@ukwhatn/wikidot 4.3.1 → 4.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -5,49 +5,126 @@ var __defProp = Object.defineProperty;
5
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
6
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
7
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ function __accessProp(key) {
9
+ return this[key];
10
+ }
11
+ var __toESMCache_node;
12
+ var __toESMCache_esm;
8
13
  var __toESM = (mod, isNodeMode, target) => {
14
+ var canCache = mod != null && typeof mod === "object";
15
+ if (canCache) {
16
+ var cache = isNodeMode ? __toESMCache_node ??= new WeakMap : __toESMCache_esm ??= new WeakMap;
17
+ var cached = cache.get(mod);
18
+ if (cached)
19
+ return cached;
20
+ }
9
21
  target = mod != null ? __create(__getProtoOf(mod)) : {};
10
22
  const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
11
23
  for (let key of __getOwnPropNames(mod))
12
24
  if (!__hasOwnProp.call(to, key))
13
25
  __defProp(to, key, {
14
- get: () => mod[key],
26
+ get: __accessProp.bind(mod, key),
15
27
  enumerable: true
16
28
  });
29
+ if (canCache)
30
+ cache.set(mod, to);
17
31
  return to;
18
32
  };
19
- var __moduleCache = /* @__PURE__ */ new WeakMap;
20
33
  var __toCommonJS = (from) => {
21
- var entry = __moduleCache.get(from), desc;
34
+ var entry = (__moduleCache ??= new WeakMap).get(from), desc;
22
35
  if (entry)
23
36
  return entry;
24
37
  entry = __defProp({}, "__esModule", { value: true });
25
- if (from && typeof from === "object" || typeof from === "function")
26
- __getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
27
- get: () => from[key],
28
- enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
29
- }));
38
+ if (from && typeof from === "object" || typeof from === "function") {
39
+ for (var key of __getOwnPropNames(from))
40
+ if (!__hasOwnProp.call(entry, key))
41
+ __defProp(entry, key, {
42
+ get: __accessProp.bind(from, key),
43
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
44
+ });
45
+ }
30
46
  __moduleCache.set(from, entry);
31
47
  return entry;
32
48
  };
49
+ var __moduleCache;
50
+ var __name = (target, name) => {
51
+ Object.defineProperty(target, "name", {
52
+ value: name,
53
+ enumerable: false,
54
+ configurable: true
55
+ });
56
+ return target;
57
+ };
58
+ var __returnValue = (v) => v;
59
+ function __exportSetter(name, newValue) {
60
+ this[name] = __returnValue.bind(null, newValue);
61
+ }
33
62
  var __export = (target, all) => {
34
63
  for (var name in all)
35
64
  __defProp(target, name, {
36
65
  get: all[name],
37
66
  enumerable: true,
38
67
  configurable: true,
39
- set: (newValue) => all[name] = () => newValue
68
+ set: __exportSetter.bind(all, name)
40
69
  });
41
70
  };
42
- var __legacyDecorateClassTS = function(decorators, target, key, desc) {
43
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
44
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
45
- r = Reflect.decorate(decorators, target, key, desc);
46
- else
47
- for (var i = decorators.length - 1;i >= 0; i--)
48
- if (d = decorators[i])
49
- r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
50
- return c > 3 && r && Object.defineProperty(target, key, r), r;
71
+ var __knownSymbol = (name, symbol) => (symbol = Symbol[name]) ? symbol : Symbol.for("Symbol." + name);
72
+ var __typeError = (msg) => {
73
+ throw TypeError(msg);
74
+ };
75
+ var __defNormalProp = (obj, key, value) => (key in obj) ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
76
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
77
+ var __privateIn = (member, obj) => Object(obj) !== obj ? __typeError('Cannot use the "in" operator on this value') : member.has(obj);
78
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
79
+ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
80
+ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
81
+ var __decoratorStart = (base) => [, , , __create(base?.[__knownSymbol("metadata")] ?? null)];
82
+ var __decoratorStrings = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"];
83
+ var __expectFn = (fn) => fn !== undefined && typeof fn !== "function" ? __typeError("Function expected") : fn;
84
+ var __decoratorContext = (kind, name, done, metadata, fns) => ({
85
+ kind: __decoratorStrings[kind],
86
+ name,
87
+ metadata,
88
+ addInitializer: (fn) => done._ ? __typeError("Already initialized") : fns.push(__expectFn(fn || null))
89
+ });
90
+ var __decoratorMetadata = (array, target) => __defNormalProp(target, __knownSymbol("metadata"), array[3]);
91
+ var __runInitializers = (array, flags, self, value) => {
92
+ for (var i = 0, fns = array[flags >> 1], n = fns && fns.length;i < n; i++)
93
+ flags & 1 ? fns[i].call(self) : value = fns[i].call(self, value);
94
+ return value;
95
+ };
96
+ var __decorateElement = (array, flags, name, decorators, target, extra) => {
97
+ var fn, it, done, ctx, access, k = flags & 7, s = !!(flags & 8), p = !!(flags & 16);
98
+ var j = k > 3 ? array.length + 1 : k ? s ? 1 : 2 : 0, key = __decoratorStrings[k + 5];
99
+ var initializers = k > 3 && (array[j - 1] = []), extraInitializers = array[j] || (array[j] = []);
100
+ var desc = k && (!p && !s && (target = target.prototype), k < 5 && (k > 3 || !p) && __getOwnPropDesc(k < 4 ? target : {
101
+ get [name]() {
102
+ return __privateGet(this, extra);
103
+ },
104
+ set [name](x) {
105
+ __privateSet(this, extra, x);
106
+ }
107
+ }, name));
108
+ k ? p && k < 4 && __name(extra, (k > 2 ? "set " : k > 1 ? "get " : "") + name) : __name(target, name);
109
+ for (var i = decorators.length - 1;i >= 0; i--) {
110
+ ctx = __decoratorContext(k, name, done = {}, array[3], extraInitializers);
111
+ if (k) {
112
+ ctx.static = s, ctx.private = p, access = ctx.access = { has: p ? (x) => __privateIn(target, x) : (x) => (name in x) };
113
+ if (k ^ 3)
114
+ access.get = p ? (x) => (k ^ 1 ? __privateGet : __privateMethod)(x, target, k ^ 4 ? extra : desc.get) : (x) => x[name];
115
+ if (k > 2)
116
+ access.set = p ? (x, y) => __privateSet(x, target, y, k ^ 4 ? extra : desc.set) : (x, y) => x[name] = y;
117
+ }
118
+ it = (0, decorators[i])(k ? k < 4 ? p ? extra : desc[key] : k > 4 ? undefined : { get: desc.get, set: desc.set } : target, ctx);
119
+ done._ = 1;
120
+ if (k ^ 4 || it === undefined)
121
+ __expectFn(it) && (k > 4 ? initializers.unshift(it) : k ? p ? extra = it : desc[key] = it : target = it);
122
+ else if (typeof it !== "object" || it === null)
123
+ __typeError("Object expected");
124
+ else
125
+ __expectFn(fn = it.get) && (desc.get = fn), __expectFn(fn = it.set) && (desc.set = fn), __expectFn(fn = it.init) && initializers.unshift(fn);
126
+ }
127
+ return k || __decoratorMetadata(array, target), desc && __defProp(target, name, desc), p ? k ^ 4 ? extra : desc : target;
51
128
  };
52
129
  var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
53
130
 
@@ -220,7 +297,9 @@ var init_amc_config = __esm(() => {
220
297
  retryInterval: 1000,
221
298
  maxBackoff: 60000,
222
299
  backoffFactor: 2,
223
- semaphoreLimit: 10
300
+ semaphoreLimit: 10,
301
+ retryBatchSize: 50,
302
+ retryMaxRetries: 3
224
303
  };
225
304
  });
226
305
 
@@ -1364,7 +1443,136 @@ var init_forum_post_revision = __esm(() => {
1364
1443
  });
1365
1444
 
1366
1445
  // src/module/forum/forum-post.ts
1367
- var cheerio4, ForumPost, ForumPostCollection;
1446
+ class ForumPost {
1447
+ thread;
1448
+ id;
1449
+ title;
1450
+ text;
1451
+ element;
1452
+ createdBy;
1453
+ createdAt;
1454
+ editedBy;
1455
+ editedAt;
1456
+ _parentId;
1457
+ _source = null;
1458
+ _revisions = null;
1459
+ constructor(data) {
1460
+ __runInitializers(_init, 5, this);
1461
+ this.thread = data.thread;
1462
+ this.id = data.id;
1463
+ this.title = data.title;
1464
+ this.text = data.text;
1465
+ this.element = data.element;
1466
+ this.createdBy = data.createdBy;
1467
+ this.createdAt = data.createdAt;
1468
+ this.editedBy = data.editedBy ?? null;
1469
+ this.editedAt = data.editedAt ?? null;
1470
+ this._parentId = data.parentId ?? null;
1471
+ }
1472
+ get parentId() {
1473
+ return this._parentId;
1474
+ }
1475
+ get source() {
1476
+ return this._source;
1477
+ }
1478
+ set source(value) {
1479
+ this._source = value;
1480
+ }
1481
+ getSource() {
1482
+ if (this.source !== null) {
1483
+ return fromPromise(Promise.resolve(this.source), (e) => new UnexpectedError(String(e)));
1484
+ }
1485
+ return fromPromise((async () => {
1486
+ const result2 = await ForumPostCollection.acquirePostSources(this.thread, [this]);
1487
+ if (result2.isErr()) {
1488
+ throw result2.error;
1489
+ }
1490
+ if (this.source === null) {
1491
+ throw new NoElementError("Source textarea not found");
1492
+ }
1493
+ return this.source;
1494
+ })(), (error) => {
1495
+ if (error instanceof NoElementError)
1496
+ return error;
1497
+ return new UnexpectedError(`Failed to get post source: ${String(error)}`);
1498
+ });
1499
+ }
1500
+ edit(source, title) {
1501
+ return fromPromise((async () => {
1502
+ const formResult = await this.thread.site.amcRequest([
1503
+ {
1504
+ moduleName: "forum/sub/ForumEditPostFormModule",
1505
+ threadId: this.thread.id,
1506
+ postId: this.id
1507
+ }
1508
+ ]);
1509
+ if (formResult.isErr()) {
1510
+ throw formResult.error;
1511
+ }
1512
+ const formResponse = formResult.value[0];
1513
+ if (!formResponse) {
1514
+ throw new NoElementError("Empty form response");
1515
+ }
1516
+ const $ = cheerio4.load(String(formResponse.body ?? ""));
1517
+ const revisionInput = $("input[name='currentRevisionId']");
1518
+ if (revisionInput.length === 0) {
1519
+ throw new NoElementError("Current revision ID input not found");
1520
+ }
1521
+ const revisionValue = revisionInput.val();
1522
+ const currentRevisionId = Number.parseInt(String(revisionValue ?? ""), 10);
1523
+ if (Number.isNaN(currentRevisionId)) {
1524
+ throw new NoElementError("Invalid revision ID value");
1525
+ }
1526
+ const editResult = await this.thread.site.amcRequest([
1527
+ {
1528
+ action: "ForumAction",
1529
+ event: "saveEditPost",
1530
+ moduleName: "Empty",
1531
+ postId: this.id,
1532
+ currentRevisionId,
1533
+ title: title ?? this.title,
1534
+ source
1535
+ }
1536
+ ]);
1537
+ if (editResult.isErr()) {
1538
+ throw editResult.error;
1539
+ }
1540
+ if (title !== undefined) {
1541
+ this.title = title;
1542
+ }
1543
+ this.source = source;
1544
+ })(), (error) => {
1545
+ if (error instanceof NoElementError || error instanceof LoginRequiredError) {
1546
+ return error;
1547
+ }
1548
+ return new UnexpectedError(`Failed to edit post: ${String(error)}`);
1549
+ });
1550
+ }
1551
+ get hasRevisions() {
1552
+ return this.editedBy !== null;
1553
+ }
1554
+ getRevisions() {
1555
+ if (this._revisions !== null) {
1556
+ return fromPromise(Promise.resolve(this._revisions), (e) => new UnexpectedError(String(e)));
1557
+ }
1558
+ return fromPromise((async () => {
1559
+ const result2 = await ForumPostRevisionCollection.acquireAllForPosts([this]);
1560
+ if (result2.isErr()) {
1561
+ throw result2.error;
1562
+ }
1563
+ this._revisions = result2.value.get(this.id) ?? new ForumPostRevisionCollection(this, []);
1564
+ return this._revisions;
1565
+ })(), (error) => {
1566
+ if (error instanceof NoElementError)
1567
+ return error;
1568
+ return new UnexpectedError(`Failed to get revisions: ${String(error)}`);
1569
+ });
1570
+ }
1571
+ toString() {
1572
+ return `ForumPost(id=${this.id}, title=${this.title})`;
1573
+ }
1574
+ }
1575
+ var cheerio4, _dec, _init, _ForumPost, ForumPostCollection;
1368
1576
  var init_forum_post = __esm(() => {
1369
1577
  init_decorators();
1370
1578
  init_errors();
@@ -1372,137 +1580,13 @@ var init_forum_post = __esm(() => {
1372
1580
  init_parser();
1373
1581
  init_forum_post_revision();
1374
1582
  cheerio4 = __toESM(require("cheerio"));
1375
- ForumPost = class ForumPost {
1376
- thread;
1377
- id;
1378
- title;
1379
- text;
1380
- element;
1381
- createdBy;
1382
- createdAt;
1383
- editedBy;
1384
- editedAt;
1385
- _parentId;
1386
- _source = null;
1387
- _revisions = null;
1388
- constructor(data) {
1389
- this.thread = data.thread;
1390
- this.id = data.id;
1391
- this.title = data.title;
1392
- this.text = data.text;
1393
- this.element = data.element;
1394
- this.createdBy = data.createdBy;
1395
- this.createdAt = data.createdAt;
1396
- this.editedBy = data.editedBy ?? null;
1397
- this.editedAt = data.editedAt ?? null;
1398
- this._parentId = data.parentId ?? null;
1399
- }
1400
- get parentId() {
1401
- return this._parentId;
1402
- }
1403
- get source() {
1404
- return this._source;
1405
- }
1406
- set source(value) {
1407
- this._source = value;
1408
- }
1409
- getSource() {
1410
- if (this.source !== null) {
1411
- return fromPromise(Promise.resolve(this.source), (e) => new UnexpectedError(String(e)));
1412
- }
1413
- return fromPromise((async () => {
1414
- const result2 = await ForumPostCollection.acquirePostSources(this.thread, [this]);
1415
- if (result2.isErr()) {
1416
- throw result2.error;
1417
- }
1418
- if (this.source === null) {
1419
- throw new NoElementError("Source textarea not found");
1420
- }
1421
- return this.source;
1422
- })(), (error) => {
1423
- if (error instanceof NoElementError)
1424
- return error;
1425
- return new UnexpectedError(`Failed to get post source: ${String(error)}`);
1426
- });
1427
- }
1428
- edit(source, title) {
1429
- return fromPromise((async () => {
1430
- const formResult = await this.thread.site.amcRequest([
1431
- {
1432
- moduleName: "forum/sub/ForumEditPostFormModule",
1433
- threadId: this.thread.id,
1434
- postId: this.id
1435
- }
1436
- ]);
1437
- if (formResult.isErr()) {
1438
- throw formResult.error;
1439
- }
1440
- const formResponse = formResult.value[0];
1441
- if (!formResponse) {
1442
- throw new NoElementError("Empty form response");
1443
- }
1444
- const $ = cheerio4.load(String(formResponse.body ?? ""));
1445
- const revisionInput = $("input[name='currentRevisionId']");
1446
- if (revisionInput.length === 0) {
1447
- throw new NoElementError("Current revision ID input not found");
1448
- }
1449
- const revisionValue = revisionInput.val();
1450
- const currentRevisionId = Number.parseInt(String(revisionValue ?? ""), 10);
1451
- if (Number.isNaN(currentRevisionId)) {
1452
- throw new NoElementError("Invalid revision ID value");
1453
- }
1454
- const editResult = await this.thread.site.amcRequest([
1455
- {
1456
- action: "ForumAction",
1457
- event: "saveEditPost",
1458
- moduleName: "Empty",
1459
- postId: this.id,
1460
- currentRevisionId,
1461
- title: title ?? this.title,
1462
- source
1463
- }
1464
- ]);
1465
- if (editResult.isErr()) {
1466
- throw editResult.error;
1467
- }
1468
- if (title !== undefined) {
1469
- this.title = title;
1470
- }
1471
- this.source = source;
1472
- })(), (error) => {
1473
- if (error instanceof NoElementError || error instanceof LoginRequiredError) {
1474
- return error;
1475
- }
1476
- return new UnexpectedError(`Failed to edit post: ${String(error)}`);
1477
- });
1478
- }
1479
- get hasRevisions() {
1480
- return this.editedBy !== null;
1481
- }
1482
- getRevisions() {
1483
- if (this._revisions !== null) {
1484
- return fromPromise(Promise.resolve(this._revisions), (e) => new UnexpectedError(String(e)));
1485
- }
1486
- return fromPromise((async () => {
1487
- const result2 = await ForumPostRevisionCollection.acquireAllForPosts([this]);
1488
- if (result2.isErr()) {
1489
- throw result2.error;
1490
- }
1491
- this._revisions = result2.value.get(this.id) ?? new ForumPostRevisionCollection(this, []);
1492
- return this._revisions;
1493
- })(), (error) => {
1494
- if (error instanceof NoElementError)
1495
- return error;
1496
- return new UnexpectedError(`Failed to get revisions: ${String(error)}`);
1497
- });
1498
- }
1499
- toString() {
1500
- return `ForumPost(id=${this.id}, title=${this.title})`;
1501
- }
1502
- };
1503
- __legacyDecorateClassTS([
1583
+ _dec = [
1504
1584
  RequireLogin
1505
- ], ForumPost.prototype, "edit", null);
1585
+ ];
1586
+ _init = __decoratorStart(undefined);
1587
+ __decorateElement(_init, 1, "edit", _dec, ForumPost);
1588
+ __decoratorMetadata(_init, ForumPost);
1589
+ _ForumPost = ForumPost;
1506
1590
  ForumPostCollection = class ForumPostCollection extends Array {
1507
1591
  thread;
1508
1592
  constructor(thread, posts) {
@@ -1653,7 +1737,7 @@ var init_forum_post = __esm(() => {
1653
1737
  }
1654
1738
  const result2 = new Map;
1655
1739
  const site = threads[0].site;
1656
- const firstPageResult = await site.amcRequest(threads.map((thread) => ({
1740
+ const firstPageResult = await site.amcRequestWithRetry(threads.map((thread) => ({
1657
1741
  moduleName: "forum/ForumViewThreadPostsModule",
1658
1742
  pageNo: "1",
1659
1743
  t: String(thread.id)
@@ -1686,7 +1770,7 @@ var init_forum_post = __esm(() => {
1686
1770
  }
1687
1771
  }
1688
1772
  if (additionalRequests.length > 0) {
1689
- const additionalResult = await site.amcRequest(additionalRequests.map(({ thread, page }) => ({
1773
+ const additionalResult = await site.amcRequestWithRetry(additionalRequests.map(({ thread, page }) => ({
1690
1774
  moduleName: "forum/ForumViewThreadPostsModule",
1691
1775
  pageNo: String(page),
1692
1776
  t: String(thread.id)
@@ -1755,7 +1839,86 @@ var init_forum_post = __esm(() => {
1755
1839
  });
1756
1840
 
1757
1841
  // src/module/forum/forum-thread.ts
1758
- var cheerio5, ForumThread, ForumThreadCollection;
1842
+ class ForumThread {
1843
+ site;
1844
+ id;
1845
+ title;
1846
+ description;
1847
+ createdBy;
1848
+ createdAt;
1849
+ postCount;
1850
+ category;
1851
+ _posts = null;
1852
+ constructor(data) {
1853
+ __runInitializers(_init, 5, this);
1854
+ this.site = data.site;
1855
+ this.id = data.id;
1856
+ this.title = data.title;
1857
+ this.description = data.description;
1858
+ this.createdBy = data.createdBy;
1859
+ this.createdAt = data.createdAt;
1860
+ this.postCount = data.postCount;
1861
+ this.category = data.category ?? null;
1862
+ }
1863
+ getUrl() {
1864
+ return `${this.site.getBaseUrl()}/forum/t-${this.id}/`;
1865
+ }
1866
+ getPosts() {
1867
+ if (this._posts !== null) {
1868
+ return fromPromise(Promise.resolve(this._posts), (e) => new UnexpectedError(String(e)));
1869
+ }
1870
+ return fromPromise((async () => {
1871
+ const result2 = await ForumPostCollection.acquireAllInThreads([this]);
1872
+ if (result2.isErr()) {
1873
+ throw result2.error;
1874
+ }
1875
+ this._posts = result2.value.get(this.id) ?? new ForumPostCollection(this, []);
1876
+ return this._posts;
1877
+ })(), (error) => new UnexpectedError(`Failed to get posts: ${String(error)}`));
1878
+ }
1879
+ reply(source, title = "", parentPostId = null) {
1880
+ return fromPromise((async () => {
1881
+ const result2 = await this.site.amcRequest([
1882
+ {
1883
+ threadId: String(this.id),
1884
+ parentId: parentPostId !== null ? String(parentPostId) : "",
1885
+ title,
1886
+ source,
1887
+ action: "ForumAction",
1888
+ event: "savePost",
1889
+ moduleName: "Empty"
1890
+ }
1891
+ ]);
1892
+ if (result2.isErr()) {
1893
+ throw result2.error;
1894
+ }
1895
+ this._posts = null;
1896
+ this.postCount += 1;
1897
+ return this;
1898
+ })(), (error) => new UnexpectedError(`Failed to reply: ${String(error)}`));
1899
+ }
1900
+ toString() {
1901
+ return `ForumThread(id=${this.id}, title=${this.title})`;
1902
+ }
1903
+ static getFromId(site, threadId, category = null) {
1904
+ return fromPromise((async () => {
1905
+ const result2 = await ForumThreadCollection.acquireFromThreadIds(site, [threadId], category);
1906
+ if (result2.isErr()) {
1907
+ throw result2.error;
1908
+ }
1909
+ const thread = result2.value[0];
1910
+ if (!thread) {
1911
+ throw new NoElementError(`Thread not found: ${threadId}`);
1912
+ }
1913
+ return thread;
1914
+ })(), (error) => {
1915
+ if (error instanceof NoElementError)
1916
+ return error;
1917
+ return new UnexpectedError(`Failed to get thread: ${String(error)}`);
1918
+ });
1919
+ }
1920
+ }
1921
+ var cheerio5, _dec, _init, _ForumThread, ForumThreadCollection;
1759
1922
  var init_forum_thread = __esm(() => {
1760
1923
  init_decorators();
1761
1924
  init_errors();
@@ -1763,87 +1926,13 @@ var init_forum_thread = __esm(() => {
1763
1926
  init_parser();
1764
1927
  init_forum_post();
1765
1928
  cheerio5 = __toESM(require("cheerio"));
1766
- ForumThread = class ForumThread {
1767
- site;
1768
- id;
1769
- title;
1770
- description;
1771
- createdBy;
1772
- createdAt;
1773
- postCount;
1774
- category;
1775
- _posts = null;
1776
- constructor(data) {
1777
- this.site = data.site;
1778
- this.id = data.id;
1779
- this.title = data.title;
1780
- this.description = data.description;
1781
- this.createdBy = data.createdBy;
1782
- this.createdAt = data.createdAt;
1783
- this.postCount = data.postCount;
1784
- this.category = data.category ?? null;
1785
- }
1786
- getUrl() {
1787
- return `${this.site.getBaseUrl()}/forum/t-${this.id}/`;
1788
- }
1789
- getPosts() {
1790
- if (this._posts !== null) {
1791
- return fromPromise(Promise.resolve(this._posts), (e) => new UnexpectedError(String(e)));
1792
- }
1793
- return fromPromise((async () => {
1794
- const result2 = await ForumPostCollection.acquireAllInThreads([this]);
1795
- if (result2.isErr()) {
1796
- throw result2.error;
1797
- }
1798
- this._posts = result2.value.get(this.id) ?? new ForumPostCollection(this, []);
1799
- return this._posts;
1800
- })(), (error) => new UnexpectedError(`Failed to get posts: ${String(error)}`));
1801
- }
1802
- reply(source, title = "", parentPostId = null) {
1803
- return fromPromise((async () => {
1804
- const result2 = await this.site.amcRequest([
1805
- {
1806
- threadId: String(this.id),
1807
- parentId: parentPostId !== null ? String(parentPostId) : "",
1808
- title,
1809
- source,
1810
- action: "ForumAction",
1811
- event: "savePost",
1812
- moduleName: "Empty"
1813
- }
1814
- ]);
1815
- if (result2.isErr()) {
1816
- throw result2.error;
1817
- }
1818
- this._posts = null;
1819
- this.postCount += 1;
1820
- return this;
1821
- })(), (error) => new UnexpectedError(`Failed to reply: ${String(error)}`));
1822
- }
1823
- toString() {
1824
- return `ForumThread(id=${this.id}, title=${this.title})`;
1825
- }
1826
- static getFromId(site, threadId, category = null) {
1827
- return fromPromise((async () => {
1828
- const result2 = await ForumThreadCollection.acquireFromThreadIds(site, [threadId], category);
1829
- if (result2.isErr()) {
1830
- throw result2.error;
1831
- }
1832
- const thread = result2.value[0];
1833
- if (!thread) {
1834
- throw new NoElementError(`Thread not found: ${threadId}`);
1835
- }
1836
- return thread;
1837
- })(), (error) => {
1838
- if (error instanceof NoElementError)
1839
- return error;
1840
- return new UnexpectedError(`Failed to get thread: ${String(error)}`);
1841
- });
1842
- }
1843
- };
1844
- __legacyDecorateClassTS([
1929
+ _dec = [
1845
1930
  RequireLogin
1846
- ], ForumThread.prototype, "reply", null);
1931
+ ];
1932
+ _init = __decoratorStart(undefined);
1933
+ __decorateElement(_init, 1, "reply", _dec, ForumThread);
1934
+ __decoratorMetadata(_init, ForumThread);
1935
+ _ForumThread = ForumThread;
1847
1936
  ForumThreadCollection = class ForumThreadCollection extends Array {
1848
1937
  site;
1849
1938
  constructor(site, threads) {
@@ -1923,11 +2012,13 @@ var init_forum_thread = __esm(() => {
1923
2012
  moduleName: "forum/ForumViewCategoryModule"
1924
2013
  });
1925
2014
  }
1926
- const additionalResults = await category.site.amcRequest(bodies);
2015
+ const additionalResults = await category.site.amcRequestWithRetry(bodies);
1927
2016
  if (additionalResults.isErr()) {
1928
2017
  throw additionalResults.error;
1929
2018
  }
1930
2019
  for (const response of additionalResults.value) {
2020
+ if (!response)
2021
+ continue;
1931
2022
  const body = String(response?.body ?? "");
1932
2023
  const $ = cheerio5.load(body);
1933
2024
  $("table.table tr.head~tr").each((_i, elem) => {
@@ -2030,86 +2121,91 @@ var init_forum_thread = __esm(() => {
2030
2121
  });
2031
2122
 
2032
2123
  // src/module/forum/forum-category.ts
2033
- var cheerio6, ForumCategory, ForumCategoryCollection;
2124
+ class ForumCategory {
2125
+ site;
2126
+ id;
2127
+ title;
2128
+ description;
2129
+ threadsCount;
2130
+ postsCount;
2131
+ _threads = null;
2132
+ constructor(data) {
2133
+ __runInitializers(_init, 5, this);
2134
+ this.site = data.site;
2135
+ this.id = data.id;
2136
+ this.title = data.title;
2137
+ this.description = data.description;
2138
+ this.threadsCount = data.threadsCount;
2139
+ this.postsCount = data.postsCount;
2140
+ }
2141
+ getThreads() {
2142
+ if (this._threads !== null) {
2143
+ return fromPromise(Promise.resolve(this._threads), (e) => new UnexpectedError(String(e)));
2144
+ }
2145
+ return fromPromise((async () => {
2146
+ const result2 = await ForumThreadCollection.acquireAllInCategory(this);
2147
+ if (result2.isErr()) {
2148
+ throw result2.error;
2149
+ }
2150
+ this._threads = result2.value;
2151
+ return this._threads;
2152
+ })(), (error) => new UnexpectedError(`Failed to get threads: ${String(error)}`));
2153
+ }
2154
+ reloadThreads() {
2155
+ this._threads = null;
2156
+ return this.getThreads();
2157
+ }
2158
+ createThread(title, description, source) {
2159
+ return fromPromise((async () => {
2160
+ const result2 = await this.site.amcRequest([
2161
+ {
2162
+ moduleName: "Empty",
2163
+ action: "ForumAction",
2164
+ event: "newThread",
2165
+ category_id: this.id,
2166
+ title,
2167
+ description,
2168
+ source
2169
+ }
2170
+ ]);
2171
+ if (result2.isErr()) {
2172
+ throw result2.error;
2173
+ }
2174
+ const response = result2.value[0];
2175
+ if (!response || typeof response.threadId !== "number") {
2176
+ throw new NoElementError("Thread ID not found in response");
2177
+ }
2178
+ const threadId = response.threadId;
2179
+ const threadResult = await ForumThread.getFromId(this.site, threadId, this);
2180
+ if (threadResult.isErr()) {
2181
+ throw threadResult.error;
2182
+ }
2183
+ return threadResult.value;
2184
+ })(), (error) => {
2185
+ if (error instanceof NoElementError || error instanceof LoginRequiredError) {
2186
+ return error;
2187
+ }
2188
+ return new UnexpectedError(`Failed to create thread: ${String(error)}`);
2189
+ });
2190
+ }
2191
+ toString() {
2192
+ return `ForumCategory(id=${this.id}, title=${this.title})`;
2193
+ }
2194
+ }
2195
+ var cheerio6, _dec, _init, _ForumCategory, ForumCategoryCollection;
2034
2196
  var init_forum_category = __esm(() => {
2035
2197
  init_decorators();
2036
2198
  init_errors();
2037
2199
  init_types();
2038
2200
  init_forum_thread();
2039
2201
  cheerio6 = __toESM(require("cheerio"));
2040
- ForumCategory = class ForumCategory {
2041
- site;
2042
- id;
2043
- title;
2044
- description;
2045
- threadsCount;
2046
- postsCount;
2047
- _threads = null;
2048
- constructor(data) {
2049
- this.site = data.site;
2050
- this.id = data.id;
2051
- this.title = data.title;
2052
- this.description = data.description;
2053
- this.threadsCount = data.threadsCount;
2054
- this.postsCount = data.postsCount;
2055
- }
2056
- getThreads() {
2057
- if (this._threads !== null) {
2058
- return fromPromise(Promise.resolve(this._threads), (e) => new UnexpectedError(String(e)));
2059
- }
2060
- return fromPromise((async () => {
2061
- const result2 = await ForumThreadCollection.acquireAllInCategory(this);
2062
- if (result2.isErr()) {
2063
- throw result2.error;
2064
- }
2065
- this._threads = result2.value;
2066
- return this._threads;
2067
- })(), (error) => new UnexpectedError(`Failed to get threads: ${String(error)}`));
2068
- }
2069
- reloadThreads() {
2070
- this._threads = null;
2071
- return this.getThreads();
2072
- }
2073
- createThread(title, description, source) {
2074
- return fromPromise((async () => {
2075
- const result2 = await this.site.amcRequest([
2076
- {
2077
- moduleName: "Empty",
2078
- action: "ForumAction",
2079
- event: "newThread",
2080
- category_id: this.id,
2081
- title,
2082
- description,
2083
- source
2084
- }
2085
- ]);
2086
- if (result2.isErr()) {
2087
- throw result2.error;
2088
- }
2089
- const response = result2.value[0];
2090
- if (!response || typeof response.threadId !== "number") {
2091
- throw new NoElementError("Thread ID not found in response");
2092
- }
2093
- const threadId = response.threadId;
2094
- const threadResult = await ForumThread.getFromId(this.site, threadId, this);
2095
- if (threadResult.isErr()) {
2096
- throw threadResult.error;
2097
- }
2098
- return threadResult.value;
2099
- })(), (error) => {
2100
- if (error instanceof NoElementError || error instanceof LoginRequiredError) {
2101
- return error;
2102
- }
2103
- return new UnexpectedError(`Failed to create thread: ${String(error)}`);
2104
- });
2105
- }
2106
- toString() {
2107
- return `ForumCategory(id=${this.id}, title=${this.title})`;
2108
- }
2109
- };
2110
- __legacyDecorateClassTS([
2202
+ _dec = [
2111
2203
  RequireLogin
2112
- ], ForumCategory.prototype, "createThread", null);
2204
+ ];
2205
+ _init = __decoratorStart(undefined);
2206
+ __decorateElement(_init, 1, "createThread", _dec, ForumCategory);
2207
+ __decoratorMetadata(_init, ForumCategory);
2208
+ _ForumCategory = ForumCategory;
2113
2209
  ForumCategoryCollection = class ForumCategoryCollection extends Array {
2114
2210
  site;
2115
2211
  constructor(site, categories) {
@@ -2962,11 +3058,17 @@ init_errors();
2962
3058
  init_types();
2963
3059
  init_parser();
2964
3060
  var cheerio7 = __toESM(require("cheerio"));
3061
+ var _dec = [
3062
+ RequireLogin
3063
+ ];
3064
+ var _init = __decoratorStart(undefined);
3065
+
2965
3066
  class SiteApplication {
2966
3067
  site;
2967
3068
  user;
2968
3069
  text;
2969
3070
  constructor(data) {
3071
+ __runInitializers(_init, 5, this);
2970
3072
  this.site = data.site;
2971
3073
  this.user = data.user;
2972
3074
  this.text = data.text;
@@ -3052,9 +3154,9 @@ class SiteApplication {
3052
3154
  return `SiteApplication(user=${this.user.name}, site=${this.site.unixName}, text=${this.text})`;
3053
3155
  }
3054
3156
  }
3055
- __legacyDecorateClassTS([
3056
- RequireLogin
3057
- ], SiteApplication.prototype, "process", null);
3157
+ __decorateElement(_init, 1, "process", _dec, SiteApplication);
3158
+ __decoratorMetadata(_init, SiteApplication);
3159
+ let _SiteApplication = SiteApplication;
3058
3160
 
3059
3161
  // src/module/site/site-member.ts
3060
3162
  init_decorators();
@@ -3062,11 +3164,17 @@ init_errors();
3062
3164
  init_types();
3063
3165
  init_parser();
3064
3166
  var cheerio8 = __toESM(require("cheerio"));
3167
+ var _dec = [
3168
+ RequireLogin
3169
+ ];
3170
+ var _init = __decoratorStart(undefined);
3171
+
3065
3172
  class SiteMember {
3066
3173
  site;
3067
3174
  user;
3068
3175
  joinedAt;
3069
3176
  constructor(data) {
3177
+ __runInitializers(_init, 5, this);
3070
3178
  this.site = data.site;
3071
3179
  this.user = data.user;
3072
3180
  this.joinedAt = data.joinedAt;
@@ -3185,14 +3293,20 @@ class SiteMember {
3185
3293
  return `SiteMember(user=${this.user.name}, site=${this.site.unixName})`;
3186
3294
  }
3187
3295
  }
3188
- __legacyDecorateClassTS([
3189
- RequireLogin
3190
- ], SiteMember.prototype, "changeGroup", null);
3296
+ __decorateElement(_init, 1, "changeGroup", _dec, SiteMember);
3297
+ __decoratorMetadata(_init, SiteMember);
3298
+ let _SiteMember = SiteMember;
3191
3299
 
3192
3300
  // src/module/site/accessors/member-accessor.ts
3301
+ var _dec = [
3302
+ RequireLogin
3303
+ ];
3304
+ var _init = __decoratorStart(undefined);
3305
+
3193
3306
  class MemberAccessor {
3194
3307
  site;
3195
3308
  constructor(site) {
3309
+ __runInitializers(_init, 5, this);
3196
3310
  this.site = site;
3197
3311
  }
3198
3312
  getAll() {
@@ -3241,9 +3355,9 @@ class MemberAccessor {
3241
3355
  });
3242
3356
  }
3243
3357
  }
3244
- __legacyDecorateClassTS([
3245
- RequireLogin
3246
- ], MemberAccessor.prototype, "invite", null);
3358
+ __decorateElement(_init, 1, "invite", _dec, MemberAccessor);
3359
+ __decoratorMetadata(_init, MemberAccessor);
3360
+ let _MemberAccessor = MemberAccessor;
3247
3361
  // src/module/site/accessors/page-accessor.ts
3248
3362
  init_errors();
3249
3363
  init_types();
@@ -3833,6 +3947,34 @@ var pageParamsSchema = import_zod3.z.object({
3833
3947
  commented_by: import_zod3.z.custom().nullable().default(null),
3834
3948
  commented_at: import_zod3.z.date().nullable().default(null)
3835
3949
  });
3950
+ var _dec = [
3951
+ RequireLogin
3952
+ ];
3953
+ var _dec2 = [
3954
+ RequireLogin
3955
+ ];
3956
+ var _dec3 = [
3957
+ RequireLogin
3958
+ ];
3959
+ var _dec4 = [
3960
+ RequireLogin
3961
+ ];
3962
+ var _dec5 = [
3963
+ RequireLogin
3964
+ ];
3965
+ var _dec6 = [
3966
+ RequireLogin
3967
+ ];
3968
+ var _dec7 = [
3969
+ RequireLogin
3970
+ ];
3971
+ var _dec8 = [
3972
+ RequireLogin
3973
+ ];
3974
+ var _dec9 = [
3975
+ RequireLogin
3976
+ ];
3977
+ var _init = __decoratorStart(undefined);
3836
3978
 
3837
3979
  class Page {
3838
3980
  site;
@@ -3861,6 +4003,7 @@ class Page {
3861
4003
  _votes = null;
3862
4004
  _files = null;
3863
4005
  constructor(data) {
4006
+ __runInitializers(_init, 5, this);
3864
4007
  this.site = data.site;
3865
4008
  this.fullname = data.fullname;
3866
4009
  this.name = data.name;
@@ -4226,33 +4369,17 @@ class Page {
4226
4369
  return `Page(fullname=${this.fullname}, title=${this.title})`;
4227
4370
  }
4228
4371
  }
4229
- __legacyDecorateClassTS([
4230
- RequireLogin
4231
- ], Page.prototype, "destroy", null);
4232
- __legacyDecorateClassTS([
4233
- RequireLogin
4234
- ], Page.prototype, "commitTags", null);
4235
- __legacyDecorateClassTS([
4236
- RequireLogin
4237
- ], Page.prototype, "setParent", null);
4238
- __legacyDecorateClassTS([
4239
- RequireLogin
4240
- ], Page.prototype, "vote", null);
4241
- __legacyDecorateClassTS([
4242
- RequireLogin
4243
- ], Page.prototype, "cancelVote", null);
4244
- __legacyDecorateClassTS([
4245
- RequireLogin
4246
- ], Page.prototype, "edit", null);
4247
- __legacyDecorateClassTS([
4248
- RequireLogin
4249
- ], Page.prototype, "rename", null);
4250
- __legacyDecorateClassTS([
4251
- RequireLogin
4252
- ], Page.prototype, "setMeta", null);
4253
- __legacyDecorateClassTS([
4254
- RequireLogin
4255
- ], Page.prototype, "deleteMeta", null);
4372
+ __decorateElement(_init, 1, "destroy", _dec, Page);
4373
+ __decorateElement(_init, 1, "commitTags", _dec2, Page);
4374
+ __decorateElement(_init, 1, "setParent", _dec3, Page);
4375
+ __decorateElement(_init, 1, "vote", _dec4, Page);
4376
+ __decorateElement(_init, 1, "cancelVote", _dec5, Page);
4377
+ __decorateElement(_init, 1, "edit", _dec6, Page);
4378
+ __decorateElement(_init, 1, "rename", _dec7, Page);
4379
+ __decorateElement(_init, 1, "setMeta", _dec8, Page);
4380
+ __decorateElement(_init, 1, "deleteMeta", _dec9, Page);
4381
+ __decoratorMetadata(_init, Page);
4382
+ let _Page = Page;
4256
4383
 
4257
4384
  class PageCollection extends Array {
4258
4385
  site;
@@ -4377,7 +4504,7 @@ class PageCollection extends Array {
4377
4504
  if (targetPages.length === 0) {
4378
4505
  return new PageCollection(site, pages);
4379
4506
  }
4380
- const result2 = await site.amcRequest(targetPages.map((page) => ({
4507
+ const result2 = await site.amcRequestWithRetry(targetPages.map((page) => ({
4381
4508
  moduleName: "history/PageRevisionListModule",
4382
4509
  page_id: page.id,
4383
4510
  options: { all: true },
@@ -4438,7 +4565,7 @@ class PageCollection extends Array {
4438
4565
  if (targetPages.length === 0) {
4439
4566
  return new PageCollection(site, pages);
4440
4567
  }
4441
- const result2 = await site.amcRequest(targetPages.map((page) => ({
4568
+ const result2 = await site.amcRequestWithRetry(targetPages.map((page) => ({
4442
4569
  moduleName: "pagerate/WhoRatedPageModule",
4443
4570
  pageId: page.id
4444
4571
  })));
@@ -4865,6 +4992,7 @@ class PagesAccessor {
4865
4992
  }
4866
4993
  // src/module/site/site.ts
4867
4994
  init_errors();
4995
+ init_logger();
4868
4996
  init_types();
4869
4997
  init_http();
4870
4998
  var cheerio13 = __toESM(require("cheerio"));
@@ -4915,8 +5043,68 @@ class Site {
4915
5043
  const protocol = this.sslSupported ? "https" : "http";
4916
5044
  return `${protocol}://${this.domain}`;
4917
5045
  }
4918
- amcRequest(bodies) {
4919
- return this.client.amcClient.request(bodies, this.unixName, this.sslSupported);
5046
+ amcRequest(bodies, options) {
5047
+ return this.client.amcClient.requestWithOptions(bodies, {
5048
+ siteName: this.unixName,
5049
+ sslSupported: this.sslSupported,
5050
+ returnExceptions: options?.returnExceptions ?? false
5051
+ });
5052
+ }
5053
+ amcRequestWithRetry(bodies, options) {
5054
+ const batchSize = options?.batchSize ?? this.client.amcClient.config.retryBatchSize;
5055
+ const maxRetries = options?.maxRetries ?? this.client.amcClient.config.retryMaxRetries;
5056
+ return fromPromise((async () => {
5057
+ if (!Number.isInteger(batchSize) || batchSize <= 0) {
5058
+ throw new Error(`Invalid batchSize: ${batchSize}. Must be a positive integer.`);
5059
+ }
5060
+ if (!Number.isInteger(maxRetries) || maxRetries < 0) {
5061
+ throw new Error(`Invalid maxRetries: ${maxRetries}. Must be a non-negative integer.`);
5062
+ }
5063
+ const allResults = [];
5064
+ for (let batchStart = 0;batchStart < bodies.length; batchStart += batchSize) {
5065
+ const batch = bodies.slice(batchStart, batchStart + batchSize);
5066
+ const initialResult = await this.amcRequest(batch, { returnExceptions: true });
5067
+ if (initialResult.isErr())
5068
+ throw initialResult.error;
5069
+ const batchResults = [];
5070
+ let failedIndices = [];
5071
+ for (const [i, respOrErr] of initialResult.value.entries()) {
5072
+ if (respOrErr instanceof WikidotError) {
5073
+ batchResults.push(null);
5074
+ failedIndices.push(i);
5075
+ } else {
5076
+ batchResults.push(respOrErr);
5077
+ }
5078
+ }
5079
+ for (let attempt = 0;attempt < maxRetries && failedIndices.length > 0; attempt++) {
5080
+ const retryBodies = failedIndices.map((i) => batch[i]);
5081
+ logger.warn(`amcRequestWithRetry: ${failedIndices.length}/${batch.length} requests failed, retrying (attempt ${attempt + 1}/${maxRetries})`);
5082
+ const retryResult = await this.amcRequest(retryBodies, { returnExceptions: true });
5083
+ if (retryResult.isErr())
5084
+ break;
5085
+ const stillFailedIndices = [];
5086
+ for (let j = 0;j < failedIndices.length; j++) {
5087
+ const retryResp = retryResult.value[j];
5088
+ if (retryResp && !(retryResp instanceof WikidotError)) {
5089
+ batchResults[failedIndices[j]] = retryResp;
5090
+ } else {
5091
+ stillFailedIndices.push(failedIndices[j]);
5092
+ }
5093
+ }
5094
+ failedIndices = stillFailedIndices;
5095
+ }
5096
+ allResults.push(...batchResults);
5097
+ }
5098
+ const failedCount = allResults.filter((r) => r === null).length;
5099
+ if (failedCount > 0) {
5100
+ logger.warn(`amcRequestWithRetry: ${allResults.length - failedCount}/${allResults.length} succeeded (${failedCount} failed)`);
5101
+ }
5102
+ return allResults;
5103
+ })(), (error) => {
5104
+ if (error instanceof WikidotError)
5105
+ return error;
5106
+ return new UnexpectedError(`AMC request with retry failed: ${String(error)}`);
5107
+ });
4920
5108
  }
4921
5109
  amcRequestSingle(body) {
4922
5110
  return fromPromise((async () => {
@@ -4958,7 +5146,7 @@ class Site {
4958
5146
  let title = null;
4959
5147
  for (const script of scripts) {
4960
5148
  const content = $(script).html();
4961
- if (!content || !content.includes("WIKIREQUEST")) {
5149
+ if (!content?.includes("WIKIREQUEST")) {
4962
5150
  continue;
4963
5151
  }
4964
5152
  const siteIdMatch = content.match(/WIKIREQUEST\.info\.siteId\s*=\s*(\d+)/);
@@ -5137,5 +5325,5 @@ init_user2();
5137
5325
  // src/util/index.ts
5138
5326
  init_parser();
5139
5327
 
5140
- //# debugId=E451E45EF8DB642764756E2164756E21
5141
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2NvbW1vbi9lcnJvcnMvYmFzZS50cyIsICJzcmMvY29tbW9uL2Vycm9ycy9hbWMudHMiLCAic3JjL2NvbW1vbi9lcnJvcnMvc2Vzc2lvbi50cyIsICJzcmMvY29tbW9uL2Vycm9ycy90YXJnZXQudHMiLCAic3JjL2NvbW1vbi9lcnJvcnMvaW5kZXgudHMiLCAic3JjL2NvbW1vbi9sb2dnZXIudHMiLCAic3JjL2NvbW1vbi90eXBlcy9yZXN1bHQudHMiLCAic3JjL2NvbW1vbi90eXBlcy9pbmRleC50cyIsICJzcmMvY29ubmVjdG9yL2FtYy1jb25maWcudHMiLCAic3JjL3V0aWwvaHR0cC50cyIsICJzcmMvbW9kdWxlL3VzZXIvYW5vbnltb3VzLXVzZXIudHMiLCAic3JjL21vZHVsZS91c2VyL2RlbGV0ZWQtdXNlci50cyIsICJzcmMvbW9kdWxlL3VzZXIvZ3Vlc3QtdXNlci50cyIsICJzcmMvdXRpbC90YWJsZS9jaGFyLXRhYmxlLnRzIiwgInNyYy91dGlsL3N0cmluZy11dGlsLnRzIiwgInNyYy9tb2R1bGUvdXNlci91c2VyLWNvbGxlY3Rpb24udHMiLCAic3JjL21vZHVsZS91c2VyL3VzZXIudHMiLCAic3JjL21vZHVsZS91c2VyL3dpa2lkb3QtdXNlci50cyIsICJzcmMvbW9kdWxlL3VzZXIvaW5kZXgudHMiLCAic3JjL3V0aWwvcGFyc2VyL3VzZXIudHMiLCAic3JjL3V0aWwvcGFyc2VyL2luZGV4LnRzIiwgInNyYy9jb21tb24vZGVjb3JhdG9ycy50cyIsICJzcmMvbW9kdWxlL2ZvcnVtL2ZvcnVtLXBvc3QtcmV2aXNpb24udHMiLCAic3JjL21vZHVsZS9mb3J1bS9mb3J1bS1wb3N0LnRzIiwgInNyYy9tb2R1bGUvZm9ydW0vZm9ydW0tdGhyZWFkLnRzIiwgInNyYy9tb2R1bGUvZm9ydW0vZm9ydW0tY2F0ZWdvcnkudHMiLCAic3JjL21vZHVsZS9mb3J1bS9pbmRleC50cyIsICJzcmMvaW5kZXgudHMiLCAic3JjL2Nvbm5lY3Rvci9hbWMtY2xpZW50LnRzIiwgInNyYy9jb25uZWN0b3IvYW1jLWhlYWRlci50cyIsICJzcmMvY29ubmVjdG9yL2FtYy10eXBlcy50cyIsICJzcmMvY29ubmVjdG9yL2luZGV4LnRzIiwgInNyYy9jb25uZWN0b3IvYXV0aC50cyIsICJzcmMvbW9kdWxlL3ByaXZhdGUtbWVzc2FnZS9wcml2YXRlLW1lc3NhZ2UudHMiLCAic3JjL21vZHVsZS9jbGllbnQvYWNjZXNzb3JzL3BtLWFjY2Vzc29yLnRzIiwgInNyYy9tb2R1bGUvc2l0ZS9hY2Nlc3NvcnMvZm9ydW0tYWNjZXNzb3IudHMiLCAic3JjL21vZHVsZS9zaXRlL2FjY2Vzc29ycy9tZW1iZXItYWNjZXNzb3IudHMiLCAic3JjL3V0aWwvcXVpY2stbW9kdWxlLnRzIiwgInNyYy9tb2R1bGUvc2l0ZS9zaXRlLWFwcGxpY2F0aW9uLnRzIiwgInNyYy9tb2R1bGUvc2l0ZS9zaXRlLW1lbWJlci50cyIsICJzcmMvbW9kdWxlL3NpdGUvYWNjZXNzb3JzL3BhZ2UtYWNjZXNzb3IudHMiLCAic3JjL21vZHVsZS9wYWdlL3BhZ2UudHMiLCAic3JjL21vZHVsZS9wYWdlL3BhZ2UtZmlsZS50cyIsICJzcmMvbW9kdWxlL3BhZ2UvcGFnZS1tZXRhLnRzIiwgInNyYy9tb2R1bGUvcGFnZS9wYWdlLXJldmlzaW9uLnRzIiwgInNyYy9tb2R1bGUvcGFnZS9wYWdlLXNvdXJjZS50cyIsICJzcmMvbW9kdWxlL3BhZ2UvcGFnZS12b3RlLnRzIiwgInNyYy9tb2R1bGUvcGFnZS9zZWFyY2gtcXVlcnkudHMiLCAic3JjL21vZHVsZS9wYWdlL3NpdGUtY2hhbmdlLnRzIiwgInNyYy9tb2R1bGUvc2l0ZS9hY2Nlc3NvcnMvcGFnZXMtYWNjZXNzb3IudHMiLCAic3JjL21vZHVsZS9zaXRlL3NpdGUudHMiLCAic3JjL21vZHVsZS9jbGllbnQvYWNjZXNzb3JzL3NpdGUtYWNjZXNzb3IudHMiLCAic3JjL21vZHVsZS9jbGllbnQvYWNjZXNzb3JzL3VzZXItYWNjZXNzb3IudHMiLCAic3JjL21vZHVsZS9jbGllbnQvY2xpZW50LnRzIiwgInNyYy9tb2R1bGUvaW5kZXgudHMiLCAic3JjL3V0aWwvaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiLyoqXG4gKiBCYXNlIGVycm9yIGNsYXNzIGZvciB0aGUgV2lraWRvdCBsaWJyYXJ5XG4gKiBBbGwgY3VzdG9tIGVycm9ycyBpbmhlcml0IGZyb20gdGhpcyBjbGFzc1xuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgV2lraWRvdEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKiogRXJyb3IgbmFtZSAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gbWVzc2FnZSAtIEVycm9yIG1lc3NhZ2VcbiAgICovXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZTtcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgbmV3LnRhcmdldC5wcm90b3R5cGUpO1xuICB9XG59XG5cbi8qKlxuICogVW5leHBlY3RlZCBlcnJvclxuICogUmVwcmVzZW50cyBpbnRlcm5hbCBpbmNvbnNpc3RlbmNpZXMgb3IgYnVnc1xuICovXG5leHBvcnQgY2xhc3MgVW5leHBlY3RlZEVycm9yIGV4dGVuZHMgV2lraWRvdEVycm9yIHt9XG4iLAogICAgImltcG9ydCB7IFdpa2lkb3RFcnJvciB9IGZyb20gJy4vYmFzZSc7XG5cbi8qKlxuICogQmFzZSBlcnJvciBmb3IgQWpheCBNb2R1bGUgQ29ubmVjdG9yIHJlbGF0ZWQgaXNzdWVzXG4gKi9cbmV4cG9ydCBjbGFzcyBBTUNFcnJvciBleHRlbmRzIFdpa2lkb3RFcnJvciB7fVxuXG4vKipcbiAqIEhUVFAgc3RhdHVzIGNvZGUgZXJyb3JcbiAqIFRocm93biB3aGVuIGFuIEFNQyByZXF1ZXN0IGZhaWxzIHdpdGggYW4gSFRUUCBlcnJvclxuICovXG5leHBvcnQgY2xhc3MgQU1DSHR0cEVycm9yIGV4dGVuZHMgQU1DRXJyb3Ige1xuICAvKiogSFRUUCBzdGF0dXMgY29kZSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc3RhdHVzQ29kZTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gbWVzc2FnZSAtIEVycm9yIG1lc3NhZ2VcbiAgICogQHBhcmFtIHN0YXR1c0NvZGUgLSBIVFRQIHN0YXR1cyBjb2RlXG4gICAqL1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIHN0YXR1c0NvZGU6IG51bWJlcikge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMuc3RhdHVzQ29kZSA9IHN0YXR1c0NvZGU7XG4gIH1cbn1cblxuLyoqXG4gKiBXaWtpZG90IHN0YXR1cyBjb2RlIGVycm9yXG4gKiBUaHJvd24gd2hlbiBBTUMgcmVzcG9uc2Ugc3RhdHVzIGlzIG5vdCBva1xuICovXG5leHBvcnQgY2xhc3MgV2lraWRvdFN0YXR1c0Vycm9yIGV4dGVuZHMgQU1DRXJyb3Ige1xuICAvKiogV2lraWRvdCBzdGF0dXMgY29kZSBzdHJpbmcgKi9cbiAgcHVibGljIHJlYWRvbmx5IHN0YXR1c0NvZGU6IHN0cmluZztcblxuICAvKipcbiAgICogQHBhcmFtIG1lc3NhZ2UgLSBFcnJvciBtZXNzYWdlXG4gICAqIEBwYXJhbSBzdGF0dXNDb2RlIC0gU3RhdHVzIGNvZGUgKGUuZy4sICdub3Rfb2snLCAndHJ5X2FnYWluJylcbiAgICovXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgc3RhdHVzQ29kZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5zdGF0dXNDb2RlID0gc3RhdHVzQ29kZTtcbiAgfVxufVxuXG4vKipcbiAqIFJlc3BvbnNlIGRhdGEgZXJyb3JcbiAqIFRocm93biB3aGVuIHJlc3BvbnNlIHBhcnNpbmcgZmFpbHNcbiAqL1xuZXhwb3J0IGNsYXNzIFJlc3BvbnNlRGF0YUVycm9yIGV4dGVuZHMgQU1DRXJyb3Ige31cbiIsCiAgICAiaW1wb3J0IHsgV2lraWRvdEVycm9yIH0gZnJvbSAnLi9iYXNlJztcblxuLyoqXG4gKiBCYXNlIGVycm9yIGZvciBzZXNzaW9uIHJlbGF0ZWQgaXNzdWVzXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXNzaW9uRXJyb3IgZXh0ZW5kcyBXaWtpZG90RXJyb3Ige31cblxuLyoqXG4gKiBTZXNzaW9uIGNyZWF0aW9uIGZhaWx1cmUgZXJyb3JcbiAqIFRocm93biB3aGVuIGEgbG9naW4gYXR0ZW1wdCBmYWlsc1xuICovXG5leHBvcnQgY2xhc3MgU2Vzc2lvbkNyZWF0ZUVycm9yIGV4dGVuZHMgU2Vzc2lvbkVycm9yIHt9XG5cbi8qKlxuICogTG9naW4gcmVxdWlyZWQgZXJyb3JcbiAqIFRocm93biB3aGVuIGFuIGF1dGhlbnRpY2F0ZWQgb3BlcmF0aW9uIGlzIGF0dGVtcHRlZCB3aXRob3V0IGxvZ2luXG4gKi9cbmV4cG9ydCBjbGFzcyBMb2dpblJlcXVpcmVkRXJyb3IgZXh0ZW5kcyBTZXNzaW9uRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlID0gJ0xvZ2luIGlzIHJlcXVpcmVkIGZvciB0aGlzIG9wZXJhdGlvbicpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBXaWtpZG90RXJyb3IgfSBmcm9tICcuL2Jhc2UnO1xuXG4vKipcbiAqIFJlc291cmNlIG5vdCBmb3VuZCBlcnJvclxuICogVGhyb3duIHdoZW4gdGhlIHJlcXVlc3RlZCByZXNvdXJjZSBkb2VzIG5vdCBleGlzdFxuICovXG5leHBvcnQgY2xhc3MgTm90Rm91bmRFeGNlcHRpb24gZXh0ZW5kcyBXaWtpZG90RXJyb3Ige31cblxuLyoqXG4gKiBSZXNvdXJjZSBhbHJlYWR5IGV4aXN0cyBlcnJvclxuICogVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBjcmVhdGUgYSByZXNvdXJjZSB0aGF0IGFscmVhZHkgZXhpc3RzXG4gKi9cbmV4cG9ydCBjbGFzcyBUYXJnZXRFeGlzdHNFcnJvciBleHRlbmRzIFdpa2lkb3RFcnJvciB7fVxuXG4vKipcbiAqIFRhcmdldCBzdGF0ZSBlcnJvclxuICogVGhyb3duIHdoZW4gYSByZXNvdXJjZSBpcyBpbiBhbiBpbm9wZXJhYmxlIHN0YXRlIChlLmcuLCBsb2NrZWQpXG4gKi9cbmV4cG9ydCBjbGFzcyBUYXJnZXRFcnJvciBleHRlbmRzIFdpa2lkb3RFcnJvciB7fVxuXG4vKipcbiAqIEFjY2VzcyBkZW5pZWQgZXJyb3JcbiAqIFRocm93biB3aGVuIGFuIG9wZXJhdGlvbiBpcyBkZW5pZWQgZHVlIHRvIGluc3VmZmljaWVudCBwZXJtaXNzaW9uc1xuICovXG5leHBvcnQgY2xhc3MgRm9yYmlkZGVuRXJyb3IgZXh0ZW5kcyBXaWtpZG90RXJyb3Ige31cblxuLyoqXG4gKiBIVE1MIGVsZW1lbnQgbm90IGZvdW5kIGVycm9yXG4gKiBUaHJvd24gd2hlbiBhIHJlcXVpcmVkIGVsZW1lbnQgaXMgbm90IGZvdW5kIGR1cmluZyBwYXJzaW5nXG4gKi9cbmV4cG9ydCBjbGFzcyBOb0VsZW1lbnRFcnJvciBleHRlbmRzIFdpa2lkb3RFcnJvciB7fVxuIiwKICAgICIvLyBCYXNlIGVycm9yc1xuXG4vLyBBTUMgZXJyb3JzXG5leHBvcnQgeyBBTUNFcnJvciwgQU1DSHR0cEVycm9yLCBSZXNwb25zZURhdGFFcnJvciwgV2lraWRvdFN0YXR1c0Vycm9yIH0gZnJvbSAnLi9hbWMnO1xuZXhwb3J0IHsgVW5leHBlY3RlZEVycm9yLCBXaWtpZG90RXJyb3IgfSBmcm9tICcuL2Jhc2UnO1xuLy8gU2Vzc2lvbiBlcnJvcnNcbmV4cG9ydCB7IExvZ2luUmVxdWlyZWRFcnJvciwgU2Vzc2lvbkNyZWF0ZUVycm9yLCBTZXNzaW9uRXJyb3IgfSBmcm9tICcuL3Nlc3Npb24nO1xuXG4vLyBUYXJnZXQgZXJyb3JzXG5leHBvcnQge1xuICBGb3JiaWRkZW5FcnJvcixcbiAgTm9FbGVtZW50RXJyb3IsXG4gIE5vdEZvdW5kRXhjZXB0aW9uLFxuICBUYXJnZXRFcnJvcixcbiAgVGFyZ2V0RXhpc3RzRXJyb3IsXG59IGZyb20gJy4vdGFyZ2V0JztcbiIsCiAgICAiLyoqXG4gKiBNb2R1bGUgcHJvdmlkaW5nIGxvZ2dpbmcgZnVuY3Rpb25hbGl0eVxuICpcbiAqIFRoaXMgbW9kdWxlIGNvbmZpZ3VyZXMgYW5kIHByb3ZpZGVzIGxvZ2dlcnMgdXNlZCB0aHJvdWdob3V0IHRoZSBsaWJyYXJ5LlxuICogQnkgZGVmYXVsdCwgaXQgZG9lcyBub3Qgb3V0cHV0IGFueXRoaW5nLCBhbGxvd2luZyBhcHBsaWNhdGlvbi1zaWRlIGxvZyBjb250cm9sLlxuICovXG5cbi8qKlxuICogTG9nIGxldmVsXG4gKi9cbmV4cG9ydCB0eXBlIExvZ0xldmVsID0gJ2RlYnVnJyB8ICdpbmZvJyB8ICd3YXJuJyB8ICdlcnJvcic7XG5cbi8qKlxuICogTG9nIGxldmVsIHByaW9yaXR5IChoaWdoZXIgbnVtYmVyID0gbW9yZSBpbXBvcnRhbnQpXG4gKi9cbmNvbnN0IExPR19MRVZFTF9QUklPUklUWTogUmVjb3JkPExvZ0xldmVsLCBudW1iZXI+ID0ge1xuICBkZWJ1ZzogMCxcbiAgaW5mbzogMSxcbiAgd2FybjogMixcbiAgZXJyb3I6IDMsXG59O1xuXG4vKipcbiAqIExvZ2dlciBoYW5kbGVyXG4gKi9cbmV4cG9ydCB0eXBlIExvZ0hhbmRsZXIgPSAoXG4gIGxldmVsOiBMb2dMZXZlbCxcbiAgbmFtZTogc3RyaW5nLFxuICBtZXNzYWdlOiBzdHJpbmcsXG4gIC4uLmFyZ3M6IHVua25vd25bXVxuKSA9PiB2b2lkO1xuXG4vKipcbiAqIE51bGxIYW5kbGVyOiBPdXRwdXRzIG5vdGhpbmcgKGRlZmF1bHQpXG4gKi9cbmV4cG9ydCBjb25zdCBudWxsSGFuZGxlcjogTG9nSGFuZGxlciA9ICgpID0+IHtcbiAgLy8gRG8gbm90aGluZ1xufTtcblxuLyoqXG4gKiBDb25zb2xlSGFuZGxlcjogT3V0cHV0cyB0byBjb25zb2xlXG4gKi9cbmV4cG9ydCBjb25zdCBjb25zb2xlSGFuZGxlcjogTG9nSGFuZGxlciA9IChcbiAgbGV2ZWw6IExvZ0xldmVsLFxuICBuYW1lOiBzdHJpbmcsXG4gIG1lc3NhZ2U6IHN0cmluZyxcbiAgLi4uYXJnczogdW5rbm93bltdXG4pID0+IHtcbiAgY29uc3QgdGltZXN0YW1wID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICBjb25zdCBmb3JtYXR0ZWRNZXNzYWdlID0gYCR7dGltZXN0YW1wfSBbJHtuYW1lfS8ke2xldmVsLnRvVXBwZXJDYXNlKCl9XSAke21lc3NhZ2V9YDtcblxuICBzd2l0Y2ggKGxldmVsKSB7XG4gICAgY2FzZSAnZGVidWcnOlxuICAgICAgY29uc29sZS5kZWJ1Zyhmb3JtYXR0ZWRNZXNzYWdlLCAuLi5hcmdzKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2luZm8nOlxuICAgICAgY29uc29sZS5pbmZvKGZvcm1hdHRlZE1lc3NhZ2UsIC4uLmFyZ3MpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnd2Fybic6XG4gICAgICBjb25zb2xlLndhcm4oZm9ybWF0dGVkTWVzc2FnZSwgLi4uYXJncyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdlcnJvcic6XG4gICAgICBjb25zb2xlLmVycm9yKGZvcm1hdHRlZE1lc3NhZ2UsIC4uLmFyZ3MpO1xuICAgICAgYnJlYWs7XG4gIH1cbn07XG5cbi8qKlxuICogTG9nZ2VyIGNsYXNzXG4gKi9cbmV4cG9ydCBjbGFzcyBMb2dnZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSBoYW5kbGVyOiBMb2dIYW5kbGVyO1xuICBwcml2YXRlIGxldmVsOiBMb2dMZXZlbDtcblxuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIGhhbmRsZXI6IExvZ0hhbmRsZXIgPSBudWxsSGFuZGxlciwgbGV2ZWw6IExvZ0xldmVsID0gJ3dhcm4nKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmhhbmRsZXIgPSBoYW5kbGVyO1xuICAgIHRoaXMubGV2ZWwgPSBsZXZlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgaGFuZGxlclxuICAgKi9cbiAgc2V0SGFuZGxlcihoYW5kbGVyOiBMb2dIYW5kbGVyKTogdm9pZCB7XG4gICAgdGhpcy5oYW5kbGVyID0gaGFuZGxlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgbG9nIGxldmVsXG4gICAqL1xuICBzZXRMZXZlbChsZXZlbDogTG9nTGV2ZWwpOiB2b2lkIHtcbiAgICB0aGlzLmxldmVsID0gbGV2ZWw7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIHNwZWNpZmllZCBsZXZlbCBzaG91bGQgYmUgbG9nZ2VkXG4gICAqL1xuICBwcml2YXRlIHNob3VsZExvZyhsZXZlbDogTG9nTGV2ZWwpOiBib29sZWFuIHtcbiAgICByZXR1cm4gTE9HX0xFVkVMX1BSSU9SSVRZW2xldmVsXSA+PSBMT0dfTEVWRUxfUFJJT1JJVFlbdGhpcy5sZXZlbF07XG4gIH1cblxuICAvKipcbiAgICogT3V0cHV0IGxvZ1xuICAgKi9cbiAgcHJpdmF0ZSBsb2cobGV2ZWw6IExvZ0xldmVsLCBtZXNzYWdlOiBzdHJpbmcsIC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNob3VsZExvZyhsZXZlbCkpIHtcbiAgICAgIHRoaXMuaGFuZGxlcihsZXZlbCwgdGhpcy5uYW1lLCBtZXNzYWdlLCAuLi5hcmdzKTtcbiAgICB9XG4gIH1cblxuICBkZWJ1ZyhtZXNzYWdlOiBzdHJpbmcsIC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuICAgIHRoaXMubG9nKCdkZWJ1ZycsIG1lc3NhZ2UsIC4uLmFyZ3MpO1xuICB9XG5cbiAgaW5mbyhtZXNzYWdlOiBzdHJpbmcsIC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuICAgIHRoaXMubG9nKCdpbmZvJywgbWVzc2FnZSwgLi4uYXJncyk7XG4gIH1cblxuICB3YXJuKG1lc3NhZ2U6IHN0cmluZywgLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgdGhpcy5sb2coJ3dhcm4nLCBtZXNzYWdlLCAuLi5hcmdzKTtcbiAgfVxuXG4gIGVycm9yKG1lc3NhZ2U6IHN0cmluZywgLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgdGhpcy5sb2coJ2Vycm9yJywgbWVzc2FnZSwgLi4uYXJncyk7XG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgbG9nZ2VyXG4gKiBAcGFyYW0gbmFtZSAtIExvZ2dlciBuYW1lIChkZWZhdWx0OiBcIndpa2lkb3RcIilcbiAqIEByZXR1cm5zIExvZ2dlciBpbnN0YW5jZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TG9nZ2VyKG5hbWUgPSAnd2lraWRvdCcpOiBMb2dnZXIge1xuICByZXR1cm4gbmV3IExvZ2dlcihuYW1lKTtcbn1cblxuLyoqXG4gKiBTZXR1cCBjb25zb2xlIG91dHB1dCBoYW5kbGVyXG4gKiBAcGFyYW0gbG9nZ2VyIC0gTG9nZ2VyIHRvIGNvbmZpZ3VyZVxuICogQHBhcmFtIGxldmVsIC0gTG9nIGxldmVsIChkZWZhdWx0OiBcIndhcm5cIilcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldHVwQ29uc29sZUhhbmRsZXIobG9nZ2VyOiBMb2dnZXIsIGxldmVsOiBMb2dMZXZlbCA9ICd3YXJuJyk6IHZvaWQge1xuICBsb2dnZXIuc2V0SGFuZGxlcihjb25zb2xlSGFuZGxlcik7XG4gIGxvZ2dlci5zZXRMZXZlbChsZXZlbCk7XG59XG5cbi8qKlxuICogRGVmYXVsdCBsb2dnZXIgdXNlZCB0aHJvdWdob3V0IHRoZSBwYWNrYWdlXG4gKi9cbmV4cG9ydCBjb25zdCBsb2dnZXI6IExvZ2dlciA9IGdldExvZ2dlcigpO1xuIiwKICAgICJpbXBvcnQgeyBlcnIsIGVyckFzeW5jLCBvaywgb2tBc3luYywgdHlwZSBSZXN1bHQsIFJlc3VsdEFzeW5jIH0gZnJvbSAnbmV2ZXJ0aHJvdyc7XG5pbXBvcnQgdHlwZSB7IFdpa2lkb3RFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbi8qKiBTeW5jaHJvbm91cyBSZXN1bHQgdHlwZSBhbGlhcyAqL1xuZXhwb3J0IHR5cGUgV2lraWRvdFJlc3VsdDxUPiA9IFJlc3VsdDxULCBXaWtpZG90RXJyb3I+O1xuXG4vKiogQXN5bmNocm9ub3VzIFJlc3VsdCB0eXBlIGFsaWFzICovXG5leHBvcnQgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmM8VD4gPSBSZXN1bHRBc3luYzxULCBXaWtpZG90RXJyb3I+O1xuXG4vKiogQ3JlYXRlIHN1Y2Nlc3MgUmVzdWx0ICovXG5leHBvcnQgY29uc3Qgd2RPayA9IDxUPih2YWx1ZTogVCk6IFdpa2lkb3RSZXN1bHQ8VD4gPT4gb2sodmFsdWUpO1xuXG4vKiogQ3JlYXRlIGVycm9yIFJlc3VsdCAqL1xuZXhwb3J0IGNvbnN0IHdkRXJyID0gPEUgZXh0ZW5kcyBXaWtpZG90RXJyb3I+KGVycm9yOiBFKTogV2lraWRvdFJlc3VsdDxuZXZlcj4gPT4gZXJyKGVycm9yKTtcblxuLyoqIENyZWF0ZSBzdWNjZXNzIFJlc3VsdEFzeW5jICovXG5leHBvcnQgY29uc3Qgd2RPa0FzeW5jID0gPFQ+KHZhbHVlOiBUKTogV2lraWRvdFJlc3VsdEFzeW5jPFQ+ID0+IG9rQXN5bmModmFsdWUpO1xuXG4vKiogQ3JlYXRlIGVycm9yIFJlc3VsdEFzeW5jICovXG5leHBvcnQgY29uc3Qgd2RFcnJBc3luYyA9IDxFIGV4dGVuZHMgV2lraWRvdEVycm9yPihlcnJvcjogRSk6IFdpa2lkb3RSZXN1bHRBc3luYzxuZXZlcj4gPT5cbiAgZXJyQXN5bmMoZXJyb3IpO1xuXG4vKiogQ29udmVydCBmcm9tIFByb21pc2UgKi9cbmV4cG9ydCBjb25zdCBmcm9tUHJvbWlzZSA9IDxUPihcbiAgcHJvbWlzZTogUHJvbWlzZTxUPixcbiAgZXJyb3JNYXBwZXI6IChlcnJvcjogdW5rbm93bikgPT4gV2lraWRvdEVycm9yXG4pOiBXaWtpZG90UmVzdWx0QXN5bmM8VD4gPT4gUmVzdWx0QXN5bmMuZnJvbVByb21pc2UocHJvbWlzZSwgZXJyb3JNYXBwZXIpO1xuXG4vKiogQ29tYmluZSBtdWx0aXBsZSBSZXN1bHRBc3luYyAqL1xuZXhwb3J0IGNvbnN0IGNvbWJpbmVSZXN1bHRzID0gPFQ+KHJlc3VsdHM6IFdpa2lkb3RSZXN1bHRBc3luYzxUPltdKTogV2lraWRvdFJlc3VsdEFzeW5jPFRbXT4gPT5cbiAgUmVzdWx0QXN5bmMuY29tYmluZShyZXN1bHRzKTtcbiIsCiAgICAiZXhwb3J0ICogZnJvbSAnLi9jb21tb24nO1xuZXhwb3J0ICogZnJvbSAnLi9yZXN1bHQnO1xuIiwKICAgICIvKipcbiAqIEFqYXggTW9kdWxlIENvbm5lY3RvciBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQU1DQ29uZmlnIHtcbiAgLyoqIFJlcXVlc3QgdGltZW91dCAobWlsbGlzZWNvbmRzKSAqL1xuICB0aW1lb3V0OiBudW1iZXI7XG5cbiAgLyoqIE1heGltdW0gcmV0cnkgY291bnQgKi9cbiAgcmV0cnlMaW1pdDogbnVtYmVyO1xuXG4gIC8qKiBCYXNlIHJldHJ5IGludGVydmFsIChtaWxsaXNlY29uZHMpICovXG4gIHJldHJ5SW50ZXJ2YWw6IG51bWJlcjtcblxuICAvKiogTWF4aW11bSBiYWNrb2ZmIChtaWxsaXNlY29uZHMpICovXG4gIG1heEJhY2tvZmY6IG51bWJlcjtcblxuICAvKiogQmFja29mZiBmYWN0b3IgKi9cbiAgYmFja29mZkZhY3RvcjogbnVtYmVyO1xuXG4gIC8qKiBNYXhpbXVtIGNvbmN1cnJlbnQgcmVxdWVzdHMgKi9cbiAgc2VtYXBob3JlTGltaXQ6IG51bWJlcjtcbn1cblxuLyoqIERlZmF1bHQgQU1DIGNvbmZpZ3VyYXRpb24gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0FNQ19DT05GSUc6IEFNQ0NvbmZpZyA9IHtcbiAgdGltZW91dDogMjAwMDAsXG4gIHJldHJ5TGltaXQ6IDUsXG4gIHJldHJ5SW50ZXJ2YWw6IDEwMDAsXG4gIG1heEJhY2tvZmY6IDYwMDAwLFxuICBiYWNrb2ZmRmFjdG9yOiAyLjAsXG4gIHNlbWFwaG9yZUxpbWl0OiAxMCxcbn07XG5cbi8qKlxuICogRml4ZWQgdG9rZW4gdmFsdWUgcmVxdWlyZWQgYnkgV2lraWRvdFxuICogVGhpcyBpcyBhIGZpeGVkIHZhbHVlIG9idGFpbmVkIGZyb20gV2lraWRvdCdzIGZyb250ZW5kLFxuICogdXNlZCBhcyBhbiBpZGVudGlmaWVyIHJhdGhlciB0aGFuIGEgc2VjdXJpdHkgdG9rZW5cbiAqL1xuZXhwb3J0IGNvbnN0IFdJS0lET1RfVE9LRU43ID0gJzEyMzQ1Nic7XG5cbi8qKlxuICogRmFsbGJhY2sgSFRUUCBzdGF0dXMgY29kZSBmb3IgSFRUUCBlcnJvcnNcbiAqIFVzZWQgd2hlbiBzdGF0dXMgY29kZSBjYW5ub3QgYmUgcmV0cmlldmVkIGZyb20gcmVzcG9uc2VcbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfSFRUUF9TVEFUVVNfQ09ERSA9IDk5OTtcbiIsCiAgICAiLyoqXG4gKiBIVFRQIHV0aWxpdGllcyB3aXRoIHJldHJ5IG1lY2hhbmlzbVxuICovXG5pbXBvcnQgdHlwZSB7IEFNQ0NvbmZpZyB9IGZyb20gJy4uL2Nvbm5lY3Rvci9hbWMtY29uZmlnJztcbmltcG9ydCB7IERFRkFVTFRfQU1DX0NPTkZJRyB9IGZyb20gJy4uL2Nvbm5lY3Rvci9hbWMtY29uZmlnJztcblxuLyoqXG4gKiBDYWxjdWxhdGUgYmFja29mZiB0aW1lIHdpdGggZXhwb25lbnRpYWwgYmFja29mZiBhbmQgaml0dGVyXG4gKiBAcGFyYW0gcmV0cnlDb3VudCAtIEN1cnJlbnQgcmV0cnkgY291bnQgKDEtYmFzZWQpXG4gKiBAcGFyYW0gYmFzZUludGVydmFsIC0gQmFzZSBpbnRlcnZhbCBpbiBtaWxsaXNlY29uZHNcbiAqIEBwYXJhbSBiYWNrb2ZmRmFjdG9yIC0gRXhwb25lbnRpYWwgYmFja29mZiBmYWN0b3JcbiAqIEBwYXJhbSBtYXhCYWNrb2ZmIC0gTWF4aW11bSBiYWNrb2ZmIHRpbWUgaW4gbWlsbGlzZWNvbmRzXG4gKiBAcmV0dXJucyBCYWNrb2ZmIHRpbWUgaW4gbWlsbGlzZWNvbmRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVCYWNrb2ZmKFxuICByZXRyeUNvdW50OiBudW1iZXIsXG4gIGJhc2VJbnRlcnZhbDogbnVtYmVyLFxuICBiYWNrb2ZmRmFjdG9yOiBudW1iZXIsXG4gIG1heEJhY2tvZmY6IG51bWJlclxuKTogbnVtYmVyIHtcbiAgY29uc3QgYmFja29mZiA9IGJhc2VJbnRlcnZhbCAqIGJhY2tvZmZGYWN0b3IgKiogKHJldHJ5Q291bnQgLSAxKTtcbiAgY29uc3Qgaml0dGVyID0gTWF0aC5yYW5kb20oKSAqIGJhY2tvZmYgKiAwLjE7XG4gIHJldHVybiBNYXRoLm1pbihiYWNrb2ZmICsgaml0dGVyLCBtYXhCYWNrb2ZmKTtcbn1cblxuLyoqXG4gKiBTbGVlcCBmb3Igc3BlY2lmaWVkIG1pbGxpc2Vjb25kc1xuICovXG5mdW5jdGlvbiBzbGVlcChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGZldGNoV2l0aFJldHJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmV0Y2hXaXRoUmV0cnlPcHRpb25zIGV4dGVuZHMgT21pdDxSZXF1ZXN0SW5pdCwgJ3NpZ25hbCc+IHtcbiAgLyoqIFdoZXRoZXIgdG8gY2hlY2sgcmVzcG9uc2Uub2sgKGRlZmF1bHQ6IHRydWUpICovXG4gIGNoZWNrT2s/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIEhUVFAgc3RhdHVzIGNvZGUgaXMgcmV0cnlhYmxlICg1eHggc2VydmVyIGVycm9ycylcbiAqL1xuZnVuY3Rpb24gaXNSZXRyeWFibGVTdGF0dXMoc3RhdHVzOiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIHN0YXR1cyA+PSA1MDAgJiYgc3RhdHVzIDwgNjAwO1xufVxuXG4vKipcbiAqIEZldGNoIHdpdGggYXV0b21hdGljIHJldHJ5IG9uIHRpbWVvdXQvbmV0d29yayBlcnJvcnMgYW5kIDV4eCBlcnJvcnNcbiAqIEBwYXJhbSB1cmwgLSBVUkwgdG8gZmV0Y2hcbiAqIEBwYXJhbSBjb25maWcgLSBBTUMgY29uZmlndXJhdGlvbiAodXNlcyB0aW1lb3V0LCByZXRyeUxpbWl0LCByZXRyeUludGVydmFsLCBtYXhCYWNrb2ZmLCBiYWNrb2ZmRmFjdG9yKVxuICogQHBhcmFtIG9wdGlvbnMgLSBGZXRjaCBvcHRpb25zIChSZXF1ZXN0SW5pdCB3aXRob3V0IHNpZ25hbClcbiAqIEByZXR1cm5zIFJlc3BvbnNlXG4gKiBAdGhyb3dzIEVycm9yIG9uIGFsbCByZXRyaWVzIGV4aGF1c3RlZCBvciBub24tcmV0cnlhYmxlIGVycm9ycyAoNHh4KVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hXaXRoUmV0cnkoXG4gIHVybDogc3RyaW5nLFxuICBjb25maWc6IEFNQ0NvbmZpZyA9IERFRkFVTFRfQU1DX0NPTkZJRyxcbiAgb3B0aW9uczogRmV0Y2hXaXRoUmV0cnlPcHRpb25zID0ge31cbik6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgY29uc3QgeyBjaGVja09rID0gdHJ1ZSwgLi4uZmV0Y2hPcHRpb25zIH0gPSBvcHRpb25zO1xuXG4gIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDwgY29uZmlnLnJldHJ5TGltaXQ7IGF0dGVtcHQrKykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgICAgICAuLi5mZXRjaE9wdGlvbnMsXG4gICAgICAgIHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dChjb25maWcudGltZW91dCksXG4gICAgICB9KTtcblxuICAgICAgLy8gRG9uJ3QgcmV0cnkgNHh4IGVycm9ycyAtIHRoZXkgYXJlIGNsaWVudCBlcnJvcnMgdGhhdCB3b24ndCBjaGFuZ2Ugb24gcmV0cnlcbiAgICAgIGlmIChjaGVja09rICYmICFyZXNwb25zZS5vaykge1xuICAgICAgICBpZiAoIWlzUmV0cnlhYmxlU3RhdHVzKHJlc3BvbnNlLnN0YXR1cykpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9OiAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNXh4IGVycm9ycyBhcmUgcmV0cnlhYmxlLCBjb250aW51ZSB0byByZXRyeSBsb2dpYyBiZWxvd1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9OiAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIERvbid0IHJldHJ5IGlmIGl0J3MgYSBub24tcmV0cnlhYmxlIEhUVFAgZXJyb3IgKDR4eClcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm1lc3NhZ2Uuc3RhcnRzV2l0aCgnSFRUUCA0JykpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoYXR0ZW1wdCA+PSBjb25maWcucmV0cnlMaW1pdCAtIDEpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBjb25zdCBiYWNrb2ZmID0gY2FsY3VsYXRlQmFja29mZihcbiAgICAgICAgYXR0ZW1wdCArIDEsXG4gICAgICAgIGNvbmZpZy5yZXRyeUludGVydmFsLFxuICAgICAgICBjb25maWcuYmFja29mZkZhY3RvcixcbiAgICAgICAgY29uZmlnLm1heEJhY2tvZmZcbiAgICAgICk7XG4gICAgICBhd2FpdCBzbGVlcChiYWNrb2ZmKTtcbiAgICB9XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdVbnJlYWNoYWJsZScpO1xufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IENsaWVudFJlZiB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RVc2VyLCBVc2VyVHlwZSB9IGZyb20gJy4vYWJzdHJhY3QtdXNlcic7XG5cbi8qKlxuICogQW5vbnltb3VzIHVzZXJcbiAqL1xuZXhwb3J0IGNsYXNzIEFub255bW91c1VzZXIgaW1wbGVtZW50cyBBYnN0cmFjdFVzZXIge1xuICBwdWJsaWMgcmVhZG9ubHkgY2xpZW50OiBDbGllbnRSZWY7XG5cbiAgLyoqIFVzZXIgSUQgKDAgZm9yIGFub255bW91cykgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlkOiBudW1iZXIgPSAwO1xuXG4gIC8qKiBVc2VybmFtZSAoXCJBbm9ueW1vdXNcIiBmb3IgYW5vbnltb3VzIHVzZXJzKSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nID0gJ0Fub255bW91cyc7XG5cbiAgLyoqIFVOSVggZm9ybWF0IHVzZXJuYW1lICovXG4gIHB1YmxpYyByZWFkb25seSB1bml4TmFtZTogc3RyaW5nID0gJ2Fub255bW91cyc7XG5cbiAgLyoqIEF2YXRhciBVUkwgKG51bGwgZm9yIGFub255bW91cykgKi9cbiAgcHVibGljIHJlYWRvbmx5IGF2YXRhclVybDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIElQIGFkZHJlc3MgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlwOiBzdHJpbmc7XG5cbiAgLyoqIFVzZXIgdHlwZSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdXNlclR5cGU6IFVzZXJUeXBlID0gJ2Fub255bW91cyc7XG5cbiAgY29uc3RydWN0b3IoY2xpZW50OiBDbGllbnRSZWYsIGlwOiBzdHJpbmcpIHtcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICB0aGlzLmlwID0gaXA7XG4gIH1cblxuICAvLyBBYnN0cmFjdFVzZXIgaW1wbGVtZW50YXRpb25cbiAgaXNVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpc0RlbGV0ZWRVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpc0Fub255bW91c1VzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaXNHdWVzdFVzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlzV2lraWRvdFVzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYEFub255bW91c1VzZXIobmFtZT0ke3RoaXMubmFtZX0sIHVuaXhOYW1lPSR7dGhpcy51bml4TmFtZX0sIGlwPSR7dGhpcy5pcH0pYDtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IENsaWVudFJlZiB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RVc2VyLCBVc2VyVHlwZSB9IGZyb20gJy4vYWJzdHJhY3QtdXNlcic7XG5cbi8qKlxuICogRGVsZXRlZCB1c2VyXG4gKi9cbmV4cG9ydCBjbGFzcyBEZWxldGVkVXNlciBpbXBsZW1lbnRzIEFic3RyYWN0VXNlciB7XG4gIHB1YmxpYyByZWFkb25seSBjbGllbnQ6IENsaWVudFJlZjtcblxuICAvKiogRGVsZXRlZCB1c2VyIElEICovXG4gIHB1YmxpYyByZWFkb25seSBpZDogbnVtYmVyO1xuXG4gIC8qKiBVc2VybmFtZSAoXCJhY2NvdW50IGRlbGV0ZWRcIiBmb3IgZGVsZXRlZCB1c2VycykgKi9cbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZyA9ICdhY2NvdW50IGRlbGV0ZWQnO1xuXG4gIC8qKiBVTklYIGZvcm1hdCB1c2VybmFtZSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdW5peE5hbWU6IHN0cmluZyA9ICdhY2NvdW50X2RlbGV0ZWQnO1xuXG4gIC8qKiBBdmF0YXIgVVJMIChudWxsIGZvciBkZWxldGVkKSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYXZhdGFyVXJsOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvKiogSVAgYWRkcmVzcyAobnVsbCBmb3IgZGVsZXRlZCkgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlwOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvKiogVXNlciB0eXBlICovXG4gIHB1YmxpYyByZWFkb25seSB1c2VyVHlwZTogVXNlclR5cGUgPSAnZGVsZXRlZCc7XG5cbiAgY29uc3RydWN0b3IoY2xpZW50OiBDbGllbnRSZWYsIGlkOiBudW1iZXIpIHtcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICB0aGlzLmlkID0gaWQ7XG4gIH1cblxuICAvLyBBYnN0cmFjdFVzZXIgaW1wbGVtZW50YXRpb25cbiAgaXNVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpc0RlbGV0ZWRVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlzQW5vbnltb3VzVXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaXNHdWVzdFVzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlzV2lraWRvdFVzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYERlbGV0ZWRVc2VyKGlkPSR7dGhpcy5pZH0sIG5hbWU9JHt0aGlzLm5hbWV9LCB1bml4TmFtZT0ke3RoaXMudW5peE5hbWV9KWA7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBDbGllbnRSZWYgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0VXNlciwgVXNlclR5cGUgfSBmcm9tICcuL2Fic3RyYWN0LXVzZXInO1xuXG4vKipcbiAqIEd1ZXN0IHVzZXJcbiAqL1xuZXhwb3J0IGNsYXNzIEd1ZXN0VXNlciBpbXBsZW1lbnRzIEFic3RyYWN0VXNlciB7XG4gIHB1YmxpYyByZWFkb25seSBjbGllbnQ6IENsaWVudFJlZjtcblxuICAvKiogVXNlciBJRCAoMCBmb3IgZ3Vlc3QpICovXG4gIHB1YmxpYyByZWFkb25seSBpZDogbnVtYmVyID0gMDtcblxuICAvKiogR3Vlc3QgbmFtZSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKiBVTklYIGZvcm1hdCB1c2VybmFtZSAobnVsbCBmb3IgZ3Vlc3QpICovXG4gIHB1YmxpYyByZWFkb25seSB1bml4TmFtZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIEF2YXRhciBVUkwgKG1heSBiZSBHcmF2YXRhcikgKi9cbiAgcHVibGljIHJlYWRvbmx5IGF2YXRhclVybDogc3RyaW5nIHwgbnVsbDtcblxuICAvKiogSVAgYWRkcmVzcyAobnVsbCBmb3IgZ3Vlc3QpICovXG4gIHB1YmxpYyByZWFkb25seSBpcDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIFVzZXIgdHlwZSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdXNlclR5cGU6IFVzZXJUeXBlID0gJ2d1ZXN0JztcblxuICBjb25zdHJ1Y3RvcihjbGllbnQ6IENsaWVudFJlZiwgbmFtZTogc3RyaW5nLCBhdmF0YXJVcmw6IHN0cmluZyB8IG51bGwgPSBudWxsKSB7XG4gICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmF2YXRhclVybCA9IGF2YXRhclVybDtcbiAgfVxuXG4gIC8vIEFic3RyYWN0VXNlciBpbXBsZW1lbnRhdGlvblxuICBpc1VzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlzRGVsZXRlZFVzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlzQW5vbnltb3VzVXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaXNHdWVzdFVzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaXNXaWtpZG90VXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgR3Vlc3RVc2VyKG5hbWU9JHt0aGlzLm5hbWV9KWA7XG4gIH1cbn1cbiIsCiAgICAiLyoqXG4gKiBNYXBwaW5nIHRhYmxlIGZvciBjb252ZXJ0aW5nIHNwZWNpYWwgc3ltYm9scyBhbmQgbm9uLUVuZ2xpc2ggYWxwaGFiZXRzIHRvIEVuZ2xpc2ggYWxwaGFiZXRzXG4gKlxuICogUHJvdmlkZXMgbWFwcGluZyBmb3IgY29udmVydGluZyBub24tQVNDSUkgY2hhcmFjdGVycyB0byBjb3JyZXNwb25kaW5nIEFTQ0lJIGNoYXJhY3RlcnMuXG4gKiBNYWlubHkgdXNlZCBmb3IgVVJMIGdlbmVyYXRpb24gYW5kIHBhZ2UgbmFtZSBjb252ZXJzaW9uIHRvIHVuaXggZm9ybWF0LlxuICovXG5cbmV4cG9ydCBjb25zdCBzcGVjaWFsQ2hhck1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgJ1xcdTAwQzAnOiAnYScsXG4gICdcXHUwMEMxJzogJ2EnLFxuICAnXFx1MDBDMic6ICdhJyxcbiAgJ1xcdTAwQzMnOiAnYScsXG4gICdcXHUwMEM0JzogJ2FlJyxcbiAgJ1xcdTAwQzUnOiAnYScsXG4gICdcXHUwMEM2JzogJ2FlJyxcbiAgJ1xcdTAwQzcnOiAnYycsXG4gICdcXHUwMEM4JzogJ2UnLFxuICAnXFx1MDBDOSc6ICdlJyxcbiAgJ1xcdTAwQ0EnOiAnZScsXG4gICdcXHUwMENCJzogJ2UnLFxuICAnXFx1MDBDQyc6ICdpJyxcbiAgJ1xcdTAwQ0QnOiAnaScsXG4gICdcXHUwMENFJzogJ2knLFxuICAnXFx1MDBDRic6ICdpJyxcbiAgJ1xcdTAwRDAnOiAnZCcsXG4gICdcXHUwMEQxJzogJ24nLFxuICAnXFx1MDBEMic6ICdvJyxcbiAgJ1xcdTAwRDMnOiAnbycsXG4gICdcXHUwMEQ0JzogJ28nLFxuICAnXFx1MDBENSc6ICdvJyxcbiAgJ1xcdTAwRDYnOiAnb2UnLFxuICAnXFx1MDBEOCc6ICdvJyxcbiAgJ1xcdTAwRDknOiAndScsXG4gICdcXHUwMERBJzogJ3UnLFxuICAnXFx1MDBEQic6ICd1JyxcbiAgJ1xcdTAwREMnOiAndWUnLFxuICAnXFx1MDBERCc6ICd5JyxcbiAgJ1xcdTAwREUnOiAndCcsXG4gICdcXHUwMERGJzogJ3NzJyxcbiAgJ1xcdTAwRTAnOiAnYScsXG4gICdcXHUwMEUxJzogJ2EnLFxuICAnXFx1MDBFMic6ICdhJyxcbiAgJ1xcdTAwRTMnOiAnYScsXG4gICdcXHUwMEU0JzogJ2FlJyxcbiAgJ1xcdTAwRTUnOiAnYScsXG4gICdcXHUwMEU2JzogJ2FlJyxcbiAgJ1xcdTAwRTcnOiAnYycsXG4gICdcXHUwMEU4JzogJ2UnLFxuICAnXFx1MDBFOSc6ICdlJyxcbiAgJ1xcdTAwRUEnOiAnZScsXG4gICdcXHUwMEVCJzogJ2UnLFxuICAnXFx1MDBFQyc6ICdpJyxcbiAgJ1xcdTAwRUQnOiAnaScsXG4gICdcXHUwMEVFJzogJ2knLFxuICAnXFx1MDBFRic6ICdpJyxcbiAgJ1xcdTAwRjAnOiAnZCcsXG4gICdcXHUwMEYxJzogJ24nLFxuICAnXFx1MDBGMic6ICdvJyxcbiAgJ1xcdTAwRjMnOiAnbycsXG4gICdcXHUwMEY0JzogJ28nLFxuICAnXFx1MDBGNSc6ICdvJyxcbiAgJ1xcdTAwRjYnOiAnb2UnLFxuICAnXFx1MDBGOCc6ICdvJyxcbiAgJ1xcdTAwRjknOiAndScsXG4gICdcXHUwMEZBJzogJ3UnLFxuICAnXFx1MDBGQic6ICd1JyxcbiAgJ1xcdTAwRkMnOiAndWUnLFxuICAnXFx1MDBGRCc6ICd5JyxcbiAgJ1xcdTAwRkUnOiAndCcsXG4gICdcXHUwMEZGJzogJ3knLFxuICAnXFx1MDEwMCc6ICdhJyxcbiAgJ1xcdTAxMDEnOiAnYScsXG4gICdcXHUwMTAyJzogJ2EnLFxuICAnXFx1MDEwMyc6ICdhJyxcbiAgJ1xcdTAxMDQnOiAnYScsXG4gICdcXHUwMTA1JzogJ2EnLFxuICAnXFx1MDEwNic6ICdjJyxcbiAgJ1xcdTAxMDcnOiAnYycsXG4gICdcXHUwMTA4JzogJ2MnLFxuICAnXFx1MDEwOSc6ICdjJyxcbiAgJ1xcdTAxMEEnOiAnYycsXG4gICdcXHUwMTBCJzogJ2MnLFxuICAnXFx1MDEwQyc6ICdjJyxcbiAgJ1xcdTAxMEQnOiAnYycsXG4gICdcXHUwMTBFJzogJ2QnLFxuICAnXFx1MDEwRic6ICdkJyxcbiAgJ1xcdTAxMTAnOiAnZCcsXG4gICdcXHUwMTExJzogJ2QnLFxuICAnXFx1MDExMic6ICdlJyxcbiAgJ1xcdTAxMTMnOiAnZScsXG4gICdcXHUwMTE0JzogJ2UnLFxuICAnXFx1MDExNSc6ICdlJyxcbiAgJ1xcdTAxMTYnOiAnZScsXG4gICdcXHUwMTE3JzogJ2UnLFxuICAnXFx1MDExOCc6ICdlJyxcbiAgJ1xcdTAxMTknOiAnZScsXG4gICdcXHUwMTFBJzogJ2UnLFxuICAnXFx1MDExQic6ICdlJyxcbiAgJ1xcdTAxMUMnOiAnZycsXG4gICdcXHUwMTFEJzogJ2cnLFxuICAnXFx1MDExRSc6ICdnJyxcbiAgJ1xcdTAxMUYnOiAnZycsXG4gICdcXHUwMTIwJzogJ2cnLFxuICAnXFx1MDEyMSc6ICdnJyxcbiAgJ1xcdTAxMjInOiAnZycsXG4gICdcXHUwMTIzJzogJ2cnLFxuICAnXFx1MDEyNCc6ICdoJyxcbiAgJ1xcdTAxMjUnOiAnaCcsXG4gICdcXHUwMTI2JzogJ2gnLFxuICAnXFx1MDEyNyc6ICdoJyxcbiAgJ1xcdTAxMjgnOiAnaScsXG4gICdcXHUwMTI5JzogJ2knLFxuICAnXFx1MDEyQSc6ICdpJyxcbiAgJ1xcdTAxMkInOiAnaScsXG4gICdcXHUwMTJDJzogJ2knLFxuICAnXFx1MDEyRCc6ICdpJyxcbiAgJ1xcdTAxMkUnOiAnaScsXG4gICdcXHUwMTJGJzogJ2knLFxuICAnXFx1MDEzMCc6ICdpJyxcbiAgJ1xcdTAxMzEnOiAnaScsXG4gICdcXHUwMTMyJzogJ2lqJyxcbiAgJ1xcdTAxMzMnOiAnaWonLFxuICAnXFx1MDEzNCc6ICdqJyxcbiAgJ1xcdTAxMzUnOiAnaicsXG4gICdcXHUwMTM2JzogJ2snLFxuICAnXFx1MDEzNyc6ICdrJyxcbiAgJ1xcdTAxMzgnOiAnaycsXG4gICdcXHUwMTM5JzogJ2wnLFxuICAnXFx1MDEzQSc6ICdsJyxcbiAgJ1xcdTAxM0InOiAnbCcsXG4gICdcXHUwMTNDJzogJ2wnLFxuICAnXFx1MDEzRCc6ICdsJyxcbiAgJ1xcdTAxM0UnOiAnbCcsXG4gICdcXHUwMTNGJzogJ2wnLFxuICAnXFx1MDE0MCc6ICdsJyxcbiAgJ1xcdTAxNDEnOiAnbCcsXG4gICdcXHUwMTQyJzogJ2wnLFxuICAnXFx1MDE0Myc6ICduJyxcbiAgJ1xcdTAxNDQnOiAnbicsXG4gICdcXHUwMTQ1JzogJ24nLFxuICAnXFx1MDE0Nic6ICduJyxcbiAgJ1xcdTAxNDcnOiAnbicsXG4gICdcXHUwMTQ4JzogJ24nLFxuICAnXFx1MDE0OSc6ICduJyxcbiAgJ1xcdTAxNEEnOiAnbicsXG4gICdcXHUwMTRCJzogJ24nLFxuICAnXFx1MDE0Qyc6ICdvJyxcbiAgJ1xcdTAxNEQnOiAnbycsXG4gICdcXHUwMTRFJzogJ28nLFxuICAnXFx1MDE0Ric6ICdvJyxcbiAgJ1xcdTAxNTAnOiAnbycsXG4gICdcXHUwMTUxJzogJ28nLFxuICAnXFx1MDE1Mic6ICdvZScsXG4gICdcXHUwMTUzJzogJ29lJyxcbiAgJ1xcdTAxNTQnOiAncicsXG4gICdcXHUwMTU1JzogJ3InLFxuICAnXFx1MDE1Nic6ICdyJyxcbiAgJ1xcdTAxNTcnOiAncicsXG4gICdcXHUwMTU4JzogJ3InLFxuICAnXFx1MDE1OSc6ICdyJyxcbiAgJ1xcdTAxNUEnOiAncycsXG4gICdcXHUwMTVCJzogJ3MnLFxuICAnXFx1MDE1Qyc6ICdzJyxcbiAgJ1xcdTAxNUQnOiAncycsXG4gICdcXHUwMTVFJzogJ3MnLFxuICAnXFx1MDE1Ric6ICdzJyxcbiAgJ1xcdTAxNjAnOiAncycsXG4gICdcXHUwMTYxJzogJ3MnLFxuICAnXFx1MDE2Mic6ICd0JyxcbiAgJ1xcdTAxNjMnOiAndCcsXG4gICdcXHUwMTY0JzogJ3QnLFxuICAnXFx1MDE2NSc6ICd0JyxcbiAgJ1xcdTAxNjYnOiAndCcsXG4gICdcXHUwMTY3JzogJ3QnLFxuICAnXFx1MDE2OCc6ICd1JyxcbiAgJ1xcdTAxNjknOiAndScsXG4gICdcXHUwMTZBJzogJ3UnLFxuICAnXFx1MDE2Qic6ICd1JyxcbiAgJ1xcdTAxNkMnOiAndScsXG4gICdcXHUwMTZEJzogJ3UnLFxuICAnXFx1MDE2RSc6ICd1JyxcbiAgJ1xcdTAxNkYnOiAndScsXG4gICdcXHUwMTcwJzogJ3UnLFxuICAnXFx1MDE3MSc6ICd1JyxcbiAgJ1xcdTAxNzInOiAndScsXG4gICdcXHUwMTczJzogJ3UnLFxuICAnXFx1MDE3NCc6ICd3JyxcbiAgJ1xcdTAxNzUnOiAndycsXG4gICdcXHUwMTc2JzogJ3knLFxuICAnXFx1MDE3Nyc6ICd5JyxcbiAgJ1xcdTAxNzgnOiAneScsXG4gICdcXHUwMTc5JzogJ3onLFxuICAnXFx1MDE3QSc6ICd6JyxcbiAgJ1xcdTAxN0InOiAneicsXG4gICdcXHUwMTdDJzogJ3onLFxuICAnXFx1MDE3RCc6ICd6JyxcbiAgJ1xcdTAxN0UnOiAneicsXG4gICdcXHUwMTdGJzogJ3NzJyxcbiAgJ1xcdTAxOTEnOiAnZicsXG4gICdcXHUwMTkyJzogJ2YnLFxuICAnXFx1MDIxOCc6ICdzJyxcbiAgJ1xcdTAyMTknOiAncycsXG4gICdcXHUwMjFBJzogJ3QnLFxuICAnXFx1MDIxQic6ICd0JyxcbiAgJ1xcdTAzODYnOiAnYScsXG4gICdcXHUwMzg4JzogJ2UnLFxuICAnXFx1MDM4OSc6ICdpJyxcbiAgJ1xcdTAzOEEnOiAnaScsXG4gICdcXHUwMzhDJzogJ28nLFxuICAnXFx1MDM4RSc6ICd5JyxcbiAgJ1xcdTAzOEYnOiAnbycsXG4gICdcXHUwMzkwJzogJ2knLFxuICAnXFx1MDM5MSc6ICdhJyxcbiAgJ1xcdTAzOTInOiAndicsXG4gICdcXHUwMzkzJzogJ2cnLFxuICAnXFx1MDM5NCc6ICdkJyxcbiAgJ1xcdTAzOTUnOiAnZScsXG4gICdcXHUwMzk2JzogJ3onLFxuICAnXFx1MDM5Nyc6ICdpJyxcbiAgJ1xcdTAzOTgnOiAndGgnLFxuICAnXFx1MDM5OSc6ICdpJyxcbiAgJ1xcdTAzOUEnOiAnaycsXG4gICdcXHUwMzlCJzogJ2wnLFxuICAnXFx1MDM5Qyc6ICdtJyxcbiAgJ1xcdTAzOUQnOiAnbicsXG4gICdcXHUwMzlFJzogJ3gnLFxuICAnXFx1MDM5Ric6ICdvJyxcbiAgJ1xcdTAzQTAnOiAncCcsXG4gICdcXHUwM0ExJzogJ3InLFxuICAnXFx1MDNBMyc6ICdzJyxcbiAgJ1xcdTAzQTQnOiAndCcsXG4gICdcXHUwM0E1JzogJ3knLFxuICAnXFx1MDNBNic6ICdmJyxcbiAgJ1xcdTAzQTcnOiAnY2gnLFxuICAnXFx1MDNBOCc6ICdwcycsXG4gICdcXHUwM0E5JzogJ28nLFxuICAnXFx1MDNBQSc6ICdpJyxcbiAgJ1xcdTAzQUInOiAneScsXG4gICdcXHUwM0FDJzogJ2EnLFxuICAnXFx1MDNBRCc6ICdlJyxcbiAgJ1xcdTAzQUUnOiAnaScsXG4gICdcXHUwM0FGJzogJ2knLFxuICAnXFx1MDNCMCc6ICd5JyxcbiAgJ1xcdTAzQjEnOiAnYScsXG4gICdcXHUwM0IyJzogJ3YnLFxuICAnXFx1MDNCMyc6ICdnJyxcbiAgJ1xcdTAzQjQnOiAnZCcsXG4gICdcXHUwM0I1JzogJ2UnLFxuICAnXFx1MDNCNic6ICd6JyxcbiAgJ1xcdTAzQjcnOiAnaScsXG4gICdcXHUwM0I4JzogJ3RoJyxcbiAgJ1xcdTAzQjknOiAnaScsXG4gICdcXHUwM0JBJzogJ2snLFxuICAnXFx1MDNCQic6ICdsJyxcbiAgJ1xcdTAzQkMnOiAnbScsXG4gICdcXHUwM0JEJzogJ24nLFxuICAnXFx1MDNCRSc6ICd4JyxcbiAgJ1xcdTAzQkYnOiAnbycsXG4gICdcXHUwM0MwJzogJ3AnLFxuICAnXFx1MDNDMSc6ICdyJyxcbiAgJ1xcdTAzQzInOiAncycsXG4gICdcXHUwM0MzJzogJ3MnLFxuICAnXFx1MDNDNCc6ICd0JyxcbiAgJ1xcdTAzQzUnOiAneScsXG4gICdcXHUwM0M2JzogJ2YnLFxuICAnXFx1MDNDNyc6ICdjaCcsXG4gICdcXHUwM0M4JzogJ3BzJyxcbiAgJ1xcdTAzQzknOiAnbycsXG4gICdcXHUwM0NBJzogJ2knLFxuICAnXFx1MDNDQic6ICd5JyxcbiAgJ1xcdTAzQ0MnOiAnbycsXG4gICdcXHUwM0NEJzogJ3knLFxuICAnXFx1MDNDRSc6ICdvJyxcbiAgJ1xcdTAzRDEnOiAndGgnLFxuICAnXFx1MDQwMSc6ICdlJyxcbiAgJ1xcdTA0MDInOiAnZCcsXG4gICdcXHUwNDAzJzogJ2cnLFxuICAnXFx1MDQwNCc6ICdlJyxcbiAgJ1xcdTA0MDUnOiAneicsXG4gICdcXHUwNDA2JzogJ2knLFxuICAnXFx1MDQwNyc6ICdpJyxcbiAgJ1xcdTA0MDgnOiAnaicsXG4gICdcXHUwNDA5JzogJ2wnLFxuICAnXFx1MDQwQSc6ICduJyxcbiAgJ1xcdTA0MEInOiAnYycsXG4gICdcXHUwNDBDJzogJ2snLFxuICAnXFx1MDQwRSc6ICd1JyxcbiAgJ1xcdTA0MEYnOiAnZCcsXG4gICdcXHUwNDEwJzogJ2EnLFxuICAnXFx1MDQxMSc6ICdiJyxcbiAgJ1xcdTA0MTInOiAndicsXG4gICdcXHUwNDEzJzogJ2cnLFxuICAnXFx1MDQxNCc6ICdkJyxcbiAgJ1xcdTA0MTUnOiAnZScsXG4gICdcXHUwNDE2JzogJ3onLFxuICAnXFx1MDQxNyc6ICd6JyxcbiAgJ1xcdTA0MTgnOiAnaScsXG4gICdcXHUwNDE5JzogJ2onLFxuICAnXFx1MDQxQSc6ICdrJyxcbiAgJ1xcdTA0MUInOiAnbCcsXG4gICdcXHUwNDFDJzogJ20nLFxuICAnXFx1MDQxRCc6ICduJyxcbiAgJ1xcdTA0MUUnOiAnbycsXG4gICdcXHUwNDFGJzogJ3AnLFxuICAnXFx1MDQyMCc6ICdyJyxcbiAgJ1xcdTA0MjEnOiAncycsXG4gICdcXHUwNDIyJzogJ3QnLFxuICAnXFx1MDQyMyc6ICd1JyxcbiAgJ1xcdTA0MjQnOiAnZicsXG4gICdcXHUwNDI1JzogJ2gnLFxuICAnXFx1MDQyNic6ICdjJyxcbiAgJ1xcdTA0MjcnOiAnYycsXG4gICdcXHUwNDI4JzogJ3MnLFxuICAnXFx1MDQyOSc6ICdzJyxcbiAgJ1xcdTA0MkInOiAneScsXG4gICdcXHUwNDJEJzogJ2UnLFxuICAnXFx1MDQyRSc6ICd1JyxcbiAgJ1xcdTA0MkYnOiAnYScsXG4gICdcXHUwNDMwJzogJ2EnLFxuICAnXFx1MDQzMSc6ICdiJyxcbiAgJ1xcdTA0MzInOiAndicsXG4gICdcXHUwNDMzJzogJ2cnLFxuICAnXFx1MDQzNCc6ICdkJyxcbiAgJ1xcdTA0MzUnOiAnZScsXG4gICdcXHUwNDM2JzogJ3onLFxuICAnXFx1MDQzNyc6ICd6JyxcbiAgJ1xcdTA0MzgnOiAnaScsXG4gICdcXHUwNDM5JzogJ2onLFxuICAnXFx1MDQzQSc6ICdrJyxcbiAgJ1xcdTA0M0InOiAnbCcsXG4gICdcXHUwNDNDJzogJ20nLFxuICAnXFx1MDQzRCc6ICduJyxcbiAgJ1xcdTA0M0UnOiAnbycsXG4gICdcXHUwNDNGJzogJ3AnLFxuICAnXFx1MDQ0MCc6ICdyJyxcbiAgJ1xcdTA0NDEnOiAncycsXG4gICdcXHUwNDQyJzogJ3QnLFxuICAnXFx1MDQ0Myc6ICd1JyxcbiAgJ1xcdTA0NDQnOiAnZicsXG4gICdcXHUwNDQ1JzogJ2gnLFxuICAnXFx1MDQ0Nic6ICdjJyxcbiAgJ1xcdTA0NDcnOiAnYycsXG4gICdcXHUwNDQ4JzogJ3MnLFxuICAnXFx1MDQ0OSc6ICdzJyxcbiAgJ1xcdTA0NEInOiAneScsXG4gICdcXHUwNDREJzogJ2UnLFxuICAnXFx1MDQ0RSc6ICd1JyxcbiAgJ1xcdTA0NEYnOiAnYScsXG4gICdcXHUwNDUxJzogJ2UnLFxuICAnXFx1MDQ1Mic6ICdkJyxcbiAgJ1xcdTA0NTMnOiAnZycsXG4gICdcXHUwNDU0JzogJ2UnLFxuICAnXFx1MDQ1NSc6ICd6JyxcbiAgJ1xcdTA0NTYnOiAnaScsXG4gICdcXHUwNDU3JzogJ2knLFxuICAnXFx1MDQ1OCc6ICdqJyxcbiAgJ1xcdTA0NTknOiAnbCcsXG4gICdcXHUwNDVBJzogJ24nLFxuICAnXFx1MDQ1Qic6ICdjJyxcbiAgJ1xcdTA0NUMnOiAnaycsXG4gICdcXHUwNDVFJzogJ3UnLFxuICAnXFx1MDQ1Ric6ICdkJyxcbiAgJ1xcdTA0NjInOiAnZScsXG4gICdcXHUwNDYzJzogJ2UnLFxuICAnXFx1MDQ2QSc6ICdhJyxcbiAgJ1xcdTA0NkInOiAnYScsXG4gICdcXHUwNDcyJzogJ2YnLFxuICAnXFx1MDQ3Myc6ICdmJyxcbiAgJ1xcdTA0NzQnOiAneScsXG4gICdcXHUwNDc1JzogJ3knLFxuICAnXFx1MDQ5MCc6ICdnJyxcbiAgJ1xcdTA0OTEnOiAnZycsXG4gICdcXHUwNDkyJzogJ2cnLFxuICAnXFx1MDQ5Myc6ICdnJyxcbiAgJ1xcdTA0OTQnOiAnZycsXG4gICdcXHUwNDk1JzogJ2cnLFxuICAnXFx1MDQ5Nic6ICd6JyxcbiAgJ1xcdTA0OTcnOiAneicsXG4gICdcXHUwNDlBJzogJ2snLFxuICAnXFx1MDQ5Qic6ICdrJyxcbiAgJ1xcdTA0OUMnOiAnaycsXG4gICdcXHUwNDlEJzogJ2snLFxuICAnXFx1MDQ5RSc6ICdrJyxcbiAgJ1xcdTA0OUYnOiAnaycsXG4gICdcXHUwNEEwJzogJ2snLFxuICAnXFx1MDRBMSc6ICdrJyxcbiAgJ1xcdTA0QTInOiAnbicsXG4gICdcXHUwNEEzJzogJ24nLFxuICAnXFx1MDRBNCc6ICduJyxcbiAgJ1xcdTA0QTUnOiAnbicsXG4gICdcXHUwNEE2JzogJ3AnLFxuICAnXFx1MDRBNyc6ICdwJyxcbiAgJ1xcdTA0QTgnOiAnbycsXG4gICdcXHUwNEE5JzogJ28nLFxuICAnXFx1MDRBQSc6ICdzJyxcbiAgJ1xcdTA0QUInOiAncycsXG4gICdcXHUwNEFDJzogJ3QnLFxuICAnXFx1MDRBRCc6ICd0JyxcbiAgJ1xcdTA0QUUnOiAndScsXG4gICdcXHUwNEFGJzogJ3UnLFxuICAnXFx1MDRCMCc6ICd1JyxcbiAgJ1xcdTA0QjEnOiAndScsXG4gICdcXHUwNEIyJzogJ2gnLFxuICAnXFx1MDRCMyc6ICdoJyxcbiAgJ1xcdTA0QjQnOiAnYycsXG4gICdcXHUwNEI1JzogJ2MnLFxuICAnXFx1MDRCNic6ICdjJyxcbiAgJ1xcdTA0QjcnOiAnYycsXG4gICdcXHUwNEI4JzogJ2MnLFxuICAnXFx1MDRCOSc6ICdjJyxcbiAgJ1xcdTA0QkEnOiAnaCcsXG4gICdcXHUwNEJCJzogJ2gnLFxuICAnXFx1MDRCQyc6ICdjJyxcbiAgJ1xcdTA0QkQnOiAnYycsXG4gICdcXHUwNEJFJzogJ2MnLFxuICAnXFx1MDRCRic6ICdjJyxcbiAgJ1xcdTA0QzEnOiAneicsXG4gICdcXHUwNEMyJzogJ3onLFxuICAnXFx1MDRDMyc6ICdrJyxcbiAgJ1xcdTA0QzQnOiAnaycsXG4gICdcXHUwNEM1JzogJ2wnLFxuICAnXFx1MDRDNic6ICdsJyxcbiAgJ1xcdTA0QzcnOiAnbicsXG4gICdcXHUwNEM4JzogJ24nLFxuICAnXFx1MDRDOSc6ICduJyxcbiAgJ1xcdTA0Q0EnOiAnbicsXG4gICdcXHUwNENCJzogJ2MnLFxuICAnXFx1MDRDQyc6ICdjJyxcbiAgJ1xcdTA0RDAnOiAnYScsXG4gICdcXHUwNEQxJzogJ2EnLFxuICAnXFx1MDREMic6ICdhJyxcbiAgJ1xcdTA0RDMnOiAnYScsXG4gICdcXHUwNEQ0JzogJ2FlJyxcbiAgJ1xcdTA0RDUnOiAnYWUnLFxuICAnXFx1MDRENic6ICdlJyxcbiAgJ1xcdTA0RDcnOiAnZScsXG4gICdcXHUwNEQ4JzogJ2EnLFxuICAnXFx1MDREOSc6ICdhJyxcbiAgJ1xcdTA0REEnOiAnYScsXG4gICdcXHUwNERCJzogJ2EnLFxuICAnXFx1MDREQyc6ICd6JyxcbiAgJ1xcdTA0REQnOiAneicsXG4gICdcXHUwNERFJzogJ3onLFxuICAnXFx1MDRERic6ICd6JyxcbiAgJ1xcdTA0RTAnOiAneicsXG4gICdcXHUwNEUxJzogJ3onLFxuICAnXFx1MDRFMic6ICdpJyxcbiAgJ1xcdTA0RTMnOiAnaScsXG4gICdcXHUwNEU0JzogJ2knLFxuICAnXFx1MDRFNSc6ICdpJyxcbiAgJ1xcdTA0RTYnOiAnbycsXG4gICdcXHUwNEU3JzogJ28nLFxuICAnXFx1MDRFOCc6ICdvJyxcbiAgJ1xcdTA0RTknOiAnbycsXG4gICdcXHUwNEVBJzogJ28nLFxuICAnXFx1MDRFQic6ICdvJyxcbiAgJ1xcdTA0RUUnOiAndScsXG4gICdcXHUwNEVGJzogJ3UnLFxuICAnXFx1MDRGMCc6ICd1JyxcbiAgJ1xcdTA0RjEnOiAndScsXG4gICdcXHUwNEYyJzogJ3UnLFxuICAnXFx1MDRGMyc6ICd1JyxcbiAgJ1xcdTA0RjQnOiAnYycsXG4gICdcXHUwNEY1JzogJ2MnLFxuICAnXFx1MDRGOCc6ICd5JyxcbiAgJ1xcdTA0RjknOiAneScsXG4gICdcXHUwNTBBJzogJ24nLFxuICAnXFx1MDUwQic6ICduJyxcbiAgJ1xcdTA1MEUnOiAndCcsXG4gICdcXHUwNTBGJzogJ3QnLFxuICAnXFx1MDUxQSc6ICdxJyxcbiAgJ1xcdTA1MUInOiAncScsXG4gICdcXHUwNTFDJzogJ3cnLFxuICAnXFx1MDUxRCc6ICd3Jyxcbn07XG4iLAogICAgIi8qKlxuICogU3RyaW5nIHV0aWxpdGllc1xuICovXG5cbmltcG9ydCB7IHNwZWNpYWxDaGFyTWFwIH0gZnJvbSAnLi90YWJsZS9jaGFyLXRhYmxlJztcblxuLyoqXG4gKiBDb252ZXJ0IHN0cmluZyB0byBVbml4IGZvcm1hdFxuICpcbiAqIFBlcmZvcm1zIGNvbnZlcnNpb24gZm9sbG93aW5nIGxlZ2FjeSB3aWtpZG90IGltcGxlbWVudGF0aW9uLlxuICogLSBDb252ZXJ0cyBzcGVjaWFsIGNoYXJhY3RlcnMgdG8gQVNDSUkgY2hhcmFjdGVyc1xuICogLSBDb252ZXJ0cyB0byBsb3dlcmNhc2VcbiAqIC0gQ29udmVydHMgbm9uLUFTQ0lJIGNoYXJhY3RlcnMgdG8gaHlwaGVuc1xuICogLSBSZWR1Y2VzIGNvbnNlY3V0aXZlIGh5cGhlbnMvY29sb25zIHRvIHNpbmdsZVxuICogLSBSZW1vdmVzIGxlYWRpbmcvdHJhaWxpbmcgaHlwaGVucy9jb2xvbnNcbiAqXG4gKiBAcGFyYW0gdGFyZ2V0U3RyIC0gU3RyaW5nIHRvIGNvbnZlcnRcbiAqIEByZXR1cm5zIENvbnZlcnRlZCBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvVW5peCh0YXJnZXRTdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIENvbnZlcnQgc3BlY2lhbCBjaGFyYWN0ZXJzXG4gIGxldCByZXN1bHQgPSAnJztcbiAgZm9yIChjb25zdCBjaGFyIG9mIHRhcmdldFN0cikge1xuICAgIGNvbnN0IG1hcHBlZCA9IHNwZWNpYWxDaGFyTWFwW2NoYXJdO1xuICAgIHJlc3VsdCArPSBtYXBwZWQgIT09IHVuZGVmaW5lZCA/IG1hcHBlZCA6IGNoYXI7XG4gIH1cblxuICAvLyBDb252ZXJ0IHRvIGxvd2VyY2FzZVxuICByZXN1bHQgPSByZXN1bHQudG9Mb3dlckNhc2UoKTtcblxuICAvLyBSZW1vdmUgbm9uLUFTQ0lJIGNoYXJhY3RlcnNcbiAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoL1teYS16MC05XFwtOl9dL2csICctJyk7XG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC9eXy8sICc6XycpO1xuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvKD88ITopXy9nLCAnLScpO1xuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXi0qLywgJycpO1xuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvLSokLywgJycpO1xuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvLXsyLH0vZywgJy0nKTtcbiAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoLzp7Mix9L2csICc6Jyk7XG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC86LS9nLCAnOicpO1xuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvLTovZywgJzonKTtcbiAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoL18tL2csICdfJyk7XG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC8tXy9nLCAnXycpO1xuXG4gIC8vIFJlbW92ZSBsZWFkaW5nIGFuZCB0cmFpbGluZyBjb2xvbnNcbiAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoL146LywgJycpO1xuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvOiQvLCAnJyk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBTdHJpbmdVdGlsIGNsYXNzIChQeXRob24gY29tcGF0aWJsZSlcbiAqL1xuZXhwb3J0IGNvbnN0IFN0cmluZ1V0aWwgPSB7XG4gIHRvVW5peCxcbn07XG4iLAogICAgImltcG9ydCB0eXBlIHsgVXNlciB9IGZyb20gJy4vdXNlcic7XG5cbi8qKlxuICogVXNlciBjb2xsZWN0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBVc2VyQ29sbGVjdGlvbiBleHRlbmRzIEFycmF5PFVzZXIgfCBudWxsPiB7XG4gIGNvbnN0cnVjdG9yKHVzZXJzPzogKFVzZXIgfCBudWxsKVtdKSB7XG4gICAgc3VwZXIoKTtcbiAgICBpZiAodXNlcnMpIHtcbiAgICAgIHRoaXMucHVzaCguLi51c2Vycyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYnkgdXNlcm5hbWVcbiAgICogQHBhcmFtIG5hbWUgLSBVc2VybmFtZVxuICAgKiBAcmV0dXJucyBVc2VyIG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgZmluZEJ5TmFtZShuYW1lOiBzdHJpbmcpOiBVc2VyIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBsb3dlck5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgZm9yIChjb25zdCB1c2VyIG9mIHRoaXMpIHtcbiAgICAgIGlmICh1c2VyICYmIHVzZXIubmFtZS50b0xvd2VyQ2FzZSgpID09PSBsb3dlck5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHVzZXI7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBieSB1c2VyIElEXG4gICAqIEBwYXJhbSBpZCAtIFVzZXIgSURcbiAgICogQHJldHVybnMgVXNlciBvciB1bmRlZmluZWRcbiAgICovXG4gIGZpbmRCeUlkKGlkOiBudW1iZXIpOiBVc2VyIHwgdW5kZWZpbmVkIHtcbiAgICBmb3IgKGNvbnN0IHVzZXIgb2YgdGhpcykge1xuICAgICAgaWYgKHVzZXIgJiYgdXNlci5pZCA9PT0gaWQpIHtcbiAgICAgICAgcmV0dXJuIHVzZXI7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIG9ubHkgbm9uLW51bGwgdXNlcnNcbiAgICogQHJldHVybnMgQXJyYXkgb2Ygbm9uLW51bGwgdXNlcnNcbiAgICovXG4gIGZpbHRlck5vbk51bGwoKTogVXNlcltdIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXIoKHVzZXIpOiB1c2VyIGlzIFVzZXIgPT4gdXNlciAhPT0gbnVsbCk7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0ICogYXMgY2hlZXJpbyBmcm9tICdjaGVlcmlvJztcbmltcG9ydCBwTGltaXQgZnJvbSAncC1saW1pdCc7XG5pbXBvcnQgeyBOb0VsZW1lbnRFcnJvciwgTm90Rm91bmRFeGNlcHRpb24sIFVuZXhwZWN0ZWRFcnJvciB9IGZyb20gJy4uLy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB7IERFRkFVTFRfQU1DX0NPTkZJRyB9IGZyb20gJy4uLy4uL2Nvbm5lY3Rvci9hbWMtY29uZmlnJztcbmltcG9ydCB7IGZldGNoV2l0aFJldHJ5IH0gZnJvbSAnLi4vLi4vdXRpbC9odHRwJztcbmltcG9ydCB7IHRvVW5peCB9IGZyb20gJy4uLy4uL3V0aWwvc3RyaW5nLXV0aWwnO1xuaW1wb3J0IHR5cGUgeyBDbGllbnRSZWYgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0VXNlciwgVXNlclR5cGUgfSBmcm9tICcuL2Fic3RyYWN0LXVzZXInO1xuaW1wb3J0IHsgVXNlckNvbGxlY3Rpb24gfSBmcm9tICcuL3VzZXItY29sbGVjdGlvbic7XG5cbi8qKlxuICogVXNlciBkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlckRhdGEge1xuICBpZDogbnVtYmVyO1xuICBuYW1lOiBzdHJpbmc7XG4gIGRpc3BsYXlOYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgYXZhdGFyVXJsPzogc3RyaW5nIHwgbnVsbDtcbiAgdW5peE5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVndWxhciB1c2VyXG4gKi9cbmV4cG9ydCBjbGFzcyBVc2VyIGltcGxlbWVudHMgQWJzdHJhY3RVc2VyIHtcbiAgcHVibGljIHJlYWRvbmx5IGNsaWVudDogQ2xpZW50UmVmO1xuXG4gIC8qKiBVc2VyIElEICovXG4gIHB1YmxpYyByZWFkb25seSBpZDogbnVtYmVyO1xuXG4gIC8qKiBVc2VybmFtZSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKiBEaXNwbGF5IG5hbWUgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRpc3BsYXlOYW1lOiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKiBBdmF0YXIgVVJMICovXG4gIHB1YmxpYyByZWFkb25seSBhdmF0YXJVcmw6IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqIFVOSVggZm9ybWF0IHVzZXJuYW1lICovXG4gIHB1YmxpYyByZWFkb25seSB1bml4TmFtZTogc3RyaW5nO1xuXG4gIC8qKiBJUCBhZGRyZXNzIChudWxsIGZvciByZWd1bGFyIHVzZXJzKSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXA6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBVc2VyIHR5cGUgKi9cbiAgcHVibGljIHJlYWRvbmx5IHVzZXJUeXBlOiBVc2VyVHlwZSA9ICd1c2VyJztcblxuICBjb25zdHJ1Y3RvcihjbGllbnQ6IENsaWVudFJlZiwgZGF0YTogVXNlckRhdGEpIHtcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICB0aGlzLmlkID0gZGF0YS5pZDtcbiAgICB0aGlzLm5hbWUgPSBkYXRhLm5hbWU7XG4gICAgdGhpcy5kaXNwbGF5TmFtZSA9IGRhdGEuZGlzcGxheU5hbWUgPz8gbnVsbDtcbiAgICB0aGlzLmF2YXRhclVybCA9IGRhdGEuYXZhdGFyVXJsID8/IGBodHRwczovL3d3dy53aWtpZG90LmNvbS9hdmF0YXIucGhwP3VzZXJpZD0ke2RhdGEuaWR9YDtcbiAgICB0aGlzLnVuaXhOYW1lID0gZGF0YS51bml4TmFtZSA/PyB0b1VuaXgoZGF0YS5uYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdXNlciBmcm9tIHVzZXJuYW1lXG4gICAqIEBwYXJhbSBjbGllbnQgLSBDbGllbnRcbiAgICogQHBhcmFtIG5hbWUgLSBVc2VybmFtZVxuICAgKiBAcmV0dXJucyBVc2VyIChudWxsIGlmIG5vdCBmb3VuZClcbiAgICovXG4gIHN0YXRpYyBmcm9tTmFtZShjbGllbnQ6IENsaWVudFJlZiwgbmFtZTogc3RyaW5nKTogV2lraWRvdFJlc3VsdEFzeW5jPFVzZXIgfCBudWxsPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdW5peE5hbWUgPSB0b1VuaXgobmFtZSk7XG4gICAgICAgIGNvbnN0IHVybCA9IGBodHRwczovL3d3dy53aWtpZG90LmNvbS91c2VyOmluZm8vJHt1bml4TmFtZX1gO1xuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hXaXRoUmV0cnkodXJsLCBERUZBVUxUX0FNQ19DT05GSUcsIHtcbiAgICAgICAgICBjaGVja09rOiBmYWxzZSwgLy8gSGFuZGxlIEhUVFAgZXJyb3JzIG1hbnVhbGx5XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGZldGNoIHVzZXIgaW5mbzogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBodG1sID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGh0bWwpO1xuXG4gICAgICAgIC8vIENoZWNrIGV4aXN0ZW5jZVxuICAgICAgICBpZiAoJCgnZGl2LmVycm9yLWJsb2NrJykubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IGlkXG4gICAgICAgIGNvbnN0IHVzZXJJZEVsZW0gPSAkKCdhLmJ0bi5idG4tZGVmYXVsdC5idG4teHMnKTtcbiAgICAgICAgaWYgKHVzZXJJZEVsZW0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdVc2VyIElEIGVsZW1lbnQgbm90IGZvdW5kJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaHJlZiA9IHVzZXJJZEVsZW0uYXR0cignaHJlZicpO1xuICAgICAgICBpZiAoIWhyZWYpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ1VzZXIgSUQgaHJlZiBub3QgZm91bmQnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1c2VySWQgPSBOdW1iZXIucGFyc2VJbnQoaHJlZi5zcGxpdCgnLycpLnBvcCgpID8/ICcwJywgMTApO1xuXG4gICAgICAgIC8vIEdldCBuYW1lXG4gICAgICAgIGNvbnN0IG5hbWVFbGVtID0gJCgnaDEucHJvZmlsZS10aXRsZScpO1xuICAgICAgICBpZiAobmFtZUVsZW0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdVc2VyIG5hbWUgZWxlbWVudCBub3QgZm91bmQnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1c2VyTmFtZSA9IG5hbWVFbGVtLnRleHQoKS50cmltKCk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBVc2VyKGNsaWVudCwge1xuICAgICAgICAgIGlkOiB1c2VySWQsXG4gICAgICAgICAgbmFtZTogdXNlck5hbWUsXG4gICAgICAgICAgdW5peE5hbWUsXG4gICAgICAgIH0pO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb3RGb3VuZEV4Y2VwdGlvbiB8fCBlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHVzZXI6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB1c2VycyBmcm9tIG11bHRpcGxlIHVzZXJuYW1lc1xuICAgKiBAcGFyYW0gY2xpZW50IC0gQ2xpZW50XG4gICAqIEBwYXJhbSBuYW1lcyAtIEFycmF5IG9mIHVzZXJuYW1lc1xuICAgKiBAcmV0dXJucyBVc2VyIGNvbGxlY3Rpb25cbiAgICovXG4gIHN0YXRpYyBmcm9tTmFtZXMoY2xpZW50OiBDbGllbnRSZWYsIG5hbWVzOiBzdHJpbmdbXSk6IFdpa2lkb3RSZXN1bHRBc3luYzxVc2VyQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIExpbWl0IGNvbmN1cnJlbnQgY29ubmVjdGlvbnNcbiAgICAgICAgY29uc3QgbGltaXQgPSBwTGltaXQoREVGQVVMVF9BTUNfQ09ORklHLnNlbWFwaG9yZUxpbWl0KTtcblxuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgbmFtZXMubWFwKChuYW1lKSA9PlxuICAgICAgICAgICAgbGltaXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBVc2VyLmZyb21OYW1lKGNsaWVudCwgbmFtZSk7XG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQuaXNPaygpID8gcmVzdWx0LnZhbHVlIDogbnVsbDtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbmV3IFVzZXJDb2xsZWN0aW9uKHJlc3VsdHMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCB1c2VyczogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8vIEFic3RyYWN0VXNlciBpbXBsZW1lbnRhdGlvblxuICBpc1VzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaXNEZWxldGVkVXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaXNBbm9ueW1vdXNVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpc0d1ZXN0VXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaXNXaWtpZG90VXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgVXNlcihpZD0ke3RoaXMuaWR9LCBuYW1lPSR7dGhpcy5uYW1lfSwgdW5peE5hbWU9JHt0aGlzLnVuaXhOYW1lfSlgO1xuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQ2xpZW50UmVmIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdFVzZXIsIFVzZXJUeXBlIH0gZnJvbSAnLi9hYnN0cmFjdC11c2VyJztcblxuLyoqXG4gKiBXaWtpZG90IHN5c3RlbSB1c2VyXG4gKi9cbmV4cG9ydCBjbGFzcyBXaWtpZG90VXNlciBpbXBsZW1lbnRzIEFic3RyYWN0VXNlciB7XG4gIHB1YmxpYyByZWFkb25seSBjbGllbnQ6IENsaWVudFJlZjtcblxuICAvKiogVXNlciBJRCAoMCBmb3IgV2lraWRvdCBzeXN0ZW0pICovXG4gIHB1YmxpYyByZWFkb25seSBpZDogbnVtYmVyID0gMDtcblxuICAvKiogVXNlcm5hbWUgKi9cbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZyA9ICdXaWtpZG90JztcblxuICAvKiogVU5JWCBmb3JtYXQgdXNlcm5hbWUgKi9cbiAgcHVibGljIHJlYWRvbmx5IHVuaXhOYW1lOiBzdHJpbmcgPSAnd2lraWRvdCc7XG5cbiAgLyoqIEF2YXRhciBVUkwgKG51bGwgZm9yIHN5c3RlbSB1c2VyKSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYXZhdGFyVXJsOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvKiogSVAgYWRkcmVzcyAobnVsbCBmb3Igc3lzdGVtIHVzZXIpICovXG4gIHB1YmxpYyByZWFkb25seSBpcDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIFVzZXIgdHlwZSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdXNlclR5cGU6IFVzZXJUeXBlID0gJ3dpa2lkb3QnO1xuXG4gIGNvbnN0cnVjdG9yKGNsaWVudDogQ2xpZW50UmVmKSB7XG4gICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XG4gIH1cblxuICAvLyBBYnN0cmFjdFVzZXIgaW1wbGVtZW50YXRpb25cbiAgaXNVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpc0RlbGV0ZWRVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpc0Fub255bW91c1VzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlzR3Vlc3RVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpc1dpa2lkb3RVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFdpa2lkb3RVc2VyKG5hbWU9JHt0aGlzLm5hbWV9LCB1bml4TmFtZT0ke3RoaXMudW5peE5hbWV9KWA7XG4gIH1cbn1cbiIsCiAgICAiZXhwb3J0IHR5cGUgeyBBYnN0cmFjdFVzZXIsIFVzZXJUeXBlIH0gZnJvbSAnLi9hYnN0cmFjdC11c2VyJztcbmV4cG9ydCB7IEFub255bW91c1VzZXIgfSBmcm9tICcuL2Fub255bW91cy11c2VyJztcbmV4cG9ydCB7IERlbGV0ZWRVc2VyIH0gZnJvbSAnLi9kZWxldGVkLXVzZXInO1xuZXhwb3J0IHsgR3Vlc3RVc2VyIH0gZnJvbSAnLi9ndWVzdC11c2VyJztcbmV4cG9ydCB7IFVzZXIsIHR5cGUgVXNlckRhdGEgfSBmcm9tICcuL3VzZXInO1xuZXhwb3J0IHsgVXNlckNvbGxlY3Rpb24gfSBmcm9tICcuL3VzZXItY29sbGVjdGlvbic7XG5leHBvcnQgeyBXaWtpZG90VXNlciB9IGZyb20gJy4vd2lraWRvdC11c2VyJztcbiIsCiAgICAiaW1wb3J0IHR5cGUgKiBhcyBjaGVlcmlvIGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0IHR5cGUgeyBBbnlOb2RlIH0gZnJvbSAnZG9taGFuZGxlcic7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi9jb21tb24vbG9nZ2VyJztcbmltcG9ydCB0eXBlIHsgQ2xpZW50UmVmIH0gZnJvbSAnLi4vLi4vbW9kdWxlL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RVc2VyIH0gZnJvbSAnLi4vLi4vbW9kdWxlL3VzZXInO1xuaW1wb3J0IHsgQW5vbnltb3VzVXNlciwgRGVsZXRlZFVzZXIsIEd1ZXN0VXNlciwgVXNlciwgV2lraWRvdFVzZXIgfSBmcm9tICcuLi8uLi9tb2R1bGUvdXNlcic7XG5cbi8qKlxuICogUGFyc2UgcHJpbnR1c2VyIGVsZW1lbnQgYW5kIHJldHVybiB1c2VyIG9iamVjdFxuICpcbiAqIEBwYXJhbSBjbGllbnQgLSBXaWtpZG90IGNsaWVudFxuICogQHBhcmFtIGVsZW0gLSBFbGVtZW50IHRvIHBhcnNlIChlbGVtZW50IHdpdGggcHJpbnR1c2VyIGNsYXNzKVxuICogQHJldHVybnMgUGFyc2VkIHVzZXIgb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVVzZXIoY2xpZW50OiBDbGllbnRSZWYsIGVsZW06IGNoZWVyaW8uQ2hlZXJpbzxBbnlOb2RlPik6IEFic3RyYWN0VXNlciB7XG4gIGNvbnN0IGNsYXNzQXR0ciA9IGVsZW0uYXR0cignY2xhc3MnKSA/PyAnJztcbiAgY29uc3QgY2xhc3NlcyA9IGNsYXNzQXR0ci5zcGxpdCgvXFxzKy8pO1xuXG4gIC8vIENoZWNrIGZvciBkZWxldGVkIHVzZXJcbiAgaWYgKGNsYXNzZXMuaW5jbHVkZXMoJ2RlbGV0ZWQnKSkge1xuICAgIGNvbnN0IGRhdGFJZCA9IGVsZW0uYXR0cignZGF0YS1pZCcpO1xuICAgIGNvbnN0IHVzZXJJZCA9IGRhdGFJZCA/IE51bWJlci5wYXJzZUludChkYXRhSWQsIDEwKSA6IDA7XG4gICAgcmV0dXJuIG5ldyBEZWxldGVkVXNlcihjbGllbnQsIHVzZXJJZCk7XG4gIH1cblxuICAvLyBJZiB0ZXh0IGlzIFwiKHVzZXIgZGVsZXRlZClcIlxuICBjb25zdCB0ZXh0ID0gZWxlbS50ZXh0KCkudHJpbSgpO1xuICBpZiAodGV4dCA9PT0gJyh1c2VyIGRlbGV0ZWQpJykge1xuICAgIHJldHVybiBuZXcgRGVsZXRlZFVzZXIoY2xpZW50LCAwKTtcbiAgfVxuXG4gIC8vIENoZWNrIGZvciBhbm9ueW1vdXMgdXNlclxuICBpZiAoY2xhc3Nlcy5pbmNsdWRlcygnYW5vbnltb3VzJykpIHtcbiAgICBjb25zdCBpcEVsZW0gPSBlbGVtLmZpbmQoJ3NwYW4uaXAnKTtcbiAgICBpZiAoaXBFbGVtLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGlwID0gaXBFbGVtLnRleHQoKS5yZXBsYWNlKC9bKCldL2csICcnKS50cmltKCk7XG4gICAgICByZXR1cm4gbmV3IEFub255bW91c1VzZXIoY2xpZW50LCBpcCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQW5vbnltb3VzVXNlcihjbGllbnQsICcnKTtcbiAgfVxuXG4gIC8vIENoZWNrIGZvciBndWVzdCB1c2VyIChoYXMgR3JhdmF0YXIgYXZhdGFyKVxuICBjb25zdCBpbWdFbGVtID0gZWxlbS5maW5kKCdpbWcnKTtcbiAgaWYgKGltZ0VsZW0ubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IHNyYyA9IGltZ0VsZW0uYXR0cignc3JjJykgPz8gJyc7XG4gICAgaWYgKHNyYy5pbmNsdWRlcygnZ3JhdmF0YXIuY29tJykpIHtcbiAgICAgIGNvbnN0IGd1ZXN0TmFtZSA9IHRleHQuc3BsaXQoJyAnKVswXSA/PyAnR3Vlc3QnO1xuICAgICAgcmV0dXJuIG5ldyBHdWVzdFVzZXIoY2xpZW50LCBndWVzdE5hbWUsIHNyYyk7XG4gICAgfVxuICB9XG5cbiAgLy8gQ2hlY2sgZm9yIFdpa2lkb3Qgc3lzdGVtIHVzZXJcbiAgaWYgKHRleHQgPT09ICdXaWtpZG90Jykge1xuICAgIHJldHVybiBuZXcgV2lraWRvdFVzZXIoY2xpZW50KTtcbiAgfVxuXG4gIC8vIFJlZ3VsYXIgdXNlclxuICBjb25zdCBsaW5rcyA9IGVsZW0uZmluZCgnYScpO1xuICBpZiAobGlua3MubGVuZ3RoID09PSAwKSB7XG4gICAgLy8gVHJlYXQgYXMgRGVsZXRlZFVzZXIgaWYgbm8gbGlua1xuICAgIHJldHVybiBuZXcgRGVsZXRlZFVzZXIoY2xpZW50LCAwKTtcbiAgfVxuXG4gIC8vIExhc3QgbGluayBpcyB0aGUgdXNlciBsaW5rXG4gIGNvbnN0IHVzZXJMaW5rID0gbGlua3MubGFzdCgpO1xuICBjb25zdCB1c2VyTmFtZSA9IHVzZXJMaW5rLnRleHQoKS50cmltKCk7XG4gIGNvbnN0IGhyZWYgPSB1c2VyTGluay5hdHRyKCdocmVmJykgPz8gJyc7XG4gIGNvbnN0IG9uY2xpY2sgPSB1c2VyTGluay5hdHRyKCdvbmNsaWNrJykgPz8gJyc7XG5cbiAgLy8gRXh0cmFjdCB1bml4X25hbWUgZnJvbSBocmVmXG4gIGNvbnN0IHVuaXhOYW1lID0gaHJlZi5yZXBsYWNlKC9eLipcXC91c2VyOmluZm9cXC8vLCAnJykucmVwbGFjZSgvXFwvJC8sICcnKTtcblxuICAvLyBFeHRyYWN0IHVzZXJfaWQgZnJvbSBvbmNsaWNrXG4gIC8vIFBhdHRlcm46IFwiV0lLSURPVC5wYWdlLmxpc3RlbmVycy51c2VySW5mbygxMjM0NTYpOyByZXR1cm4gZmFsc2U7XCJcbiAgY29uc3QgdXNlcklkTWF0Y2ggPSBvbmNsaWNrLm1hdGNoKC91c2VySW5mb1xcKChcXGQrKVxcKS8pO1xuICBjb25zdCB1c2VySWQgPSB1c2VySWRNYXRjaD8uWzFdID8gTnVtYmVyLnBhcnNlSW50KHVzZXJJZE1hdGNoWzFdLCAxMCkgOiAwO1xuXG4gIC8vIEdlbmVyYXRlIGF2YXRhciBVUkxcbiAgY29uc3QgYXZhdGFyVXJsID0gdXNlcklkID4gMCA/IGBodHRwOi8vd3d3Lndpa2lkb3QuY29tL2F2YXRhci5waHA/dXNlcmlkPSR7dXNlcklkfWAgOiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIG5ldyBVc2VyKGNsaWVudCwge1xuICAgIGlkOiB1c2VySWQsXG4gICAgbmFtZTogdXNlck5hbWUsXG4gICAgdW5peE5hbWUsXG4gICAgYXZhdGFyVXJsLFxuICB9KTtcbn1cblxuLyoqXG4gKiBQYXJzZSBkYXRlIGZyb20gb2RhdGUgZWxlbWVudFxuICpcbiAqIEBwYXJhbSBlbGVtIC0gRWxlbWVudCB0byBwYXJzZSAob2RhdGUgZWxlbWVudClcbiAqIEByZXR1cm5zIFBhcnNlZCBEYXRlLCBvciBudWxsIG9uIHBhcnNlIGZhaWx1cmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlT2RhdGUoZWxlbTogY2hlZXJpby5DaGVlcmlvPEFueU5vZGU+KTogRGF0ZSB8IG51bGwge1xuICBjb25zdCBjbGFzc0F0dHIgPSBlbGVtLmF0dHIoJ2NsYXNzJykgPz8gJyc7XG5cbiAgLy8gRXh0cmFjdCBVbml4IHRpbWVzdGFtcCBmcm9tIGNsYXNzXG4gIC8vIFBhdHRlcm46IFwib2RhdGUgdGltZV8xMjM0NTY3ODkwIGZvcm1hdF8uLi5cIiBmb3JtYXRcbiAgY29uc3QgdGltZU1hdGNoID0gY2xhc3NBdHRyLm1hdGNoKC90aW1lXyhcXGQrKS8pO1xuICBpZiAodGltZU1hdGNoPy5bMV0pIHtcbiAgICBjb25zdCB1bml4VGltZSA9IE51bWJlci5wYXJzZUludCh0aW1lTWF0Y2hbMV0sIDEwKTtcbiAgICByZXR1cm4gbmV3IERhdGUodW5peFRpbWUgKiAxMDAwKTtcbiAgfVxuXG4gIC8vIEZhbGxiYWNrOiBwYXJzZSBmcm9tIHRleHRcbiAgY29uc3QgdGV4dCA9IGVsZW0udGV4dCgpLnRyaW0oKTtcbiAgY29uc3QgcGFyc2VkID0gRGF0ZS5wYXJzZSh0ZXh0KTtcbiAgaWYgKCFOdW1iZXIuaXNOYU4ocGFyc2VkKSkge1xuICAgIHJldHVybiBuZXcgRGF0ZShwYXJzZWQpO1xuICB9XG5cbiAgLy8gUmV0dXJuIG51bGwgYW5kIGxvZyB3YXJuaW5nIGlmIHBhcnNpbmcgZmFpbHNcbiAgbG9nZ2VyLndhcm4oYEZhaWxlZCB0byBwYXJzZSBvZGF0ZSBlbGVtZW50OiBjbGFzcz1cIiR7Y2xhc3NBdHRyfVwiLCB0ZXh0PVwiJHt0ZXh0fVwiYCk7XG4gIHJldHVybiBudWxsO1xufVxuIiwKICAgICJleHBvcnQgeyBwYXJzZU9kYXRlLCBwYXJzZVVzZXIgfSBmcm9tICcuL3VzZXInO1xuIiwKICAgICIvKipcbiAqIERlY29yYXRvciB1dGlsaXRpZXNcbiAqL1xuXG5pbXBvcnQgeyBMb2dpblJlcXVpcmVkRXJyb3IgfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMsIHdkRXJyQXN5bmMgfSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBUeXBlIGZvciBvYmplY3RzIHRoYXQgaGF2ZSBhIGNsaWVudCByZWZlcmVuY2VcbiAqL1xuaW50ZXJmYWNlIEhhc0NsaWVudCB7XG4gIGNsaWVudD86IHsgcmVxdWlyZUxvZ2luKCk6IHsgaXNFcnIoKTogYm9vbGVhbjsgZXJyb3I/OiBFcnJvciB9IH07XG4gIHNpdGU/OiB7IGNsaWVudDogeyByZXF1aXJlTG9naW4oKTogeyBpc0VycigpOiBib29sZWFuOyBlcnJvcj86IEVycm9yIH0gfSB9O1xuICB0aHJlYWQ/OiB7IHNpdGU6IHsgY2xpZW50OiB7IHJlcXVpcmVMb2dpbigpOiB7IGlzRXJyKCk6IGJvb2xlYW47IGVycm9yPzogRXJyb3IgfSB9IH0gfTtcbn1cblxuLyoqXG4gKiBHZXQgY2xpZW50IHJlZmVyZW5jZSBmcm9tIGFuIG9iamVjdFxuICovXG5mdW5jdGlvbiBnZXRDbGllbnRSZWYoXG4gIG9iajogSGFzQ2xpZW50XG4pOiB7IHJlcXVpcmVMb2dpbigpOiB7IGlzRXJyKCk6IGJvb2xlYW47IGVycm9yPzogRXJyb3IgfSB9IHwgbnVsbCB7XG4gIGlmIChvYmouY2xpZW50KSByZXR1cm4gb2JqLmNsaWVudDtcbiAgaWYgKG9iai5zaXRlPy5jbGllbnQpIHJldHVybiBvYmouc2l0ZS5jbGllbnQ7XG4gIGlmIChvYmoudGhyZWFkPy5zaXRlPy5jbGllbnQpIHJldHVybiBvYmoudGhyZWFkLnNpdGUuY2xpZW50O1xuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBMb2dpbiByZXF1aXJlZCBtZXRob2QgZGVjb3JhdG9yXG4gKlxuICogTWV0aG9kcyBkZWNvcmF0ZWQgd2l0aCB0aGlzIHdpbGwgY2hlY2sgbG9naW4gc3RhdHVzIGJlZm9yZSBleGVjdXRpb24uXG4gKiBSZXR1cm5zIExvZ2luUmVxdWlyZWRFcnJvciBpZiBub3QgbG9nZ2VkIGluLlxuICpcbiAqIEBleGFtcGxlXG4gKiBjbGFzcyBQYWdlIHtcbiAqICAgQFJlcXVpcmVMb2dpblxuICogICBkZXN0cm95KCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gKiAgICAgcmV0dXJuIGZyb21Qcm9taXNlKGFzeW5jICgpID0+IHsgLi4uIH0sIChlKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKC4uLikpO1xuICogICB9XG4gKiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBSZXF1aXJlTG9naW48XG4gIFRoaXMgZXh0ZW5kcyBIYXNDbGllbnQsXG4gIEFyZ3MgZXh0ZW5kcyB1bmtub3duW10sXG4gIFJldHVybiBleHRlbmRzIFdpa2lkb3RSZXN1bHRBc3luYzx1bmtub3duPixcbj4oXG4gIHRhcmdldDogKHRoaXM6IFRoaXMsIC4uLmFyZ3M6IEFyZ3MpID0+IFJldHVybixcbiAgX2NvbnRleHQ6IENsYXNzTWV0aG9kRGVjb3JhdG9yQ29udGV4dDxUaGlzLCAodGhpczogVGhpcywgLi4uYXJnczogQXJncykgPT4gUmV0dXJuPlxuKTogKHRoaXM6IFRoaXMsIC4uLmFyZ3M6IEFyZ3MpID0+IFJldHVybiB7XG4gIHJldHVybiBmdW5jdGlvbiAodGhpczogVGhpcywgLi4uYXJnczogQXJncyk6IFJldHVybiB7XG4gICAgY29uc3QgY2xpZW50UmVmID0gZ2V0Q2xpZW50UmVmKHRoaXMpO1xuICAgIGlmICghY2xpZW50UmVmKSB7XG4gICAgICByZXR1cm4gd2RFcnJBc3luYyhuZXcgTG9naW5SZXF1aXJlZEVycm9yKCdDbGllbnQgcmVmZXJlbmNlIG5vdCBmb3VuZCcpKSBhcyB1bmtub3duIGFzIFJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBsb2dpblJlc3VsdCA9IGNsaWVudFJlZi5yZXF1aXJlTG9naW4oKTtcbiAgICBpZiAobG9naW5SZXN1bHQuaXNFcnIoKSkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgICBQcm9taXNlLnJlamVjdChsb2dpblJlc3VsdC5lcnJvciksXG4gICAgICAgICgpID0+IG5ldyBMb2dpblJlcXVpcmVkRXJyb3IoJ0xvZ2luIHJlcXVpcmVkJylcbiAgICAgICkgYXMgdW5rbm93biBhcyBSZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhcmdldC5jYWxsKHRoaXMsIC4uLmFyZ3MpO1xuICB9O1xufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IENoZWVyaW8sIENoZWVyaW9BUEkgfSBmcm9tICdjaGVlcmlvJztcbmltcG9ydCAqIGFzIGNoZWVyaW8gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQgdHlwZSB7IEFueU5vZGUgfSBmcm9tICdkb21oYW5kbGVyJztcbmltcG9ydCB7IE5vRWxlbWVudEVycm9yLCBVbmV4cGVjdGVkRXJyb3IgfSBmcm9tICcuLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyBwYXJzZU9kYXRlLCBwYXJzZVVzZXIgfSBmcm9tICcuLi8uLi91dGlsL3BhcnNlcic7XG5pbXBvcnQgdHlwZSB7IENsaWVudCB9IGZyb20gJy4uL2NsaWVudCc7XG5pbXBvcnQgdHlwZSB7IEZvcnVtUG9zdFJlZiB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RVc2VyIH0gZnJvbSAnLi4vdXNlcic7XG5cbi8qKlxuICogRm9ydW0gcG9zdCByZXZpc2lvbiBkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRm9ydW1Qb3N0UmV2aXNpb25EYXRhIHtcbiAgcG9zdDogRm9ydW1Qb3N0UmVmO1xuICBpZDogbnVtYmVyO1xuICByZXZObzogbnVtYmVyO1xuICBjcmVhdGVkQnk6IEFic3RyYWN0VXNlcjtcbiAgY3JlYXRlZEF0OiBEYXRlO1xufVxuXG4vKipcbiAqIEZvcnVtIHBvc3QgcmV2aXNpb24gKHZlcnNpb24gaW4gZWRpdCBoaXN0b3J5KVxuICovXG5leHBvcnQgY2xhc3MgRm9ydW1Qb3N0UmV2aXNpb24ge1xuICAvKiogUG9zdCB0aGlzIHJldmlzaW9uIGJlbG9uZ3MgdG8gKi9cbiAgcHVibGljIHJlYWRvbmx5IHBvc3Q6IEZvcnVtUG9zdFJlZjtcblxuICAvKiogUmV2aXNpb24gSUQgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlkOiBudW1iZXI7XG5cbiAgLyoqIFJldmlzaW9uIG51bWJlciAoMCA9IGluaXRpYWwgdmVyc2lvbikgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJldk5vOiBudW1iZXI7XG5cbiAgLyoqIFJldmlzaW9uIGNyZWF0b3IgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZWRCeTogQWJzdHJhY3RVc2VyO1xuXG4gIC8qKiBSZXZpc2lvbiBjcmVhdGlvbiBkYXRlICovXG4gIHB1YmxpYyByZWFkb25seSBjcmVhdGVkQXQ6IERhdGU7XG5cbiAgLyoqIEhUTUwgY29udGVudCAoaW50ZXJuYWwgY2FjaGUpICovXG4gIHByaXZhdGUgX2h0bWw6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IEZvcnVtUG9zdFJldmlzaW9uRGF0YSkge1xuICAgIHRoaXMucG9zdCA9IGRhdGEucG9zdDtcbiAgICB0aGlzLmlkID0gZGF0YS5pZDtcbiAgICB0aGlzLnJldk5vID0gZGF0YS5yZXZObztcbiAgICB0aGlzLmNyZWF0ZWRCeSA9IGRhdGEuY3JlYXRlZEJ5O1xuICAgIHRoaXMuY3JlYXRlZEF0ID0gZGF0YS5jcmVhdGVkQXQ7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBIVE1MIGNvbnRlbnQgaGFzIGJlZW4gYWNxdWlyZWRcbiAgICovXG4gIGlzSHRtbEFjcXVpcmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9odG1sICE9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBIVE1MIGNvbnRlbnQgKGNhY2hlZClcbiAgICovXG4gIGdldCBodG1sKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9odG1sO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBIVE1MIGNvbnRlbnRcbiAgICovXG4gIHNldCBodG1sKHZhbHVlOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgdGhpcy5faHRtbCA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCByZXZpc2lvbiBIVE1MIGNvbnRlbnRcbiAgICogQHJldHVybnMgSFRNTCBzdHJpbmdcbiAgICovXG4gIGdldEh0bWwoKTogV2lraWRvdFJlc3VsdEFzeW5jPHN0cmluZz4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9odG1sICE9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2h0bWw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnBvc3QudGhyZWFkLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2ZvcnVtL3N1Yi9Gb3J1bVBvc3RSZXZpc2lvbk1vZHVsZScsXG4gICAgICAgICAgICByZXZpc2lvbklkOiB0aGlzLmlkLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdFbXB0eSByZXNwb25zZSBmcm9tIEZvcnVtUG9zdFJldmlzaW9uTW9kdWxlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb250ZW50ID0gU3RyaW5nKHJlc3BvbnNlLmNvbnRlbnQgPz8gJycpO1xuICAgICAgICB0aGlzLl9odG1sID0gY29udGVudDtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHJldmlzaW9uIEhUTUw6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYEZvcnVtUG9zdFJldmlzaW9uKGlkPSR7dGhpcy5pZH0sIHJldk5vPSR7dGhpcy5yZXZOb30pYDtcbiAgfVxufVxuXG4vKipcbiAqIEZvcnVtIHBvc3QgcmV2aXNpb24gY29sbGVjdGlvblxuICovXG5leHBvcnQgY2xhc3MgRm9ydW1Qb3N0UmV2aXNpb25Db2xsZWN0aW9uIGV4dGVuZHMgQXJyYXk8Rm9ydW1Qb3N0UmV2aXNpb24+IHtcbiAgcHVibGljIHJlYWRvbmx5IHBvc3Q6IEZvcnVtUG9zdFJlZjtcblxuICBjb25zdHJ1Y3Rvcihwb3N0OiBGb3J1bVBvc3RSZWYsIHJldmlzaW9ucz86IEZvcnVtUG9zdFJldmlzaW9uW10pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucG9zdCA9IHBvc3Q7XG4gICAgaWYgKHJldmlzaW9ucykge1xuICAgICAgdGhpcy5wdXNoKC4uLnJldmlzaW9ucyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYnkgSURcbiAgICogQHBhcmFtIGlkIC0gUmV2aXNpb24gSURcbiAgICogQHJldHVybnMgUmV2aXNpb24gKHVuZGVmaW5lZCBpZiBub3QgZm91bmQpXG4gICAqL1xuICBmaW5kQnlJZChpZDogbnVtYmVyKTogRm9ydW1Qb3N0UmV2aXNpb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbmQoKHJldmlzaW9uKSA9PiByZXZpc2lvbi5pZCA9PT0gaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYnkgcmV2aXNpb24gbnVtYmVyXG4gICAqIEBwYXJhbSByZXZObyAtIFJldmlzaW9uIG51bWJlclxuICAgKiBAcmV0dXJucyBSZXZpc2lvbiAodW5kZWZpbmVkIGlmIG5vdCBmb3VuZClcbiAgICovXG4gIGZpbmRCeVJldk5vKHJldk5vOiBudW1iZXIpOiBGb3J1bVBvc3RSZXZpc2lvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmluZCgocmV2aXNpb24pID0+IHJldmlzaW9uLnJldk5vID09PSByZXZObyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IEhUTUwgZm9yIGFsbCByZXZpc2lvbnNcbiAgICogQHJldHVybnMgQXJyYXkgb2YgSFRNTCBzdHJpbmdzXG4gICAqL1xuICBnZXRIdG1scygpOiBXaWtpZG90UmVzdWx0QXN5bmM8c3RyaW5nW10+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgdGhpcy5tYXAoYXN5bmMgKHJldmlzaW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXZpc2lvbi5nZXRIdG1sKCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgSFRNTHM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIHJldmlzaW9ucyBmcm9tIEhUTUwgKGludGVybmFsIG1ldGhvZClcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIF9wYXJzZShwb3N0OiBGb3J1bVBvc3RSZWYsICQ6IENoZWVyaW9BUEkpOiBGb3J1bVBvc3RSZXZpc2lvbltdIHtcbiAgICBjb25zdCByZXZpc2lvbnM6IEZvcnVtUG9zdFJldmlzaW9uW10gPSBbXTtcblxuICAgICQoJ3RhYmxlLnRhYmxlIHRyJykuZWFjaCgoX2ksIHJvd0VsZW0pID0+IHtcbiAgICAgIGNvbnN0ICRyb3cgPSAkKHJvd0VsZW0pO1xuXG4gICAgICAvLyBTa2lwIGhlYWRlciByb3dcbiAgICAgIGlmICgkcm93Lmhhc0NsYXNzKCdoZWFkJykpIHJldHVybjtcblxuICAgICAgLy8gR2V0IHVzZXIgZWxlbWVudFxuICAgICAgY29uc3QgJHVzZXJFbGVtID0gJHJvdy5maW5kKCdzcGFuLnByaW50dXNlcicpO1xuICAgICAgaWYgKCR1c2VyRWxlbS5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgLy8gR2V0IG9kYXRlIGVsZW1lbnRcbiAgICAgIGNvbnN0ICRvZGF0ZUVsZW0gPSAkcm93LmZpbmQoJ3NwYW4ub2RhdGUnKTtcbiAgICAgIGlmICgkb2RhdGVFbGVtLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICAvLyBHZXQgcmV2aXNpb24gSUQgZnJvbSBvbmNsaWNrIGF0dHJpYnV0ZVxuICAgICAgY29uc3QgJHJldmlzaW9uTGluayA9ICRyb3cuZmluZCgnYVtvbmNsaWNrKj1cInNob3dSZXZpc2lvblwiXScpO1xuICAgICAgaWYgKCRyZXZpc2lvbkxpbmsubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IG9uY2xpY2sgPSAkcmV2aXNpb25MaW5rLmF0dHIoJ29uY2xpY2snKSA/PyAnJztcbiAgICAgIGNvbnN0IHJldmlzaW9uSWRNYXRjaCA9IG9uY2xpY2subWF0Y2goL3Nob3dSZXZpc2lvblxccypcXChcXHMqZXZlbnRcXHMqLFxccyooXFxkKylcXHMqXFwpLyk7XG4gICAgICBpZiAoIXJldmlzaW9uSWRNYXRjaD8uWzFdKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHJldmlzaW9uSWQgPSBOdW1iZXIucGFyc2VJbnQocmV2aXNpb25JZE1hdGNoWzFdLCAxMCk7XG4gICAgICBpZiAoTnVtYmVyLmlzTmFOKHJldmlzaW9uSWQpKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGNyZWF0ZWRCeSA9IHBhcnNlVXNlcihwb3N0LnRocmVhZC5zaXRlLmNsaWVudCBhcyBDbGllbnQsICR1c2VyRWxlbSBhcyBDaGVlcmlvPEFueU5vZGU+KTtcbiAgICAgIGNvbnN0IGNyZWF0ZWRBdCA9IHBhcnNlT2RhdGUoJG9kYXRlRWxlbSBhcyBDaGVlcmlvPEFueU5vZGU+KSA/PyBuZXcgRGF0ZSgpO1xuXG4gICAgICByZXZpc2lvbnMucHVzaChcbiAgICAgICAgbmV3IEZvcnVtUG9zdFJldmlzaW9uKHtcbiAgICAgICAgICBwb3N0LFxuICAgICAgICAgIGlkOiByZXZpc2lvbklkLFxuICAgICAgICAgIHJldk5vOiAwLCAvLyBXaWxsIGJlIHNldCBhZnRlciBwYXJzaW5nIGFsbCByZXZpc2lvbnNcbiAgICAgICAgICBjcmVhdGVkQnksXG4gICAgICAgICAgY3JlYXRlZEF0LFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIC8vIEFQSSByZXR1cm5zIG5ld2VzdCBmaXJzdCwgcmV2ZXJzZSB0byBnZXQgb2xkZXN0IGZpcnN0IGFuZCBzZXQgcmV2Tm9cbiAgICByZXZpc2lvbnMucmV2ZXJzZSgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmV2aXNpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvLyBVc2UgT2JqZWN0LmRlZmluZVByb3BlcnR5IHRvIHNldCByZWFkb25seSBwcm9wZXJ0eVxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldmlzaW9uc1tpXSwgJ3Jldk5vJywge1xuICAgICAgICB2YWx1ZTogaSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmV2aXNpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgcmV2aXNpb25zIGZvciBhIHBvc3RcbiAgICogQHBhcmFtIHBvc3QgLSBGb3J1bSBwb3N0IHJlZmVyZW5jZVxuICAgKiBAcmV0dXJucyBSZXZpc2lvbiBjb2xsZWN0aW9uXG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZUFsbChwb3N0OiBGb3J1bVBvc3RSZWYpOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1Qb3N0UmV2aXNpb25Db2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcG9zdC50aHJlYWQuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnZm9ydW0vc3ViL0ZvcnVtUG9zdFJldmlzaW9uc01vZHVsZScsXG4gICAgICAgICAgICBwb3N0SWQ6IHBvc3QuaWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ0VtcHR5IHJlc3BvbnNlIGZyb20gRm9ydW1Qb3N0UmV2aXNpb25zTW9kdWxlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBib2R5ID0gU3RyaW5nKHJlc3BvbnNlLmJvZHkgPz8gJycpO1xuICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGJvZHkpO1xuXG4gICAgICAgIGNvbnN0IHJldmlzaW9ucyA9IEZvcnVtUG9zdFJldmlzaW9uQ29sbGVjdGlvbi5fcGFyc2UocG9zdCwgJCk7XG4gICAgICAgIHJldHVybiBuZXcgRm9ydW1Qb3N0UmV2aXNpb25Db2xsZWN0aW9uKHBvc3QsIHJldmlzaW9ucyk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSByZXZpc2lvbnM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCByZXZpc2lvbnMgZm9yIG11bHRpcGxlIHBvc3RzXG4gICAqIEBwYXJhbSBwb3N0cyAtIEFycmF5IG9mIGZvcnVtIHBvc3QgcmVmZXJlbmNlc1xuICAgKiBAcGFyYW0gd2l0aEh0bWwgLSBXaGV0aGVyIHRvIGFsc28gZmV0Y2ggSFRNTCBjb250ZW50IGZvciBlYWNoIHJldmlzaW9uXG4gICAqIEByZXR1cm5zIE1hcCBvZiBwb3N0IElEIHRvIHJldmlzaW9uIGNvbGxlY3Rpb25cbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlQWxsRm9yUG9zdHMoXG4gICAgcG9zdHM6IEZvcnVtUG9zdFJlZltdLFxuICAgIHdpdGhIdG1sID0gZmFsc2VcbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPE1hcDxudW1iZXIsIEZvcnVtUG9zdFJldmlzaW9uQ29sbGVjdGlvbj4+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAocG9zdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBNYXA8bnVtYmVyLCBGb3J1bVBvc3RSZXZpc2lvbkNvbGxlY3Rpb24+KCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwPG51bWJlciwgRm9ydW1Qb3N0UmV2aXNpb25Db2xsZWN0aW9uPigpO1xuICAgICAgICBjb25zdCBzaXRlID0gcG9zdHNbMF0hLnRocmVhZC5zaXRlO1xuXG4gICAgICAgIC8vIFN0ZXAgMTogR2V0IHJldmlzaW9uIGxpc3RzIGZvciBhbGwgcG9zdHNcbiAgICAgICAgY29uc3QgcmV2aXNpb25zUmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFxuICAgICAgICAgIHBvc3RzLm1hcCgocG9zdCkgPT4gKHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdmb3J1bS9zdWIvRm9ydW1Qb3N0UmV2aXNpb25zTW9kdWxlJyxcbiAgICAgICAgICAgIHBvc3RJZDogcG9zdC5pZCxcbiAgICAgICAgICB9KSlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAocmV2aXNpb25zUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXZpc2lvbnNSZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGVwIDI6IFBhcnNlIHJldmlzaW9uc1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgcG9zdCA9IHBvc3RzW2ldITtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHJldmlzaW9uc1Jlc3VsdC52YWx1ZVtpXTtcbiAgICAgICAgICBpZiAoIXJlc3BvbnNlKSBjb250aW51ZTtcblxuICAgICAgICAgIGNvbnN0IGJvZHkgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChib2R5KTtcbiAgICAgICAgICBjb25zdCByZXZpc2lvbnMgPSBGb3J1bVBvc3RSZXZpc2lvbkNvbGxlY3Rpb24uX3BhcnNlKHBvc3QsICQpO1xuICAgICAgICAgIHJlc3VsdC5zZXQocG9zdC5pZCwgbmV3IEZvcnVtUG9zdFJldmlzaW9uQ29sbGVjdGlvbihwb3N0LCByZXZpc2lvbnMpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0ZXAgMzogR2V0IEhUTUwgY29udGVudCBpZiByZXF1ZXN0ZWRcbiAgICAgICAgaWYgKHdpdGhIdG1sKSB7XG4gICAgICAgICAgY29uc3QgYWxsUmV2aXNpb25zOiB7IHJldmlzaW9uOiBGb3J1bVBvc3RSZXZpc2lvbjsgcG9zdElkOiBudW1iZXIgfVtdID0gW107XG4gICAgICAgICAgZm9yIChjb25zdCBbcG9zdElkLCBjb2xsZWN0aW9uXSBvZiByZXN1bHQpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcmV2aXNpb24gb2YgY29sbGVjdGlvbikge1xuICAgICAgICAgICAgICBhbGxSZXZpc2lvbnMucHVzaCh7IHJldmlzaW9uLCBwb3N0SWQgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGFsbFJldmlzaW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBodG1sUmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFxuICAgICAgICAgICAgICBhbGxSZXZpc2lvbnMubWFwKCh7IHJldmlzaW9uIH0pID0+ICh7XG4gICAgICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2ZvcnVtL3N1Yi9Gb3J1bVBvc3RSZXZpc2lvbk1vZHVsZScsXG4gICAgICAgICAgICAgICAgcmV2aXNpb25JZDogcmV2aXNpb24uaWQsXG4gICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKGh0bWxSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgICAgICB0aHJvdyBodG1sUmVzdWx0LmVycm9yO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbFJldmlzaW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBjb25zdCB7IHJldmlzaW9uIH0gPSBhbGxSZXZpc2lvbnNbaV0hO1xuICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGh0bWxSZXN1bHQudmFsdWVbaV07XG4gICAgICAgICAgICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIHJldmlzaW9uLmh0bWwgPSBTdHJpbmcocmVzcG9uc2UuY29udGVudCA/PyAnJyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgcmV2aXNpb25zIGZvciBwb3N0czogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBDaGVlcmlvLCBDaGVlcmlvQVBJIH0gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQgKiBhcyBjaGVlcmlvIGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0IHR5cGUgeyBBbnlOb2RlLCBFbGVtZW50IH0gZnJvbSAnZG9taGFuZGxlcic7XG5pbXBvcnQgeyBSZXF1aXJlTG9naW4gfSBmcm9tICcuLi8uLi9jb21tb24vZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBMb2dpblJlcXVpcmVkRXJyb3IsIE5vRWxlbWVudEVycm9yLCBVbmV4cGVjdGVkRXJyb3IgfSBmcm9tICcuLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyBwYXJzZU9kYXRlLCBwYXJzZVVzZXIgfSBmcm9tICcuLi8uLi91dGlsL3BhcnNlcic7XG5pbXBvcnQgdHlwZSB7IENsaWVudCB9IGZyb20gJy4uL2NsaWVudCc7XG5pbXBvcnQgdHlwZSB7IEZvcnVtVGhyZWFkUmVmIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdFVzZXIgfSBmcm9tICcuLi91c2VyJztcbmltcG9ydCB7IEZvcnVtUG9zdFJldmlzaW9uQ29sbGVjdGlvbiB9IGZyb20gJy4vZm9ydW0tcG9zdC1yZXZpc2lvbic7XG5cbi8qKlxuICogRm9ydW0gcG9zdCBkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRm9ydW1Qb3N0RGF0YSB7XG4gIHRocmVhZDogRm9ydW1UaHJlYWRSZWY7XG4gIGlkOiBudW1iZXI7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIHRleHQ6IHN0cmluZztcbiAgZWxlbWVudDogRWxlbWVudDtcbiAgY3JlYXRlZEJ5OiBBYnN0cmFjdFVzZXI7XG4gIGNyZWF0ZWRBdDogRGF0ZTtcbiAgZWRpdGVkQnk/OiBBYnN0cmFjdFVzZXIgfCBudWxsO1xuICBlZGl0ZWRBdD86IERhdGUgfCBudWxsO1xuICBwYXJlbnRJZD86IG51bWJlciB8IG51bGw7XG59XG5cbi8qKlxuICogRm9ydW0gcG9zdFxuICovXG5leHBvcnQgY2xhc3MgRm9ydW1Qb3N0IHtcbiAgcHVibGljIHJlYWRvbmx5IHRocmVhZDogRm9ydW1UaHJlYWRSZWY7XG4gIHB1YmxpYyByZWFkb25seSBpZDogbnVtYmVyO1xuICBwdWJsaWMgdGl0bGU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHRleHQ6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGVsZW1lbnQ6IEVsZW1lbnQ7XG4gIHB1YmxpYyByZWFkb25seSBjcmVhdGVkQnk6IEFic3RyYWN0VXNlcjtcbiAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZWRBdDogRGF0ZTtcbiAgcHVibGljIHJlYWRvbmx5IGVkaXRlZEJ5OiBBYnN0cmFjdFVzZXIgfCBudWxsO1xuICBwdWJsaWMgcmVhZG9ubHkgZWRpdGVkQXQ6IERhdGUgfCBudWxsO1xuICBwcml2YXRlIF9wYXJlbnRJZDogbnVtYmVyIHwgbnVsbDtcbiAgcHJpdmF0ZSBfc291cmNlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfcmV2aXNpb25zOiBGb3J1bVBvc3RSZXZpc2lvbkNvbGxlY3Rpb24gfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBGb3J1bVBvc3REYXRhKSB7XG4gICAgdGhpcy50aHJlYWQgPSBkYXRhLnRocmVhZDtcbiAgICB0aGlzLmlkID0gZGF0YS5pZDtcbiAgICB0aGlzLnRpdGxlID0gZGF0YS50aXRsZTtcbiAgICB0aGlzLnRleHQgPSBkYXRhLnRleHQ7XG4gICAgdGhpcy5lbGVtZW50ID0gZGF0YS5lbGVtZW50O1xuICAgIHRoaXMuY3JlYXRlZEJ5ID0gZGF0YS5jcmVhdGVkQnk7XG4gICAgdGhpcy5jcmVhdGVkQXQgPSBkYXRhLmNyZWF0ZWRBdDtcbiAgICB0aGlzLmVkaXRlZEJ5ID0gZGF0YS5lZGl0ZWRCeSA/PyBudWxsO1xuICAgIHRoaXMuZWRpdGVkQXQgPSBkYXRhLmVkaXRlZEF0ID8/IG51bGw7XG4gICAgdGhpcy5fcGFyZW50SWQgPSBkYXRhLnBhcmVudElkID8/IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUGFyZW50IHBvc3QgSURcbiAgICovXG4gIGdldCBwYXJlbnRJZCgpOiBudW1iZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50SWQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNvdXJjZSBjb2RlIChjYWNoZWQpXG4gICAqL1xuICBnZXQgc291cmNlKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9zb3VyY2U7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHNvdXJjZSBjb2RlXG4gICAqL1xuICBzZXQgc291cmNlKHZhbHVlOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgdGhpcy5fc291cmNlID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNvdXJjZSBjb2RlIChXaWtpZG90IHN5bnRheClcbiAgICovXG4gIGdldFNvdXJjZSgpOiBXaWtpZG90UmVzdWx0QXN5bmM8c3RyaW5nPiB7XG4gICAgaWYgKHRoaXMuc291cmNlICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gZnJvbVByb21pc2UoUHJvbWlzZS5yZXNvbHZlKHRoaXMuc291cmNlKSwgKGUpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoU3RyaW5nKGUpKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgRm9ydW1Qb3N0Q29sbGVjdGlvbi5hY3F1aXJlUG9zdFNvdXJjZXModGhpcy50aHJlYWQsIFt0aGlzXSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zb3VyY2UgPT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ1NvdXJjZSB0ZXh0YXJlYSBub3QgZm91bmQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2U7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSByZXR1cm4gZXJyb3I7XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHBvc3Qgc291cmNlOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFZGl0IHBvc3RcbiAgICogQHBhcmFtIHNvdXJjZSAtIE5ldyBzb3VyY2UgKFdpa2lkb3Qgc3ludGF4KVxuICAgKiBAcGFyYW0gdGl0bGUgLSBOZXcgdGl0bGUgKGtlZXBzIGN1cnJlbnQgdGl0bGUgaWYgb21pdHRlZClcbiAgICovXG4gIEBSZXF1aXJlTG9naW5cbiAgZWRpdChzb3VyY2U6IHN0cmluZywgdGl0bGU/OiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIEdldCBjdXJyZW50IHJldmlzaW9uIElEXG4gICAgICAgIGNvbnN0IGZvcm1SZXN1bHQgPSBhd2FpdCB0aGlzLnRocmVhZC5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdmb3J1bS9zdWIvRm9ydW1FZGl0UG9zdEZvcm1Nb2R1bGUnLFxuICAgICAgICAgICAgdGhyZWFkSWQ6IHRoaXMudGhyZWFkLmlkLFxuICAgICAgICAgICAgcG9zdElkOiB0aGlzLmlkLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChmb3JtUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBmb3JtUmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZm9ybVJlc3BvbnNlID0gZm9ybVJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFmb3JtUmVzcG9uc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ0VtcHR5IGZvcm0gcmVzcG9uc2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoU3RyaW5nKGZvcm1SZXNwb25zZS5ib2R5ID8/ICcnKSk7XG4gICAgICAgIGNvbnN0IHJldmlzaW9uSW5wdXQgPSAkKFwiaW5wdXRbbmFtZT0nY3VycmVudFJldmlzaW9uSWQnXVwiKTtcbiAgICAgICAgaWYgKHJldmlzaW9uSW5wdXQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdDdXJyZW50IHJldmlzaW9uIElEIGlucHV0IG5vdCBmb3VuZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmV2aXNpb25WYWx1ZSA9IHJldmlzaW9uSW5wdXQudmFsKCk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRSZXZpc2lvbklkID0gTnVtYmVyLnBhcnNlSW50KFN0cmluZyhyZXZpc2lvblZhbHVlID8/ICcnKSwgMTApO1xuICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKGN1cnJlbnRSZXZpc2lvbklkKSkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcignSW52YWxpZCByZXZpc2lvbiBJRCB2YWx1ZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2F2ZSBlZGl0XG4gICAgICAgIGNvbnN0IGVkaXRSZXN1bHQgPSBhd2FpdCB0aGlzLnRocmVhZC5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ0ZvcnVtQWN0aW9uJyxcbiAgICAgICAgICAgIGV2ZW50OiAnc2F2ZUVkaXRQb3N0JyxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdFbXB0eScsXG4gICAgICAgICAgICBwb3N0SWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICBjdXJyZW50UmV2aXNpb25JZCxcbiAgICAgICAgICAgIHRpdGxlOiB0aXRsZSA/PyB0aGlzLnRpdGxlLFxuICAgICAgICAgICAgc291cmNlLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChlZGl0UmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBlZGl0UmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIGxvY2FsIHN0YXRlXG4gICAgICAgIGlmICh0aXRsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy50aXRsZSA9IHRpdGxlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGVkaXQgcG9zdDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcG9zdCBoYXMgYmVlbiBlZGl0ZWQgKGhhcyByZXZpc2lvbnMpXG4gICAqL1xuICBnZXQgaGFzUmV2aXNpb25zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmVkaXRlZEJ5ICE9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBwb3N0IHJldmlzaW9ucyAoZWRpdCBoaXN0b3J5KVxuICAgKiBAcmV0dXJucyBSZXZpc2lvbiBjb2xsZWN0aW9uXG4gICAqL1xuICBnZXRSZXZpc2lvbnMoKTogV2lraWRvdFJlc3VsdEFzeW5jPEZvcnVtUG9zdFJldmlzaW9uQ29sbGVjdGlvbj4ge1xuICAgIGlmICh0aGlzLl9yZXZpc2lvbnMgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiBmcm9tUHJvbWlzZShQcm9taXNlLnJlc29sdmUodGhpcy5fcmV2aXNpb25zKSwgKGUpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoU3RyaW5nKGUpKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgRm9ydW1Qb3N0UmV2aXNpb25Db2xsZWN0aW9uLmFjcXVpcmVBbGxGb3JQb3N0cyhbdGhpc10pO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcmV2aXNpb25zID0gcmVzdWx0LnZhbHVlLmdldCh0aGlzLmlkKSA/PyBuZXcgRm9ydW1Qb3N0UmV2aXNpb25Db2xsZWN0aW9uKHRoaXMsIFtdKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JldmlzaW9ucztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHJldHVybiBlcnJvcjtcbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgcmV2aXNpb25zOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBGb3J1bVBvc3QoaWQ9JHt0aGlzLmlkfSwgdGl0bGU9JHt0aGlzLnRpdGxlfSlgO1xuICB9XG59XG5cbi8qKlxuICogRm9ydW0gcG9zdCBjb2xsZWN0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBGb3J1bVBvc3RDb2xsZWN0aW9uIGV4dGVuZHMgQXJyYXk8Rm9ydW1Qb3N0PiB7XG4gIHB1YmxpYyByZWFkb25seSB0aHJlYWQ6IEZvcnVtVGhyZWFkUmVmO1xuXG4gIGNvbnN0cnVjdG9yKHRocmVhZDogRm9ydW1UaHJlYWRSZWYsIHBvc3RzPzogRm9ydW1Qb3N0W10pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMudGhyZWFkID0gdGhyZWFkO1xuICAgIGlmIChwb3N0cykge1xuICAgICAgdGhpcy5wdXNoKC4uLnBvc3RzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBieSBJRFxuICAgKiBAcGFyYW0gaWQgLSBQb3N0IElEXG4gICAqIEByZXR1cm5zIFBvc3QgKHVuZGVmaW5lZCBpZiBub3QgZm91bmQpXG4gICAqL1xuICBmaW5kQnlJZChpZDogbnVtYmVyKTogRm9ydW1Qb3N0IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5maW5kKChwb3N0KSA9PiBwb3N0LmlkID09PSBpZCk7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgcG9zdHMgZnJvbSBIVE1MIChpbnRlcm5hbCBtZXRob2QpXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBfcGFyc2UodGhyZWFkOiBGb3J1bVRocmVhZFJlZiwgJDogQ2hlZXJpb0FQSSk6IEZvcnVtUG9zdFtdIHtcbiAgICBjb25zdCBwb3N0czogRm9ydW1Qb3N0W10gPSBbXTtcblxuICAgICQoJ2Rpdi5wb3N0W2lkXj1cInBvc3QtXCJdJykuZWFjaCgoX2ksIHBvc3RFbGVtKSA9PiB7XG4gICAgICBjb25zdCAkcG9zdCA9ICQocG9zdEVsZW0pO1xuICAgICAgY29uc3QgcG9zdElkQXR0ciA9ICRwb3N0LmF0dHIoJ2lkJyk7XG4gICAgICBpZiAoIXBvc3RJZEF0dHIpIHJldHVybjtcblxuICAgICAgY29uc3QgcG9zdElkID0gTnVtYmVyLnBhcnNlSW50KHBvc3RJZEF0dHIucmVwbGFjZSgncG9zdC0nLCAnJyksIDEwKTtcbiAgICAgIGlmIChOdW1iZXIuaXNOYU4ocG9zdElkKSkgcmV0dXJuO1xuXG4gICAgICAvLyBHZXQgcGFyZW50IHBvc3QgSURcbiAgICAgIGxldCBwYXJlbnRJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgICBjb25zdCAkcGFyZW50Q29udGFpbmVyID0gJHBvc3QucGFyZW50KCk7XG4gICAgICBpZiAoJHBhcmVudENvbnRhaW5lci5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0ICRncmFuZHBhcmVudCA9ICRwYXJlbnRDb250YWluZXIucGFyZW50KCk7XG4gICAgICAgIGlmICgkZ3JhbmRwYXJlbnQubGVuZ3RoID4gMCAmJiAkZ3JhbmRwYXJlbnRbMF0/Lm5hbWUgIT09ICdib2R5Jykge1xuICAgICAgICAgIGNvbnN0IGdyYW5kcGFyZW50Q2xhc3NlcyA9ICRncmFuZHBhcmVudC5hdHRyKCdjbGFzcycpID8/ICcnO1xuICAgICAgICAgIGlmIChncmFuZHBhcmVudENsYXNzZXMuaW5jbHVkZXMoJ3Bvc3QtY29udGFpbmVyJykpIHtcbiAgICAgICAgICAgIGNvbnN0ICRwYXJlbnRQb3N0ID0gJGdyYW5kcGFyZW50LmZpbmQoJz4gZGl2LnBvc3QnKTtcbiAgICAgICAgICAgIGlmICgkcGFyZW50UG9zdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHBhcmVudFBvc3RJZEF0dHIgPSAkcGFyZW50UG9zdC5hdHRyKCdpZCcpO1xuICAgICAgICAgICAgICBpZiAocGFyZW50UG9zdElkQXR0cikge1xuICAgICAgICAgICAgICAgIHBhcmVudElkID0gTnVtYmVyLnBhcnNlSW50KHBhcmVudFBvc3RJZEF0dHIucmVwbGFjZSgncG9zdC0nLCAnJyksIDEwKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBHZXQgdGl0bGUgYW5kIGNvbnRlbnRcbiAgICAgIC8vIFVzZSBjaGlsZCBjb21iaW5hdG9yICg+KSB0byBhdm9pZCBtYXRjaGluZyBuZXN0ZWQgcHNldWRvLXBvc3RzIGluIGNvbnRlbnRcbiAgICAgIGNvbnN0ICR3cmFwcGVyID0gJHBvc3QuZmluZCgnPiBkaXYubG9uZycpO1xuICAgICAgaWYgKCR3cmFwcGVyLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCAkaGVhZCA9ICR3cmFwcGVyLmZpbmQoJz4gZGl2LmhlYWQnKTtcbiAgICAgIGlmICgkaGVhZC5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgY29uc3QgJHRpdGxlID0gJGhlYWQuZmluZCgnPiBkaXYudGl0bGUnKTtcbiAgICAgIGNvbnN0IHRpdGxlID0gJHRpdGxlLnRleHQoKS50cmltKCk7XG5cbiAgICAgIGNvbnN0ICRjb250ZW50ID0gJHdyYXBwZXIuZmluZCgnPiBkaXYuY29udGVudCcpO1xuICAgICAgY29uc3QgdGV4dCA9ICRjb250ZW50Lmh0bWwoKSA/PyAnJztcblxuICAgICAgLy8gQXV0aG9yIGFuZCB0aW1lc3RhbXBcbiAgICAgIGNvbnN0ICRpbmZvID0gJGhlYWQuZmluZCgnPiBkaXYuaW5mbycpO1xuICAgICAgaWYgKCRpbmZvLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCAkdXNlckVsZW0gPSAkaW5mby5maW5kKCdzcGFuLnByaW50dXNlcicpO1xuICAgICAgaWYgKCR1c2VyRWxlbS5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgY29uc3QgY3JlYXRlZEJ5ID0gcGFyc2VVc2VyKHRocmVhZC5zaXRlLmNsaWVudCBhcyBDbGllbnQsICR1c2VyRWxlbSBhcyBDaGVlcmlvPEFueU5vZGU+KTtcblxuICAgICAgY29uc3QgJG9kYXRlRWxlbSA9ICRpbmZvLmZpbmQoJ3NwYW4ub2RhdGUnKTtcbiAgICAgIGlmICgkb2RhdGVFbGVtLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBjcmVhdGVkQXQgPSBwYXJzZU9kYXRlKCRvZGF0ZUVsZW0gYXMgQ2hlZXJpbzxBbnlOb2RlPikgPz8gbmV3IERhdGUoKTtcblxuICAgICAgLy8gRWRpdCBpbmZvIChpZiBleGlzdHMpXG4gICAgICBsZXQgZWRpdGVkQnk6IEFic3RyYWN0VXNlciB8IG51bGwgPSBudWxsO1xuICAgICAgbGV0IGVkaXRlZEF0OiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gICAgICBjb25zdCAkY2hhbmdlcyA9ICR3cmFwcGVyLmZpbmQoJ2Rpdi5jaGFuZ2VzJyk7XG4gICAgICBpZiAoJGNoYW5nZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCAkZWRpdFVzZXJFbGVtID0gJGNoYW5nZXMuZmluZCgnc3Bhbi5wcmludHVzZXInKTtcbiAgICAgICAgY29uc3QgJGVkaXRPZGF0ZUVsZW0gPSAkY2hhbmdlcy5maW5kKCdzcGFuLm9kYXRlJyk7XG4gICAgICAgIGlmICgkZWRpdFVzZXJFbGVtLmxlbmd0aCA+IDAgJiYgJGVkaXRPZGF0ZUVsZW0ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGVkaXRlZEJ5ID0gcGFyc2VVc2VyKHRocmVhZC5zaXRlLmNsaWVudCBhcyBDbGllbnQsICRlZGl0VXNlckVsZW0gYXMgQ2hlZXJpbzxBbnlOb2RlPik7XG4gICAgICAgICAgZWRpdGVkQXQgPSBwYXJzZU9kYXRlKCRlZGl0T2RhdGVFbGVtIGFzIENoZWVyaW88QW55Tm9kZT4pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHBvc3RzLnB1c2goXG4gICAgICAgIG5ldyBGb3J1bVBvc3Qoe1xuICAgICAgICAgIHRocmVhZCxcbiAgICAgICAgICBpZDogcG9zdElkLFxuICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgIHRleHQsXG4gICAgICAgICAgZWxlbWVudDogcG9zdEVsZW0gYXMgRWxlbWVudCxcbiAgICAgICAgICBjcmVhdGVkQnksXG4gICAgICAgICAgY3JlYXRlZEF0LFxuICAgICAgICAgIGVkaXRlZEJ5LFxuICAgICAgICAgIGVkaXRlZEF0LFxuICAgICAgICAgIHBhcmVudElkLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBwb3N0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHBvc3RzIGluIGEgdGhyZWFkXG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZUFsbEluVGhyZWFkKHRocmVhZDogRm9ydW1UaHJlYWRSZWYpOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1Qb3N0Q29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBvc3RzOiBGb3J1bVBvc3RbXSA9IFtdO1xuXG4gICAgICAgIGNvbnN0IGZpcnN0UmVzdWx0ID0gYXdhaXQgdGhyZWFkLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2ZvcnVtL0ZvcnVtVmlld1RocmVhZFBvc3RzTW9kdWxlJyxcbiAgICAgICAgICAgIHBhZ2VObzogJzEnLFxuICAgICAgICAgICAgdDogU3RyaW5nKHRocmVhZC5pZCksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKGZpcnN0UmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBmaXJzdFJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpcnN0UmVzcG9uc2UgPSBmaXJzdFJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFmaXJzdFJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdFbXB0eSByZXNwb25zZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlyc3RCb2R5ID0gU3RyaW5nKGZpcnN0UmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgIGNvbnN0ICRmaXJzdCA9IGNoZWVyaW8ubG9hZChmaXJzdEJvZHkpO1xuXG4gICAgICAgIHBvc3RzLnB1c2goLi4uRm9ydW1Qb3N0Q29sbGVjdGlvbi5fcGFyc2UodGhyZWFkLCAkZmlyc3QpKTtcblxuICAgICAgICAvLyBDaGVjayBwYWdpbmF0aW9uXG4gICAgICAgIGNvbnN0ICRwYWdlciA9ICRmaXJzdCgnZGl2LnBhZ2VyJyk7XG4gICAgICAgIGlmICgkcGFnZXIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBGb3J1bVBvc3RDb2xsZWN0aW9uKHRocmVhZCwgcG9zdHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgJHBhZ2VyVGFyZ2V0cyA9ICRwYWdlci5maW5kKCdzcGFuLnRhcmdldCcpO1xuICAgICAgICBpZiAoJHBhZ2VyVGFyZ2V0cy5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBGb3J1bVBvc3RDb2xsZWN0aW9uKHRocmVhZCwgcG9zdHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IGxhc3QgcGFnZSBudW1iZXIgZnJvbSBzZWNvbmQgdG8gbGFzdCBwYWdlIGxpbmtcbiAgICAgICAgY29uc3QgbGFzdFBhZ2VUZXh0ID0gJHBhZ2VyVGFyZ2V0c1xuICAgICAgICAgIC5lcSgkcGFnZXJUYXJnZXRzLmxlbmd0aCAtIDIpXG4gICAgICAgICAgLnRleHQoKVxuICAgICAgICAgIC50cmltKCk7XG4gICAgICAgIGNvbnN0IGxhc3RQYWdlID0gTnVtYmVyLnBhcnNlSW50KGxhc3RQYWdlVGV4dCwgMTApO1xuICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKGxhc3RQYWdlKSB8fCBsYXN0UGFnZSA8PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBGb3J1bVBvc3RDb2xsZWN0aW9uKHRocmVhZCwgcG9zdHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IHJlbWFpbmluZyBwYWdlc1xuICAgICAgICBjb25zdCBib2RpZXM6IHsgbW9kdWxlTmFtZTogc3RyaW5nOyBwYWdlTm86IHN0cmluZzsgdDogc3RyaW5nIH1bXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBwYWdlID0gMjsgcGFnZSA8PSBsYXN0UGFnZTsgcGFnZSsrKSB7XG4gICAgICAgICAgYm9kaWVzLnB1c2goe1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2ZvcnVtL0ZvcnVtVmlld1RocmVhZFBvc3RzTW9kdWxlJyxcbiAgICAgICAgICAgIHBhZ2VObzogU3RyaW5nKHBhZ2UpLFxuICAgICAgICAgICAgdDogU3RyaW5nKHRocmVhZC5pZCksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhZGRpdGlvbmFsUmVzdWx0cyA9IGF3YWl0IHRocmVhZC5zaXRlLmFtY1JlcXVlc3QoYm9kaWVzKTtcbiAgICAgICAgaWYgKGFkZGl0aW9uYWxSZXN1bHRzLmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBhZGRpdGlvbmFsUmVzdWx0cy5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgcmVzcG9uc2Ugb2YgYWRkaXRpb25hbFJlc3VsdHMudmFsdWUpIHtcbiAgICAgICAgICBjb25zdCBib2R5ID0gU3RyaW5nKHJlc3BvbnNlPy5ib2R5ID8/ICcnKTtcbiAgICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGJvZHkpO1xuICAgICAgICAgIHBvc3RzLnB1c2goLi4uRm9ydW1Qb3N0Q29sbGVjdGlvbi5fcGFyc2UodGhyZWFkLCAkKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IEZvcnVtUG9zdENvbGxlY3Rpb24odGhyZWFkLCBwb3N0cyk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSByZXR1cm4gZXJyb3I7XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSBwb3N0czogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBwb3N0cyBmcm9tIG11bHRpcGxlIHRocmVhZHNcbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlQWxsSW5UaHJlYWRzKFxuICAgIHRocmVhZHM6IEZvcnVtVGhyZWFkUmVmW11cbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPE1hcDxudW1iZXIsIEZvcnVtUG9zdENvbGxlY3Rpb24+PiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKHRocmVhZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBNYXA8bnVtYmVyLCBGb3J1bVBvc3RDb2xsZWN0aW9uPigpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IE1hcDxudW1iZXIsIEZvcnVtUG9zdENvbGxlY3Rpb24+KCk7XG4gICAgICAgIGNvbnN0IHNpdGUgPSB0aHJlYWRzWzBdIS5zaXRlO1xuXG4gICAgICAgIC8vIFN0ZXAgMTogR2V0IGZpcnN0IHBhZ2Ugb2YgYWxsIHRocmVhZHNcbiAgICAgICAgY29uc3QgZmlyc3RQYWdlUmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFxuICAgICAgICAgIHRocmVhZHMubWFwKCh0aHJlYWQpID0+ICh7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnZm9ydW0vRm9ydW1WaWV3VGhyZWFkUG9zdHNNb2R1bGUnLFxuICAgICAgICAgICAgcGFnZU5vOiAnMScsXG4gICAgICAgICAgICB0OiBTdHJpbmcodGhyZWFkLmlkKSxcbiAgICAgICAgICB9KSlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoZmlyc3RQYWdlUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBmaXJzdFBhZ2VSZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGVwIDI6IFBhcnNlIGZpcnN0IHBhZ2VzIGFuZCBkZXRlcm1pbmUgcGFnaW5hdGlvblxuICAgICAgICBjb25zdCBhZGRpdGlvbmFsUmVxdWVzdHM6IHsgdGhyZWFkOiBGb3J1bVRocmVhZFJlZjsgcGFnZTogbnVtYmVyIH1bXSA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhyZWFkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHRocmVhZCA9IHRocmVhZHNbaV0hO1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gZmlyc3RQYWdlUmVzdWx0LnZhbHVlW2ldO1xuICAgICAgICAgIGlmICghcmVzcG9uc2UpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY29uc3QgYm9keSA9IFN0cmluZyhyZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGJvZHkpO1xuXG4gICAgICAgICAgY29uc3QgcG9zdHMgPSBGb3J1bVBvc3RDb2xsZWN0aW9uLl9wYXJzZSh0aHJlYWQsICQpO1xuICAgICAgICAgIHJlc3VsdC5zZXQodGhyZWFkLmlkLCBuZXcgRm9ydW1Qb3N0Q29sbGVjdGlvbih0aHJlYWQsIHBvc3RzKSk7XG5cbiAgICAgICAgICAvLyBDaGVjayBwYWdpbmF0aW9uXG4gICAgICAgICAgY29uc3QgJHBhZ2VyID0gJCgnZGl2LnBhZ2VyJyk7XG4gICAgICAgICAgaWYgKCRwYWdlci5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY29uc3QgJHBhZ2VyVGFyZ2V0cyA9ICRwYWdlci5maW5kKCdzcGFuLnRhcmdldCcpO1xuICAgICAgICAgIGlmICgkcGFnZXJUYXJnZXRzLmxlbmd0aCA8IDIpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY29uc3QgbGFzdFBhZ2VUZXh0ID0gJHBhZ2VyVGFyZ2V0c1xuICAgICAgICAgICAgLmVxKCRwYWdlclRhcmdldHMubGVuZ3RoIC0gMilcbiAgICAgICAgICAgIC50ZXh0KClcbiAgICAgICAgICAgIC50cmltKCk7XG4gICAgICAgICAgY29uc3QgbGFzdFBhZ2UgPSBOdW1iZXIucGFyc2VJbnQobGFzdFBhZ2VUZXh0LCAxMCk7XG4gICAgICAgICAgaWYgKE51bWJlci5pc05hTihsYXN0UGFnZSkgfHwgbGFzdFBhZ2UgPD0gMSkgY29udGludWU7XG5cbiAgICAgICAgICBmb3IgKGxldCBwYWdlID0gMjsgcGFnZSA8PSBsYXN0UGFnZTsgcGFnZSsrKSB7XG4gICAgICAgICAgICBhZGRpdGlvbmFsUmVxdWVzdHMucHVzaCh7IHRocmVhZCwgcGFnZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGVwIDM6IEZldGNoIGFkZGl0aW9uYWwgcGFnZXNcbiAgICAgICAgaWYgKGFkZGl0aW9uYWxSZXF1ZXN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgYWRkaXRpb25hbFJlc3VsdCA9IGF3YWl0IHNpdGUuYW1jUmVxdWVzdChcbiAgICAgICAgICAgIGFkZGl0aW9uYWxSZXF1ZXN0cy5tYXAoKHsgdGhyZWFkLCBwYWdlIH0pID0+ICh7XG4gICAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdmb3J1bS9Gb3J1bVZpZXdUaHJlYWRQb3N0c01vZHVsZScsXG4gICAgICAgICAgICAgIHBhZ2VObzogU3RyaW5nKHBhZ2UpLFxuICAgICAgICAgICAgICB0OiBTdHJpbmcodGhyZWFkLmlkKSxcbiAgICAgICAgICAgIH0pKVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoYWRkaXRpb25hbFJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgICB0aHJvdyBhZGRpdGlvbmFsUmVzdWx0LmVycm9yO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWRkaXRpb25hbFJlcXVlc3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCB7IHRocmVhZCB9ID0gYWRkaXRpb25hbFJlcXVlc3RzW2ldITtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYWRkaXRpb25hbFJlc3VsdC52YWx1ZVtpXTtcbiAgICAgICAgICAgIGlmICghcmVzcG9uc2UpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBjb25zdCBib2R5ID0gU3RyaW5nKHJlc3BvbnNlLmJvZHkgPz8gJycpO1xuICAgICAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChib2R5KTtcbiAgICAgICAgICAgIGNvbnN0IHBvc3RzID0gRm9ydW1Qb3N0Q29sbGVjdGlvbi5fcGFyc2UodGhyZWFkLCAkKTtcblxuICAgICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSByZXN1bHQuZ2V0KHRocmVhZC5pZCk7XG4gICAgICAgICAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgICAgICAgICAgZXhpc3RpbmcucHVzaCguLi5wb3N0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHJldHVybiBlcnJvcjtcbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBhY3F1aXJlIHBvc3RzOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gYWNxdWlyZSBwb3N0IHNvdXJjZXMgaW4gYnVsa1xuICAgKi9cbiAgc3RhdGljIGFjcXVpcmVQb3N0U291cmNlcyhcbiAgICB0aHJlYWQ6IEZvcnVtVGhyZWFkUmVmLFxuICAgIHBvc3RzOiBGb3J1bVBvc3RbXVxuICApOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1Qb3N0Q29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRhcmdldFBvc3RzID0gcG9zdHMuZmlsdGVyKChwb3N0KSA9PiBwb3N0LnNvdXJjZSA9PT0gbnVsbCk7XG5cbiAgICAgICAgaWYgKHRhcmdldFBvc3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBuZXcgRm9ydW1Qb3N0Q29sbGVjdGlvbih0aHJlYWQsIHBvc3RzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRocmVhZC5zaXRlLmFtY1JlcXVlc3QoXG4gICAgICAgICAgdGFyZ2V0UG9zdHMubWFwKChwb3N0KSA9PiAoe1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2ZvcnVtL3N1Yi9Gb3J1bUVkaXRQb3N0Rm9ybU1vZHVsZScsXG4gICAgICAgICAgICB0aHJlYWRJZDogdGhyZWFkLmlkLFxuICAgICAgICAgICAgcG9zdElkOiBwb3N0LmlkLFxuICAgICAgICAgIH0pKVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFyZ2V0UG9zdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBwb3N0ID0gdGFyZ2V0UG9zdHNbaV07XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbaV07XG4gICAgICAgICAgaWYgKCFwb3N0IHx8ICFyZXNwb25zZSkgY29udGludWU7XG4gICAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJykpO1xuICAgICAgICAgIGNvbnN0IHNvdXJjZUVsZW0gPSAkKFwidGV4dGFyZWFbbmFtZT0nc291cmNlJ11cIik7XG4gICAgICAgICAgaWYgKHNvdXJjZUVsZW0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoYFNvdXJjZSB0ZXh0YXJlYSBub3QgZm91bmQgZm9yIHBvc3Q6ICR7cG9zdC5pZH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcG9zdC5zb3VyY2UgPSBzb3VyY2VFbGVtLnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgRm9ydW1Qb3N0Q29sbGVjdGlvbih0aHJlYWQsIHBvc3RzKTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHJldHVybiBlcnJvcjtcbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBhY3F1aXJlIHBvc3Qgc291cmNlczogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNvdXJjZXMgZm9yIGFsbCBwb3N0cyBpbiB0aGUgY29sbGVjdGlvblxuICAgKiBAcmV0dXJucyBSZXN1bHQgY29udGFpbmluZyB0aGUgY29sbGVjdGlvbiAoZm9yIG1ldGhvZCBjaGFpbmluZylcbiAgICovXG4gIGdldFBvc3RTb3VyY2VzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxGb3J1bVBvc3RDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIEZvcnVtUG9zdENvbGxlY3Rpb24uYWNxdWlyZVBvc3RTb3VyY2VzKHRoaXMudGhyZWFkLCBBcnJheS5mcm9tKHRoaXMpKTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IENoZWVyaW8gfSBmcm9tICdjaGVlcmlvJztcbmltcG9ydCAqIGFzIGNoZWVyaW8gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQgdHlwZSB7IEFueU5vZGUgfSBmcm9tICdkb21oYW5kbGVyJztcbmltcG9ydCB7IFJlcXVpcmVMb2dpbiB9IGZyb20gJy4uLy4uL2NvbW1vbi9kZWNvcmF0b3JzJztcbmltcG9ydCB7IE5vRWxlbWVudEVycm9yLCBVbmV4cGVjdGVkRXJyb3IgfSBmcm9tICcuLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyBwYXJzZU9kYXRlLCBwYXJzZVVzZXIgfSBmcm9tICcuLi8uLi91dGlsL3BhcnNlcic7XG5pbXBvcnQgdHlwZSB7IFNpdGUgfSBmcm9tICcuLi9zaXRlJztcbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RVc2VyIH0gZnJvbSAnLi4vdXNlcic7XG5pbXBvcnQgdHlwZSB7IEZvcnVtQ2F0ZWdvcnkgfSBmcm9tICcuL2ZvcnVtLWNhdGVnb3J5JztcbmltcG9ydCB7IEZvcnVtUG9zdENvbGxlY3Rpb24gfSBmcm9tICcuL2ZvcnVtLXBvc3QnO1xuXG4vKipcbiAqIEZvcnVtIHRocmVhZCBkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRm9ydW1UaHJlYWREYXRhIHtcbiAgc2l0ZTogU2l0ZTtcbiAgaWQ6IG51bWJlcjtcbiAgdGl0bGU6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgY3JlYXRlZEJ5OiBBYnN0cmFjdFVzZXIgfCBudWxsO1xuICBjcmVhdGVkQXQ6IERhdGU7XG4gIHBvc3RDb3VudDogbnVtYmVyO1xuICBjYXRlZ29yeT86IEZvcnVtQ2F0ZWdvcnkgfCBudWxsO1xufVxuXG4vKipcbiAqIEZvcnVtIHRocmVhZFxuICovXG5leHBvcnQgY2xhc3MgRm9ydW1UaHJlYWQge1xuICBwdWJsaWMgcmVhZG9ubHkgc2l0ZTogU2l0ZTtcbiAgcHVibGljIHJlYWRvbmx5IGlkOiBudW1iZXI7XG4gIHB1YmxpYyByZWFkb25seSB0aXRsZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgZGVzY3JpcHRpb246IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZWRCeTogQWJzdHJhY3RVc2VyIHwgbnVsbDtcbiAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZWRBdDogRGF0ZTtcbiAgcHVibGljIHBvc3RDb3VudDogbnVtYmVyO1xuICBwdWJsaWMgcmVhZG9ubHkgY2F0ZWdvcnk6IEZvcnVtQ2F0ZWdvcnkgfCBudWxsO1xuICBwcml2YXRlIF9wb3N0czogRm9ydW1Qb3N0Q29sbGVjdGlvbiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IEZvcnVtVGhyZWFkRGF0YSkge1xuICAgIHRoaXMuc2l0ZSA9IGRhdGEuc2l0ZTtcbiAgICB0aGlzLmlkID0gZGF0YS5pZDtcbiAgICB0aGlzLnRpdGxlID0gZGF0YS50aXRsZTtcbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGF0YS5kZXNjcmlwdGlvbjtcbiAgICB0aGlzLmNyZWF0ZWRCeSA9IGRhdGEuY3JlYXRlZEJ5O1xuICAgIHRoaXMuY3JlYXRlZEF0ID0gZGF0YS5jcmVhdGVkQXQ7XG4gICAgdGhpcy5wb3N0Q291bnQgPSBkYXRhLnBvc3RDb3VudDtcbiAgICB0aGlzLmNhdGVnb3J5ID0gZGF0YS5jYXRlZ29yeSA/PyBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aHJlYWQgVVJMXG4gICAqL1xuICBnZXRVcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5zaXRlLmdldEJhc2VVcmwoKX0vZm9ydW0vdC0ke3RoaXMuaWR9L2A7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBvc3QgbGlzdFxuICAgKi9cbiAgZ2V0UG9zdHMoKTogV2lraWRvdFJlc3VsdEFzeW5jPEZvcnVtUG9zdENvbGxlY3Rpb24+IHtcbiAgICBpZiAodGhpcy5fcG9zdHMgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiBmcm9tUHJvbWlzZShQcm9taXNlLnJlc29sdmUodGhpcy5fcG9zdHMpLCAoZSkgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihTdHJpbmcoZSkpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBGb3J1bVBvc3RDb2xsZWN0aW9uLmFjcXVpcmVBbGxJblRocmVhZHMoW3RoaXNdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Bvc3RzID0gcmVzdWx0LnZhbHVlLmdldCh0aGlzLmlkKSA/PyBuZXcgRm9ydW1Qb3N0Q29sbGVjdGlvbih0aGlzLCBbXSk7XG4gICAgICAgIHJldHVybiB0aGlzLl9wb3N0cztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgcG9zdHM6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVwbHkgdG8gdGhyZWFkXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIHJlcGx5KFxuICAgIHNvdXJjZTogc3RyaW5nLFxuICAgIHRpdGxlID0gJycsXG4gICAgcGFyZW50UG9zdElkOiBudW1iZXIgfCBudWxsID0gbnVsbFxuICApOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1UaHJlYWQ+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdGhyZWFkSWQ6IFN0cmluZyh0aGlzLmlkKSxcbiAgICAgICAgICAgIHBhcmVudElkOiBwYXJlbnRQb3N0SWQgIT09IG51bGwgPyBTdHJpbmcocGFyZW50UG9zdElkKSA6ICcnLFxuICAgICAgICAgICAgdGl0bGUsXG4gICAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgICBhY3Rpb246ICdGb3J1bUFjdGlvbicsXG4gICAgICAgICAgICBldmVudDogJ3NhdmVQb3N0JyxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdFbXB0eScsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9wb3N0cyA9IG51bGw7XG4gICAgICAgIHRoaXMucG9zdENvdW50ICs9IDE7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIHJlcGx5OiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYEZvcnVtVGhyZWFkKGlkPSR7dGhpcy5pZH0sIHRpdGxlPSR7dGhpcy50aXRsZX0pYDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhyZWFkIGJ5IElEXG4gICAqL1xuICBzdGF0aWMgZ2V0RnJvbUlkKFxuICAgIHNpdGU6IFNpdGUsXG4gICAgdGhyZWFkSWQ6IG51bWJlcixcbiAgICBjYXRlZ29yeTogRm9ydW1DYXRlZ29yeSB8IG51bGwgPSBudWxsXG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzxGb3J1bVRocmVhZD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IEZvcnVtVGhyZWFkQ29sbGVjdGlvbi5hY3F1aXJlRnJvbVRocmVhZElkcyhzaXRlLCBbdGhyZWFkSWRdLCBjYXRlZ29yeSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0aHJlYWQgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghdGhyZWFkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKGBUaHJlYWQgbm90IGZvdW5kOiAke3RocmVhZElkfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aHJlYWQ7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSByZXR1cm4gZXJyb3I7XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHRocmVhZDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBGb3J1bSB0aHJlYWQgY29sbGVjdGlvblxuICovXG5leHBvcnQgY2xhc3MgRm9ydW1UaHJlYWRDb2xsZWN0aW9uIGV4dGVuZHMgQXJyYXk8Rm9ydW1UaHJlYWQ+IHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG5cbiAgY29uc3RydWN0b3Ioc2l0ZTogU2l0ZSwgdGhyZWFkcz86IEZvcnVtVGhyZWFkW10pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuc2l0ZSA9IHNpdGU7XG4gICAgaWYgKHRocmVhZHMpIHtcbiAgICAgIHRoaXMucHVzaCguLi50aHJlYWRzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBieSBJRFxuICAgKi9cbiAgZmluZEJ5SWQoaWQ6IG51bWJlcik6IEZvcnVtVGhyZWFkIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5maW5kKCh0aHJlYWQpID0+IHRocmVhZC5pZCA9PT0gaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgdGhyZWFkcyBpbiBjYXRlZ29yeVxuICAgKi9cbiAgc3RhdGljIGFjcXVpcmVBbGxJbkNhdGVnb3J5KGNhdGVnb3J5OiBGb3J1bUNhdGVnb3J5KTogV2lraWRvdFJlc3VsdEFzeW5jPEZvcnVtVGhyZWFkQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRocmVhZHM6IEZvcnVtVGhyZWFkW10gPSBbXTtcblxuICAgICAgICBjb25zdCBmaXJzdFJlc3VsdCA9IGF3YWl0IGNhdGVnb3J5LnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgcDogMSxcbiAgICAgICAgICAgIGM6IGNhdGVnb3J5LmlkLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2ZvcnVtL0ZvcnVtVmlld0NhdGVnb3J5TW9kdWxlJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcblxuICAgICAgICBpZiAoZmlyc3RSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IGZpcnN0UmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlyc3RSZXNwb25zZSA9IGZpcnN0UmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIWZpcnN0UmVzcG9uc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ0VtcHR5IHJlc3BvbnNlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaXJzdEJvZHkgPSBTdHJpbmcoZmlyc3RSZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgY29uc3QgJGZpcnN0ID0gY2hlZXJpby5sb2FkKGZpcnN0Qm9keSk7XG5cbiAgICAgICAgJGZpcnN0KCd0YWJsZS50YWJsZSB0ci5oZWFkfnRyJykuZWFjaCgoX2ksIGVsZW0pID0+IHtcbiAgICAgICAgICBjb25zdCAkcm93ID0gJGZpcnN0KGVsZW0pO1xuICAgICAgICAgIGNvbnN0IHRpdGxlRWxlbSA9ICRyb3cuZmluZCgnZGl2LnRpdGxlIGEnKTtcbiAgICAgICAgICBjb25zdCBocmVmID0gdGl0bGVFbGVtLmF0dHIoJ2hyZWYnKSA/PyAnJztcbiAgICAgICAgICBjb25zdCB0aHJlYWRJZE1hdGNoID0gaHJlZi5tYXRjaCgvdC0oXFxkKykvKTtcbiAgICAgICAgICBpZiAoIXRocmVhZElkTWF0Y2g/LlsxXSkgcmV0dXJuO1xuXG4gICAgICAgICAgY29uc3QgdGhyZWFkSWQgPSBOdW1iZXIucGFyc2VJbnQodGhyZWFkSWRNYXRjaFsxXSwgMTApO1xuICAgICAgICAgIGNvbnN0IHRpdGxlID0gdGl0bGVFbGVtLnRleHQoKS50cmltKCk7XG4gICAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSAkcm93LmZpbmQoJ2Rpdi5kZXNjcmlwdGlvbicpLnRleHQoKS50cmltKCk7XG4gICAgICAgICAgY29uc3QgcG9zdENvdW50ID0gTnVtYmVyLnBhcnNlSW50KCRyb3cuZmluZCgndGQucG9zdHMnKS50ZXh0KCkudHJpbSgpLCAxMCkgfHwgMDtcblxuICAgICAgICAgIC8vIFBhcnNlIHVzZXIgYW5kIHRpbWVzdGFtcFxuICAgICAgICAgIGNvbnN0ICR1c2VyRWxlbSA9ICRyb3cuZmluZCgndGQuc3RhcnRlZCBzcGFuLnByaW50dXNlcicpO1xuICAgICAgICAgIGNvbnN0ICRvZGF0ZUVsZW0gPSAkcm93LmZpbmQoJ3RkLnN0YXJ0ZWQgc3Bhbi5vZGF0ZScpO1xuXG4gICAgICAgICAgY29uc3QgY3JlYXRlZEJ5ID1cbiAgICAgICAgICAgICR1c2VyRWxlbS5sZW5ndGggPiAwXG4gICAgICAgICAgICAgID8gcGFyc2VVc2VyKGNhdGVnb3J5LnNpdGUuY2xpZW50LCAkdXNlckVsZW0gYXMgQ2hlZXJpbzxBbnlOb2RlPilcbiAgICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICAgIGNvbnN0IGNyZWF0ZWRBdCA9XG4gICAgICAgICAgICAkb2RhdGVFbGVtLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgPyAocGFyc2VPZGF0ZSgkb2RhdGVFbGVtIGFzIENoZWVyaW88QW55Tm9kZT4pID8/IG5ldyBEYXRlKCkpXG4gICAgICAgICAgICAgIDogbmV3IERhdGUoKTtcblxuICAgICAgICAgIHRocmVhZHMucHVzaChcbiAgICAgICAgICAgIG5ldyBGb3J1bVRocmVhZCh7XG4gICAgICAgICAgICAgIHNpdGU6IGNhdGVnb3J5LnNpdGUsXG4gICAgICAgICAgICAgIGlkOiB0aHJlYWRJZCxcbiAgICAgICAgICAgICAgdGl0bGUsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICBjcmVhdGVkQnksXG4gICAgICAgICAgICAgIGNyZWF0ZWRBdCxcbiAgICAgICAgICAgICAgcG9zdENvdW50LFxuICAgICAgICAgICAgICBjYXRlZ29yeSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQ2hlY2sgcGFnaW5hdGlvblxuICAgICAgICBjb25zdCBwYWdlciA9ICRmaXJzdCgnZGl2LnBhZ2VyJyk7XG4gICAgICAgIGlmIChwYWdlci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbmV3IEZvcnVtVGhyZWFkQ29sbGVjdGlvbihjYXRlZ29yeS5zaXRlLCB0aHJlYWRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhZ2VyTGlua3MgPSBwYWdlci5maW5kKCdhJyk7XG4gICAgICAgIGlmIChwYWdlckxpbmtzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IEZvcnVtVGhyZWFkQ29sbGVjdGlvbihjYXRlZ29yeS5zaXRlLCB0aHJlYWRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxhc3RQYWdlTGluayA9IHBhZ2VyTGlua3NbcGFnZXJMaW5rcy5sZW5ndGggLSAyXTtcbiAgICAgICAgY29uc3QgbGFzdFBhZ2VUZXh0ID0gbGFzdFBhZ2VMaW5rID8gJGZpcnN0KGxhc3RQYWdlTGluaykudGV4dCgpLnRyaW0oKSA6ICcxJztcbiAgICAgICAgY29uc3QgbGFzdFBhZ2UgPSBOdW1iZXIucGFyc2VJbnQobGFzdFBhZ2VUZXh0LCAxMCkgfHwgMTtcblxuICAgICAgICBpZiAobGFzdFBhZ2UgPD0gMSkge1xuICAgICAgICAgIHJldHVybiBuZXcgRm9ydW1UaHJlYWRDb2xsZWN0aW9uKGNhdGVnb3J5LnNpdGUsIHRocmVhZHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmV0Y2ggcmVtYWluaW5nIHBhZ2VzXG4gICAgICAgIGNvbnN0IGJvZGllczogeyBwOiBudW1iZXI7IGM6IG51bWJlcjsgbW9kdWxlTmFtZTogc3RyaW5nIH1bXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBwYWdlID0gMjsgcGFnZSA8PSBsYXN0UGFnZTsgcGFnZSsrKSB7XG4gICAgICAgICAgYm9kaWVzLnB1c2goe1xuICAgICAgICAgICAgcDogcGFnZSxcbiAgICAgICAgICAgIGM6IGNhdGVnb3J5LmlkLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2ZvcnVtL0ZvcnVtVmlld0NhdGVnb3J5TW9kdWxlJyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFkZGl0aW9uYWxSZXN1bHRzID0gYXdhaXQgY2F0ZWdvcnkuc2l0ZS5hbWNSZXF1ZXN0KGJvZGllcyk7XG4gICAgICAgIGlmIChhZGRpdGlvbmFsUmVzdWx0cy5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgYWRkaXRpb25hbFJlc3VsdHMuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IHJlc3BvbnNlIG9mIGFkZGl0aW9uYWxSZXN1bHRzLnZhbHVlKSB7XG4gICAgICAgICAgY29uc3QgYm9keSA9IFN0cmluZyhyZXNwb25zZT8uYm9keSA/PyAnJyk7XG4gICAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChib2R5KTtcblxuICAgICAgICAgICQoJ3RhYmxlLnRhYmxlIHRyLmhlYWR+dHInKS5lYWNoKChfaSwgZWxlbSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgJHJvdyA9ICQoZWxlbSk7XG4gICAgICAgICAgICBjb25zdCB0aXRsZUVsZW0gPSAkcm93LmZpbmQoJ2Rpdi50aXRsZSBhJyk7XG4gICAgICAgICAgICBjb25zdCBocmVmID0gdGl0bGVFbGVtLmF0dHIoJ2hyZWYnKSA/PyAnJztcbiAgICAgICAgICAgIGNvbnN0IHRocmVhZElkTWF0Y2ggPSBocmVmLm1hdGNoKC90LShcXGQrKS8pO1xuICAgICAgICAgICAgaWYgKCF0aHJlYWRJZE1hdGNoPy5bMV0pIHJldHVybjtcblxuICAgICAgICAgICAgY29uc3QgdGhyZWFkSWQgPSBOdW1iZXIucGFyc2VJbnQodGhyZWFkSWRNYXRjaFsxXSwgMTApO1xuICAgICAgICAgICAgY29uc3QgdGl0bGUgPSB0aXRsZUVsZW0udGV4dCgpLnRyaW0oKTtcbiAgICAgICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gJHJvdy5maW5kKCdkaXYuZGVzY3JpcHRpb24nKS50ZXh0KCkudHJpbSgpO1xuICAgICAgICAgICAgY29uc3QgcG9zdENvdW50ID0gTnVtYmVyLnBhcnNlSW50KCRyb3cuZmluZCgndGQucG9zdHMnKS50ZXh0KCkudHJpbSgpLCAxMCkgfHwgMDtcblxuICAgICAgICAgICAgLy8gUGFyc2UgdXNlciBhbmQgdGltZXN0YW1wXG4gICAgICAgICAgICBjb25zdCAkdXNlckVsZW0gPSAkcm93LmZpbmQoJ3RkLnN0YXJ0ZWQgc3Bhbi5wcmludHVzZXInKTtcbiAgICAgICAgICAgIGNvbnN0ICRvZGF0ZUVsZW0gPSAkcm93LmZpbmQoJ3RkLnN0YXJ0ZWQgc3Bhbi5vZGF0ZScpO1xuXG4gICAgICAgICAgICBjb25zdCBjcmVhdGVkQnkgPVxuICAgICAgICAgICAgICAkdXNlckVsZW0ubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgID8gcGFyc2VVc2VyKGNhdGVnb3J5LnNpdGUuY2xpZW50LCAkdXNlckVsZW0gYXMgQ2hlZXJpbzxBbnlOb2RlPilcbiAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgICAgICBjb25zdCBjcmVhdGVkQXQgPVxuICAgICAgICAgICAgICAkb2RhdGVFbGVtLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICA/IChwYXJzZU9kYXRlKCRvZGF0ZUVsZW0gYXMgQ2hlZXJpbzxBbnlOb2RlPikgPz8gbmV3IERhdGUoKSlcbiAgICAgICAgICAgICAgICA6IG5ldyBEYXRlKCk7XG5cbiAgICAgICAgICAgIHRocmVhZHMucHVzaChcbiAgICAgICAgICAgICAgbmV3IEZvcnVtVGhyZWFkKHtcbiAgICAgICAgICAgICAgICBzaXRlOiBjYXRlZ29yeS5zaXRlLFxuICAgICAgICAgICAgICAgIGlkOiB0aHJlYWRJZCxcbiAgICAgICAgICAgICAgICB0aXRsZSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICBjcmVhdGVkQnksXG4gICAgICAgICAgICAgICAgY3JlYXRlZEF0LFxuICAgICAgICAgICAgICAgIHBvc3RDb3VudCxcbiAgICAgICAgICAgICAgICBjYXRlZ29yeSxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IEZvcnVtVGhyZWFkQ29sbGVjdGlvbihjYXRlZ29yeS5zaXRlLCB0aHJlYWRzKTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHJldHVybiBlcnJvcjtcbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBhY3F1aXJlIHRocmVhZHM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHNpbmdsZSB0aHJlYWQgYnkgdGhyZWFkIElEXG4gICAqIEBwYXJhbSBzaXRlIC0gU2l0ZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gdGhyZWFkSWQgLSBUaHJlYWQgSURcbiAgICovXG4gIHN0YXRpYyBmcm9tSWQoc2l0ZTogU2l0ZSwgdGhyZWFkSWQ6IG51bWJlcik6IFdpa2lkb3RSZXN1bHRBc3luYzxGb3J1bVRocmVhZD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IEZvcnVtVGhyZWFkQ29sbGVjdGlvbi5hY3F1aXJlRnJvbVRocmVhZElkcyhzaXRlLCBbdGhyZWFkSWRdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRocmVhZCA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCF0aHJlYWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoYFRocmVhZCBub3QgZm91bmQ6ICR7dGhyZWFkSWR9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRocmVhZDtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHJldHVybiBlcnJvcjtcbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgdGhyZWFkOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhyZWFkcyBieSB0aHJlYWQgSURzXG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZUZyb21UaHJlYWRJZHMoXG4gICAgc2l0ZTogU2l0ZSxcbiAgICB0aHJlYWRJZHM6IG51bWJlcltdLFxuICAgIGNhdGVnb3J5OiBGb3J1bUNhdGVnb3J5IHwgbnVsbCA9IG51bGxcbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPEZvcnVtVGhyZWFkQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNpdGUuYW1jUmVxdWVzdChcbiAgICAgICAgICB0aHJlYWRJZHMubWFwKCh0aHJlYWRJZCkgPT4gKHtcbiAgICAgICAgICAgIHQ6IHRocmVhZElkLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2ZvcnVtL0ZvcnVtVmlld1RocmVhZE1vZHVsZScsXG4gICAgICAgICAgfSkpXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGhyZWFkczogRm9ydW1UaHJlYWRbXSA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhyZWFkSWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbaV07XG4gICAgICAgICAgY29uc3QgdGhyZWFkSWQgPSB0aHJlYWRJZHNbaV07XG4gICAgICAgICAgaWYgKCFyZXNwb25zZSB8fCAhdGhyZWFkSWQpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY29uc3QgYm9keSA9IFN0cmluZyhyZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGJvZHkpO1xuXG4gICAgICAgICAgLy8gUGFyc2UgdGhyZWFkIGluZm8gZnJvbSBwYWdlXG4gICAgICAgICAgY29uc3QgYmNFbGVtID0gJCgnZGl2LmZvcnVtLWJyZWFkY3J1bWJzJyk7XG4gICAgICAgICAgaWYgKGJjRWxlbS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcignQnJlYWRjcnVtYnMgbm90IGZvdW5kJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGJjUGFydHMgPSBiY0VsZW0udGV4dCgpLnNwbGl0KCfCuycpO1xuICAgICAgICAgIGNvbnN0IHRpdGxlID0gYmNQYXJ0cy5sZW5ndGggPiAwID8gKGJjUGFydHNbYmNQYXJ0cy5sZW5ndGggLSAxXT8udHJpbSgpID8/ICcnKSA6ICcnO1xuXG4gICAgICAgICAgY29uc3QgZGVzY0Jsb2NrRWxlbSA9ICQoJ2Rpdi5kZXNjcmlwdGlvbi1ibG9jaycpO1xuICAgICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gZGVzY0Jsb2NrRWxlbS50ZXh0KCkudHJpbSgpO1xuXG4gICAgICAgICAgY29uc3QgcG9zdENvdW50TWF0Y2ggPSAkKCdkaXYuc3RhdGlzdGljcycpLnRleHQoKS5tYXRjaCgvKFxcZCspLyk7XG4gICAgICAgICAgY29uc3QgcG9zdENvdW50ID0gcG9zdENvdW50TWF0Y2g/LlsxXSA/IE51bWJlci5wYXJzZUludChwb3N0Q291bnRNYXRjaFsxXSwgMTApIDogMDtcblxuICAgICAgICAgIHRocmVhZHMucHVzaChcbiAgICAgICAgICAgIG5ldyBGb3J1bVRocmVhZCh7XG4gICAgICAgICAgICAgIHNpdGUsXG4gICAgICAgICAgICAgIGlkOiB0aHJlYWRJZCxcbiAgICAgICAgICAgICAgdGl0bGUsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICBjcmVhdGVkQnk6IG51bGwsXG4gICAgICAgICAgICAgIGNyZWF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgcG9zdENvdW50LFxuICAgICAgICAgICAgICBjYXRlZ29yeSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgRm9ydW1UaHJlYWRDb2xsZWN0aW9uKHNpdGUsIHRocmVhZHMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgdGhyZWFkczogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0ICogYXMgY2hlZXJpbyBmcm9tICdjaGVlcmlvJztcbmltcG9ydCB7IFJlcXVpcmVMb2dpbiB9IGZyb20gJy4uLy4uL2NvbW1vbi9kZWNvcmF0b3JzJztcbmltcG9ydCB7IExvZ2luUmVxdWlyZWRFcnJvciwgTm9FbGVtZW50RXJyb3IsIFVuZXhwZWN0ZWRFcnJvciB9IGZyb20gJy4uLy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgU2l0ZSB9IGZyb20gJy4uL3NpdGUnO1xuaW1wb3J0IHsgRm9ydW1UaHJlYWQsIEZvcnVtVGhyZWFkQ29sbGVjdGlvbiB9IGZyb20gJy4vZm9ydW0tdGhyZWFkJztcblxuLyoqXG4gKiBGb3J1bSBjYXRlZ29yeSBkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRm9ydW1DYXRlZ29yeURhdGEge1xuICBzaXRlOiBTaXRlO1xuICBpZDogbnVtYmVyO1xuICB0aXRsZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICB0aHJlYWRzQ291bnQ6IG51bWJlcjtcbiAgcG9zdHNDb3VudDogbnVtYmVyO1xufVxuXG4vKipcbiAqIEZvcnVtIGNhdGVnb3J5XG4gKi9cbmV4cG9ydCBjbGFzcyBGb3J1bUNhdGVnb3J5IHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG4gIHB1YmxpYyByZWFkb25seSBpZDogbnVtYmVyO1xuICBwdWJsaWMgcmVhZG9ubHkgdGl0bGU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSB0aHJlYWRzQ291bnQ6IG51bWJlcjtcbiAgcHVibGljIHJlYWRvbmx5IHBvc3RzQ291bnQ6IG51bWJlcjtcbiAgcHJpdmF0ZSBfdGhyZWFkczogRm9ydW1UaHJlYWRDb2xsZWN0aW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoZGF0YTogRm9ydW1DYXRlZ29yeURhdGEpIHtcbiAgICB0aGlzLnNpdGUgPSBkYXRhLnNpdGU7XG4gICAgdGhpcy5pZCA9IGRhdGEuaWQ7XG4gICAgdGhpcy50aXRsZSA9IGRhdGEudGl0bGU7XG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRhdGEuZGVzY3JpcHRpb247XG4gICAgdGhpcy50aHJlYWRzQ291bnQgPSBkYXRhLnRocmVhZHNDb3VudDtcbiAgICB0aGlzLnBvc3RzQ291bnQgPSBkYXRhLnBvc3RzQ291bnQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRocmVhZCBsaXN0XG4gICAqL1xuICBnZXRUaHJlYWRzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxGb3J1bVRocmVhZENvbGxlY3Rpb24+IHtcbiAgICBpZiAodGhpcy5fdGhyZWFkcyAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFByb21pc2UucmVzb2x2ZSh0aGlzLl90aHJlYWRzKSwgKGUpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoU3RyaW5nKGUpKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgRm9ydW1UaHJlYWRDb2xsZWN0aW9uLmFjcXVpcmVBbGxJbkNhdGVnb3J5KHRoaXMpO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdGhyZWFkcyA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RocmVhZHM7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHRocmVhZHM6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVsb2FkIHRocmVhZCBsaXN0XG4gICAqL1xuICByZWxvYWRUaHJlYWRzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxGb3J1bVRocmVhZENvbGxlY3Rpb24+IHtcbiAgICB0aGlzLl90aHJlYWRzID0gbnVsbDtcbiAgICByZXR1cm4gdGhpcy5nZXRUaHJlYWRzKCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRocmVhZFxuICAgKi9cbiAgQFJlcXVpcmVMb2dpblxuICBjcmVhdGVUaHJlYWQoXG4gICAgdGl0bGU6IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nLFxuICAgIHNvdXJjZTogc3RyaW5nXG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzxGb3J1bVRocmVhZD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnRW1wdHknLFxuICAgICAgICAgICAgYWN0aW9uOiAnRm9ydW1BY3Rpb24nLFxuICAgICAgICAgICAgZXZlbnQ6ICduZXdUaHJlYWQnLFxuICAgICAgICAgICAgY2F0ZWdvcnlfaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICB0aXRsZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgc291cmNlLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXJlc3BvbnNlIHx8IHR5cGVvZiByZXNwb25zZS50aHJlYWRJZCAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ1RocmVhZCBJRCBub3QgZm91bmQgaW4gcmVzcG9uc2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRocmVhZElkID0gcmVzcG9uc2UudGhyZWFkSWQgYXMgbnVtYmVyO1xuICAgICAgICBjb25zdCB0aHJlYWRSZXN1bHQgPSBhd2FpdCBGb3J1bVRocmVhZC5nZXRGcm9tSWQodGhpcy5zaXRlLCB0aHJlYWRJZCwgdGhpcyk7XG4gICAgICAgIGlmICh0aHJlYWRSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHRocmVhZFJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhyZWFkUmVzdWx0LnZhbHVlO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSB0aHJlYWQ6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYEZvcnVtQ2F0ZWdvcnkoaWQ9JHt0aGlzLmlkfSwgdGl0bGU9JHt0aGlzLnRpdGxlfSlgO1xuICB9XG59XG5cbi8qKlxuICogRm9ydW0gY2F0ZWdvcnkgY29sbGVjdGlvblxuICovXG5leHBvcnQgY2xhc3MgRm9ydW1DYXRlZ29yeUNvbGxlY3Rpb24gZXh0ZW5kcyBBcnJheTxGb3J1bUNhdGVnb3J5PiB7XG4gIHB1YmxpYyByZWFkb25seSBzaXRlOiBTaXRlO1xuXG4gIGNvbnN0cnVjdG9yKHNpdGU6IFNpdGUsIGNhdGVnb3JpZXM/OiBGb3J1bUNhdGVnb3J5W10pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuc2l0ZSA9IHNpdGU7XG4gICAgaWYgKGNhdGVnb3JpZXMpIHtcbiAgICAgIHRoaXMucHVzaCguLi5jYXRlZ29yaWVzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBieSBJRFxuICAgKi9cbiAgZmluZEJ5SWQoaWQ6IG51bWJlcik6IEZvcnVtQ2F0ZWdvcnkgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbmQoKGNhdGVnb3J5KSA9PiBjYXRlZ29yeS5pZCA9PT0gaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgY2F0ZWdvcmllcyBmb3IgYSBzaXRlXG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZUFsbChzaXRlOiBTaXRlKTogV2lraWRvdFJlc3VsdEFzeW5jPEZvcnVtQ2F0ZWdvcnlDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnZm9ydW0vRm9ydW1TdGFydE1vZHVsZScsXG4gICAgICAgICAgICBoaWRkZW46ICd0cnVlJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcblxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcignRW1wdHkgcmVzcG9uc2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJvZHkgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoYm9keSk7XG5cbiAgICAgICAgY29uc3QgY2F0ZWdvcmllczogRm9ydW1DYXRlZ29yeVtdID0gW107XG5cbiAgICAgICAgJCgndGFibGUgdHIuaGVhZH50cicpLmVhY2goKF9pLCByb3cpID0+IHtcbiAgICAgICAgICBjb25zdCAkcm93ID0gJChyb3cpO1xuICAgICAgICAgIGNvbnN0IG5hbWVFbGVtID0gJHJvdy5maW5kKCd0ZC5uYW1lJyk7XG4gICAgICAgICAgY29uc3QgbmFtZUxpbmtFbGVtID0gbmFtZUVsZW0uZmluZCgnYScpO1xuICAgICAgICAgIGNvbnN0IGhyZWYgPSBuYW1lTGlua0VsZW0uYXR0cignaHJlZicpID8/ICcnO1xuXG4gICAgICAgICAgY29uc3QgY2F0ZWdvcnlJZE1hdGNoID0gaHJlZi5tYXRjaCgvYy0oXFxkKykvKTtcbiAgICAgICAgICBpZiAoIWNhdGVnb3J5SWRNYXRjaD8uWzFdKSByZXR1cm47XG5cbiAgICAgICAgICBjb25zdCBjYXRlZ29yeUlkID0gTnVtYmVyLnBhcnNlSW50KGNhdGVnb3J5SWRNYXRjaFsxXSwgMTApO1xuICAgICAgICAgIGNvbnN0IHRpdGxlID0gbmFtZUxpbmtFbGVtLnRleHQoKS50cmltKCk7XG4gICAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSBuYW1lRWxlbS5maW5kKCdkaXYuZGVzY3JpcHRpb24nKS50ZXh0KCkudHJpbSgpO1xuICAgICAgICAgIGNvbnN0IHRocmVhZHNDb3VudCA9IE51bWJlci5wYXJzZUludCgkcm93LmZpbmQoJ3RkLnRocmVhZHMnKS50ZXh0KCkudHJpbSgpLCAxMCkgfHwgMDtcbiAgICAgICAgICBjb25zdCBwb3N0c0NvdW50ID0gTnVtYmVyLnBhcnNlSW50KCRyb3cuZmluZCgndGQucG9zdHMnKS50ZXh0KCkudHJpbSgpLCAxMCkgfHwgMDtcblxuICAgICAgICAgIGNhdGVnb3JpZXMucHVzaChcbiAgICAgICAgICAgIG5ldyBGb3J1bUNhdGVnb3J5KHtcbiAgICAgICAgICAgICAgc2l0ZSxcbiAgICAgICAgICAgICAgaWQ6IGNhdGVnb3J5SWQsXG4gICAgICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgdGhyZWFkc0NvdW50LFxuICAgICAgICAgICAgICBwb3N0c0NvdW50LFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gbmV3IEZvcnVtQ2F0ZWdvcnlDb2xsZWN0aW9uKHNpdGUsIGNhdGVnb3JpZXMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgY2F0ZWdvcmllczogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cbiIsCiAgICAiZXhwb3J0IHsgRm9ydW1DYXRlZ29yeSwgRm9ydW1DYXRlZ29yeUNvbGxlY3Rpb24sIHR5cGUgRm9ydW1DYXRlZ29yeURhdGEgfSBmcm9tICcuL2ZvcnVtLWNhdGVnb3J5JztcbmV4cG9ydCB7IEZvcnVtUG9zdCwgRm9ydW1Qb3N0Q29sbGVjdGlvbiwgdHlwZSBGb3J1bVBvc3REYXRhIH0gZnJvbSAnLi9mb3J1bS1wb3N0JztcbmV4cG9ydCB7XG4gIEZvcnVtUG9zdFJldmlzaW9uLFxuICBGb3J1bVBvc3RSZXZpc2lvbkNvbGxlY3Rpb24sXG4gIHR5cGUgRm9ydW1Qb3N0UmV2aXNpb25EYXRhLFxufSBmcm9tICcuL2ZvcnVtLXBvc3QtcmV2aXNpb24nO1xuZXhwb3J0IHsgRm9ydW1UaHJlYWQsIEZvcnVtVGhyZWFkQ29sbGVjdGlvbiwgdHlwZSBGb3J1bVRocmVhZERhdGEgfSBmcm9tICcuL2ZvcnVtLXRocmVhZCc7XG4iLAogICAgIi8vIENvbW1vblxuZXhwb3J0ICogZnJvbSAnLi9jb21tb24vZXJyb3JzJztcbmV4cG9ydCAqIGZyb20gJy4vY29tbW9uL2xvZ2dlcic7XG5leHBvcnQgKiBmcm9tICcuL2NvbW1vbi90eXBlcyc7XG5cbi8vIENvbm5lY3RvclxuZXhwb3J0ICogZnJvbSAnLi9jb25uZWN0b3InO1xuXG4vLyBNb2R1bGVcbmV4cG9ydCAqIGZyb20gJy4vbW9kdWxlJztcblxuLy8gVXRpbFxuZXhwb3J0ICogZnJvbSAnLi91dGlsJztcbiIsCiAgICAiaW1wb3J0IGt5LCB7IHR5cGUgS3lJbnN0YW5jZSB9IGZyb20gJ2t5JztcbmltcG9ydCBwTGltaXQsIHsgdHlwZSBMaW1pdEZ1bmN0aW9uIH0gZnJvbSAncC1saW1pdCc7XG5pbXBvcnQge1xuICBBTUNIdHRwRXJyb3IsXG4gIEZvcmJpZGRlbkVycm9yLFxuICBOb3RGb3VuZEV4Y2VwdGlvbixcbiAgUmVzcG9uc2VEYXRhRXJyb3IsXG4gIFVuZXhwZWN0ZWRFcnJvcixcbiAgV2lraWRvdEVycm9yLFxuICBXaWtpZG90U3RhdHVzRXJyb3IsXG59IGZyb20gJy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jLCB3ZEVyckFzeW5jLCB3ZE9rQXN5bmMgfSBmcm9tICcuLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgZmV0Y2hXaXRoUmV0cnkgfSBmcm9tICcuLi91dGlsL2h0dHAnO1xuaW1wb3J0IHtcbiAgdHlwZSBBTUNDb25maWcsXG4gIERFRkFVTFRfQU1DX0NPTkZJRyxcbiAgREVGQVVMVF9IVFRQX1NUQVRVU19DT0RFLFxuICBXSUtJRE9UX1RPS0VONyxcbn0gZnJvbSAnLi9hbWMtY29uZmlnJztcbmltcG9ydCB7IEFNQ0hlYWRlciB9IGZyb20gJy4vYW1jLWhlYWRlcic7XG5pbXBvcnQgeyB0eXBlIEFNQ1JlcXVlc3RCb2R5LCB0eXBlIEFNQ1Jlc3BvbnNlLCBhbWNSZXNwb25zZVNjaGVtYSB9IGZyb20gJy4vYW1jLXR5cGVzJztcblxuLyoqXG4gKiBNYXNrIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbiAoZm9yIGxvZ2dpbmcpXG4gKiBAcGFyYW0gYm9keSAtIFJlcXVlc3QgYm9keSB0byBtYXNrXG4gKiBAcmV0dXJucyBNYXNrZWQgYm9keVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFza1NlbnNpdGl2ZURhdGEoYm9keTogQU1DUmVxdWVzdEJvZHkpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGNvbnN0IG1hc2tlZCA9IHsgLi4uYm9keSB9O1xuICBjb25zdCBzZW5zaXRpdmVLZXlzID0gWydwYXNzd29yZCcsICdsb2dpbicsICdXSUtJRE9UX1NFU1NJT05fSUQnLCAnd2lraWRvdF90b2tlbjcnXTtcbiAgZm9yIChjb25zdCBrZXkgb2Ygc2Vuc2l0aXZlS2V5cykge1xuICAgIGlmIChrZXkgaW4gbWFza2VkKSB7XG4gICAgICBtYXNrZWRba2V5XSA9ICcqKipNQVNLRUQqKionO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbWFza2VkO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZSBleHBvbmVudGlhbCBiYWNrb2ZmIGludGVydmFsICh3aXRoIGppdHRlcilcbiAqIEBwYXJhbSByZXRyeUNvdW50IC0gQ3VycmVudCByZXRyeSBjb3VudCAoc3RhcnRzIGZyb20gMSlcbiAqIEBwYXJhbSBiYXNlSW50ZXJ2YWwgLSBCYXNlIGludGVydmFsIChtaWxsaXNlY29uZHMpXG4gKiBAcGFyYW0gYmFja29mZkZhY3RvciAtIEJhY2tvZmYgZmFjdG9yXG4gKiBAcGFyYW0gbWF4QmFja29mZiAtIE1heGltdW0gYmFja29mZiBpbnRlcnZhbCAobWlsbGlzZWNvbmRzKVxuICogQHJldHVybnMgQ2FsY3VsYXRlZCBiYWNrb2ZmIGludGVydmFsIChtaWxsaXNlY29uZHMpXG4gKi9cbmZ1bmN0aW9uIGNhbGN1bGF0ZUJhY2tvZmYoXG4gIHJldHJ5Q291bnQ6IG51bWJlcixcbiAgYmFzZUludGVydmFsOiBudW1iZXIsXG4gIGJhY2tvZmZGYWN0b3I6IG51bWJlcixcbiAgbWF4QmFja29mZjogbnVtYmVyXG4pOiBudW1iZXIge1xuICBjb25zdCBiYWNrb2ZmID0gYmFzZUludGVydmFsICogYmFja29mZkZhY3RvciAqKiAocmV0cnlDb3VudCAtIDEpO1xuICBjb25zdCBqaXR0ZXIgPSBNYXRoLnJhbmRvbSgpICogYmFja29mZiAqIDAuMTtcbiAgcmV0dXJuIE1hdGgubWluKGJhY2tvZmYgKyBqaXR0ZXIsIG1heEJhY2tvZmYpO1xufVxuXG4vKipcbiAqIFNsZWVwIGZvciBzcGVjaWZpZWQgZHVyYXRpb25cbiAqIEBwYXJhbSBtcyAtIER1cmF0aW9uIGluIG1pbGxpc2Vjb25kc1xuICovXG5mdW5jdGlvbiBzbGVlcChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xufVxuXG4vKipcbiAqIEFNQyByZXF1ZXN0IG9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBTUNSZXF1ZXN0T3B0aW9ucyB7XG4gIC8qKiBTaXRlIG5hbWUgKGRlZmF1bHQ6IHd3dykgKi9cbiAgc2l0ZU5hbWU/OiBzdHJpbmc7XG4gIC8qKiBTU0wgc3VwcG9ydCAoYXV0by1kZXRlY3RlZCBpZiBvbWl0dGVkKSAqL1xuICBzc2xTdXBwb3J0ZWQ/OiBib29sZWFuO1xuICAvKiogSW5jbHVkZSBlcnJvcnMgaW4gcmVzdWx0cyBpbnN0ZWFkIG9mIHRocm93aW5nIChkZWZhdWx0OiBmYWxzZSkgKi9cbiAgcmV0dXJuRXhjZXB0aW9ucz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQWpheCBNb2R1bGUgQ29ubmVjdG9yIGNsaWVudFxuICogTWFuYWdlcyByZXF1ZXN0cyB0byBXaWtpZG90IEFNQyBlbmRwb2ludFxuICovXG5leHBvcnQgY2xhc3MgQU1DQ2xpZW50IHtcbiAgLyoqIGt5IGluc3RhbmNlICovXG4gIHByaXZhdGUgcmVhZG9ubHkga3k6IEt5SW5zdGFuY2U7XG5cbiAgLyoqIENvbmN1cnJlbnQgcmVxdWVzdCBsaW1pdGVyICovXG4gIHByaXZhdGUgcmVhZG9ubHkgbGltaXQ6IExpbWl0RnVuY3Rpb247XG5cbiAgLyoqIEhlYWRlciBtYW5hZ2VyICovXG4gIHB1YmxpYyByZWFkb25seSBoZWFkZXI6IEFNQ0hlYWRlcjtcblxuICAvKiogQ29uZmlndXJhdGlvbiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29uZmlnOiBBTUNDb25maWc7XG5cbiAgLyoqIEJhc2UgZG9tYWluICovXG4gIHB1YmxpYyByZWFkb25seSBkb21haW46IHN0cmluZztcblxuICAvKiogU1NMIHN1cHBvcnQgc3RhdHVzIGNhY2hlICovXG4gIHByaXZhdGUgc3NsQ2FjaGU6IE1hcDxzdHJpbmcsIGJvb2xlYW4+ID0gbmV3IE1hcCgpO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gY29uZmlnIC0gQU1DIGNvbmZpZ3VyYXRpb24gKHVzZXMgZGVmYXVsdHMgaWYgb21pdHRlZClcbiAgICogQHBhcmFtIGRvbWFpbiAtIEJhc2UgZG9tYWluIChkZWZhdWx0OiB3aWtpZG90LmNvbSlcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogUGFydGlhbDxBTUNDb25maWc+ID0ge30sIGRvbWFpbiA9ICd3aWtpZG90LmNvbScpIHtcbiAgICB0aGlzLmNvbmZpZyA9IHsgLi4uREVGQVVMVF9BTUNfQ09ORklHLCAuLi5jb25maWcgfTtcbiAgICB0aGlzLmRvbWFpbiA9IGRvbWFpbjtcbiAgICB0aGlzLmhlYWRlciA9IG5ldyBBTUNIZWFkZXIoKTtcbiAgICB0aGlzLmxpbWl0ID0gcExpbWl0KHRoaXMuY29uZmlnLnNlbWFwaG9yZUxpbWl0KTtcblxuICAgIHRoaXMua3kgPSBreS5jcmVhdGUoe1xuICAgICAgdGltZW91dDogdGhpcy5jb25maWcudGltZW91dCxcbiAgICAgIHJldHJ5OiAwLCAvLyBNYW51YWwgcmV0cnkgY29udHJvbFxuICAgIH0pO1xuXG4gICAgLy8gd3d3IGFsd2F5cyBzdXBwb3J0cyBTU0xcbiAgICB0aGlzLnNzbENhY2hlLnNldCgnd3d3JywgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgc2l0ZSBleGlzdGVuY2UgYW5kIFNTTCBzdXBwb3J0IHN0YXR1c1xuICAgKiBAcGFyYW0gc2l0ZU5hbWUgLSBTaXRlIG5hbWVcbiAgICogQHJldHVybnMgU1NMIHN1cHBvcnQgc3RhdHVzICh0cnVlOiBIVFRQUywgZmFsc2U6IEhUVFApXG4gICAqL1xuICBjaGVja1NpdGVTU0woc2l0ZU5hbWU6IHN0cmluZyk6IFdpa2lkb3RSZXN1bHRBc3luYzxib29sZWFuPiB7XG4gICAgLy8gUmV0dXJuIGNhY2hlZCB2YWx1ZSBpZiBleGlzdHNcbiAgICBjb25zdCBjYWNoZWQgPSB0aGlzLnNzbENhY2hlLmdldChzaXRlTmFtZSk7XG4gICAgaWYgKGNhY2hlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gd2RPa0FzeW5jKGNhY2hlZCk7XG4gICAgfVxuXG4gICAgLy8gd3d3IGFsd2F5cyBzdXBwb3J0cyBTU0xcbiAgICBpZiAoc2l0ZU5hbWUgPT09ICd3d3cnKSB7XG4gICAgICByZXR1cm4gd2RPa0FzeW5jKHRydWUpO1xuICAgIH1cblxuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hXaXRoUmV0cnkoYGh0dHA6Ly8ke3NpdGVOYW1lfS4ke3RoaXMuZG9tYWlufWAsIHRoaXMuY29uZmlnLCB7XG4gICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICByZWRpcmVjdDogJ21hbnVhbCcsXG4gICAgICAgICAgY2hlY2tPazogZmFsc2UsIC8vIERvbid0IHJldHJ5IG9uIEhUVFAgZXJyb3JzICgzMDEgaXMgZXhwZWN0ZWQpXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIDQwNCBtZWFucyBzaXRlIGRvZXMgbm90IGV4aXN0XG4gICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihgU2l0ZSBpcyBub3QgZm91bmQ6ICR7c2l0ZU5hbWV9LiR7dGhpcy5kb21haW59YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTU0wgc3VwcG9ydGVkIGlmIDMwMSByZWRpcmVjdCB0byBodHRwc1xuICAgICAgICBjb25zdCBpc1NTTCA9XG4gICAgICAgICAgcmVzcG9uc2Uuc3RhdHVzID09PSAzMDEgJiYgcmVzcG9uc2UuaGVhZGVycy5nZXQoJ0xvY2F0aW9uJyk/LnN0YXJ0c1dpdGgoJ2h0dHBzJykgPT09IHRydWU7XG5cbiAgICAgICAgLy8gU2F2ZSB0byBjYWNoZVxuICAgICAgICB0aGlzLnNzbENhY2hlLnNldChzaXRlTmFtZSwgaXNTU0wpO1xuICAgICAgICByZXR1cm4gaXNTU0w7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFdpa2lkb3RFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGNoZWNrIFNTTCBmb3IgJHtzaXRlTmFtZX06ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgQU1DIHJlcXVlc3RcbiAgICogQHBhcmFtIGJvZGllcyAtIFJlcXVlc3QgYm9keSBhcnJheVxuICAgKiBAcGFyYW0gc2l0ZU5hbWUgLSBTaXRlIG5hbWUgKGRlZmF1bHQ6IHd3dylcbiAgICogQHBhcmFtIHNzbFN1cHBvcnRlZCAtIFNTTCBzdXBwb3J0IChhdXRvLWRldGVjdGVkIGlmIG9taXR0ZWQpXG4gICAqIEByZXR1cm5zIFJlc3BvbnNlIGFycmF5XG4gICAqL1xuICByZXF1ZXN0KFxuICAgIGJvZGllczogQU1DUmVxdWVzdEJvZHlbXSxcbiAgICBzaXRlTmFtZSA9ICd3d3cnLFxuICAgIHNzbFN1cHBvcnRlZD86IGJvb2xlYW5cbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPEFNQ1Jlc3BvbnNlW10+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0V2l0aE9wdGlvbnMoYm9kaWVzLCB7XG4gICAgICBzaXRlTmFtZSxcbiAgICAgIHNzbFN1cHBvcnRlZCxcbiAgICAgIHJldHVybkV4Y2VwdGlvbnM6IGZhbHNlLFxuICAgIH0pIGFzIFdpa2lkb3RSZXN1bHRBc3luYzxBTUNSZXNwb25zZVtdPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIEFNQyByZXF1ZXN0ICh3aXRoIG9wdGlvbnMpXG4gICAqIEBwYXJhbSBib2RpZXMgLSBSZXF1ZXN0IGJvZHkgYXJyYXlcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBSZXF1ZXN0IG9wdGlvbnNcbiAgICogQHJldHVybnMgUmVzcG9uc2UgYXJyYXkgKGluY2x1ZGVzIGVycm9ycyBpZiByZXR1cm5FeGNlcHRpb25zIGlzIHRydWUpXG4gICAqL1xuICByZXF1ZXN0V2l0aE9wdGlvbnMoXG4gICAgYm9kaWVzOiBBTUNSZXF1ZXN0Qm9keVtdLFxuICAgIG9wdGlvbnM6IEFNQ1JlcXVlc3RPcHRpb25zID0ge31cbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPChBTUNSZXNwb25zZSB8IFdpa2lkb3RFcnJvcilbXT4ge1xuICAgIGNvbnN0IHsgc2l0ZU5hbWUgPSAnd3d3Jywgc3NsU3VwcG9ydGVkLCByZXR1cm5FeGNlcHRpb25zID0gZmFsc2UgfSA9IG9wdGlvbnM7XG5cbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyBHZXQgU1NMIHN1cHBvcnQgc3RhdHVzXG4gICAgICAgIGxldCBzc2wgPSBzc2xTdXBwb3J0ZWQ7XG4gICAgICAgIGlmIChzc2wgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IHNzbFJlc3VsdCA9IGF3YWl0IHRoaXMuY2hlY2tTaXRlU1NMKHNpdGVOYW1lKTtcbiAgICAgICAgICBpZiAoc3NsUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICAgIHRocm93IHNzbFJlc3VsdC5lcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3NsID0gc3NsUmVzdWx0LnZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJvdG9jb2wgPSBzc2wgPyAnaHR0cHMnIDogJ2h0dHAnO1xuICAgICAgICBjb25zdCB1cmwgPSBgJHtwcm90b2NvbH06Ly8ke3NpdGVOYW1lfS4ke3RoaXMuZG9tYWlufS9hamF4LW1vZHVsZS1jb25uZWN0b3IucGhwYDtcblxuICAgICAgICAvLyBFeGVjdXRlIHJlcXVlc3RzIGluIHBhcmFsbGVsXG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICBib2RpZXMubWFwKChib2R5KSA9PiB0aGlzLmxpbWl0KCgpID0+IHRoaXMuc2luZ2xlUmVxdWVzdChib2R5LCB1cmwpKSlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAocmV0dXJuRXhjZXB0aW9ucykge1xuICAgICAgICAgIC8vIFJldHVybiBhbGwgcmVzdWx0cyBpbmNsdWRpbmcgZXJyb3JzXG4gICAgICAgICAgcmV0dXJuIHJlc3VsdHMubWFwKChyKSA9PiB7XG4gICAgICAgICAgICBpZiAoci5pc09rKCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHIudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gci5lcnJvcjtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRocm93IGZpcnN0IGVycm9yIGlmIGFueVxuICAgICAgICBjb25zdCBmaXJzdEVycm9yID0gcmVzdWx0cy5maW5kKChyKSA9PiByLmlzRXJyKCkpO1xuICAgICAgICBpZiAoZmlyc3RFcnJvcj8uaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IGZpcnN0RXJyb3IuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0cy5tYXAoKHIpID0+IHtcbiAgICAgICAgICBpZiAoci5pc09rKCkpIHtcbiAgICAgICAgICAgIHJldHVybiByLnZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEVycm9yKCdVbmV4cGVjdGVkIGVycm9yIGluIHJlc3VsdCBwcm9jZXNzaW5nJyk7XG4gICAgICAgIH0pO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBXaWtpZG90RXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEFNQyByZXF1ZXN0IGZhaWxlZDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSW50ZXJuYWwgbWV0aG9kIHRvIGV4ZWN1dGUgYSBzaW5nbGUgcmVxdWVzdFxuICAgKiBAcGFyYW0gYm9keSAtIFJlcXVlc3QgYm9keVxuICAgKiBAcGFyYW0gdXJsIC0gUmVxdWVzdCBVUkxcbiAgICogQHJldHVybnMgUmVzcG9uc2VcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2luZ2xlUmVxdWVzdChcbiAgICBib2R5OiBBTUNSZXF1ZXN0Qm9keSxcbiAgICB1cmw6IHN0cmluZ1xuICApOiBQcm9taXNlPFdpa2lkb3RSZXN1bHRBc3luYzxBTUNSZXNwb25zZT4+IHtcbiAgICBsZXQgcmV0cnlDb3VudCA9IDA7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gQWRkIHdpa2lkb3RfdG9rZW43XG4gICAgICAgIGNvbnN0IHJlcXVlc3RCb2R5ID0geyAuLi5ib2R5LCB3aWtpZG90X3Rva2VuNzogV0lLSURPVF9UT0tFTjcgfTtcblxuICAgICAgICAvLyBDcmVhdGUgVVJMLWVuY29kZWQgYm9keVxuICAgICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmVxdWVzdEJvZHkpKSB7XG4gICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIFN0cmluZyh2YWx1ZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5reS5wb3N0KHVybCwge1xuICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVyLmdldEhlYWRlcnMoKSxcbiAgICAgICAgICBib2R5OiBmb3JtRGF0YS50b1N0cmluZygpLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBQYXJzZSBhcyBKU09OXG4gICAgICAgIGxldCByZXNwb25zZURhdGE6IHVua25vd247XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlVGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXNwb25zZURhdGEgPSBKU09OLnBhcnNlKHJlc3BvbnNlVGV4dCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIFJldHJ5IG9uIEpTT04gcGFyc2UgZXJyb3IgKGUuZy4sIGVtcHR5IHJlc3BvbnNlKVxuICAgICAgICAgIHJldHJ5Q291bnQrKztcbiAgICAgICAgICBpZiAocmV0cnlDb3VudCA+PSB0aGlzLmNvbmZpZy5yZXRyeUxpbWl0KSB7XG4gICAgICAgICAgICByZXR1cm4gd2RFcnJBc3luYyhcbiAgICAgICAgICAgICAgbmV3IFJlc3BvbnNlRGF0YUVycm9yKGBBTUMgcmVzcG9uZGVkIHdpdGggbm9uLUpTT04gZGF0YTogJHtyZXNwb25zZVRleHR9YClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGJhY2tvZmYgPSBjYWxjdWxhdGVCYWNrb2ZmKFxuICAgICAgICAgICAgcmV0cnlDb3VudCxcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLnJldHJ5SW50ZXJ2YWwsXG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5iYWNrb2ZmRmFjdG9yLFxuICAgICAgICAgICAgdGhpcy5jb25maWcubWF4QmFja29mZlxuICAgICAgICAgICk7XG4gICAgICAgICAgYXdhaXQgc2xlZXAoYmFja29mZik7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWYWxpZGF0ZSB3aXRoIHpvZFxuICAgICAgICBjb25zdCBwYXJzZVJlc3VsdCA9IGFtY1Jlc3BvbnNlU2NoZW1hLnNhZmVQYXJzZShyZXNwb25zZURhdGEpO1xuICAgICAgICBpZiAoIXBhcnNlUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICByZXR1cm4gd2RFcnJBc3luYyhcbiAgICAgICAgICAgIG5ldyBSZXNwb25zZURhdGFFcnJvcihgSW52YWxpZCBBTUMgcmVzcG9uc2UgZm9ybWF0OiAke3BhcnNlUmVzdWx0LmVycm9yLm1lc3NhZ2V9YClcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYW1jUmVzcG9uc2UgPSBwYXJzZVJlc3VsdC5kYXRhO1xuXG4gICAgICAgIC8vIFJldHJ5IGlmIHRyeV9hZ2FpblxuICAgICAgICBpZiAoYW1jUmVzcG9uc2Uuc3RhdHVzID09PSAndHJ5X2FnYWluJykge1xuICAgICAgICAgIHJldHJ5Q291bnQrKztcbiAgICAgICAgICBpZiAocmV0cnlDb3VudCA+PSB0aGlzLmNvbmZpZy5yZXRyeUxpbWl0KSB7XG4gICAgICAgICAgICByZXR1cm4gd2RFcnJBc3luYyhuZXcgV2lraWRvdFN0YXR1c0Vycm9yKCdBTUMgcmVzcG9uZGVkIHdpdGggdHJ5X2FnYWluJywgJ3RyeV9hZ2FpbicpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgYmFja29mZiA9IGNhbGN1bGF0ZUJhY2tvZmYoXG4gICAgICAgICAgICByZXRyeUNvdW50LFxuICAgICAgICAgICAgdGhpcy5jb25maWcucmV0cnlJbnRlcnZhbCxcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLmJhY2tvZmZGYWN0b3IsXG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5tYXhCYWNrb2ZmXG4gICAgICAgICAgKTtcbiAgICAgICAgICBhd2FpdCBzbGVlcChiYWNrb2ZmKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZvcmJpZGRlbkVycm9yIGlmIG5vX3Blcm1pc3Npb25cbiAgICAgICAgaWYgKGFtY1Jlc3BvbnNlLnN0YXR1cyA9PT0gJ25vX3Blcm1pc3Npb24nKSB7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0U3RyID0gYm9keS5tb2R1bGVOYW1lXG4gICAgICAgICAgICA/IGBtb2R1bGVOYW1lOiAke2JvZHkubW9kdWxlTmFtZX1gXG4gICAgICAgICAgICA6IGJvZHkuYWN0aW9uXG4gICAgICAgICAgICAgID8gYGFjdGlvbjogJHtib2R5LmFjdGlvbn0vJHtib2R5LmV2ZW50ID8/ICcnfWBcbiAgICAgICAgICAgICAgOiAndW5rbm93bic7XG4gICAgICAgICAgcmV0dXJuIHdkRXJyQXN5bmMoXG4gICAgICAgICAgICBuZXcgRm9yYmlkZGVuRXJyb3IoXG4gICAgICAgICAgICAgIGBZb3VyIGFjY291bnQgaGFzIG5vIHBlcm1pc3Npb24gdG8gcGVyZm9ybSB0aGlzIGFjdGlvbjogJHt0YXJnZXRTdHJ9YFxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFcnJvciBpZiBzdGF0dXMgaXMgbm90IG9rXG4gICAgICAgIGlmIChhbWNSZXNwb25zZS5zdGF0dXMgIT09ICdvaycpIHtcbiAgICAgICAgICByZXR1cm4gd2RFcnJBc3luYyhcbiAgICAgICAgICAgIG5ldyBXaWtpZG90U3RhdHVzRXJyb3IoXG4gICAgICAgICAgICAgIGBBTUMgcmVzcG9uZGVkIHdpdGggZXJyb3Igc3RhdHVzOiBcIiR7YW1jUmVzcG9uc2Uuc3RhdHVzfVwiYCxcbiAgICAgICAgICAgICAgYW1jUmVzcG9uc2Uuc3RhdHVzXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB3ZE9rQXN5bmMoYW1jUmVzcG9uc2UpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gUmV0cnkgb24gYWxsIGVycm9ycyAoSFRUUCBlcnJvcnMsIG5ldHdvcmsgZXJyb3JzLCB0aW1lb3V0cywgZXRjLilcbiAgICAgICAgLy8gV2lraWRvdCBzZXJ2ZXIgaGFzIGEgcmVsYXRpdmVseSBoaWdoIGVycm9yIHJhdGUsIHNvIHJldHJ5IGlzIGVzc2VudGlhbFxuICAgICAgICByZXRyeUNvdW50Kys7XG4gICAgICAgIGlmIChyZXRyeUNvdW50ID49IHRoaXMuY29uZmlnLnJldHJ5TGltaXQpIHtcbiAgICAgICAgICBjb25zdCBzdGF0dXNDb2RlID1cbiAgICAgICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgJ3Jlc3BvbnNlJyBpbiBlcnJvclxuICAgICAgICAgICAgICA/ICgoZXJyb3IgYXMgeyByZXNwb25zZT86IHsgc3RhdHVzPzogbnVtYmVyIH0gfSkucmVzcG9uc2U/LnN0YXR1cyA/P1xuICAgICAgICAgICAgICAgIERFRkFVTFRfSFRUUF9TVEFUVVNfQ09ERSlcbiAgICAgICAgICAgICAgOiBERUZBVUxUX0hUVFBfU1RBVFVTX0NPREU7XG4gICAgICAgICAgcmV0dXJuIHdkRXJyQXN5bmMobmV3IEFNQ0h0dHBFcnJvcihgQU1DIHJlcXVlc3QgZmFpbGVkOiAke1N0cmluZyhlcnJvcil9YCwgc3RhdHVzQ29kZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYmFja29mZiA9IGNhbGN1bGF0ZUJhY2tvZmYoXG4gICAgICAgICAgcmV0cnlDb3VudCxcbiAgICAgICAgICB0aGlzLmNvbmZpZy5yZXRyeUludGVydmFsLFxuICAgICAgICAgIHRoaXMuY29uZmlnLmJhY2tvZmZGYWN0b3IsXG4gICAgICAgICAgdGhpcy5jb25maWcubWF4QmFja29mZlxuICAgICAgICApO1xuICAgICAgICBhd2FpdCBzbGVlcChiYWNrb2ZmKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsCiAgICAiLyoqXG4gKiBDbGFzcyBmb3IgbWFuYWdpbmcgQU1DIHJlcXVlc3QgaGVhZGVyc1xuICovXG5leHBvcnQgY2xhc3MgQU1DSGVhZGVyIHtcbiAgcHJpdmF0ZSBjb29raWVzOiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xuICBwcml2YXRlIGNvbnRlbnRUeXBlOiBzdHJpbmc7XG4gIHByaXZhdGUgdXNlckFnZW50OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVmZXJlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIEhlYWRlciBpbml0aWFsaXphdGlvbiBvcHRpb25zXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRpb25zPzogeyBjb250ZW50VHlwZT86IHN0cmluZzsgdXNlckFnZW50Pzogc3RyaW5nOyByZWZlcmVyPzogc3RyaW5nIH0pIHtcbiAgICB0aGlzLmNvbnRlbnRUeXBlID0gb3B0aW9ucz8uY29udGVudFR5cGUgPz8gJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCc7XG4gICAgdGhpcy51c2VyQWdlbnQgPSBvcHRpb25zPy51c2VyQWdlbnQgPz8gJ1dpa2lkb3RUUyc7XG4gICAgdGhpcy5yZWZlcmVyID0gb3B0aW9ucz8ucmVmZXJlciA/PyAnaHR0cHM6Ly93d3cud2lraWRvdC5jb20vJztcbiAgICB0aGlzLmNvb2tpZXMgPSBuZXcgTWFwKFtbJ3dpa2lkb3RfdG9rZW43JywgJzEyMzQ1NiddXSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgY29va2llXG4gICAqIEBwYXJhbSBuYW1lIC0gQ29va2llIG5hbWVcbiAgICogQHBhcmFtIHZhbHVlIC0gQ29va2llIHZhbHVlXG4gICAqL1xuICBzZXRDb29raWUobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5jb29raWVzLnNldChuYW1lLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGEgY29va2llXG4gICAqIEBwYXJhbSBuYW1lIC0gQ29va2llIG5hbWVcbiAgICovXG4gIGRlbGV0ZUNvb2tpZShuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmNvb2tpZXMuZGVsZXRlKG5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIGNvb2tpZVxuICAgKiBAcGFyYW0gbmFtZSAtIENvb2tpZSBuYW1lXG4gICAqIEByZXR1cm5zIENvb2tpZSB2YWx1ZSwgdW5kZWZpbmVkIGlmIG5vdCBleGlzdHNcbiAgICovXG4gIGdldENvb2tpZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmNvb2tpZXMuZ2V0KG5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBIVFRQIGhlYWRlcnMgb2JqZWN0XG4gICAqIEByZXR1cm5zIEhlYWRlcnMgZGljdGlvbmFyeVxuICAgKi9cbiAgZ2V0SGVhZGVycygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICBjb25zdCBjb29raWVTdHJpbmcgPSBBcnJheS5mcm9tKHRoaXMuY29va2llcy5lbnRyaWVzKCkpXG4gICAgICAubWFwKChbbmFtZSwgdmFsdWVdKSA9PiBgJHtuYW1lfT0ke3ZhbHVlfWApXG4gICAgICAuam9pbignOyAnKTtcblxuICAgIHJldHVybiB7XG4gICAgICAnQ29udGVudC1UeXBlJzogdGhpcy5jb250ZW50VHlwZSxcbiAgICAgICdVc2VyLUFnZW50JzogdGhpcy51c2VyQWdlbnQsXG4gICAgICBSZWZlcmVyOiB0aGlzLnJlZmVyZXIsXG4gICAgICBDb29raWU6IGNvb2tpZVN0cmluZyxcbiAgICB9O1xuICB9XG59XG4iLAogICAgImltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuXG4vKipcbiAqIEFNQyByZXF1ZXN0IGJvZHkgdmFsdWUgdHlwZVxuICovXG5leHBvcnQgdHlwZSBBTUNSZXF1ZXN0Qm9keVZhbHVlID1cbiAgfCBzdHJpbmdcbiAgfCBudW1iZXJcbiAgfCBib29sZWFuXG4gIHwgbnVsbFxuICB8IHVuZGVmaW5lZFxuICB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIHwgQU1DUmVxdWVzdEJvZHlWYWx1ZVtdO1xuXG4vKipcbiAqIEFNQyByZXF1ZXN0IGJvZHkgdHlwZSBkZWZpbml0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQU1DUmVxdWVzdEJvZHkge1xuICBtb2R1bGVOYW1lPzogc3RyaW5nO1xuICBhY3Rpb24/OiBzdHJpbmc7XG4gIGV2ZW50Pzogc3RyaW5nO1xuICBba2V5OiBzdHJpbmddOiBBTUNSZXF1ZXN0Qm9keVZhbHVlO1xufVxuXG4vKipcbiAqIEFNQyByZXNwb25zZSBiYXNlIHNjaGVtYVxuICovXG5jb25zdCBiYXNlU2NoZW1hOiB6LlpvZE9iamVjdDx7XG4gIHN0YXR1czogei5ab2RTdHJpbmc7XG4gIGJvZHk6IHouWm9kT3B0aW9uYWw8ei5ab2RTdHJpbmc+O1xuICBtZXNzYWdlOiB6LlpvZE9wdGlvbmFsPHouWm9kU3RyaW5nPjtcbn0+ID0gei5vYmplY3Qoe1xuICBzdGF0dXM6IHouc3RyaW5nKCksXG4gIGJvZHk6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgbWVzc2FnZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxufSk7XG5cbi8qKlxuICogQU1DIHJlc3BvbnNlIHNjaGVtYVxuICovXG5leHBvcnQgY29uc3QgYW1jUmVzcG9uc2VTY2hlbWE6IHouWm9kVHlwZTx6LmluZmVyPHR5cGVvZiBiYXNlU2NoZW1hPiAmIFJlY29yZDxzdHJpbmcsIHVua25vd24+PiA9XG4gIGJhc2VTY2hlbWEucGFzc3Rocm91Z2goKTtcblxuLyoqXG4gKiBBTUMgcmVzcG9uc2UgdHlwZVxuICovXG5leHBvcnQgdHlwZSBBTUNSZXNwb25zZSA9IHouaW5mZXI8dHlwZW9mIGFtY1Jlc3BvbnNlU2NoZW1hPjtcblxuLyoqXG4gKiBTdWNjZXNzZnVsIEFNQyByZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFNQ1N1Y2Nlc3NSZXNwb25zZSB7XG4gIHN0YXR1czogJ29rJztcbiAgYm9keTogc3RyaW5nO1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgQU1DIHJlc3BvbnNlIGlzIHN1Y2Nlc3NmdWxcbiAqIEBwYXJhbSByZXNwb25zZSAtIEFNQyByZXNwb25zZVxuICogQHJldHVybnMgdHJ1ZSBpZiByZXNwb25zZSBpcyBzdWNjZXNzZnVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1N1Y2Nlc3NSZXNwb25zZShyZXNwb25zZTogQU1DUmVzcG9uc2UpOiByZXNwb25zZSBpcyBBTUNTdWNjZXNzUmVzcG9uc2Uge1xuICByZXR1cm4gcmVzcG9uc2Uuc3RhdHVzID09PSAnb2snO1xufVxuIiwKICAgICJleHBvcnQgeyBBTUNDbGllbnQsIHR5cGUgQU1DUmVxdWVzdE9wdGlvbnMsIG1hc2tTZW5zaXRpdmVEYXRhIH0gZnJvbSAnLi9hbWMtY2xpZW50JztcbmV4cG9ydCB7IHR5cGUgQU1DQ29uZmlnLCBERUZBVUxUX0FNQ19DT05GSUcgfSBmcm9tICcuL2FtYy1jb25maWcnO1xuZXhwb3J0IHsgQU1DSGVhZGVyIH0gZnJvbSAnLi9hbWMtaGVhZGVyJztcbmV4cG9ydCB7XG4gIHR5cGUgQU1DUmVxdWVzdEJvZHksXG4gIHR5cGUgQU1DUmVzcG9uc2UsXG4gIHR5cGUgQU1DU3VjY2Vzc1Jlc3BvbnNlLFxuICBhbWNSZXNwb25zZVNjaGVtYSxcbiAgaXNTdWNjZXNzUmVzcG9uc2UsXG59IGZyb20gJy4vYW1jLXR5cGVzJztcbmV4cG9ydCB7IGxvZ2luLCBsb2dvdXQgfSBmcm9tICcuL2F1dGgnO1xuIiwKICAgICJpbXBvcnQgeyBTZXNzaW9uQ3JlYXRlRXJyb3IgfSBmcm9tICcuLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYywgd2RPa0FzeW5jIH0gZnJvbSAnLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgQXV0aENsaWVudENvbnRleHQgfSBmcm9tICcuLi9tb2R1bGUvdHlwZXMnO1xuaW1wb3J0IHsgZmV0Y2hXaXRoUmV0cnkgfSBmcm9tICcuLi91dGlsL2h0dHAnO1xuaW1wb3J0IHsgREVGQVVMVF9BTUNfQ09ORklHIH0gZnJvbSAnLi9hbWMtY29uZmlnJztcblxuY29uc3QgTE9HSU5fVVJMID0gJ2h0dHBzOi8vd3d3Lndpa2lkb3QuY29tL2RlZmF1bHQtLWZsb3cvbG9naW5fX0xvZ2luUG9wdXBTY3JlZW4nO1xuXG4vKiogTG9naW4gcmV0cnkgbGltaXQgKHJlZHVjZWQgdG8gcHJldmVudCBhY2NvdW50IGxvY2tvdXQpICovXG5jb25zdCBMT0dJTl9SRVRSWV9MSU1JVCA9IDM7XG5cbi8qKlxuICogTG9naW4gdG8gV2lraWRvdCB3aXRoIHVzZXJuYW1lIGFuZCBwYXNzd29yZFxuICogQHBhcmFtIGNsaWVudCAtIENsaWVudCBjb250ZXh0IChvYmplY3Qgd2l0aCBBTUNDbGllbnQpXG4gKiBAcGFyYW0gdXNlcm5hbWUgLSBVc2VybmFtZVxuICogQHBhcmFtIHBhc3N3b3JkIC0gUGFzc3dvcmRcbiAqIEByZXR1cm5zIHZvaWQgb24gc3VjY2VzcywgU2Vzc2lvbkNyZWF0ZUVycm9yIG9uIGZhaWx1cmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvZ2luKFxuICBjbGllbnQ6IEF1dGhDbGllbnRDb250ZXh0LFxuICB1c2VybmFtZTogc3RyaW5nLFxuICBwYXNzd29yZDogc3RyaW5nXG4pOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7XG4gICAgICAgIGxvZ2luOiB1c2VybmFtZSxcbiAgICAgICAgcGFzc3dvcmQ6IHBhc3N3b3JkLFxuICAgICAgICBhY3Rpb246ICdMb2dpbjJBY3Rpb24nLFxuICAgICAgICBldmVudDogJ2xvZ2luJyxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBVc2UgcmVkdWNlZCByZXRyeSBsaW1pdCBmb3IgbG9naW4gdG8gcHJldmVudCBhY2NvdW50IGxvY2tvdXRcbiAgICAgIGNvbnN0IGxvZ2luQ29uZmlnID0ge1xuICAgICAgICAuLi5ERUZBVUxUX0FNQ19DT05GSUcsXG4gICAgICAgIHJldHJ5TGltaXQ6IExPR0lOX1JFVFJZX0xJTUlULFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hXaXRoUmV0cnkoTE9HSU5fVVJMLCBsb2dpbkNvbmZpZywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogY2xpZW50LmFtY0NsaWVudC5oZWFkZXIuZ2V0SGVhZGVycygpLFxuICAgICAgICBib2R5OiBmb3JtRGF0YS50b1N0cmluZygpLFxuICAgICAgICBjaGVja09rOiBmYWxzZSwgLy8gSGFuZGxlIEhUVFAgZXJyb3JzIG1hbnVhbGx5IGZvciBiZXR0ZXIgZXJyb3IgbWVzc2FnZXNcbiAgICAgIH0pO1xuXG4gICAgICAvLyBDaGVjayBzdGF0dXMgY29kZVxuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgU2Vzc2lvbkNyZWF0ZUVycm9yKFxuICAgICAgICAgIGBMb2dpbiBhdHRlbXB0IGZhaWxlZCBkdWUgdG8gSFRUUCBzdGF0dXMgY29kZTogJHtyZXNwb25zZS5zdGF0dXN9YFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBib2R5IGZvciBlcnJvciBtZXNzYWdlXG4gICAgICBjb25zdCBib2R5ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgaWYgKGJvZHkuaW5jbHVkZXMoJ1RoZSBsb2dpbiBhbmQgcGFzc3dvcmQgZG8gbm90IG1hdGNoJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlc3Npb25DcmVhdGVFcnJvcignTG9naW4gYXR0ZW1wdCBmYWlsZWQgZHVlIHRvIGludmFsaWQgdXNlcm5hbWUgb3IgcGFzc3dvcmQnKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgY29va2llc1xuICAgICAgY29uc3QgY29va2llcyA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdTZXQtQ29va2llJyk7XG4gICAgICBpZiAoIWNvb2tpZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlc3Npb25DcmVhdGVFcnJvcignTG9naW4gYXR0ZW1wdCBmYWlsZWQgZHVlIHRvIG1pc3NpbmcgY29va2llcycpO1xuICAgICAgfVxuXG4gICAgICAvLyBFeHRyYWN0IFdJS0lET1RfU0VTU0lPTl9JRCBmcm9tIGNvb2tpZXNcbiAgICAgIGNvbnN0IHNlc3Npb25JZE1hdGNoID0gY29va2llcy5tYXRjaCgvV0lLSURPVF9TRVNTSU9OX0lEPShbXjtdKykvKTtcbiAgICAgIGlmICghc2Vzc2lvbklkTWF0Y2g/LlsxXSkge1xuICAgICAgICB0aHJvdyBuZXcgU2Vzc2lvbkNyZWF0ZUVycm9yKFxuICAgICAgICAgICdMb2dpbiBhdHRlbXB0IGZhaWxlZCBkdWUgdG8gbWlzc2luZyBXSUtJRE9UX1NFU1NJT05fSUQgY29va2llJ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgc2Vzc2lvbiBjb29raWVcbiAgICAgIGNsaWVudC5hbWNDbGllbnQuaGVhZGVyLnNldENvb2tpZSgnV0lLSURPVF9TRVNTSU9OX0lEJywgc2Vzc2lvbklkTWF0Y2hbMV0pO1xuICAgIH0pKCksXG4gICAgKGVycm9yKSA9PiB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBTZXNzaW9uQ3JlYXRlRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBTZXNzaW9uQ3JlYXRlRXJyb3IoYExvZ2luIGZhaWxlZDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgIH1cbiAgKTtcbn1cblxuLyoqXG4gKiBMb2dvdXQgZnJvbSBXaWtpZG90XG4gKiBAcGFyYW0gY2xpZW50IC0gQ2xpZW50IGNvbnRleHQgKG9iamVjdCB3aXRoIEFNQ0NsaWVudClcbiAqIEByZXR1cm5zIHZvaWQgb24gc3VjY2Vzc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbG9nb3V0KGNsaWVudDogQXV0aENsaWVudENvbnRleHQpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAvLyBUcnkgdG8gbG9nb3V0IHZpYSBBTUMsIHRoZW4gYWx3YXlzIHJlbW92ZSBzZXNzaW9uIGNvb2tpZVxuICByZXR1cm4gY2xpZW50LmFtY0NsaWVudFxuICAgIC5yZXF1ZXN0KFtcbiAgICAgIHtcbiAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgYWN0aW9uOiAnTG9naW4yQWN0aW9uJyxcbiAgICAgICAgZXZlbnQ6ICdsb2dvdXQnLFxuICAgICAgfSxcbiAgICBdKVxuICAgIC5tYXAoKCkgPT4ge1xuICAgICAgLy8gTG9nb3V0IHN1Y2NlZWRlZCwgcmVtb3ZlIHNlc3Npb24gY29va2llXG4gICAgICBjbGllbnQuYW1jQ2xpZW50LmhlYWRlci5kZWxldGVDb29raWUoJ1dJS0lET1RfU0VTU0lPTl9JRCcpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9KVxuICAgIC5vckVsc2UoKCkgPT4ge1xuICAgICAgLy8gRXZlbiBpZiBsb2dvdXQgcmVxdWVzdCBmYWlscywgd2Ugc3RpbGwgd2FudCB0byBjbGVhciB0aGUgc2Vzc2lvbiBsb2NhbGx5XG4gICAgICBjbGllbnQuYW1jQ2xpZW50LmhlYWRlci5kZWxldGVDb29raWUoJ1dJS0lET1RfU0VTU0lPTl9JRCcpO1xuICAgICAgcmV0dXJuIHdkT2tBc3luYyh1bmRlZmluZWQpO1xuICAgIH0pO1xufVxuIiwKICAgICJpbXBvcnQgKiBhcyBjaGVlcmlvIGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0IHtcbiAgRm9yYmlkZGVuRXJyb3IsXG4gIExvZ2luUmVxdWlyZWRFcnJvcixcbiAgTm9FbGVtZW50RXJyb3IsXG4gIFVuZXhwZWN0ZWRFcnJvcixcbn0gZnJvbSAnLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgcGFyc2VPZGF0ZSwgcGFyc2VVc2VyIH0gZnJvbSAnLi4vLi4vdXRpbC9wYXJzZXInO1xuaW1wb3J0IHR5cGUgeyBDbGllbnQgfSBmcm9tICcuLi9jbGllbnQnO1xuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdFVzZXIgfSBmcm9tICcuLi91c2VyJztcbmltcG9ydCB0eXBlIHsgVXNlciB9IGZyb20gJy4uL3VzZXIvdXNlcic7XG5cbi8qKlxuICogUHJpdmF0ZSBtZXNzYWdlIGRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcml2YXRlTWVzc2FnZURhdGEge1xuICBjbGllbnQ6IENsaWVudDtcbiAgaWQ6IG51bWJlcjtcbiAgc2VuZGVyOiBBYnN0cmFjdFVzZXI7XG4gIHJlY2lwaWVudDogQWJzdHJhY3RVc2VyO1xuICBzdWJqZWN0OiBzdHJpbmc7XG4gIGJvZHk6IHN0cmluZztcbiAgY3JlYXRlZEF0OiBEYXRlO1xufVxuXG4vKipcbiAqIFByaXZhdGUgbWVzc2FnZVxuICovXG5leHBvcnQgY2xhc3MgUHJpdmF0ZU1lc3NhZ2Uge1xuICBwdWJsaWMgcmVhZG9ubHkgY2xpZW50OiBDbGllbnQ7XG4gIHB1YmxpYyByZWFkb25seSBpZDogbnVtYmVyO1xuICBwdWJsaWMgcmVhZG9ubHkgc2VuZGVyOiBBYnN0cmFjdFVzZXI7XG4gIHB1YmxpYyByZWFkb25seSByZWNpcGllbnQ6IEFic3RyYWN0VXNlcjtcbiAgcHVibGljIHJlYWRvbmx5IHN1YmplY3Q6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGJvZHk6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZWRBdDogRGF0ZTtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBQcml2YXRlTWVzc2FnZURhdGEpIHtcbiAgICB0aGlzLmNsaWVudCA9IGRhdGEuY2xpZW50O1xuICAgIHRoaXMuaWQgPSBkYXRhLmlkO1xuICAgIHRoaXMuc2VuZGVyID0gZGF0YS5zZW5kZXI7XG4gICAgdGhpcy5yZWNpcGllbnQgPSBkYXRhLnJlY2lwaWVudDtcbiAgICB0aGlzLnN1YmplY3QgPSBkYXRhLnN1YmplY3Q7XG4gICAgdGhpcy5ib2R5ID0gZGF0YS5ib2R5O1xuICAgIHRoaXMuY3JlYXRlZEF0ID0gZGF0YS5jcmVhdGVkQXQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IG1lc3NhZ2UgYnkgbWVzc2FnZSBJRFxuICAgKiBAcGFyYW0gY2xpZW50IC0gQ2xpZW50IGluc3RhbmNlXG4gICAqIEBwYXJhbSBtZXNzYWdlSWQgLSBNZXNzYWdlIElEXG4gICAqIEByZXR1cm5zIFByaXZhdGUgbWVzc2FnZVxuICAgKi9cbiAgc3RhdGljIGZyb21JZChjbGllbnQ6IENsaWVudCwgbWVzc2FnZUlkOiBudW1iZXIpOiBXaWtpZG90UmVzdWx0QXN5bmM8UHJpdmF0ZU1lc3NhZ2U+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24uZnJvbUlkcyhjbGllbnQsIFttZXNzYWdlSWRdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghbWVzc2FnZSkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcihgTWVzc2FnZSBub3QgZm91bmQ6ICR7bWVzc2FnZUlkfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBGb3JiaWRkZW5FcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IG1lc3NhZ2U6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgcHJpdmF0ZSBtZXNzYWdlXG4gICAqIEBwYXJhbSBjbGllbnQgLSBDbGllbnQgaW5zdGFuY2VcbiAgICogQHBhcmFtIHJlY2lwaWVudCAtIFJlY2lwaWVudFxuICAgKiBAcGFyYW0gc3ViamVjdCAtIFN1YmplY3RcbiAgICogQHBhcmFtIGJvZHkgLSBCb2R5XG4gICAqL1xuICBzdGF0aWMgc2VuZChcbiAgICBjbGllbnQ6IENsaWVudCxcbiAgICByZWNpcGllbnQ6IFVzZXIsXG4gICAgc3ViamVjdDogc3RyaW5nLFxuICAgIGJvZHk6IHN0cmluZ1xuICApOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIGNvbnN0IGxvZ2luUmVzdWx0ID0gY2xpZW50LnJlcXVpcmVMb2dpbigpO1xuICAgIGlmIChsb2dpblJlc3VsdC5pc0VycigpKSB7XG4gICAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAgIFByb21pc2UucmVqZWN0KGxvZ2luUmVzdWx0LmVycm9yKSxcbiAgICAgICAgKCkgPT4gbmV3IExvZ2luUmVxdWlyZWRFcnJvcignTG9naW4gcmVxdWlyZWQgdG8gc2VuZCBtZXNzYWdlJylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2xpZW50LmFtY0NsaWVudC5yZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzb3VyY2U6IGJvZHksXG4gICAgICAgICAgICBzdWJqZWN0LFxuICAgICAgICAgICAgdG9fdXNlcl9pZDogcmVjaXBpZW50LmlkLFxuICAgICAgICAgICAgYWN0aW9uOiAnRGFzaGJvYXJkTWVzc2FnZUFjdGlvbicsXG4gICAgICAgICAgICBldmVudDogJ3NlbmQnLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gc2VuZCBtZXNzYWdlOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFByaXZhdGVNZXNzYWdlKGlkPSR7dGhpcy5pZH0sIHNlbmRlcj0ke3RoaXMuc2VuZGVyfSwgcmVjaXBpZW50PSR7dGhpcy5yZWNpcGllbnR9LCBzdWJqZWN0PSR7dGhpcy5zdWJqZWN0fSlgO1xuICB9XG59XG5cbi8qKlxuICogUHJpdmF0ZSBtZXNzYWdlIGNvbGxlY3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFByaXZhdGVNZXNzYWdlQ29sbGVjdGlvbiBleHRlbmRzIEFycmF5PFByaXZhdGVNZXNzYWdlPiB7XG4gIHB1YmxpYyByZWFkb25seSBjbGllbnQ6IENsaWVudDtcblxuICBjb25zdHJ1Y3RvcihjbGllbnQ6IENsaWVudCwgbWVzc2FnZXM/OiBQcml2YXRlTWVzc2FnZVtdKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICBpZiAobWVzc2FnZXMpIHtcbiAgICAgIHRoaXMucHVzaCguLi5tZXNzYWdlcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYnkgSURcbiAgICovXG4gIGZpbmRCeUlkKGlkOiBudW1iZXIpOiBQcml2YXRlTWVzc2FnZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmluZCgobWVzc2FnZSkgPT4gbWVzc2FnZS5pZCA9PT0gaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBtZXNzYWdlcyBmcm9tIGxpc3Qgb2YgbWVzc2FnZSBJRHNcbiAgICovXG4gIHN0YXRpYyBmcm9tSWRzKFxuICAgIGNsaWVudDogQ2xpZW50LFxuICAgIG1lc3NhZ2VJZHM6IG51bWJlcltdXG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzxQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24+IHtcbiAgICBjb25zdCBsb2dpblJlc3VsdCA9IGNsaWVudC5yZXF1aXJlTG9naW4oKTtcbiAgICBpZiAobG9naW5SZXN1bHQuaXNFcnIoKSkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgICBQcm9taXNlLnJlamVjdChsb2dpblJlc3VsdC5lcnJvciksXG4gICAgICAgICgpID0+IG5ldyBMb2dpblJlcXVpcmVkRXJyb3IoJ0xvZ2luIHJlcXVpcmVkIHRvIGdldCBtZXNzYWdlcycpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJvZGllcyA9IG1lc3NhZ2VJZHMubWFwKChtZXNzYWdlSWQpID0+ICh7XG4gICAgICAgICAgaXRlbTogbWVzc2FnZUlkLFxuICAgICAgICAgIG1vZHVsZU5hbWU6ICdkYXNoYm9hcmQvbWVzc2FnZXMvRE1WaWV3TWVzc2FnZU1vZHVsZScsXG4gICAgICAgIH0pKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjbGllbnQuYW1jQ2xpZW50LnJlcXVlc3QoYm9kaWVzKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWVzc2FnZXM6IFByaXZhdGVNZXNzYWdlW10gPSBbXTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1lc3NhZ2VJZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVtpXTtcbiAgICAgICAgICBjb25zdCBtZXNzYWdlSWQgPSBtZXNzYWdlSWRzW2ldO1xuICAgICAgICAgIGlmICghcmVzcG9uc2UgfHwgbWVzc2FnZUlkID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY29uc3QgaHRtbCA9IFN0cmluZyhyZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGh0bWwpO1xuXG4gICAgICAgICAgLy8gR2V0IHVzZXIgaW5mb3JtYXRpb25cbiAgICAgICAgICBjb25zdCBwcmludHVzZXJFbGVtcyA9ICQoJ2Rpdi5wbWVzc2FnZSBkaXYuaGVhZGVyIHNwYW4ucHJpbnR1c2VyJyk7XG4gICAgICAgICAgaWYgKHByaW50dXNlckVsZW1zLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBGb3JiaWRkZW5FcnJvcihgRmFpbGVkIHRvIGdldCBtZXNzYWdlOiAke21lc3NhZ2VJZH1gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBzZW5kZXJFbGVtID0gJChwcmludHVzZXJFbGVtc1swXSk7XG4gICAgICAgICAgY29uc3QgcmVjaXBpZW50RWxlbSA9ICQocHJpbnR1c2VyRWxlbXNbMV0pO1xuXG4gICAgICAgICAgY29uc3Qgc2VuZGVyID0gcGFyc2VVc2VyKGNsaWVudCwgc2VuZGVyRWxlbSk7XG4gICAgICAgICAgY29uc3QgcmVjaXBpZW50ID0gcGFyc2VVc2VyKGNsaWVudCwgcmVjaXBpZW50RWxlbSk7XG5cbiAgICAgICAgICAvLyBTdWJqZWN0XG4gICAgICAgICAgY29uc3Qgc3ViamVjdEVsZW0gPSAkKCdkaXYucG1lc3NhZ2UgZGl2LmhlYWRlciBzcGFuLnN1YmplY3QnKTtcbiAgICAgICAgICBjb25zdCBzdWJqZWN0ID0gc3ViamVjdEVsZW0udGV4dCgpLnRyaW0oKTtcblxuICAgICAgICAgIC8vIEJvZHlcbiAgICAgICAgICBjb25zdCBib2R5RWxlbSA9ICQoJ2Rpdi5wbWVzc2FnZSBkaXYuYm9keScpO1xuICAgICAgICAgIGNvbnN0IGJvZHkgPSBib2R5RWxlbS50ZXh0KCkudHJpbSgpO1xuXG4gICAgICAgICAgLy8gVGltZXN0YW1wXG4gICAgICAgICAgY29uc3Qgb2RhdGVFbGVtID0gJCgnZGl2LmhlYWRlciBzcGFuLm9kYXRlJyk7XG4gICAgICAgICAgY29uc3QgY3JlYXRlZEF0ID1cbiAgICAgICAgICAgIG9kYXRlRWxlbS5sZW5ndGggPiAwID8gKHBhcnNlT2RhdGUob2RhdGVFbGVtKSA/PyBuZXcgRGF0ZSgwKSkgOiBuZXcgRGF0ZSgwKTtcblxuICAgICAgICAgIG1lc3NhZ2VzLnB1c2goXG4gICAgICAgICAgICBuZXcgUHJpdmF0ZU1lc3NhZ2Uoe1xuICAgICAgICAgICAgICBjbGllbnQsXG4gICAgICAgICAgICAgIGlkOiBtZXNzYWdlSWQsXG4gICAgICAgICAgICAgIHNlbmRlcixcbiAgICAgICAgICAgICAgcmVjaXBpZW50LFxuICAgICAgICAgICAgICBzdWJqZWN0LFxuICAgICAgICAgICAgICBib2R5LFxuICAgICAgICAgICAgICBjcmVhdGVkQXQsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IFByaXZhdGVNZXNzYWdlQ29sbGVjdGlvbihjbGllbnQsIG1lc3NhZ2VzKTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRm9yYmlkZGVuRXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBMb2dpblJlcXVpcmVkRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgbWVzc2FnZXM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVybmFsIG1ldGhvZCB0byBnZXQgbWVzc2FnZXMgZnJvbSBtb2R1bGVcbiAgICovXG4gIHByb3RlY3RlZCBzdGF0aWMgYWNxdWlyZUZyb21Nb2R1bGUoXG4gICAgY2xpZW50OiBDbGllbnQsXG4gICAgbW9kdWxlTmFtZTogc3RyaW5nXG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzxQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24+IHtcbiAgICBjb25zdCBsb2dpblJlc3VsdCA9IGNsaWVudC5yZXF1aXJlTG9naW4oKTtcbiAgICBpZiAobG9naW5SZXN1bHQuaXNFcnIoKSkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgICBQcm9taXNlLnJlamVjdChsb2dpblJlc3VsdC5lcnJvciksXG4gICAgICAgICgpID0+IG5ldyBMb2dpblJlcXVpcmVkRXJyb3IoJ0xvZ2luIHJlcXVpcmVkIHRvIGdldCBtZXNzYWdlcycpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIEdldCBwYWdlclxuICAgICAgICBjb25zdCBmaXJzdFJlc3VsdCA9IGF3YWl0IGNsaWVudC5hbWNDbGllbnQucmVxdWVzdChbeyBtb2R1bGVOYW1lIH1dKTtcbiAgICAgICAgaWYgKGZpcnN0UmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBmaXJzdFJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpcnN0UmVzcG9uc2UgPSBmaXJzdFJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFmaXJzdFJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdFbXB0eSByZXNwb25zZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlyc3RIdG1sID0gU3RyaW5nKGZpcnN0UmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgIGNvbnN0ICRmaXJzdCA9IGNoZWVyaW8ubG9hZChmaXJzdEh0bWwpO1xuXG4gICAgICAgIC8vIEdldCBwYWdlIGNvdW50XG4gICAgICAgIGNvbnN0IHBhZ2VyVGFyZ2V0cyA9ICRmaXJzdCgnZGl2LnBhZ2VyIHNwYW4udGFyZ2V0Jyk7XG4gICAgICAgIGxldCBtYXhQYWdlID0gMTtcbiAgICAgICAgaWYgKHBhZ2VyVGFyZ2V0cy5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgY29uc3QgbGFzdFBhZ2VUZXh0ID0gJGZpcnN0KHBhZ2VyVGFyZ2V0c1twYWdlclRhcmdldHMubGVuZ3RoIC0gMl0pXG4gICAgICAgICAgICAudGV4dCgpXG4gICAgICAgICAgICAudHJpbSgpO1xuICAgICAgICAgIG1heFBhZ2UgPSBOdW1iZXIucGFyc2VJbnQobGFzdFBhZ2VUZXh0LCAxMCkgfHwgMTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCBtZXNzYWdlIElEcyBmcm9tIGFsbCBwYWdlc1xuICAgICAgICBjb25zdCBtZXNzYWdlSWRzOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgICAgIGlmIChtYXhQYWdlID4gMSkge1xuICAgICAgICAgIGNvbnN0IGJvZGllcyA9IFtdO1xuICAgICAgICAgIGZvciAobGV0IHBhZ2UgPSAxOyBwYWdlIDw9IG1heFBhZ2U7IHBhZ2UrKykge1xuICAgICAgICAgICAgYm9kaWVzLnB1c2goeyBwYWdlLCBtb2R1bGVOYW1lIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBhZGRpdGlvbmFsUmVzdWx0cyA9IGF3YWl0IGNsaWVudC5hbWNDbGllbnQucmVxdWVzdChib2RpZXMpO1xuICAgICAgICAgIGlmIChhZGRpdGlvbmFsUmVzdWx0cy5pc0VycigpKSB7XG4gICAgICAgICAgICB0aHJvdyBhZGRpdGlvbmFsUmVzdWx0cy5lcnJvcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IHJlc3BvbnNlIG9mIGFkZGl0aW9uYWxSZXN1bHRzLnZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCBodG1sID0gU3RyaW5nKHJlc3BvbnNlPy5ib2R5ID8/ICcnKTtcbiAgICAgICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoaHRtbCk7XG4gICAgICAgICAgICAkKCd0ci5tZXNzYWdlJykuZWFjaCgoX2ksIGVsZW0pID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZGF0YUhyZWYgPSAkKGVsZW0pLmF0dHIoJ2RhdGEtaHJlZicpID8/ICcnO1xuICAgICAgICAgICAgICBjb25zdCBpZE1hdGNoID0gZGF0YUhyZWYubWF0Y2goL1xcLyhcXGQrKSQvKTtcbiAgICAgICAgICAgICAgaWYgKGlkTWF0Y2g/LlsxXSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VJZHMucHVzaChOdW1iZXIucGFyc2VJbnQoaWRNYXRjaFsxXSwgMTApKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICRmaXJzdCgndHIubWVzc2FnZScpLmVhY2goKF9pLCBlbGVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkYXRhSHJlZiA9ICRmaXJzdChlbGVtKS5hdHRyKCdkYXRhLWhyZWYnKSA/PyAnJztcbiAgICAgICAgICAgIGNvbnN0IGlkTWF0Y2ggPSBkYXRhSHJlZi5tYXRjaCgvXFwvKFxcZCspJC8pO1xuICAgICAgICAgICAgaWYgKGlkTWF0Y2g/LlsxXSkge1xuICAgICAgICAgICAgICBtZXNzYWdlSWRzLnB1c2goTnVtYmVyLnBhcnNlSW50KGlkTWF0Y2hbMV0sIDEwKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgbWVzc2FnZXNcbiAgICAgICAgY29uc3QgbWVzc2FnZXNSZXN1bHQgPSBhd2FpdCBQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24uZnJvbUlkcyhjbGllbnQsIG1lc3NhZ2VJZHMpO1xuICAgICAgICBpZiAobWVzc2FnZXNSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IG1lc3NhZ2VzUmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2VzUmVzdWx0LnZhbHVlO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBGb3JiaWRkZW5FcnJvciB8fFxuICAgICAgICAgIGVycm9yIGluc3RhbmNlb2YgTG9naW5SZXF1aXJlZEVycm9yIHx8XG4gICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvclxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBhY3F1aXJlIG1lc3NhZ2VzOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEluYm94XG4gKi9cbmV4cG9ydCBjbGFzcyBQcml2YXRlTWVzc2FnZUluYm94IGV4dGVuZHMgUHJpdmF0ZU1lc3NhZ2VDb2xsZWN0aW9uIHtcbiAgLyoqXG4gICAqIEdldCBhbGwgbWVzc2FnZXMgaW4gaW5ib3hcbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlKGNsaWVudDogQ2xpZW50KTogV2lraWRvdFJlc3VsdEFzeW5jPFByaXZhdGVNZXNzYWdlSW5ib3g+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24uYWNxdWlyZUZyb21Nb2R1bGUoXG4gICAgICAgICAgY2xpZW50LFxuICAgICAgICAgICdkYXNoYm9hcmQvbWVzc2FnZXMvRE1JbmJveE1vZHVsZSdcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGluYm94ID0gbmV3IFByaXZhdGVNZXNzYWdlSW5ib3goY2xpZW50KTtcbiAgICAgICAgaW5ib3gucHVzaCguLi5yZXN1bHQudmFsdWUpO1xuICAgICAgICByZXR1cm4gaW5ib3g7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEZvcmJpZGRlbkVycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgTG9naW5SZXF1aXJlZEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSBpbmJveDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBTZW50IGJveFxuICovXG5leHBvcnQgY2xhc3MgUHJpdmF0ZU1lc3NhZ2VTZW50Qm94IGV4dGVuZHMgUHJpdmF0ZU1lc3NhZ2VDb2xsZWN0aW9uIHtcbiAgLyoqXG4gICAqIEdldCBhbGwgbWVzc2FnZXMgaW4gc2VudCBib3hcbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlKGNsaWVudDogQ2xpZW50KTogV2lraWRvdFJlc3VsdEFzeW5jPFByaXZhdGVNZXNzYWdlU2VudEJveD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByaXZhdGVNZXNzYWdlQ29sbGVjdGlvbi5hY3F1aXJlRnJvbU1vZHVsZShcbiAgICAgICAgICBjbGllbnQsXG4gICAgICAgICAgJ2Rhc2hib2FyZC9tZXNzYWdlcy9ETVNlbnRNb2R1bGUnXG4gICAgICAgICk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZW50Qm94ID0gbmV3IFByaXZhdGVNZXNzYWdlU2VudEJveChjbGllbnQpO1xuICAgICAgICBzZW50Qm94LnB1c2goLi4ucmVzdWx0LnZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHNlbnRCb3g7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEZvcmJpZGRlbkVycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgTG9naW5SZXF1aXJlZEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSBzZW50IGJveDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHtcbiAgUHJpdmF0ZU1lc3NhZ2UsXG4gIFByaXZhdGVNZXNzYWdlQ29sbGVjdGlvbixcbiAgUHJpdmF0ZU1lc3NhZ2VJbmJveCxcbiAgUHJpdmF0ZU1lc3NhZ2VTZW50Qm94LFxufSBmcm9tICcuLi8uLi9wcml2YXRlLW1lc3NhZ2UnO1xuaW1wb3J0IHR5cGUgeyBVc2VyIH0gZnJvbSAnLi4vLi4vdXNlci91c2VyJztcbmltcG9ydCB0eXBlIHsgQ2xpZW50IH0gZnJvbSAnLi4vY2xpZW50JztcblxuLyoqXG4gKiBQcml2YXRlIG1lc3NhZ2Ugb3BlcmF0aW9ucyBhY2Nlc3NvclxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBHZXQgaW5ib3hcbiAqIGNvbnN0IGluYm94UmVzdWx0ID0gYXdhaXQgY2xpZW50LnByaXZhdGVNZXNzYWdlLmluYm94KCk7XG4gKiBpZiAoIWluYm94UmVzdWx0LmlzT2soKSkge1xuICogICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBnZXQgaW5ib3gnKTtcbiAqIH1cbiAqIGNvbnN0IGluYm94ID0gaW5ib3hSZXN1bHQudmFsdWU7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFByaXZhdGVNZXNzYWdlQWNjZXNzb3Ige1xuICBwdWJsaWMgcmVhZG9ubHkgY2xpZW50OiBDbGllbnQ7XG5cbiAgY29uc3RydWN0b3IoY2xpZW50OiBDbGllbnQpIHtcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbWVzc2FnZSBieSBtZXNzYWdlIElEXG4gICAqXG4gICAqIEBwYXJhbSBpZCAtIE1lc3NhZ2UgSURcbiAgICogQHJldHVybnMgTWVzc2FnZSBvYmplY3Qgd3JhcHBlZCBpbiBSZXN1bHQgdHlwZVxuICAgKi9cbiAgZ2V0KGlkOiBudW1iZXIpOiBXaWtpZG90UmVzdWx0QXN5bmM8UHJpdmF0ZU1lc3NhZ2U+IHtcbiAgICByZXR1cm4gUHJpdmF0ZU1lc3NhZ2UuZnJvbUlkKHRoaXMuY2xpZW50LCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IG1lc3NhZ2VzIGZyb20gbXVsdGlwbGUgbWVzc2FnZSBJRHNcbiAgICogQHBhcmFtIGlkcyAtIEFycmF5IG9mIG1lc3NhZ2UgSURzXG4gICAqIEByZXR1cm5zIE1lc3NhZ2UgY29sbGVjdGlvblxuICAgKi9cbiAgZ2V0TWVzc2FnZXMoaWRzOiBudW1iZXJbXSk6IFdpa2lkb3RSZXN1bHRBc3luYzxQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gUHJpdmF0ZU1lc3NhZ2VDb2xsZWN0aW9uLmZyb21JZHModGhpcy5jbGllbnQsIGlkcyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGluYm94IG1lc3NhZ2UgbGlzdFxuICAgKiBAcmV0dXJucyBJbmJveFxuICAgKi9cbiAgaW5ib3goKTogV2lraWRvdFJlc3VsdEFzeW5jPFByaXZhdGVNZXNzYWdlSW5ib3g+IHtcbiAgICByZXR1cm4gUHJpdmF0ZU1lc3NhZ2VJbmJveC5hY3F1aXJlKHRoaXMuY2xpZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc2VudCBib3ggbWVzc2FnZSBsaXN0XG4gICAqIEByZXR1cm5zIFNlbnQgYm94XG4gICAqL1xuICBzZW50Qm94KCk6IFdpa2lkb3RSZXN1bHRBc3luYzxQcml2YXRlTWVzc2FnZVNlbnRCb3g+IHtcbiAgICByZXR1cm4gUHJpdmF0ZU1lc3NhZ2VTZW50Qm94LmFjcXVpcmUodGhpcy5jbGllbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgYSBwcml2YXRlIG1lc3NhZ2VcbiAgICogQHBhcmFtIHJlY2lwaWVudCAtIFJlY2lwaWVudFxuICAgKiBAcGFyYW0gc3ViamVjdCAtIFN1YmplY3RcbiAgICogQHBhcmFtIGJvZHkgLSBCb2R5XG4gICAqL1xuICBzZW5kKHJlY2lwaWVudDogVXNlciwgc3ViamVjdDogc3RyaW5nLCBib2R5OiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiBQcml2YXRlTWVzc2FnZS5zZW5kKHRoaXMuY2xpZW50LCByZWNpcGllbnQsIHN1YmplY3QsIGJvZHkpO1xuICB9XG59XG5cbmV4cG9ydCB7IFByaXZhdGVNZXNzYWdlLCBQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24sIFByaXZhdGVNZXNzYWdlSW5ib3gsIFByaXZhdGVNZXNzYWdlU2VudEJveCB9O1xuIiwKICAgICJpbXBvcnQgdHlwZSB7IFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQge1xuICBGb3J1bUNhdGVnb3J5LFxuICBGb3J1bUNhdGVnb3J5Q29sbGVjdGlvbixcbiAgRm9ydW1Qb3N0LFxuICBGb3J1bVRocmVhZCxcbiAgRm9ydW1UaHJlYWRDb2xsZWN0aW9uLFxufSBmcm9tICcuLi8uLi9mb3J1bSc7XG5pbXBvcnQgdHlwZSB7IFNpdGUgfSBmcm9tICcuLi9zaXRlJztcblxuLyoqXG4gKiBGb3J1bSBvcGVyYXRpb25zIGFjY2Vzc29yXG4gKi9cbmV4cG9ydCBjbGFzcyBGb3J1bUFjY2Vzc29yIHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG5cbiAgY29uc3RydWN0b3Ioc2l0ZTogU2l0ZSkge1xuICAgIHRoaXMuc2l0ZSA9IHNpdGU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGZvcnVtIGNhdGVnb3J5IGxpc3RcbiAgICogQHJldHVybnMgQ2F0ZWdvcnkgbGlzdFxuICAgKi9cbiAgZ2V0Q2F0ZWdvcmllcygpOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1DYXRlZ29yeUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gRm9ydW1DYXRlZ29yeUNvbGxlY3Rpb24uYWNxdWlyZUFsbCh0aGlzLnNpdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aHJlYWRcbiAgICogQHBhcmFtIHRocmVhZElkIC0gVGhyZWFkIElEXG4gICAqIEByZXR1cm5zIFRocmVhZFxuICAgKi9cbiAgZ2V0VGhyZWFkKHRocmVhZElkOiBudW1iZXIpOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1UaHJlYWQ+IHtcbiAgICByZXR1cm4gRm9ydW1UaHJlYWQuZ2V0RnJvbUlkKHRoaXMuc2l0ZSwgdGhyZWFkSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBtdWx0aXBsZSB0aHJlYWRzXG4gICAqIEBwYXJhbSB0aHJlYWRJZHMgLSBBcnJheSBvZiB0aHJlYWQgSURzXG4gICAqIEByZXR1cm5zIFRocmVhZCBjb2xsZWN0aW9uXG4gICAqL1xuICBnZXRUaHJlYWRzKHRocmVhZElkczogbnVtYmVyW10pOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1UaHJlYWRDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIEZvcnVtVGhyZWFkQ29sbGVjdGlvbi5hY3F1aXJlRnJvbVRocmVhZElkcyh0aGlzLnNpdGUsIHRocmVhZElkcyk7XG4gIH1cbn1cblxuZXhwb3J0IHsgRm9ydW1DYXRlZ29yeSwgRm9ydW1DYXRlZ29yeUNvbGxlY3Rpb24sIEZvcnVtVGhyZWFkLCBGb3J1bVRocmVhZENvbGxlY3Rpb24sIEZvcnVtUG9zdCB9O1xuIiwKICAgICJpbXBvcnQgeyBSZXF1aXJlTG9naW4gfSBmcm9tICcuLi8uLi8uLi9jb21tb24vZGVjb3JhdG9ycyc7XG5pbXBvcnQge1xuICBMb2dpblJlcXVpcmVkRXJyb3IsXG4gIFRhcmdldEVycm9yLFxuICBVbmV4cGVjdGVkRXJyb3IsXG4gIFdpa2lkb3RTdGF0dXNFcnJvcixcbn0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgdHlwZSBRTUNVc2VyLCBRdWlja01vZHVsZSB9IGZyb20gJy4uLy4uLy4uL3V0aWwvcXVpY2stbW9kdWxlJztcbmltcG9ydCB0eXBlIHsgVXNlciB9IGZyb20gJy4uLy4uL3VzZXIvdXNlcic7XG5pbXBvcnQgdHlwZSB7IFNpdGUgfSBmcm9tICcuLi9zaXRlJztcbmltcG9ydCB7IFNpdGVBcHBsaWNhdGlvbiB9IGZyb20gJy4uL3NpdGUtYXBwbGljYXRpb24nO1xuaW1wb3J0IHsgU2l0ZU1lbWJlciB9IGZyb20gJy4uL3NpdGUtbWVtYmVyJztcblxuLyoqXG4gKiBTaXRlIG1lbWJlciBvcGVyYXRpb25zIGFjY2Vzc29yXG4gKi9cbmV4cG9ydCBjbGFzcyBNZW1iZXJBY2Nlc3NvciB7XG4gIHB1YmxpYyByZWFkb25seSBzaXRlOiBTaXRlO1xuXG4gIGNvbnN0cnVjdG9yKHNpdGU6IFNpdGUpIHtcbiAgICB0aGlzLnNpdGUgPSBzaXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgbWVtYmVyc1xuICAgKiBAcmV0dXJucyBNZW1iZXIgbGlzdFxuICAgKi9cbiAgZ2V0QWxsKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxTaXRlTWVtYmVyW10+IHtcbiAgICByZXR1cm4gU2l0ZU1lbWJlci5nZXRNZW1iZXJzKHRoaXMuc2l0ZSwgJycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBtb2RlcmF0b3IgbGlzdFxuICAgKiBAcmV0dXJucyBNb2RlcmF0b3IgbGlzdFxuICAgKi9cbiAgZ2V0TW9kZXJhdG9ycygpOiBXaWtpZG90UmVzdWx0QXN5bmM8U2l0ZU1lbWJlcltdPiB7XG4gICAgcmV0dXJuIFNpdGVNZW1iZXIuZ2V0TWVtYmVycyh0aGlzLnNpdGUsICdtb2RlcmF0b3JzJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFkbWluIGxpc3RcbiAgICogQHJldHVybnMgQWRtaW4gbGlzdFxuICAgKi9cbiAgZ2V0QWRtaW5zKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxTaXRlTWVtYmVyW10+IHtcbiAgICByZXR1cm4gU2l0ZU1lbWJlci5nZXRNZW1iZXJzKHRoaXMuc2l0ZSwgJ2FkbWlucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBwZW5kaW5nIG1lbWJlcnNoaXAgYXBwbGljYXRpb25zXG4gICAqIEByZXR1cm5zIEFwcGxpY2F0aW9uIGxpc3RcbiAgICovXG4gIGdldEFwcGxpY2F0aW9ucygpOiBXaWtpZG90UmVzdWx0QXN5bmM8U2l0ZUFwcGxpY2F0aW9uW10+IHtcbiAgICByZXR1cm4gU2l0ZUFwcGxpY2F0aW9uLmFjcXVpcmVBbGwodGhpcy5zaXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2ggbWVtYmVyc1xuICAgKiBAcGFyYW0gcXVlcnkgLSBTZWFyY2ggcXVlcnkgKHBhcnQgb2YgdXNlcm5hbWUpXG4gICAqIEByZXR1cm5zIE1hdGNoZWQgdXNlciBsaXN0IChRTUNVc2VyIGZvcm1hdClcbiAgICovXG4gIGxvb2t1cChxdWVyeTogc3RyaW5nKTogV2lraWRvdFJlc3VsdEFzeW5jPFFNQ1VzZXJbXT4ge1xuICAgIHJldHVybiBRdWlja01vZHVsZS5tZW1iZXJMb29rdXAodGhpcy5zaXRlLmlkLCBxdWVyeSk7XG4gIH1cblxuICAvKipcbiAgICogSW52aXRlIHVzZXIgdG8gc2l0ZVxuICAgKiBAcGFyYW0gdXNlciAtIFVzZXIgdG8gaW52aXRlXG4gICAqIEBwYXJhbSB0ZXh0IC0gSW52aXRhdGlvbiBtZXNzYWdlXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIGludml0ZSh1c2VyOiBVc2VyLCB0ZXh0OiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhY3Rpb246ICdNYW5hZ2VTaXRlTWVtYmVyc2hpcEFjdGlvbicsXG4gICAgICAgICAgICBldmVudDogJ2ludml0ZU1lbWJlcicsXG4gICAgICAgICAgICB1c2VyX2lkOiB1c2VyLmlkLFxuICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdFbXB0eScsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gcmVzdWx0LmVycm9yO1xuICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFdpa2lkb3RTdGF0dXNFcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1c0NvZGUgPT09ICdhbHJlYWR5X2ludml0ZWQnKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUYXJnZXRFcnJvcihcbiAgICAgICAgICAgICAgICBgVXNlciBpcyBhbHJlYWR5IGludml0ZWQgdG8gJHt0aGlzLnNpdGUudW5peE5hbWV9OiAke3VzZXIubmFtZX1gXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzQ29kZSA9PT0gJ2FscmVhZHlfbWVtYmVyJykge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgVGFyZ2V0RXJyb3IoXG4gICAgICAgICAgICAgICAgYFVzZXIgaXMgYWxyZWFkeSBhIG1lbWJlciBvZiAke3RoaXMuc2l0ZS51bml4TmFtZX06ICR7dXNlci5uYW1lfWBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgVGFyZ2V0RXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBMb2dpblJlcXVpcmVkRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBpbnZpdGUgdXNlcjogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IHsgU2l0ZU1lbWJlciwgU2l0ZUFwcGxpY2F0aW9uIH07XG4iLAogICAgIi8qKlxuICogUXVpY2tNb2R1bGUgLSBXaWtpZG90IGxpZ2h0d2VpZ2h0IEFQSVxuICpcbiAqIFNlYXJjaCBmdW5jdGlvbmFsaXR5IHVzaW5nIHF1aWNrbW9kdWxlLnBocCBlbmRwb2ludFxuICovXG5cbmltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuaW1wb3J0IHsgTm90Rm91bmRFeGNlcHRpb24sIFVuZXhwZWN0ZWRFcnJvciB9IGZyb20gJy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB7IERFRkFVTFRfQU1DX0NPTkZJRyB9IGZyb20gJy4uL2Nvbm5lY3Rvci9hbWMtY29uZmlnJztcbmltcG9ydCB7IGZldGNoV2l0aFJldHJ5IH0gZnJvbSAnLi9odHRwJztcblxuLyoqXG4gKiBRdWlja01vZHVsZSBtb2R1bGUgbmFtZVxuICovXG5leHBvcnQgdHlwZSBRdWlja01vZHVsZU5hbWUgPSAnTWVtYmVyTG9va3VwUU1vZHVsZScgfCAnVXNlckxvb2t1cFFNb2R1bGUnIHwgJ1BhZ2VMb29rdXBRTW9kdWxlJztcblxuLyoqXG4gKiBRdWlja01vZHVsZSB1c2VyIGluZm9ybWF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUU1DVXNlciB7XG4gIGlkOiBudW1iZXI7XG4gIG5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBRdWlja01vZHVsZSBwYWdlIGluZm9ybWF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUU1DUGFnZSB7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIHVuaXhOYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUXVpY2tNb2R1bGUgcmVzcG9uc2Ugc2NoZW1hXG4gKi9cbmNvbnN0IHF1aWNrTW9kdWxlVXNlclJlc3BvbnNlU2NoZW1hID0gei5vYmplY3Qoe1xuICB1c2Vyczogei51bmlvbihbXG4gICAgei5hcnJheShcbiAgICAgIHoub2JqZWN0KHtcbiAgICAgICAgdXNlcl9pZDogei51bmlvbihbei5zdHJpbmcoKSwgei5udW1iZXIoKV0pLFxuICAgICAgICBuYW1lOiB6LnN0cmluZygpLFxuICAgICAgfSlcbiAgICApLFxuICAgIHoubGl0ZXJhbChmYWxzZSksXG4gIF0pLFxufSk7XG5cbmNvbnN0IHF1aWNrTW9kdWxlUGFnZVJlc3BvbnNlU2NoZW1hID0gei5vYmplY3Qoe1xuICBwYWdlczogei51bmlvbihbXG4gICAgei5hcnJheShcbiAgICAgIHoub2JqZWN0KHtcbiAgICAgICAgdGl0bGU6IHouc3RyaW5nKCksXG4gICAgICAgIHVuaXhfbmFtZTogei5zdHJpbmcoKSxcbiAgICAgIH0pXG4gICAgKSxcbiAgICB6LmxpdGVyYWwoZmFsc2UpLFxuICBdKSxcbn0pO1xuXG4vKipcbiAqIFNlbmQgcmVxdWVzdCB0byBRdWlja01vZHVsZSBlbmRwb2ludFxuICovXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0UXVpY2tNb2R1bGUoXG4gIG1vZHVsZU5hbWU6IFF1aWNrTW9kdWxlTmFtZSxcbiAgc2l0ZUlkOiBudW1iZXIsXG4gIHF1ZXJ5OiBzdHJpbmdcbik6IFByb21pc2U8dW5rbm93bj4ge1xuICBjb25zdCB1cmwgPSBgaHR0cHM6Ly93d3cud2lraWRvdC5jb20vcXVpY2ttb2R1bGUucGhwP21vZHVsZT0ke21vZHVsZU5hbWV9JnM9JHtzaXRlSWR9JnE9JHtlbmNvZGVVUklDb21wb25lbnQocXVlcnkpfWA7XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaFdpdGhSZXRyeSh1cmwsIERFRkFVTFRfQU1DX0NPTkZJRywge1xuICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgaGVhZGVyczoge1xuICAgICAgQWNjZXB0OiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgfSxcbiAgICBjaGVja09rOiBmYWxzZSwgLy8gSGFuZGxlIEhUVFAgZXJyb3JzIG1hbnVhbGx5XG4gIH0pO1xuXG4gIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDUwMCkge1xuICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihgU2l0ZSBub3QgZm91bmQ6IHNpdGVJZD0ke3NpdGVJZH1gKTtcbiAgfVxuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEVycm9yKGBRdWlja01vZHVsZSByZXF1ZXN0IGZhaWxlZDogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gIH1cblxuICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xufVxuXG4vKipcbiAqIFNlYXJjaCBzaXRlIG1lbWJlcnNcbiAqIEBwYXJhbSBzaXRlSWQgLSBTaXRlIElEXG4gKiBAcGFyYW0gcXVlcnkgLSBTZWFyY2ggcXVlcnkgKHBhcnRpYWwgdXNlcm5hbWUpXG4gKiBAcmV0dXJucyBMaXN0IG9mIG1hdGNoaW5nIHVzZXJzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZW1iZXJMb29rdXAoc2l0ZUlkOiBudW1iZXIsIHF1ZXJ5OiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8UU1DVXNlcltdPiB7XG4gIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcXVlc3RRdWlja01vZHVsZSgnTWVtYmVyTG9va3VwUU1vZHVsZScsIHNpdGVJZCwgcXVlcnkpO1xuICAgICAgY29uc3QgcGFyc2VkID0gcXVpY2tNb2R1bGVVc2VyUmVzcG9uc2VTY2hlbWEucGFyc2UoZGF0YSk7XG5cbiAgICAgIGlmIChwYXJzZWQudXNlcnMgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHBhcnNlZC51c2Vycy5tYXAoKHVzZXIpID0+ICh7XG4gICAgICAgIGlkOiB0eXBlb2YgdXNlci51c2VyX2lkID09PSAnc3RyaW5nJyA/IE51bWJlci5wYXJzZUludCh1c2VyLnVzZXJfaWQsIDEwKSA6IHVzZXIudXNlcl9pZCxcbiAgICAgICAgbmFtZTogdXNlci5uYW1lLFxuICAgICAgfSkpO1xuICAgIH0pKCksXG4gICAgKGVycm9yKSA9PiB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb3RGb3VuZEV4Y2VwdGlvbikgcmV0dXJuIGVycm9yO1xuICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYE1lbWJlciBsb29rdXAgZmFpbGVkOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgfVxuICApO1xufVxuXG4vKipcbiAqIFNlYXJjaCB1c2VycyBhY3Jvc3MgYWxsIFdpa2lkb3RcbiAqIEBwYXJhbSBzaXRlSWQgLSBTaXRlIElEIChhbnkgc2l0ZSBJRCB3b3JrcylcbiAqIEBwYXJhbSBxdWVyeSAtIFNlYXJjaCBxdWVyeSAocGFydGlhbCB1c2VybmFtZSlcbiAqIEByZXR1cm5zIExpc3Qgb2YgbWF0Y2hpbmcgdXNlcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZXJMb29rdXAoc2l0ZUlkOiBudW1iZXIsIHF1ZXJ5OiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8UU1DVXNlcltdPiB7XG4gIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcXVlc3RRdWlja01vZHVsZSgnVXNlckxvb2t1cFFNb2R1bGUnLCBzaXRlSWQsIHF1ZXJ5KTtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHF1aWNrTW9kdWxlVXNlclJlc3BvbnNlU2NoZW1hLnBhcnNlKGRhdGEpO1xuXG4gICAgICBpZiAocGFyc2VkLnVzZXJzID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXJzZWQudXNlcnMubWFwKCh1c2VyKSA9PiAoe1xuICAgICAgICBpZDogdHlwZW9mIHVzZXIudXNlcl9pZCA9PT0gJ3N0cmluZycgPyBOdW1iZXIucGFyc2VJbnQodXNlci51c2VyX2lkLCAxMCkgOiB1c2VyLnVzZXJfaWQsXG4gICAgICAgIG5hbWU6IHVzZXIubmFtZSxcbiAgICAgIH0pKTtcbiAgICB9KSgpLFxuICAgIChlcnJvcikgPT4ge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm90Rm91bmRFeGNlcHRpb24pIHJldHVybiBlcnJvcjtcbiAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBVc2VyIGxvb2t1cCBmYWlsZWQ6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICB9XG4gICk7XG59XG5cbi8qKlxuICogU2VhcmNoIHBhZ2VzIHdpdGhpbiBzaXRlXG4gKiBAcGFyYW0gc2l0ZUlkIC0gU2l0ZSBJRFxuICogQHBhcmFtIHF1ZXJ5IC0gU2VhcmNoIHF1ZXJ5IChwYXJ0aWFsIHBhZ2UgbmFtZSlcbiAqIEByZXR1cm5zIExpc3Qgb2YgbWF0Y2hpbmcgcGFnZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhZ2VMb29rdXAoc2l0ZUlkOiBudW1iZXIsIHF1ZXJ5OiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8UU1DUGFnZVtdPiB7XG4gIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcXVlc3RRdWlja01vZHVsZSgnUGFnZUxvb2t1cFFNb2R1bGUnLCBzaXRlSWQsIHF1ZXJ5KTtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHF1aWNrTW9kdWxlUGFnZVJlc3BvbnNlU2NoZW1hLnBhcnNlKGRhdGEpO1xuXG4gICAgICBpZiAocGFyc2VkLnBhZ2VzID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXJzZWQucGFnZXMubWFwKChwYWdlKSA9PiAoe1xuICAgICAgICB0aXRsZTogcGFnZS50aXRsZSxcbiAgICAgICAgdW5peE5hbWU6IHBhZ2UudW5peF9uYW1lLFxuICAgICAgfSkpO1xuICAgIH0pKCksXG4gICAgKGVycm9yKSA9PiB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb3RGb3VuZEV4Y2VwdGlvbikgcmV0dXJuIGVycm9yO1xuICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYFBhZ2UgbG9va3VwIGZhaWxlZDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgIH1cbiAgKTtcbn1cblxuLyoqXG4gKiBRdWlja01vZHVsZSBBUEkgKG1haW50YWluZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5KVxuICogQGRlcHJlY2F0ZWQgVXNlIGluZGl2aWR1YWwgZnVuY3Rpb25zIChtZW1iZXJMb29rdXAsIHVzZXJMb29rdXAsIHBhZ2VMb29rdXApIGluc3RlYWRcbiAqL1xuZXhwb3J0IGNvbnN0IFF1aWNrTW9kdWxlOiB7XG4gIG1lbWJlckxvb2t1cDogdHlwZW9mIG1lbWJlckxvb2t1cDtcbiAgdXNlckxvb2t1cDogdHlwZW9mIHVzZXJMb29rdXA7XG4gIHBhZ2VMb29rdXA6IHR5cGVvZiBwYWdlTG9va3VwO1xufSA9IHtcbiAgbWVtYmVyTG9va3VwOiBtZW1iZXJMb29rdXAsXG4gIHVzZXJMb29rdXA6IHVzZXJMb29rdXAsXG4gIHBhZ2VMb29rdXA6IHBhZ2VMb29rdXAsXG59O1xuIiwKICAgICJpbXBvcnQgKiBhcyBjaGVlcmlvIGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0IHsgUmVxdWlyZUxvZ2luIH0gZnJvbSAnLi4vLi4vY29tbW9uL2RlY29yYXRvcnMnO1xuaW1wb3J0IHtcbiAgRm9yYmlkZGVuRXJyb3IsXG4gIExvZ2luUmVxdWlyZWRFcnJvcixcbiAgTm90Rm91bmRFeGNlcHRpb24sXG4gIFVuZXhwZWN0ZWRFcnJvcixcbiAgV2lraWRvdFN0YXR1c0Vycm9yLFxufSBmcm9tICcuLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyBwYXJzZVVzZXIgfSBmcm9tICcuLi8uLi91dGlsL3BhcnNlcic7XG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0VXNlciB9IGZyb20gJy4uL3VzZXInO1xuaW1wb3J0IHR5cGUgeyBTaXRlIH0gZnJvbSAnLi9zaXRlJztcblxuLyoqXG4gKiBTaXRlIG1lbWJlcnNoaXAgYXBwbGljYXRpb24gZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpdGVBcHBsaWNhdGlvbkRhdGEge1xuICBzaXRlOiBTaXRlO1xuICB1c2VyOiBBYnN0cmFjdFVzZXI7XG4gIHRleHQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBTaXRlIG1lbWJlcnNoaXAgYXBwbGljYXRpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFNpdGVBcHBsaWNhdGlvbiB7XG4gIHB1YmxpYyByZWFkb25seSBzaXRlOiBTaXRlO1xuICBwdWJsaWMgcmVhZG9ubHkgdXNlcjogQWJzdHJhY3RVc2VyO1xuICBwdWJsaWMgcmVhZG9ubHkgdGV4dDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IFNpdGVBcHBsaWNhdGlvbkRhdGEpIHtcbiAgICB0aGlzLnNpdGUgPSBkYXRhLnNpdGU7XG4gICAgdGhpcy51c2VyID0gZGF0YS51c2VyO1xuICAgIHRoaXMudGV4dCA9IGRhdGEudGV4dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHBlbmRpbmcgbWVtYmVyc2hpcCBhcHBsaWNhdGlvbnNcbiAgICogQHBhcmFtIHNpdGUgLSBUYXJnZXQgc2l0ZVxuICAgKi9cbiAgc3RhdGljIGFjcXVpcmVBbGwoc2l0ZTogU2l0ZSk6IFdpa2lkb3RSZXN1bHRBc3luYzxTaXRlQXBwbGljYXRpb25bXT4ge1xuICAgIGNvbnN0IGxvZ2luUmVzdWx0ID0gc2l0ZS5jbGllbnQucmVxdWlyZUxvZ2luKCk7XG4gICAgaWYgKGxvZ2luUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgICAgUHJvbWlzZS5yZWplY3QobG9naW5SZXN1bHQuZXJyb3IpLFxuICAgICAgICAoKSA9PiBuZXcgTG9naW5SZXF1aXJlZEVycm9yKCdMb2dpbiByZXF1aXJlZCB0byBnZXQgYXBwbGljYXRpb25zJylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7IG1vZHVsZU5hbWU6ICdtYW5hZ2VzaXRlL01hbmFnZVNpdGVNZW1iZXJzQXBwbGljYXRpb25zTW9kdWxlJyB9LFxuICAgICAgICBdKTtcblxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoJ0VtcHR5IHJlc3BvbnNlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBodG1sID0gU3RyaW5nKHJlc3BvbnNlLmJvZHkgPz8gJycpO1xuXG4gICAgICAgIC8vIFBlcm1pc3Npb24gY2hlY2tcbiAgICAgICAgaWYgKGh0bWwuaW5jbHVkZXMoJ1dJS0lET1QucGFnZS5saXN0ZW5lcnMubG9naW5DbGljayhldmVudCknKSkge1xuICAgICAgICAgIHRocm93IG5ldyBGb3JiaWRkZW5FcnJvcignWW91IGFyZSBub3QgYWxsb3dlZCB0byBhY2Nlc3MgdGhpcyBwYWdlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGh0bWwpO1xuICAgICAgICBjb25zdCBhcHBsaWNhdGlvbnM6IFNpdGVBcHBsaWNhdGlvbltdID0gW107XG5cbiAgICAgICAgY29uc3QgdXNlckVsZW1lbnRzID0gJCgnaDMgc3Bhbi5wcmludHVzZXInKS50b0FycmF5KCk7XG4gICAgICAgIGNvbnN0IHRleHRXcmFwcGVyRWxlbWVudHMgPSAkKCd0YWJsZScpLnRvQXJyYXkoKTtcblxuICAgICAgICBpZiAodXNlckVsZW1lbnRzLmxlbmd0aCAhPT0gdGV4dFdyYXBwZXJFbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEVycm9yKFxuICAgICAgICAgICAgJ0xlbmd0aCBvZiB1c2VyX2VsZW1lbnRzIGFuZCB0ZXh0X3dyYXBwZXJfZWxlbWVudHMgYXJlIGRpZmZlcmVudCdcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1c2VyRWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCB1c2VyRWxlbWVudCA9IHVzZXJFbGVtZW50c1tpXTtcbiAgICAgICAgICBjb25zdCB0ZXh0V3JhcHBlckVsZW1lbnQgPSB0ZXh0V3JhcHBlckVsZW1lbnRzW2ldO1xuXG4gICAgICAgICAgaWYgKCF1c2VyRWxlbWVudCB8fCAhdGV4dFdyYXBwZXJFbGVtZW50KSBjb250aW51ZTtcblxuICAgICAgICAgIGNvbnN0IHVzZXIgPSBwYXJzZVVzZXIoc2l0ZS5jbGllbnQsICQodXNlckVsZW1lbnQpKTtcbiAgICAgICAgICBjb25zdCB0ZXh0RWxlbWVudCA9ICQodGV4dFdyYXBwZXJFbGVtZW50KS5maW5kKCd0ZCcpLmVxKDEpO1xuICAgICAgICAgIGNvbnN0IHRleHQgPSB0ZXh0RWxlbWVudC50ZXh0KCkudHJpbSgpO1xuXG4gICAgICAgICAgYXBwbGljYXRpb25zLnB1c2gobmV3IFNpdGVBcHBsaWNhdGlvbih7IHNpdGUsIHVzZXIsIHRleHQgfSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFwcGxpY2F0aW9ucztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRm9yYmlkZGVuRXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBMb2dpblJlcXVpcmVkRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgYXBwbGljYXRpb25zOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gcHJvY2VzcyBhcHBsaWNhdGlvblxuICAgKi9cbiAgQFJlcXVpcmVMb2dpblxuICBwcml2YXRlIHByb2Nlc3MoYWN0aW9uOiAnYWNjZXB0JyB8ICdkZWNsaW5lJyk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ01hbmFnZVNpdGVNZW1iZXJzaGlwQWN0aW9uJyxcbiAgICAgICAgICAgIGV2ZW50OiAnYWNjZXB0QXBwbGljYXRpb24nLFxuICAgICAgICAgICAgdXNlcl9pZDogdGhpcy51c2VyLmlkLFxuICAgICAgICAgICAgdGV4dDogYHlvdXIgYXBwbGljYXRpb24gaGFzIGJlZW4gJHthY3Rpb259ZWRgLFxuICAgICAgICAgICAgdHlwZTogYWN0aW9uLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgY29uc3QgZXJyb3IgPSByZXN1bHQuZXJyb3I7XG4gICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgV2lraWRvdFN0YXR1c0Vycm9yICYmIGVycm9yLnN0YXR1c0NvZGUgPT09ICdub19hcHBsaWNhdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihgQXBwbGljYXRpb24gbm90IGZvdW5kOiAke3RoaXMudXNlci5uYW1lfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb3RGb3VuZEV4Y2VwdGlvbiB8fCBlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIHByb2Nlc3MgYXBwbGljYXRpb246ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjY2VwdCBtZW1iZXJzaGlwIGFwcGxpY2F0aW9uXG4gICAqL1xuICBhY2NlcHQoKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5wcm9jZXNzKCdhY2NlcHQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNsaW5lIG1lbWJlcnNoaXAgYXBwbGljYXRpb25cbiAgICovXG4gIGRlY2xpbmUoKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5wcm9jZXNzKCdkZWNsaW5lJyk7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgU2l0ZUFwcGxpY2F0aW9uKHVzZXI9JHt0aGlzLnVzZXIubmFtZX0sIHNpdGU9JHt0aGlzLnNpdGUudW5peE5hbWV9LCB0ZXh0PSR7dGhpcy50ZXh0fSlgO1xuICB9XG59XG4iLAogICAgImltcG9ydCAqIGFzIGNoZWVyaW8gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQgeyBSZXF1aXJlTG9naW4gfSBmcm9tICcuLi8uLi9jb21tb24vZGVjb3JhdG9ycyc7XG5pbXBvcnQge1xuICBMb2dpblJlcXVpcmVkRXJyb3IsXG4gIFRhcmdldEVycm9yLFxuICBVbmV4cGVjdGVkRXJyb3IsXG4gIFdpa2lkb3RTdGF0dXNFcnJvcixcbn0gZnJvbSAnLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgcGFyc2VPZGF0ZSwgcGFyc2VVc2VyIH0gZnJvbSAnLi4vLi4vdXRpbC9wYXJzZXInO1xuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdFVzZXIgfSBmcm9tICcuLi91c2VyJztcbmltcG9ydCB0eXBlIHsgU2l0ZSB9IGZyb20gJy4vc2l0ZSc7XG5cbi8qKlxuICogU2l0ZSBtZW1iZXIgZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpdGVNZW1iZXJEYXRhIHtcbiAgc2l0ZTogU2l0ZTtcbiAgdXNlcjogQWJzdHJhY3RVc2VyO1xuICBqb2luZWRBdDogRGF0ZSB8IG51bGw7XG59XG5cbi8qKlxuICogU2l0ZSBtZW1iZXJcbiAqL1xuZXhwb3J0IGNsYXNzIFNpdGVNZW1iZXIge1xuICBwdWJsaWMgcmVhZG9ubHkgc2l0ZTogU2l0ZTtcbiAgcHVibGljIHJlYWRvbmx5IHVzZXI6IEFic3RyYWN0VXNlcjtcbiAgcHVibGljIHJlYWRvbmx5IGpvaW5lZEF0OiBEYXRlIHwgbnVsbDtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBTaXRlTWVtYmVyRGF0YSkge1xuICAgIHRoaXMuc2l0ZSA9IGRhdGEuc2l0ZTtcbiAgICB0aGlzLnVzZXIgPSBkYXRhLnVzZXI7XG4gICAgdGhpcy5qb2luZWRBdCA9IGRhdGEuam9pbmVkQXQ7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgbWVtYmVyIGluZm9ybWF0aW9uIGZyb20gSFRNTFxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcGFyc2Uoc2l0ZTogU2l0ZSwgaHRtbDogc3RyaW5nKTogU2l0ZU1lbWJlcltdIHtcbiAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGh0bWwpO1xuICAgIGNvbnN0IG1lbWJlcnM6IFNpdGVNZW1iZXJbXSA9IFtdO1xuXG4gICAgJCgndGFibGUgdHInKS5lYWNoKChfaSwgcm93KSA9PiB7XG4gICAgICBjb25zdCB0ZHMgPSAkKHJvdykuZmluZCgndGQnKTtcbiAgICAgIGNvbnN0IHVzZXJFbGVtID0gJCh0ZHNbMF0pLmZpbmQoJy5wcmludHVzZXInKTtcblxuICAgICAgaWYgKHVzZXJFbGVtLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHVzZXIgPSBwYXJzZVVzZXIoc2l0ZS5jbGllbnQsIHVzZXJFbGVtKTtcblxuICAgICAgLy8gU2Vjb25kIHRkIGNvbnRhaW5zIGpvaW4gZGF0ZSBpZiBleGlzdHNcbiAgICAgIGxldCBqb2luZWRBdDogRGF0ZSB8IG51bGwgPSBudWxsO1xuICAgICAgaWYgKHRkcy5sZW5ndGggPj0gMikge1xuICAgICAgICBjb25zdCBvZGF0ZUVsZW0gPSAkKHRkc1sxXSkuZmluZCgnLm9kYXRlJyk7XG4gICAgICAgIGlmIChvZGF0ZUVsZW0ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGpvaW5lZEF0ID0gcGFyc2VPZGF0ZShvZGF0ZUVsZW0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG1lbWJlcnMucHVzaChuZXcgU2l0ZU1lbWJlcih7IHNpdGUsIHVzZXIsIGpvaW5lZEF0IH0pKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBtZW1iZXJzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzaXRlIG1lbWJlciBsaXN0XG4gICAqIEBwYXJhbSBzaXRlIC0gVGFyZ2V0IHNpdGVcbiAgICogQHBhcmFtIGdyb3VwIC0gR3JvdXAgKFwiYWRtaW5zXCIsIFwibW9kZXJhdG9yc1wiLCBvciBlbXB0eSBzdHJpbmcgZm9yIGFsbCBtZW1iZXJzKVxuICAgKi9cbiAgc3RhdGljIGdldE1lbWJlcnMoXG4gICAgc2l0ZTogU2l0ZSxcbiAgICBncm91cDogJ2FkbWlucycgfCAnbW9kZXJhdG9ycycgfCAnJyA9ICcnXG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzxTaXRlTWVtYmVyW10+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBtZW1iZXJzOiBTaXRlTWVtYmVyW10gPSBbXTtcblxuICAgICAgICAvLyBHZXQgZmlyc3QgcGFnZVxuICAgICAgICBjb25zdCBmaXJzdFJlc3VsdCA9IGF3YWl0IHNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ21lbWJlcnNoaXAvTWVtYmVyc0xpc3RNb2R1bGUnLFxuICAgICAgICAgICAgcGFnZTogMSxcbiAgICAgICAgICAgIGdyb3VwLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChmaXJzdFJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgZmlyc3RSZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaXJzdFJlc3BvbnNlID0gZmlyc3RSZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghZmlyc3RSZXNwb25zZSkge1xuICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoJ0VtcHR5IHJlc3BvbnNlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaXJzdEh0bWwgPSBTdHJpbmcoZmlyc3RSZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgbWVtYmVycy5wdXNoKC4uLlNpdGVNZW1iZXIucGFyc2Uoc2l0ZSwgZmlyc3RIdG1sKSk7XG5cbiAgICAgICAgLy8gQ2hlY2sgcGFnZXJcbiAgICAgICAgY29uc3QgJGZpcnN0ID0gY2hlZXJpby5sb2FkKGZpcnN0SHRtbCk7XG4gICAgICAgIGNvbnN0IHBhZ2VyTGlua3MgPSAkZmlyc3QoJ2Rpdi5wYWdlciBhJyk7XG4gICAgICAgIGlmIChwYWdlckxpbmtzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICByZXR1cm4gbWVtYmVycztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxhc3RQYWdlVGV4dCA9ICRmaXJzdChwYWdlckxpbmtzW3BhZ2VyTGlua3MubGVuZ3RoIC0gMl0pXG4gICAgICAgICAgLnRleHQoKVxuICAgICAgICAgIC50cmltKCk7XG4gICAgICAgIGNvbnN0IGxhc3RQYWdlID0gTnVtYmVyLnBhcnNlSW50KGxhc3RQYWdlVGV4dCwgMTApIHx8IDE7XG4gICAgICAgIGlmIChsYXN0UGFnZSA8PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIG1lbWJlcnM7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgcmVtYWluaW5nIHBhZ2VzXG4gICAgICAgIGNvbnN0IGJvZGllcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBwYWdlID0gMjsgcGFnZSA8PSBsYXN0UGFnZTsgcGFnZSsrKSB7XG4gICAgICAgICAgYm9kaWVzLnB1c2goe1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ21lbWJlcnNoaXAvTWVtYmVyc0xpc3RNb2R1bGUnLFxuICAgICAgICAgICAgcGFnZSxcbiAgICAgICAgICAgIGdyb3VwLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWRkaXRpb25hbFJlc3VsdHMgPSBhd2FpdCBzaXRlLmFtY1JlcXVlc3QoYm9kaWVzKTtcbiAgICAgICAgaWYgKGFkZGl0aW9uYWxSZXN1bHRzLmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBhZGRpdGlvbmFsUmVzdWx0cy5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgcmVzcG9uc2Ugb2YgYWRkaXRpb25hbFJlc3VsdHMudmFsdWUpIHtcbiAgICAgICAgICBjb25zdCBodG1sID0gU3RyaW5nKHJlc3BvbnNlPy5ib2R5ID8/ICcnKTtcbiAgICAgICAgICBtZW1iZXJzLnB1c2goLi4uU2l0ZU1lbWJlci5wYXJzZShzaXRlLCBodG1sKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWVtYmVycztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgbWVtYmVyczogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gY2hhbmdlIGdyb3VwXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIHByaXZhdGUgY2hhbmdlR3JvdXAoXG4gICAgZXZlbnQ6ICd0b01vZGVyYXRvcnMnIHwgJ3JlbW92ZU1vZGVyYXRvcicgfCAndG9BZG1pbnMnIHwgJ3JlbW92ZUFkbWluJ1xuICApOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhY3Rpb246ICdNYW5hZ2VTaXRlTWVtYmVyc2hpcEFjdGlvbicsXG4gICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgIHVzZXJfaWQ6IHRoaXMudXNlci5pZCxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICcnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBXaWtpZG90U3RhdHVzRXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXNDb2RlID09PSAnbm90X2FscmVhZHknKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUYXJnZXRFcnJvcihgVXNlciBpcyBub3QgbW9kZXJhdG9yL2FkbWluOiAke3RoaXMudXNlci5uYW1lfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1c0NvZGUgPT09ICdhbHJlYWR5X2FkbWluJyB8fCBlcnJvci5zdGF0dXNDb2RlID09PSAnYWxyZWFkeV9tb2RlcmF0b3InKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUYXJnZXRFcnJvcihcbiAgICAgICAgICAgICAgICBgVXNlciBpcyBhbHJlYWR5ICR7ZXJyb3Iuc3RhdHVzQ29kZS5yZXBsYWNlKCdhbHJlYWR5XycsICcnKX06ICR7dGhpcy51c2VyLm5hbWV9YFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBUYXJnZXRFcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGNoYW5nZSBtZW1iZXIgZ3JvdXA6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb21vdGUgdG8gbW9kZXJhdG9yXG4gICAqL1xuICB0b01vZGVyYXRvcigpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmNoYW5nZUdyb3VwKCd0b01vZGVyYXRvcnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgbW9kZXJhdG9yIHByaXZpbGVnZXNcbiAgICovXG4gIHJlbW92ZU1vZGVyYXRvcigpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmNoYW5nZUdyb3VwKCdyZW1vdmVNb2RlcmF0b3InKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9tb3RlIHRvIGFkbWluXG4gICAqL1xuICB0b0FkbWluKCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuY2hhbmdlR3JvdXAoJ3RvQWRtaW5zJyk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFkbWluIHByaXZpbGVnZXNcbiAgICovXG4gIHJlbW92ZUFkbWluKCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuY2hhbmdlR3JvdXAoJ3JlbW92ZUFkbWluJyk7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgU2l0ZU1lbWJlcih1c2VyPSR7dGhpcy51c2VyLm5hbWV9LCBzaXRlPSR7dGhpcy5zaXRlLnVuaXhOYW1lfSlgO1xuICB9XG59XG4iLAogICAgImltcG9ydCB7IE5vRWxlbWVudEVycm9yLCBVbmV4cGVjdGVkRXJyb3IgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyBwYXJzZVVzZXIgfSBmcm9tICcuLi8uLi8uLi91dGlsL3BhcnNlcic7XG5pbXBvcnQgeyBQYWdlLCBQYWdlQ29sbGVjdGlvbiwgU2VhcmNoUGFnZXNRdWVyeSB9IGZyb20gJy4uLy4uL3BhZ2UnO1xuaW1wb3J0IHR5cGUgeyBTaXRlIH0gZnJvbSAnLi4vc2l0ZSc7XG5cbi8qKlxuICogU2luZ2xlIHBhZ2Ugb3BlcmF0aW9ucyBhY2Nlc3NvclxuICovXG5leHBvcnQgY2xhc3MgUGFnZUFjY2Vzc29yIHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG5cbiAgY29uc3RydWN0b3Ioc2l0ZTogU2l0ZSkge1xuICAgIHRoaXMuc2l0ZSA9IHNpdGU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBhZ2UgYnkgVU5JWCBuYW1lXG4gICAqIEBwYXJhbSB1bml4TmFtZSAtIFBhZ2UgVU5JWCBuYW1lIChlLmcuLCAnc2NwLTE3MycpXG4gICAqIEByZXR1cm5zIFBhZ2UgKG51bGwgaWYgbm90IGZvdW5kKVxuICAgKi9cbiAgZ2V0KHVuaXhOYW1lOiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZSB8IG51bGw+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBxdWVyeSA9IG5ldyBTZWFyY2hQYWdlc1F1ZXJ5KHsgZnVsbG5hbWU6IHVuaXhOYW1lIH0pO1xuICAgICAgICBjb25zdCB1c2VyUGFyc2VyID0gcGFyc2VVc2VyLmJpbmQobnVsbCwgdGhpcy5zaXRlLmNsaWVudCk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUGFnZUNvbGxlY3Rpb24uc2VhcmNoUGFnZXModGhpcy5zaXRlLCB1c2VyUGFyc2VyLCBxdWVyeSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQudmFsdWUubGVuZ3RoID4gMCA/IChyZXN1bHQudmFsdWVbMF0gPz8gbnVsbCkgOiBudWxsO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCBwYWdlOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBwYWdlXG4gICAqIEBwYXJhbSBmdWxsbmFtZSAtIFBhZ2UgZnVsbG5hbWUgKGUuZy4sICdzY3AtMTczJylcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBDcmVhdGlvbiBvcHRpb25zXG4gICAqIEByZXR1cm5zIHZvaWRcbiAgICovXG4gIGNyZWF0ZShcbiAgICBmdWxsbmFtZTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIHRpdGxlPzogc3RyaW5nO1xuICAgICAgc291cmNlPzogc3RyaW5nO1xuICAgICAgY29tbWVudD86IHN0cmluZztcbiAgICAgIGZvcmNlRWRpdD86IGJvb2xlYW47XG4gICAgfSA9IHt9XG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIFBhZ2VDb2xsZWN0aW9uLmNyZWF0ZU9yRWRpdCh0aGlzLnNpdGUsIGZ1bGxuYW1lLCB7XG4gICAgICB0aXRsZTogb3B0aW9ucy50aXRsZSxcbiAgICAgIHNvdXJjZTogb3B0aW9ucy5zb3VyY2UsXG4gICAgICBjb21tZW50OiBvcHRpb25zLmNvbW1lbnQsXG4gICAgICBmb3JjZUVkaXQ6IG9wdGlvbnMuZm9yY2VFZGl0LFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCB7IFBhZ2UgfTtcbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBDaGVlcmlvIH0gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQgKiBhcyBjaGVlcmlvIGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0IHR5cGUgeyBBbnlOb2RlIH0gZnJvbSAnZG9taGFuZGxlcic7XG5pbXBvcnQgcExpbWl0IGZyb20gJ3AtbGltaXQnO1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5pbXBvcnQgeyBSZXF1aXJlTG9naW4gfSBmcm9tICcuLi8uLi9jb21tb24vZGVjb3JhdG9ycyc7XG5pbXBvcnQge1xuICBGb3JiaWRkZW5FcnJvcixcbiAgTG9naW5SZXF1aXJlZEVycm9yLFxuICBOb0VsZW1lbnRFcnJvcixcbiAgTm90Rm91bmRFeGNlcHRpb24sXG4gIFRhcmdldEV4aXN0c0Vycm9yLFxuICBVbmV4cGVjdGVkRXJyb3IsXG59IGZyb20gJy4uLy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgQU1DUmVxdWVzdEJvZHkgfSBmcm9tICcuLi8uLi9jb25uZWN0b3InO1xuaW1wb3J0IHsgZmV0Y2hXaXRoUmV0cnkgfSBmcm9tICcuLi8uLi91dGlsL2h0dHAnO1xuaW1wb3J0IHsgcGFyc2VPZGF0ZSwgcGFyc2VVc2VyIH0gZnJvbSAnLi4vLi4vdXRpbC9wYXJzZXInO1xuaW1wb3J0IHR5cGUgeyBTaXRlIH0gZnJvbSAnLi4vc2l0ZSc7XG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0VXNlciB9IGZyb20gJy4uL3VzZXInO1xuaW1wb3J0IHsgUGFnZUZpbGVDb2xsZWN0aW9uIH0gZnJvbSAnLi9wYWdlLWZpbGUnO1xuaW1wb3J0IHsgUGFnZU1ldGFDb2xsZWN0aW9uIH0gZnJvbSAnLi9wYWdlLW1ldGEnO1xuaW1wb3J0IHsgUGFnZVJldmlzaW9uLCBQYWdlUmV2aXNpb25Db2xsZWN0aW9uIH0gZnJvbSAnLi9wYWdlLXJldmlzaW9uJztcbmltcG9ydCB7IFBhZ2VTb3VyY2UgfSBmcm9tICcuL3BhZ2Utc291cmNlJztcbmltcG9ydCB7IFBhZ2VWb3RlLCBQYWdlVm90ZUNvbGxlY3Rpb24gfSBmcm9tICcuL3BhZ2Utdm90ZSc7XG5pbXBvcnQgeyBERUZBVUxUX01PRFVMRV9CT0RZLCBERUZBVUxUX1BFUl9QQUdFLCBTZWFyY2hQYWdlc1F1ZXJ5IH0gZnJvbSAnLi9zZWFyY2gtcXVlcnknO1xuXG4vKipcbiAqIFNjaGVtYSBmb3IgTGlzdFBhZ2VzTW9kdWxlIHBhcnNlIHJlc3VsdFxuICogVXNlcyBab2QgZm9yIHR5cGUtc2FmZSB2YWxpZGF0aW9uIG9mIHBhcnNlIHJlc3VsdHNcbiAqL1xuY29uc3QgcGFnZVBhcmFtc1NjaGVtYSA9IHoub2JqZWN0KHtcbiAgZnVsbG5hbWU6IHoucHJlcHJvY2VzcygodikgPT4gdiA/PyAnJywgei5zdHJpbmcoKSksXG4gIG5hbWU6IHoucHJlcHJvY2VzcygodikgPT4gdiA/PyAnJywgei5zdHJpbmcoKSksXG4gIGNhdGVnb3J5OiB6LnByZXByb2Nlc3MoKHYpID0+IHYgPz8gJycsIHouc3RyaW5nKCkpLFxuICB0aXRsZTogei5wcmVwcm9jZXNzKCh2KSA9PiB2ID8/ICcnLCB6LnN0cmluZygpKSxcbiAgY2hpbGRyZW5fY291bnQ6IHouY29lcmNlLm51bWJlcigpLmRlZmF1bHQoMCksXG4gIGNvbW1lbnRzX2NvdW50OiB6LmNvZXJjZS5udW1iZXIoKS5kZWZhdWx0KDApLFxuICBzaXplOiB6LmNvZXJjZS5udW1iZXIoKS5kZWZhdWx0KDApLFxuICByYXRpbmc6IHouY29lcmNlLm51bWJlcigpLmRlZmF1bHQoMCksXG4gIHZvdGVzX2NvdW50OiB6LmNvZXJjZS5udW1iZXIoKS5kZWZhdWx0KDApLFxuICByYXRpbmdfcGVyY2VudDogei5jb2VyY2UubnVtYmVyKCkubnVsbGFibGUoKS5kZWZhdWx0KG51bGwpLFxuICByZXZpc2lvbnNfY291bnQ6IHouY29lcmNlLm51bWJlcigpLmRlZmF1bHQoMCksXG4gIHBhcmVudF9mdWxsbmFtZTogei5zdHJpbmcoKS5udWxsYWJsZSgpLmRlZmF1bHQobnVsbCksXG4gIHRhZ3M6IHouYXJyYXkoei5zdHJpbmcoKSkuZGVmYXVsdChbXSksXG4gIGNyZWF0ZWRfYnk6IHouY3VzdG9tPEFic3RyYWN0VXNlcj4oKS5udWxsYWJsZSgpLmRlZmF1bHQobnVsbCksXG4gIGNyZWF0ZWRfYXQ6IHouZGF0ZSgpLm51bGxhYmxlKCkuZGVmYXVsdChudWxsKSxcbiAgdXBkYXRlZF9ieTogei5jdXN0b208QWJzdHJhY3RVc2VyPigpLm51bGxhYmxlKCkuZGVmYXVsdChudWxsKSxcbiAgdXBkYXRlZF9hdDogei5kYXRlKCkubnVsbGFibGUoKS5kZWZhdWx0KG51bGwpLFxuICBjb21tZW50ZWRfYnk6IHouY3VzdG9tPEFic3RyYWN0VXNlcj4oKS5udWxsYWJsZSgpLmRlZmF1bHQobnVsbCksXG4gIGNvbW1lbnRlZF9hdDogei5kYXRlKCkubnVsbGFibGUoKS5kZWZhdWx0KG51bGwpLFxufSk7XG5cbi8qKlxuICogUGFnZSBkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFnZURhdGEge1xuICBzaXRlOiBTaXRlO1xuICBmdWxsbmFtZTogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGNhdGVnb3J5OiBzdHJpbmc7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGNoaWxkcmVuQ291bnQ6IG51bWJlcjtcbiAgY29tbWVudHNDb3VudDogbnVtYmVyO1xuICBzaXplOiBudW1iZXI7XG4gIHJhdGluZzogbnVtYmVyO1xuICB2b3Rlc0NvdW50OiBudW1iZXI7XG4gIHJhdGluZ1BlcmNlbnQ6IG51bWJlciB8IG51bGw7XG4gIHJldmlzaW9uc0NvdW50OiBudW1iZXI7XG4gIHBhcmVudEZ1bGxuYW1lOiBzdHJpbmcgfCBudWxsO1xuICB0YWdzOiBzdHJpbmdbXTtcbiAgY3JlYXRlZEJ5OiBBYnN0cmFjdFVzZXIgfCBudWxsO1xuICBjcmVhdGVkQXQ6IERhdGU7XG4gIHVwZGF0ZWRCeTogQWJzdHJhY3RVc2VyIHwgbnVsbDtcbiAgdXBkYXRlZEF0OiBEYXRlO1xuICBjb21tZW50ZWRCeTogQWJzdHJhY3RVc2VyIHwgbnVsbDtcbiAgY29tbWVudGVkQXQ6IERhdGUgfCBudWxsO1xufVxuXG4vKipcbiAqIFdpa2lkb3QgcGFnZVxuICovXG5leHBvcnQgY2xhc3MgUGFnZSB7XG4gIHB1YmxpYyByZWFkb25seSBzaXRlOiBTaXRlO1xuICBwdWJsaWMgcmVhZG9ubHkgZnVsbG5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGNhdGVnb3J5OiBzdHJpbmc7XG4gIHB1YmxpYyB0aXRsZTogc3RyaW5nO1xuICBwdWJsaWMgY2hpbGRyZW5Db3VudDogbnVtYmVyO1xuICBwdWJsaWMgY29tbWVudHNDb3VudDogbnVtYmVyO1xuICBwdWJsaWMgc2l6ZTogbnVtYmVyO1xuICBwdWJsaWMgcmF0aW5nOiBudW1iZXI7XG4gIHB1YmxpYyB2b3Rlc0NvdW50OiBudW1iZXI7XG4gIHB1YmxpYyByYXRpbmdQZXJjZW50OiBudW1iZXIgfCBudWxsO1xuICBwdWJsaWMgcmV2aXNpb25zQ291bnQ6IG51bWJlcjtcbiAgcHVibGljIHBhcmVudEZ1bGxuYW1lOiBzdHJpbmcgfCBudWxsO1xuICBwdWJsaWMgdGFnczogc3RyaW5nW107XG4gIHB1YmxpYyByZWFkb25seSBjcmVhdGVkQnk6IEFic3RyYWN0VXNlciB8IG51bGw7XG4gIHB1YmxpYyByZWFkb25seSBjcmVhdGVkQXQ6IERhdGU7XG4gIHB1YmxpYyB1cGRhdGVkQnk6IEFic3RyYWN0VXNlciB8IG51bGw7XG4gIHB1YmxpYyB1cGRhdGVkQXQ6IERhdGU7XG4gIHB1YmxpYyBjb21tZW50ZWRCeTogQWJzdHJhY3RVc2VyIHwgbnVsbDtcbiAgcHVibGljIGNvbW1lbnRlZEF0OiBEYXRlIHwgbnVsbDtcblxuICBwcml2YXRlIF9pZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX3NvdXJjZTogUGFnZVNvdXJjZSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9yZXZpc2lvbnM6IFBhZ2VSZXZpc2lvbkNvbGxlY3Rpb24gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfdm90ZXM6IFBhZ2VWb3RlQ29sbGVjdGlvbiB8IG51bGwgPSBudWxsO1xuICBfZmlsZXM6IFBhZ2VGaWxlQ29sbGVjdGlvbiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IFBhZ2VEYXRhKSB7XG4gICAgdGhpcy5zaXRlID0gZGF0YS5zaXRlO1xuICAgIHRoaXMuZnVsbG5hbWUgPSBkYXRhLmZ1bGxuYW1lO1xuICAgIHRoaXMubmFtZSA9IGRhdGEubmFtZTtcbiAgICB0aGlzLmNhdGVnb3J5ID0gZGF0YS5jYXRlZ29yeTtcbiAgICB0aGlzLnRpdGxlID0gZGF0YS50aXRsZTtcbiAgICB0aGlzLmNoaWxkcmVuQ291bnQgPSBkYXRhLmNoaWxkcmVuQ291bnQ7XG4gICAgdGhpcy5jb21tZW50c0NvdW50ID0gZGF0YS5jb21tZW50c0NvdW50O1xuICAgIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbiAgICB0aGlzLnJhdGluZyA9IGRhdGEucmF0aW5nO1xuICAgIHRoaXMudm90ZXNDb3VudCA9IGRhdGEudm90ZXNDb3VudDtcbiAgICB0aGlzLnJhdGluZ1BlcmNlbnQgPSBkYXRhLnJhdGluZ1BlcmNlbnQ7XG4gICAgdGhpcy5yZXZpc2lvbnNDb3VudCA9IGRhdGEucmV2aXNpb25zQ291bnQ7XG4gICAgdGhpcy5wYXJlbnRGdWxsbmFtZSA9IGRhdGEucGFyZW50RnVsbG5hbWU7XG4gICAgdGhpcy50YWdzID0gZGF0YS50YWdzO1xuICAgIHRoaXMuY3JlYXRlZEJ5ID0gZGF0YS5jcmVhdGVkQnk7XG4gICAgdGhpcy5jcmVhdGVkQXQgPSBkYXRhLmNyZWF0ZWRBdDtcbiAgICB0aGlzLnVwZGF0ZWRCeSA9IGRhdGEudXBkYXRlZEJ5O1xuICAgIHRoaXMudXBkYXRlZEF0ID0gZGF0YS51cGRhdGVkQXQ7XG4gICAgdGhpcy5jb21tZW50ZWRCeSA9IGRhdGEuY29tbWVudGVkQnk7XG4gICAgdGhpcy5jb21tZW50ZWRBdCA9IGRhdGEuY29tbWVudGVkQXQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBhZ2UgVVJMXG4gICAqL1xuICBnZXRVcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5zaXRlLmdldEJhc2VVcmwoKX0vJHt0aGlzLmZ1bGxuYW1lfWA7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBwYWdlIElEIGhhcyBiZWVuIGFjcXVpcmVkXG4gICAqL1xuICBpc0lkQWNxdWlyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lkICE9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBwYWdlIElEXG4gICAqL1xuICBnZXQgaWQoKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2lkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBwYWdlIElEXG4gICAqL1xuICBzZXQgaWQodmFsdWU6IG51bWJlciB8IG51bGwpIHtcbiAgICB0aGlzLl9pZCA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzb3VyY2UgY29kZVxuICAgKi9cbiAgZ2V0IHNvdXJjZSgpOiBQYWdlU291cmNlIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3NvdXJjZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgc291cmNlIGNvZGVcbiAgICovXG4gIHNldCBzb3VyY2UodmFsdWU6IFBhZ2VTb3VyY2UgfCBudWxsKSB7XG4gICAgdGhpcy5fc291cmNlID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHJldmlzaW9uIGhpc3RvcnlcbiAgICovXG4gIGdldCByZXZpc2lvbnMoKTogUGFnZVJldmlzaW9uQ29sbGVjdGlvbiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9yZXZpc2lvbnM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHJldmlzaW9uIGhpc3RvcnlcbiAgICovXG4gIHNldCByZXZpc2lvbnModmFsdWU6IFBhZ2VSZXZpc2lvbkNvbGxlY3Rpb24gfCBudWxsKSB7XG4gICAgdGhpcy5fcmV2aXNpb25zID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHZvdGUgaW5mb3JtYXRpb25cbiAgICovXG4gIGdldCB2b3RlcygpOiBQYWdlVm90ZUNvbGxlY3Rpb24gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fdm90ZXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHZvdGUgaW5mb3JtYXRpb25cbiAgICovXG4gIHNldCB2b3Rlcyh2YWx1ZTogUGFnZVZvdGVDb2xsZWN0aW9uIHwgbnVsbCkge1xuICAgIHRoaXMuX3ZvdGVzID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxhdGVzdCByZXZpc2lvblxuICAgKi9cbiAgZ2V0IGxhdGVzdFJldmlzaW9uKCk6IFBhZ2VSZXZpc2lvbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLl9yZXZpc2lvbnMgfHwgdGhpcy5fcmV2aXNpb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gdGhpcy5fcmV2aXNpb25zLnJlZHVjZSgobWF4LCByZXYpID0+IChyZXYucmV2Tm8gPiBtYXgucmV2Tm8gPyByZXYgOiBtYXgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmUgcGFnZSBJRCBpcyBhdmFpbGFibGUgKGF1dG8tYWNxdWlyZSBpZiBub3QgeWV0IGFjcXVpcmVkKVxuICAgKiBAcGFyYW0gb3BlcmF0aW9uIC0gT3BlcmF0aW9uIG5hbWUgKGZvciBlcnJvciBtZXNzYWdlKVxuICAgKiBAdGhyb3dzIElmIElEIGFjcXVpc2l0aW9uIGZhaWxzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZUlkKG9wZXJhdGlvbjogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBpZiAodGhpcy5faWQgPT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFBhZ2VDb2xsZWN0aW9uLmFjcXVpcmVQYWdlSWRzKHRoaXMuc2l0ZSwgW3RoaXNdKTtcbiAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gYWNxdWlyZSBwYWdlIElEIGZvciAke29wZXJhdGlvbn06ICR7cmVzdWx0LmVycm9yLm1lc3NhZ2V9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5faWQgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoYFBhZ2UgSUQgYWNxdWlzaXRpb24gZmFpbGVkIGZvciAke29wZXJhdGlvbn1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2lkO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBwYWdlXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIGRlc3Ryb3koKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBwYWdlSWQgPSBhd2FpdCB0aGlzLmVuc3VyZUlkKCdkZWxldGlvbicpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uOiAnV2lraVBhZ2VBY3Rpb24nLFxuICAgICAgICAgICAgZXZlbnQ6ICdkZWxldGVQYWdlJyxcbiAgICAgICAgICAgIHBhZ2VfaWQ6IHBhZ2VJZCxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdFbXB0eScsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGRlbGV0ZSBwYWdlOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgdGFnc1xuICAgKi9cbiAgQFJlcXVpcmVMb2dpblxuICBjb21taXRUYWdzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcGFnZUlkID0gYXdhaXQgdGhpcy5lbnN1cmVJZCgnc2F2aW5nIHRhZ3MnKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRhZ3M6IHRoaXMudGFncy5qb2luKCcgJyksXG4gICAgICAgICAgICBhY3Rpb246ICdXaWtpUGFnZUFjdGlvbicsXG4gICAgICAgICAgICBldmVudDogJ3NhdmVUYWdzJyxcbiAgICAgICAgICAgIHBhZ2VJZDogcGFnZUlkLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gc2F2ZSB0YWdzOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBwYXJlbnQgcGFnZVxuICAgKiBAcGFyYW0gcGFyZW50RnVsbG5hbWUgLSBQYXJlbnQgcGFnZSBmdWxsbmFtZSAobnVsbCB0byByZW1vdmUpXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIHNldFBhcmVudChwYXJlbnRGdWxsbmFtZTogc3RyaW5nIHwgbnVsbCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcGFnZUlkID0gYXdhaXQgdGhpcy5lbnN1cmVJZCgnc2V0dGluZyBwYXJlbnQnKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ1dpa2lQYWdlQWN0aW9uJyxcbiAgICAgICAgICAgIGV2ZW50OiAnc2V0UGFyZW50UGFnZScsXG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnRW1wdHknLFxuICAgICAgICAgICAgcGFnZUlkOiBTdHJpbmcocGFnZUlkKSxcbiAgICAgICAgICAgIHBhcmVudE5hbWU6IHBhcmVudEZ1bGxuYW1lID8/ICcnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wYXJlbnRGdWxsbmFtZSA9IHBhcmVudEZ1bGxuYW1lO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIHNldCBwYXJlbnQ6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVm90ZSBvbiBwYWdlXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFZvdGUgdmFsdWVcbiAgICogQHJldHVybnMgTmV3IHJhdGluZ1xuICAgKi9cbiAgQFJlcXVpcmVMb2dpblxuICB2b3RlKHZhbHVlOiBudW1iZXIpOiBXaWtpZG90UmVzdWx0QXN5bmM8bnVtYmVyPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcGFnZUlkID0gYXdhaXQgdGhpcy5lbnN1cmVJZCgndm90aW5nJyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhY3Rpb246ICdSYXRlQWN0aW9uJyxcbiAgICAgICAgICAgIGV2ZW50OiAncmF0ZVBhZ2UnLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgICAgIHBhZ2VJZDogcGFnZUlkLFxuICAgICAgICAgICAgcG9pbnRzOiB2YWx1ZSxcbiAgICAgICAgICAgIGZvcmNlOiAneWVzJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRFcnJvcignRW1wdHkgcmVzcG9uc2UgZnJvbSB2b3RlIHJlcXVlc3QnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdSYXRpbmcgPSBOdW1iZXIucGFyc2VJbnQoU3RyaW5nKHJlc3BvbnNlLnBvaW50cyA/PyB0aGlzLnJhdGluZyksIDEwKTtcbiAgICAgICAgdGhpcy5yYXRpbmcgPSBuZXdSYXRpbmc7XG4gICAgICAgIHJldHVybiBuZXdSYXRpbmc7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gdm90ZTogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWwgdm90ZVxuICAgKiBAcmV0dXJucyBOZXcgcmF0aW5nXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIGNhbmNlbFZvdGUoKTogV2lraWRvdFJlc3VsdEFzeW5jPG51bWJlcj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhZ2VJZCA9IGF3YWl0IHRoaXMuZW5zdXJlSWQoJ2NhbmNlbGluZyB2b3RlJyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhY3Rpb246ICdSYXRlQWN0aW9uJyxcbiAgICAgICAgICAgIGV2ZW50OiAnY2FuY2VsVm90ZScsXG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnRW1wdHknLFxuICAgICAgICAgICAgcGFnZUlkOiBwYWdlSWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoJ0VtcHR5IHJlc3BvbnNlIGZyb20gY2FuY2VsIHZvdGUgcmVxdWVzdCcpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld1JhdGluZyA9IE51bWJlci5wYXJzZUludChTdHJpbmcocmVzcG9uc2UucG9pbnRzID8/IHRoaXMucmF0aW5nKSwgMTApO1xuICAgICAgICB0aGlzLnJhdGluZyA9IG5ld1JhdGluZztcbiAgICAgICAgcmV0dXJuIG5ld1JhdGluZztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBjYW5jZWwgdm90ZTogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFZGl0IHRoZSBwYWdlXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gRWRpdCBvcHRpb25zXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIGVkaXQob3B0aW9uczoge1xuICAgIHRpdGxlPzogc3RyaW5nO1xuICAgIHNvdXJjZT86IHN0cmluZztcbiAgICBjb21tZW50Pzogc3RyaW5nO1xuICAgIGZvcmNlRWRpdD86IGJvb2xlYW47XG4gIH0pOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhZ2VJZCA9IGF3YWl0IHRoaXMuZW5zdXJlSWQoJ2VkaXRpbmcnKTtcblxuICAgICAgICAvLyBHZXQgY3VycmVudCBzb3VyY2UgKGlmIG5vdCBzcGVjaWZpZWQpXG4gICAgICAgIGxldCBjdXJyZW50U291cmNlID0gb3B0aW9ucy5zb3VyY2U7XG4gICAgICAgIGlmIChjdXJyZW50U291cmNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb25zdCBleGlzdGluZ1NvdXJjZSA9IHRoaXMuX3NvdXJjZTtcbiAgICAgICAgICBpZiAoZXhpc3RpbmdTb3VyY2UgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGN1cnJlbnRTb3VyY2UgPSBleGlzdGluZ1NvdXJjZS53aWtpVGV4dDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQWNxdWlyZSBzb3VyY2VcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZVJlc3VsdCA9IGF3YWl0IFBhZ2VDb2xsZWN0aW9uLmFjcXVpcmVQYWdlU291cmNlcyh0aGlzLnNpdGUsIFt0aGlzXSk7XG4gICAgICAgICAgICBpZiAoc291cmNlUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICAgICAgdGhyb3cgc291cmNlUmVzdWx0LmVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQWZ0ZXIgYWNxdWlyZVBhZ2VTb3VyY2VzLCB0aGlzLl9zb3VyY2UgaXMgc2V0XG4gICAgICAgICAgICBjdXJyZW50U291cmNlID0gdGhpcy5fc291cmNlPy53aWtpVGV4dCA/PyAnJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQYWdlQ29sbGVjdGlvbi5jcmVhdGVPckVkaXQodGhpcy5zaXRlLCB0aGlzLmZ1bGxuYW1lLCB7XG4gICAgICAgICAgcGFnZUlkLFxuICAgICAgICAgIHRpdGxlOiBvcHRpb25zLnRpdGxlID8/IHRoaXMudGl0bGUsXG4gICAgICAgICAgc291cmNlOiBjdXJyZW50U291cmNlLFxuICAgICAgICAgIGNvbW1lbnQ6IG9wdGlvbnMuY29tbWVudCA/PyAnJyxcbiAgICAgICAgICBmb3JjZUVkaXQ6IG9wdGlvbnMuZm9yY2VFZGl0ID8/IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIEZvcmJpZGRlbkVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZWRpdCBwYWdlOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5hbWUgdGhlIHBhZ2VcbiAgICogQHBhcmFtIG5ld0Z1bGxuYW1lIC0gTmV3IGZ1bGxuYW1lXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIHJlbmFtZShuZXdGdWxsbmFtZTogc3RyaW5nKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBwYWdlSWQgPSBhd2FpdCB0aGlzLmVuc3VyZUlkKCdyZW5hbWluZycpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uOiAnV2lraVBhZ2VBY3Rpb24nLFxuICAgICAgICAgICAgZXZlbnQ6ICdyZW5hbWVQYWdlJyxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdFbXB0eScsXG4gICAgICAgICAgICBwYWdlX2lkOiBwYWdlSWQsXG4gICAgICAgICAgICBuZXdfbmFtZTogbmV3RnVsbG5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICAvLyBVcGRhdGUgcHJvcGVydGllcyAodXNpbmcgT2JqZWN0LmFzc2lnbiBzaW5jZSByZWFkb25seSlcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCB7XG4gICAgICAgICAgZnVsbG5hbWU6IG5ld0Z1bGxuYW1lLFxuICAgICAgICAgIGNhdGVnb3J5OiBuZXdGdWxsbmFtZS5pbmNsdWRlcygnOicpID8gbmV3RnVsbG5hbWUuc3BsaXQoJzonKVswXSA6ICdfZGVmYXVsdCcsXG4gICAgICAgICAgbmFtZTogbmV3RnVsbG5hbWUuaW5jbHVkZXMoJzonKSA/IG5ld0Z1bGxuYW1lLnNwbGl0KCc6JylbMV0gOiBuZXdGdWxsbmFtZSxcbiAgICAgICAgfSk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gcmVuYW1lIHBhZ2U6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxpc3Qgb2YgZmlsZXMgYXR0YWNoZWQgdG8gdGhlIHBhZ2VcbiAgICovXG4gIGdldEZpbGVzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlRmlsZUNvbGxlY3Rpb24+IHtcbiAgICBpZiAodGhpcy5fZmlsZXMgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiBmcm9tUHJvbWlzZShQcm9taXNlLnJlc29sdmUodGhpcy5fZmlsZXMpLCAoZSkgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihTdHJpbmcoZSkpKTtcbiAgICB9XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbmV3IFBhZ2VDb2xsZWN0aW9uKHRoaXMuc2l0ZSwgW3RoaXNdKS5nZXRQYWdlRmlsZXMoKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIC8vIF9maWxlcyBzaG91bGQgYmUgc2V0IGJ5IGdldFBhZ2VGaWxlcygpXG4gICAgICAgIGlmICh0aGlzLl9maWxlcyA9PT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMuX2ZpbGVzID0gbmV3IFBhZ2VGaWxlQ29sbGVjdGlvbih0aGlzLCBbXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbGVzO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCBmaWxlczogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGRpc2N1c3Npb24gdGhyZWFkIGZvciB0aGUgcGFnZVxuICAgKi9cbiAgZ2V0RGlzY3Vzc2lvbigpOiBXaWtpZG90UmVzdWx0QXN5bmM8aW1wb3J0KCcuLi9mb3J1bScpLkZvcnVtVGhyZWFkIHwgbnVsbD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhZ2VJZCA9IGF3YWl0IHRoaXMuZW5zdXJlSWQoJ2dldHRpbmcgZGlzY3Vzc2lvbicpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnZm9ydW0vRm9ydW1Db21tZW50c0xpc3RNb2R1bGUnLFxuICAgICAgICAgICAgcGFnZUlkLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBodG1sID0gU3RyaW5nKHJlc3BvbnNlLmJvZHkgPz8gJycpO1xuICAgICAgICAvLyBFeHRyYWN0IHRocmVhZCBJRFxuICAgICAgICBjb25zdCBtYXRjaCA9IGh0bWwubWF0Y2goXG4gICAgICAgICAgL1dJS0lET1RcXC5tb2R1bGVzXFwuRm9ydW1WaWV3VGhyZWFkTW9kdWxlXFwudmFyc1xcLnRocmVhZElkXFxzKj1cXHMqKFxcZCspL1xuICAgICAgICApO1xuICAgICAgICBpZiAoIW1hdGNoPy5bMV0pIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRocmVhZElkID0gTnVtYmVyLnBhcnNlSW50KG1hdGNoWzFdLCAxMCk7XG5cbiAgICAgICAgLy8gR2V0IEZvcnVtVGhyZWFkXG4gICAgICAgIGNvbnN0IHsgRm9ydW1UaHJlYWQgfSA9IGF3YWl0IGltcG9ydCgnLi4vZm9ydW0nKTtcbiAgICAgICAgY29uc3QgdGhyZWFkUmVzdWx0ID0gYXdhaXQgRm9ydW1UaHJlYWQuZ2V0RnJvbUlkKHRoaXMuc2l0ZSwgdGhyZWFkSWQpO1xuICAgICAgICBpZiAodGhyZWFkUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyB0aHJlYWRSZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRocmVhZFJlc3VsdC52YWx1ZTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgZGlzY3Vzc2lvbjogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGxpc3Qgb2YgbWV0YSB0YWdzIGZvciB0aGUgcGFnZVxuICAgKiBAcmV0dXJucyBNZXRhIHRhZyBjb2xsZWN0aW9uXG4gICAqL1xuICBnZXRNZXRhcygpOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZU1ldGFDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVJZCgnZ2V0dGluZyBtZXRhcycpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQYWdlTWV0YUNvbGxlY3Rpb24uYWNxdWlyZSh0aGlzKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQudmFsdWU7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IG1ldGFzOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIG1ldGEgdGFnXG4gICAqIEBwYXJhbSBuYW1lIC0gTWV0YSB0YWcgbmFtZVxuICAgKiBAcGFyYW0gY29udGVudCAtIE1ldGEgdGFnIHZhbHVlXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIHNldE1ldGEobmFtZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuZW5zdXJlSWQoJ3NldHRpbmcgbWV0YScpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQYWdlTWV0YUNvbGxlY3Rpb24uc2V0TWV0YSh0aGlzLCBuYW1lLCBjb250ZW50KTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gc2V0IG1ldGE6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGEgbWV0YSB0YWdcbiAgICogQHBhcmFtIG5hbWUgLSBNZXRhIHRhZyBuYW1lXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIGRlbGV0ZU1ldGEobmFtZTogc3RyaW5nKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLmVuc3VyZUlkKCdkZWxldGluZyBtZXRhJyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFBhZ2VNZXRhQ29sbGVjdGlvbi5kZWxldGVNZXRhKHRoaXMsIG5hbWUpO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBkZWxldGUgbWV0YTogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcGFnZSBzb3VyY2UgKGF1dG8tYWNxdWlyZSBpZiBub3QgeWV0IGFjcXVpcmVkKVxuICAgKiBAcmV0dXJucyBQYWdlIHNvdXJjZVxuICAgKi9cbiAgZ2V0U291cmNlKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlU291cmNlPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX3NvdXJjZSA9PT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFBhZ2VDb2xsZWN0aW9uLmFjcXVpcmVQYWdlSWRzKHRoaXMuc2l0ZSwgW3RoaXNdKTtcbiAgICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgc291cmNlUmVzdWx0ID0gYXdhaXQgUGFnZUNvbGxlY3Rpb24uYWNxdWlyZVBhZ2VTb3VyY2VzKHRoaXMuc2l0ZSwgW3RoaXNdKTtcbiAgICAgICAgICBpZiAoc291cmNlUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICAgIHRocm93IHNvdXJjZVJlc3VsdC5lcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3NvdXJjZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbignQ2Fubm90IGZpbmQgcGFnZSBzb3VyY2UnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fc291cmNlO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb3RGb3VuZEV4Y2VwdGlvbikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCBzb3VyY2U6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCByZXZpc2lvbiBoaXN0b3J5IChhdXRvLWFjcXVpcmUgaWYgbm90IHlldCBhY3F1aXJlZClcbiAgICogQHJldHVybnMgUmV2aXNpb24gY29sbGVjdGlvblxuICAgKi9cbiAgZ2V0UmV2aXNpb25zKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlUmV2aXNpb25Db2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX3JldmlzaW9ucyA9PT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFBhZ2VDb2xsZWN0aW9uLmFjcXVpcmVQYWdlSWRzKHRoaXMuc2l0ZSwgW3RoaXNdKTtcbiAgICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcmV2UmVzdWx0ID0gYXdhaXQgUGFnZUNvbGxlY3Rpb24uYWNxdWlyZVBhZ2VSZXZpc2lvbnModGhpcy5zaXRlLCBbdGhpc10pO1xuICAgICAgICAgIGlmIChyZXZSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgICAgdGhyb3cgcmV2UmVzdWx0LmVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fcmV2aXNpb25zID09PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKCdDYW5ub3QgZmluZCBwYWdlIHJldmlzaW9ucycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXZpc2lvbnM7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vdEZvdW5kRXhjZXB0aW9uKSByZXR1cm4gZXJyb3I7XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHJldmlzaW9uczogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHZvdGUgaW5mb3JtYXRpb24gKGF1dG8tYWNxdWlyZSBpZiBub3QgeWV0IGFjcXVpcmVkKVxuICAgKiBAcmV0dXJucyBWb3RlIGNvbGxlY3Rpb25cbiAgICovXG4gIGdldFZvdGVzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlVm90ZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5fdm90ZXMgPT09IG51bGwpIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQYWdlQ29sbGVjdGlvbi5hY3F1aXJlUGFnZUlkcyh0aGlzLnNpdGUsIFt0aGlzXSk7XG4gICAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHZvdGVzUmVzdWx0ID0gYXdhaXQgUGFnZUNvbGxlY3Rpb24uYWNxdWlyZVBhZ2VWb3Rlcyh0aGlzLnNpdGUsIFt0aGlzXSk7XG4gICAgICAgICAgaWYgKHZvdGVzUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICAgIHRocm93IHZvdGVzUmVzdWx0LmVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fdm90ZXMgPT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oJ0Nhbm5vdCBmaW5kIHBhZ2Ugdm90ZXMnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fdm90ZXM7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vdEZvdW5kRXhjZXB0aW9uKSByZXR1cm4gZXJyb3I7XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHZvdGVzOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQYWdlKGZ1bGxuYW1lPSR7dGhpcy5mdWxsbmFtZX0sIHRpdGxlPSR7dGhpcy50aXRsZX0pYDtcbiAgfVxufVxuXG4vKipcbiAqIFBhZ2UgY29sbGVjdGlvblxuICovXG5leHBvcnQgY2xhc3MgUGFnZUNvbGxlY3Rpb24gZXh0ZW5kcyBBcnJheTxQYWdlPiB7XG4gIHB1YmxpYyByZWFkb25seSBzaXRlOiBTaXRlO1xuXG4gIGNvbnN0cnVjdG9yKHNpdGU6IFNpdGUsIHBhZ2VzPzogUGFnZVtdKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnNpdGUgPSBzaXRlO1xuICAgIGlmIChwYWdlcykge1xuICAgICAgdGhpcy5wdXNoKC4uLnBhZ2VzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBieSBmdWxsbmFtZVxuICAgKiBAcGFyYW0gZnVsbG5hbWUgLSBQYWdlIGZ1bGxuYW1lXG4gICAqIEByZXR1cm5zIFBhZ2UgKHVuZGVmaW5lZCBpZiBub3QgZm91bmQpXG4gICAqL1xuICBmaW5kQnlGdWxsbmFtZShmdWxsbmFtZTogc3RyaW5nKTogUGFnZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmluZCgocGFnZSkgPT4gcGFnZS5mdWxsbmFtZSA9PT0gZnVsbG5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjcXVpcmUgcGFnZSBJRHMgaW4gYnVsa1xuICAgKi9cbiAgZ2V0UGFnZUlkcygpOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gUGFnZUNvbGxlY3Rpb24uYWNxdWlyZVBhZ2VJZHModGhpcy5zaXRlLCB0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3F1aXJlIHBhZ2Ugc291cmNlcyBpbiBidWxrXG4gICAqL1xuICBnZXRQYWdlU291cmNlcygpOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gUGFnZUNvbGxlY3Rpb24uYWNxdWlyZVBhZ2VTb3VyY2VzKHRoaXMuc2l0ZSwgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQWNxdWlyZSBwYWdlIHJldmlzaW9ucyBpbiBidWxrXG4gICAqL1xuICBnZXRQYWdlUmV2aXNpb25zKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBQYWdlQ29sbGVjdGlvbi5hY3F1aXJlUGFnZVJldmlzaW9ucyh0aGlzLnNpdGUsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjcXVpcmUgcGFnZSB2b3RlcyBpbiBidWxrXG4gICAqL1xuICBnZXRQYWdlVm90ZXMoKTogV2lraWRvdFJlc3VsdEFzeW5jPFBhZ2VDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIFBhZ2VDb2xsZWN0aW9uLmFjcXVpcmVQYWdlVm90ZXModGhpcy5zaXRlLCB0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3F1aXJlIHBhZ2UgZmlsZXMgaW4gYnVsa1xuICAgKi9cbiAgZ2V0UGFnZUZpbGVzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBQYWdlQ29sbGVjdGlvbi5hY3F1aXJlUGFnZUZpbGVzKHRoaXMuc2l0ZSwgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogSW50ZXJuYWwgbWV0aG9kIHRvIGFjcXVpcmUgcGFnZSBmaWxlcyBpbiBidWxrXG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZVBhZ2VGaWxlcyhzaXRlOiBTaXRlLCBwYWdlczogUGFnZVtdKTogV2lraWRvdFJlc3VsdEFzeW5jPFBhZ2VDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0UGFnZXMgPSBwYWdlcy5maWx0ZXIoKHBhZ2UpID0+IHBhZ2UuaWQgIT09IG51bGwpO1xuXG4gICAgICAgIGlmICh0YXJnZXRQYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFBhZ2VDb2xsZWN0aW9uKHNpdGUsIHBhZ2VzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNpdGUuYW1jUmVxdWVzdChcbiAgICAgICAgICB0YXJnZXRQYWdlcy5tYXAoKHBhZ2UpID0+ICh7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnZmlsZXMvUGFnZUZpbGVzTW9kdWxlJyxcbiAgICAgICAgICAgIHBhZ2VfaWQ6IHBhZ2UuaWQsXG4gICAgICAgICAgfSkpXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXJnZXRQYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHBhZ2UgPSB0YXJnZXRQYWdlc1tpXTtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVtpXTtcbiAgICAgICAgICBpZiAoIXBhZ2UgfHwgIXJlc3BvbnNlKSBjb250aW51ZTtcblxuICAgICAgICAgIGNvbnN0IGh0bWwgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChodG1sKTtcbiAgICAgICAgICBjb25zdCBmaWxlcyA9IFBhZ2VGaWxlQ29sbGVjdGlvbi5fcGFyc2VGcm9tSHRtbChwYWdlLCAkKTtcbiAgICAgICAgICBwYWdlLl9maWxlcyA9IG5ldyBQYWdlRmlsZUNvbGxlY3Rpb24ocGFnZSwgZmlsZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQYWdlQ29sbGVjdGlvbihzaXRlLCBwYWdlcyk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSBwYWdlIGZpbGVzOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVybmFsIG1ldGhvZCB0byBhY3F1aXJlIHBhZ2UgSURzIGluIGJ1bGtcbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlUGFnZUlkcyhzaXRlOiBTaXRlLCBwYWdlczogUGFnZVtdKTogV2lraWRvdFJlc3VsdEFzeW5jPFBhZ2VDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0UGFnZXMgPSBwYWdlcy5maWx0ZXIoKHBhZ2UpID0+ICFwYWdlLmlzSWRBY3F1aXJlZCgpKTtcblxuICAgICAgICBpZiAodGFyZ2V0UGFnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBQYWdlQ29sbGVjdGlvbihzaXRlLCBwYWdlcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMaW1pdCBjb25jdXJyZW50IGNvbm5lY3Rpb25zICh1c2luZyBzYW1lIHNlbWFwaG9yZUxpbWl0IGFzIEFNQ0NsaWVudClcbiAgICAgICAgY29uc3QgbGltaXQgPSBwTGltaXQoc2l0ZS5jbGllbnQuYW1jQ2xpZW50LmNvbmZpZy5zZW1hcGhvcmVMaW1pdCk7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IHNpdGUuY2xpZW50LmFtY0NsaWVudC5jb25maWc7XG5cbiAgICAgICAgLy8gQWNjZXNzIHdpdGggbm9yZW5kZXIsIG5vcmVkaXJlY3QgKHdpdGggcmV0cnkpXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIHRhcmdldFBhZ2VzLm1hcCgocGFnZSkgPT5cbiAgICAgICAgICAgIGxpbWl0KGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgdXJsID0gYCR7cGFnZS5nZXRVcmwoKX0vbm9yZW5kZXIvdHJ1ZS9ub3JlZGlyZWN0L3RydWVgO1xuICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoV2l0aFJldHJ5KHVybCwgY29uZmlnLCB7XG4gICAgICAgICAgICAgICAgaGVhZGVyczogc2l0ZS5jbGllbnQuYW1jQ2xpZW50LmhlYWRlci5nZXRIZWFkZXJzKCksXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICByZXR1cm4geyBwYWdlLCByZXNwb25zZSB9O1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICApXG4gICAgICAgICk7XG5cbiAgICAgICAgZm9yIChjb25zdCB7IHBhZ2UsIHJlc3BvbnNlIH0gb2YgcmVzcG9uc2VzKSB7XG4gICAgICAgICAgY29uc3QgdGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgICBjb25zdCBtYXRjaCA9IHRleHQubWF0Y2goL1dJS0lSRVFVRVNUXFwuaW5mb1xcLnBhZ2VJZFxccyo9XFxzKihcXGQrKTsvKTtcbiAgICAgICAgICBpZiAoIW1hdGNoPy5bMV0pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcihgQ2Fubm90IGZpbmQgcGFnZSBpZDogJHtwYWdlLmZ1bGxuYW1lfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwYWdlLmlkID0gTnVtYmVyLnBhcnNlSW50KG1hdGNoWzFdLCAxMCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IFBhZ2VDb2xsZWN0aW9uKHNpdGUsIHBhZ2VzKTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHJldHVybiBlcnJvcjtcbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBhY3F1aXJlIHBhZ2UgSURzOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gYWNxdWlyZSBwYWdlIHNvdXJjZXMgaW4gYnVsa1xuICAgKi9cbiAgc3RhdGljIGFjcXVpcmVQYWdlU291cmNlcyhzaXRlOiBTaXRlLCBwYWdlczogUGFnZVtdKTogV2lraWRvdFJlc3VsdEFzeW5jPFBhZ2VDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0UGFnZXMgPSBwYWdlcy5maWx0ZXIoKHBhZ2UpID0+IHBhZ2Uuc291cmNlID09PSBudWxsICYmIHBhZ2UuaWQgIT09IG51bGwpO1xuXG4gICAgICAgIGlmICh0YXJnZXRQYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFBhZ2VDb2xsZWN0aW9uKHNpdGUsIHBhZ2VzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNpdGUuYW1jUmVxdWVzdChcbiAgICAgICAgICB0YXJnZXRQYWdlcy5tYXAoKHBhZ2UpID0+ICh7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAndmlld3NvdXJjZS9WaWV3U291cmNlTW9kdWxlJyxcbiAgICAgICAgICAgIHBhZ2VfaWQ6IHBhZ2UuaWQsXG4gICAgICAgICAgfSkpXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXJnZXRQYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHBhZ2UgPSB0YXJnZXRQYWdlc1tpXTtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVtpXTtcbiAgICAgICAgICBpZiAoIXBhZ2UgfHwgIXJlc3BvbnNlKSBjb250aW51ZTtcbiAgICAgICAgICBjb25zdCBib2R5ID0gU3RyaW5nKHJlc3BvbnNlLmJvZHkgPz8gJycpLnJlcGxhY2UoLyZuYnNwOy9nLCAnICcpO1xuICAgICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoYm9keSk7XG4gICAgICAgICAgY29uc3Qgc291cmNlRWxlbWVudCA9ICQoJ2Rpdi5wYWdlLXNvdXJjZScpO1xuICAgICAgICAgIGlmIChzb3VyY2VFbGVtZW50Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKGBDYW5ub3QgZmluZCBzb3VyY2UgZWxlbWVudCBmb3IgcGFnZTogJHtwYWdlLmZ1bGxuYW1lfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB3aWtpVGV4dCA9IHNvdXJjZUVsZW1lbnQudGV4dCgpLnRyaW0oKS5yZXBsYWNlKC9eXFx0LywgJycpO1xuICAgICAgICAgIHBhZ2Uuc291cmNlID0gbmV3IFBhZ2VTb3VyY2UoeyBwYWdlLCB3aWtpVGV4dCB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgUGFnZUNvbGxlY3Rpb24oc2l0ZSwgcGFnZXMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgcGFnZSBzb3VyY2VzOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gYWNxdWlyZSBwYWdlIHJldmlzaW9ucyBpbiBidWxrXG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZVBhZ2VSZXZpc2lvbnMoc2l0ZTogU2l0ZSwgcGFnZXM6IFBhZ2VbXSk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRhcmdldFBhZ2VzID0gcGFnZXMuZmlsdGVyKChwYWdlKSA9PiBwYWdlLnJldmlzaW9ucyA9PT0gbnVsbCAmJiBwYWdlLmlkICE9PSBudWxsKTtcblxuICAgICAgICBpZiAodGFyZ2V0UGFnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBQYWdlQ29sbGVjdGlvbihzaXRlLCBwYWdlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzaXRlLmFtY1JlcXVlc3QoXG4gICAgICAgICAgdGFyZ2V0UGFnZXMubWFwKChwYWdlKSA9PiAoe1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2hpc3RvcnkvUGFnZVJldmlzaW9uTGlzdE1vZHVsZScsXG4gICAgICAgICAgICBwYWdlX2lkOiBwYWdlLmlkLFxuICAgICAgICAgICAgb3B0aW9uczogeyBhbGw6IHRydWUgfSxcbiAgICAgICAgICAgIHBlcnBhZ2U6IDEwMDAwMDAwMCxcbiAgICAgICAgICB9KSlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQYXJzZSByZXZpc2lvbnNcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXJnZXRQYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHBhZ2UgPSB0YXJnZXRQYWdlc1tpXTtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVtpXTtcbiAgICAgICAgICBpZiAoIXBhZ2UgfHwgIXJlc3BvbnNlKSBjb250aW51ZTtcblxuICAgICAgICAgIGNvbnN0IGJvZHkgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChib2R5KTtcbiAgICAgICAgICBjb25zdCByZXZpc2lvbnM6IFBhZ2VSZXZpc2lvbltdID0gW107XG5cbiAgICAgICAgICAkKCd0YWJsZS5wYWdlLWhpc3RvcnkgdHJbaWRePVwicmV2aXNpb24tcm93LVwiXScpLmVhY2goKF9qLCByZXZFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCAkcmV2ID0gJChyZXZFbGVtZW50KTtcbiAgICAgICAgICAgIGNvbnN0IHJldklkQXR0ciA9ICRyZXYuYXR0cignaWQnKTtcbiAgICAgICAgICAgIGlmICghcmV2SWRBdHRyKSByZXR1cm47XG5cbiAgICAgICAgICAgIGNvbnN0IHJldklkID0gTnVtYmVyLnBhcnNlSW50KHJldklkQXR0ci5yZXBsYWNlKCdyZXZpc2lvbi1yb3ctJywgJycpLCAxMCk7XG4gICAgICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKHJldklkKSkgcmV0dXJuO1xuXG4gICAgICAgICAgICBjb25zdCAkdGRzID0gJHJldi5maW5kKCd0ZCcpO1xuICAgICAgICAgICAgaWYgKCR0ZHMubGVuZ3RoIDwgNykgcmV0dXJuO1xuXG4gICAgICAgICAgICBjb25zdCByZXZOb1RleHQgPSAkdGRzLmVxKDApLnRleHQoKS50cmltKCkucmVwbGFjZSgvXFwuJC8sICcnKTtcbiAgICAgICAgICAgIGNvbnN0IHJldk5vID0gTnVtYmVyLnBhcnNlSW50KHJldk5vVGV4dCwgMTApO1xuICAgICAgICAgICAgaWYgKE51bWJlci5pc05hTihyZXZObykpIHJldHVybjtcblxuICAgICAgICAgICAgY29uc3QgJGNyZWF0ZWRCeUVsZW0gPSAkdGRzLmVxKDQpLmZpbmQoJ3NwYW4ucHJpbnR1c2VyJyk7XG4gICAgICAgICAgICBpZiAoJGNyZWF0ZWRCeUVsZW0ubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICAgICAgICBjb25zdCBjcmVhdGVkQnkgPSBwYXJzZVVzZXIoc2l0ZS5jbGllbnQsICRjcmVhdGVkQnlFbGVtIGFzIENoZWVyaW88QW55Tm9kZT4pO1xuXG4gICAgICAgICAgICBjb25zdCAkY3JlYXRlZEF0RWxlbSA9ICR0ZHMuZXEoNSkuZmluZCgnc3Bhbi5vZGF0ZScpO1xuICAgICAgICAgICAgaWYgKCRjcmVhdGVkQXRFbGVtLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgY3JlYXRlZEF0ID0gcGFyc2VPZGF0ZSgkY3JlYXRlZEF0RWxlbSBhcyBDaGVlcmlvPEFueU5vZGU+KSA/PyBuZXcgRGF0ZSgpO1xuXG4gICAgICAgICAgICBjb25zdCBjb21tZW50ID0gJHRkcy5lcSg2KS50ZXh0KCkudHJpbSgpO1xuXG4gICAgICAgICAgICByZXZpc2lvbnMucHVzaChcbiAgICAgICAgICAgICAgbmV3IFBhZ2VSZXZpc2lvbih7XG4gICAgICAgICAgICAgICAgcGFnZSxcbiAgICAgICAgICAgICAgICBpZDogcmV2SWQsXG4gICAgICAgICAgICAgICAgcmV2Tm8sXG4gICAgICAgICAgICAgICAgY3JlYXRlZEJ5LFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRBdCxcbiAgICAgICAgICAgICAgICBjb21tZW50LFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHBhZ2UucmV2aXNpb25zID0gbmV3IFBhZ2VSZXZpc2lvbkNvbGxlY3Rpb24ocGFnZSwgcmV2aXNpb25zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgUGFnZUNvbGxlY3Rpb24oc2l0ZSwgcGFnZXMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgcGFnZSByZXZpc2lvbnM6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSW50ZXJuYWwgbWV0aG9kIHRvIGFjcXVpcmUgcGFnZSB2b3RlcyBpbiBidWxrXG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZVBhZ2VWb3RlcyhzaXRlOiBTaXRlLCBwYWdlczogUGFnZVtdKTogV2lraWRvdFJlc3VsdEFzeW5jPFBhZ2VDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0UGFnZXMgPSBwYWdlcy5maWx0ZXIoKHBhZ2UpID0+IHBhZ2Uudm90ZXMgPT09IG51bGwgJiYgcGFnZS5pZCAhPT0gbnVsbCk7XG5cbiAgICAgICAgaWYgKHRhcmdldFBhZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBuZXcgUGFnZUNvbGxlY3Rpb24oc2l0ZSwgcGFnZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFxuICAgICAgICAgIHRhcmdldFBhZ2VzLm1hcCgocGFnZSkgPT4gKHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdwYWdlcmF0ZS9XaG9SYXRlZFBhZ2VNb2R1bGUnLFxuICAgICAgICAgICAgcGFnZUlkOiBwYWdlLmlkLFxuICAgICAgICAgIH0pKVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBhcnNlIHZvdGVzXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFyZ2V0UGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBwYWdlID0gdGFyZ2V0UGFnZXNbaV07XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbaV07XG4gICAgICAgICAgaWYgKCFwYWdlIHx8ICFyZXNwb25zZSkgY29udGludWU7XG5cbiAgICAgICAgICBjb25zdCBib2R5ID0gU3RyaW5nKHJlc3BvbnNlLmJvZHkgPz8gJycpO1xuICAgICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoYm9keSk7XG5cbiAgICAgICAgICBjb25zdCAkdXNlckVsZW1zID0gJCgnc3Bhbi5wcmludHVzZXInKTtcbiAgICAgICAgICBjb25zdCAkdmFsdWVFbGVtcyA9ICQoXCJzcGFuW3N0eWxlXj0nY29sb3InXVwiKTtcblxuICAgICAgICAgIGlmICgkdXNlckVsZW1zLmxlbmd0aCAhPT0gJHZhbHVlRWxlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEVycm9yKCdVc2VyIGFuZCB2YWx1ZSBjb3VudCBtaXNtYXRjaCBpbiB2b3RlcycpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHZvdGVzOiBQYWdlVm90ZVtdID0gW107XG4gICAgICAgICAgJHVzZXJFbGVtcy5lYWNoKChqLCB1c2VyRWxlbSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgJHVzZXIgPSAkKHVzZXJFbGVtKTtcbiAgICAgICAgICAgIGNvbnN0ICR2YWx1ZSA9ICR2YWx1ZUVsZW1zLmVxKGopO1xuXG4gICAgICAgICAgICBjb25zdCB1c2VyID0gcGFyc2VVc2VyKHNpdGUuY2xpZW50LCAkdXNlciBhcyBDaGVlcmlvPEFueU5vZGU+KTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlVGV4dCA9ICR2YWx1ZS50ZXh0KCkudHJpbSgpO1xuXG4gICAgICAgICAgICBsZXQgdmFsdWU6IG51bWJlcjtcbiAgICAgICAgICAgIGlmICh2YWx1ZVRleHQgPT09ICcrJykge1xuICAgICAgICAgICAgICB2YWx1ZSA9IDE7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlVGV4dCA9PT0gJy0nKSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gLTE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB2YWx1ZSA9IE51bWJlci5wYXJzZUludCh2YWx1ZVRleHQsIDEwKSB8fCAwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2b3Rlcy5wdXNoKG5ldyBQYWdlVm90ZSh7IHBhZ2UsIHVzZXIsIHZhbHVlIH0pKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHBhZ2Uudm90ZXMgPSBuZXcgUGFnZVZvdGVDb2xsZWN0aW9uKHBhZ2UsIHZvdGVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgUGFnZUNvbGxlY3Rpb24oc2l0ZSwgcGFnZXMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgcGFnZSB2b3RlczogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBMaXN0UGFnZXNNb2R1bGUgcmVzcG9uc2VcbiAgICovXG4gIHN0YXRpYyBwYXJzZShcbiAgICBzaXRlOiBTaXRlLFxuICAgIGh0bWxCb2R5OiBjaGVlcmlvLkNoZWVyaW9BUEksXG4gICAgX3BhcnNlVXNlcjogKGVsZW1lbnQ6IGNoZWVyaW8uQ2hlZXJpbzxBbnlOb2RlPikgPT4gQWJzdHJhY3RVc2VyXG4gICk6IFBhZ2VDb2xsZWN0aW9uIHtcbiAgICBjb25zdCBwYWdlczogUGFnZVtdID0gW107XG5cbiAgICBodG1sQm9keSgnZGl2LnBhZ2UnKS5lYWNoKChfaSwgcGFnZUVsZW1lbnQpID0+IHtcbiAgICAgIGNvbnN0ICRwYWdlID0gaHRtbEJvZHkocGFnZUVsZW1lbnQpO1xuICAgICAgY29uc3QgcGFnZVBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAgICAgLy8gQ2hlY2sgZm9yIDUtc3RhciByYXRpbmdcbiAgICAgIGNvbnN0IGlzNVN0YXJSYXRpbmcgPSAkcGFnZS5maW5kKCdzcGFuLnJhdGluZyBzcGFuLnBhZ2UtcmF0ZS1saXN0LXBhZ2VzLXN0YXJ0JykubGVuZ3RoID4gMDtcblxuICAgICAgLy8gR2V0IGVhY2ggdmFsdWVcbiAgICAgICRwYWdlLmZpbmQoJ3NwYW4uc2V0JykuZWFjaCgoX2osIHNldEVsZW1lbnQpID0+IHtcbiAgICAgICAgY29uc3QgJHNldCA9IGh0bWxCb2R5KHNldEVsZW1lbnQpO1xuICAgICAgICBjb25zdCBrZXlFbGVtZW50ID0gJHNldC5maW5kKCdzcGFuLm5hbWUnKTtcbiAgICAgICAgaWYgKGtleUVsZW1lbnQubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgbGV0IGtleSA9IGtleUVsZW1lbnQudGV4dCgpLnRyaW0oKTtcbiAgICAgICAgY29uc3QgdmFsdWVFbGVtZW50ID0gJHNldC5maW5kKCdzcGFuLnZhbHVlJyk7XG5cbiAgICAgICAgbGV0IHZhbHVlOiB1bmtub3duID0gbnVsbDtcblxuICAgICAgICBpZiAodmFsdWVFbGVtZW50Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHZhbHVlID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmIChbJ2NyZWF0ZWRfYXQnLCAndXBkYXRlZF9hdCcsICdjb21tZW50ZWRfYXQnXS5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgY29uc3Qgb2RhdGVFbGVtZW50ID0gdmFsdWVFbGVtZW50LmZpbmQoJ3NwYW4ub2RhdGUnKTtcbiAgICAgICAgICBpZiAob2RhdGVFbGVtZW50Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IG9kYXRlRWxlbWVudC5hdHRyKCdjbGFzcycpPy5tYXRjaCgvdGltZV8oXFxkKykvKT8uWzFdO1xuICAgICAgICAgICAgdmFsdWUgPSB0aW1lc3RhbXAgPyBuZXcgRGF0ZShOdW1iZXIucGFyc2VJbnQodGltZXN0YW1wLCAxMCkgKiAxMDAwKSA6IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIFsnY3JlYXRlZF9ieV9saW5rZWQnLCAndXBkYXRlZF9ieV9saW5rZWQnLCAnY29tbWVudGVkX2J5X2xpbmtlZCddLmluY2x1ZGVzKGtleSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgcHJpbnR1c2VyRWxlbWVudCA9IHZhbHVlRWxlbWVudC5maW5kKCdzcGFuLnByaW50dXNlcicpO1xuICAgICAgICAgIGlmIChwcmludHVzZXJFbGVtZW50Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHZhbHVlID0gX3BhcnNlVXNlcihwcmludHVzZXJFbGVtZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoWyd0YWdzJywgJ190YWdzJ10uaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgIHZhbHVlID0gdmFsdWVFbGVtZW50LnRleHQoKS5zcGxpdCgvXFxzKy8pLmZpbHRlcihCb29sZWFuKTtcbiAgICAgICAgfSBlbHNlIGlmIChbJ3JhdGluZ192b3RlcycsICdjb21tZW50cycsICdzaXplJywgJ3JldmlzaW9ucyddLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICB2YWx1ZSA9IE51bWJlci5wYXJzZUludCh2YWx1ZUVsZW1lbnQudGV4dCgpLnRyaW0oKSwgMTApIHx8IDA7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAncmF0aW5nJykge1xuICAgICAgICAgIGNvbnN0IHJhdGluZ1RleHQgPSB2YWx1ZUVsZW1lbnQudGV4dCgpLnRyaW0oKTtcbiAgICAgICAgICB2YWx1ZSA9IGlzNVN0YXJSYXRpbmdcbiAgICAgICAgICAgID8gTnVtYmVyLnBhcnNlRmxvYXQocmF0aW5nVGV4dCkgfHwgMFxuICAgICAgICAgICAgOiBOdW1iZXIucGFyc2VJbnQocmF0aW5nVGV4dCwgMTApIHx8IDA7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAncmF0aW5nX3BlcmNlbnQnKSB7XG4gICAgICAgICAgaWYgKGlzNVN0YXJSYXRpbmcpIHtcbiAgICAgICAgICAgIHZhbHVlID0gKE51bWJlci5wYXJzZUZsb2F0KHZhbHVlRWxlbWVudC50ZXh0KCkudHJpbSgpKSB8fCAwKSAvIDEwMDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWUgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlRWxlbWVudC50ZXh0KCkudHJpbSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gS2V5IGNvbnZlcnNpb25cbiAgICAgICAgaWYgKGtleS5pbmNsdWRlcygnX2xpbmtlZCcpKSB7XG4gICAgICAgICAga2V5ID0ga2V5LnJlcGxhY2UoJ19saW5rZWQnLCAnJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoWydjb21tZW50cycsICdjaGlsZHJlbicsICdyZXZpc2lvbnMnXS5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAga2V5ID0gYCR7a2V5fV9jb3VudGA7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAncmF0aW5nX3ZvdGVzJykge1xuICAgICAgICAgIGtleSA9ICd2b3Rlc19jb3VudCc7XG4gICAgICAgIH1cblxuICAgICAgICBwYWdlUGFyYW1zW2tleV0gPSB2YWx1ZTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBNZXJnZSB0YWdzXG4gICAgICBjb25zdCB0YWdzID0gQXJyYXkuaXNBcnJheShwYWdlUGFyYW1zLnRhZ3MpID8gcGFnZVBhcmFtcy50YWdzIDogW107XG4gICAgICBjb25zdCBoaWRkZW5UYWdzID0gQXJyYXkuaXNBcnJheShwYWdlUGFyYW1zLl90YWdzKSA/IHBhZ2VQYXJhbXMuX3RhZ3MgOiBbXTtcbiAgICAgIHBhZ2VQYXJhbXMudGFncyA9IFsuLi50YWdzLCAuLi5oaWRkZW5UYWdzXTtcblxuICAgICAgLy8gVmFsaWRhdGUgd2l0aCBab2Qgc2NoZW1hIGFuZCBhcHBseSBkZWZhdWx0c1xuICAgICAgY29uc3QgcGFyc2VkID0gcGFnZVBhcmFtc1NjaGVtYS5wYXJzZShwYWdlUGFyYW1zKTtcblxuICAgICAgLy8gQ3JlYXRlIFBhZ2Ugb2JqZWN0XG4gICAgICBwYWdlcy5wdXNoKFxuICAgICAgICBuZXcgUGFnZSh7XG4gICAgICAgICAgc2l0ZSxcbiAgICAgICAgICBmdWxsbmFtZTogcGFyc2VkLmZ1bGxuYW1lLFxuICAgICAgICAgIG5hbWU6IHBhcnNlZC5uYW1lLFxuICAgICAgICAgIGNhdGVnb3J5OiBwYXJzZWQuY2F0ZWdvcnksXG4gICAgICAgICAgdGl0bGU6IHBhcnNlZC50aXRsZSxcbiAgICAgICAgICBjaGlsZHJlbkNvdW50OiBwYXJzZWQuY2hpbGRyZW5fY291bnQsXG4gICAgICAgICAgY29tbWVudHNDb3VudDogcGFyc2VkLmNvbW1lbnRzX2NvdW50LFxuICAgICAgICAgIHNpemU6IHBhcnNlZC5zaXplLFxuICAgICAgICAgIHJhdGluZzogcGFyc2VkLnJhdGluZyxcbiAgICAgICAgICB2b3Rlc0NvdW50OiBwYXJzZWQudm90ZXNfY291bnQsXG4gICAgICAgICAgcmF0aW5nUGVyY2VudDogcGFyc2VkLnJhdGluZ19wZXJjZW50LFxuICAgICAgICAgIHJldmlzaW9uc0NvdW50OiBwYXJzZWQucmV2aXNpb25zX2NvdW50LFxuICAgICAgICAgIHBhcmVudEZ1bGxuYW1lOiBwYXJzZWQucGFyZW50X2Z1bGxuYW1lLFxuICAgICAgICAgIHRhZ3M6IHBhcnNlZC50YWdzLFxuICAgICAgICAgIGNyZWF0ZWRCeTogcGFyc2VkLmNyZWF0ZWRfYnksXG4gICAgICAgICAgY3JlYXRlZEF0OiBwYXJzZWQuY3JlYXRlZF9hdCA/PyBuZXcgRGF0ZSgpLFxuICAgICAgICAgIHVwZGF0ZWRCeTogcGFyc2VkLnVwZGF0ZWRfYnksXG4gICAgICAgICAgdXBkYXRlZEF0OiBwYXJzZWQudXBkYXRlZF9hdCA/PyBuZXcgRGF0ZSgpLFxuICAgICAgICAgIGNvbW1lbnRlZEJ5OiBwYXJzZWQuY29tbWVudGVkX2J5LFxuICAgICAgICAgIGNvbW1lbnRlZEF0OiBwYXJzZWQuY29tbWVudGVkX2F0LFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgUGFnZUNvbGxlY3Rpb24oc2l0ZSwgcGFnZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlYXJjaCBwYWdlc1xuICAgKi9cbiAgc3RhdGljIHNlYXJjaFBhZ2VzKFxuICAgIHNpdGU6IFNpdGUsXG4gICAgcGFyc2VVc2VyOiAoZWxlbWVudDogY2hlZXJpby5DaGVlcmlvPEFueU5vZGU+KSA9PiBBYnN0cmFjdFVzZXIsXG4gICAgcXVlcnk6IFNlYXJjaFBhZ2VzUXVlcnkgfCBudWxsID0gbnVsbFxuICApOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBxID0gcXVlcnkgPz8gbmV3IFNlYXJjaFBhZ2VzUXVlcnkoKTtcbiAgICAgICAgY29uc3QgcXVlcnlEaWN0ID0gcS5hc0RpY3QoKTtcblxuICAgICAgICAvLyBHZW5lcmF0ZSBtb2R1bGUgYm9keVxuICAgICAgICBjb25zdCBtb2R1bGVCb2R5ID0gYFtbZGl2IGNsYXNzPVwicGFnZVwiXV1cXG4ke0RFRkFVTFRfTU9EVUxFX0JPRFkubWFwKFxuICAgICAgICAgIChrZXkpID0+XG4gICAgICAgICAgICBgW1tzcGFuIGNsYXNzPVwic2V0ICR7a2V5fVwiXV1bW3NwYW4gY2xhc3M9XCJuYW1lXCJdXSAke2tleX0gW1svc3Bhbl1dW1tzcGFuIGNsYXNzPVwidmFsdWVcIl1dICUlJHtrZXl9JSUgW1svc3Bhbl1dW1svc3Bhbl1dYFxuICAgICAgICApLmpvaW4oJycpfVxcbltbL2Rpdl1dYDtcblxuICAgICAgICBjb25zdCByZXF1ZXN0Qm9keSA9IHtcbiAgICAgICAgICAuLi5xdWVyeURpY3QsXG4gICAgICAgICAgbW9kdWxlTmFtZTogJ2xpc3QvTGlzdFBhZ2VzTW9kdWxlJyxcbiAgICAgICAgICBtb2R1bGVfYm9keTogbW9kdWxlQm9keSxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzaXRlLmFtY1JlcXVlc3QoW3JlcXVlc3RCb2R5XSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIGlmIChyZXN1bHQuZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnbm90X29rJykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBGb3JiaWRkZW5FcnJvcignRmFpbGVkIHRvIGdldCBwYWdlcywgdGFyZ2V0IHNpdGUgbWF5IGJlIHByaXZhdGUnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlyc3RSZXNwb25zZSA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgY29uc3QgYm9keSA9IFN0cmluZyhmaXJzdFJlc3BvbnNlPy5ib2R5ID8/ICcnKTtcbiAgICAgICAgY29uc3QgJGZpcnN0ID0gY2hlZXJpby5sb2FkKGJvZHkpO1xuXG4gICAgICAgIGxldCB0b3RhbCA9IDE7XG4gICAgICAgIGNvbnN0IGh0bWxCb2RpZXM6IGNoZWVyaW8uQ2hlZXJpb0FQSVtdID0gWyRmaXJzdF07XG5cbiAgICAgICAgLy8gQ2hlY2sgcGFnaW5hdGlvblxuICAgICAgICBjb25zdCBwYWdlckVsZW1lbnQgPSAkZmlyc3QoJ2Rpdi5wYWdlcicpO1xuICAgICAgICBpZiAocGFnZXJFbGVtZW50Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBsYXN0UGFnZXJFbGVtZW50cyA9ICRmaXJzdCgnZGl2LnBhZ2VyIHNwYW4udGFyZ2V0Jyk7XG4gICAgICAgICAgaWYgKGxhc3RQYWdlckVsZW1lbnRzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICBjb25zdCBzZWNvbmRMYXN0UGFnZXIgPSAkZmlyc3QobGFzdFBhZ2VyRWxlbWVudHNbbGFzdFBhZ2VyRWxlbWVudHMubGVuZ3RoIC0gMl0pO1xuICAgICAgICAgICAgY29uc3QgbGFzdFBhZ2VyTGluayA9IHNlY29uZExhc3RQYWdlci5maW5kKCdhJyk7XG4gICAgICAgICAgICBpZiAobGFzdFBhZ2VyTGluay5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHRvdGFsID0gTnVtYmVyLnBhcnNlSW50KGxhc3RQYWdlckxpbmsudGV4dCgpLnRyaW0oKSwgMTApIHx8IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IGFkZGl0aW9uYWwgcGFnZXNcbiAgICAgICAgaWYgKHRvdGFsID4gMSkge1xuICAgICAgICAgIGNvbnN0IGFkZGl0aW9uYWxCb2RpZXM6IEFNQ1JlcXVlc3RCb2R5W10gPSBbXTtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHRvdGFsOyBpKyspIHtcbiAgICAgICAgICAgIGFkZGl0aW9uYWxCb2RpZXMucHVzaCh7XG4gICAgICAgICAgICAgIC4uLnF1ZXJ5RGljdCxcbiAgICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2xpc3QvTGlzdFBhZ2VzTW9kdWxlJyxcbiAgICAgICAgICAgICAgbW9kdWxlX2JvZHk6IG1vZHVsZUJvZHksXG4gICAgICAgICAgICAgIG9mZnNldDogaSAqIChxLnBlclBhZ2UgPz8gREVGQVVMVF9QRVJfUEFHRSksXG4gICAgICAgICAgICB9IGFzIEFNQ1JlcXVlc3RCb2R5KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBhZGRpdGlvbmFsUmVzdWx0cyA9IGF3YWl0IHNpdGUuYW1jUmVxdWVzdChhZGRpdGlvbmFsQm9kaWVzKTtcbiAgICAgICAgICBpZiAoYWRkaXRpb25hbFJlc3VsdHMuaXNFcnIoKSkge1xuICAgICAgICAgICAgdGhyb3cgYWRkaXRpb25hbFJlc3VsdHMuZXJyb3I7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yIChjb25zdCByZXNwb25zZSBvZiBhZGRpdGlvbmFsUmVzdWx0cy52YWx1ZSkge1xuICAgICAgICAgICAgY29uc3QgcmVzcEJvZHkgPSBTdHJpbmcocmVzcG9uc2U/LmJvZHkgPz8gJycpO1xuICAgICAgICAgICAgaHRtbEJvZGllcy5wdXNoKGNoZWVyaW8ubG9hZChyZXNwQm9keSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBhcnNlXG4gICAgICAgIGNvbnN0IHBhZ2VzOiBQYWdlW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCAkaHRtbCBvZiBodG1sQm9kaWVzKSB7XG4gICAgICAgICAgY29uc3QgcGFyc2VkID0gUGFnZUNvbGxlY3Rpb24ucGFyc2Uoc2l0ZSwgJGh0bWwsIHBhcnNlVXNlcik7XG4gICAgICAgICAgcGFnZXMucHVzaCguLi5wYXJzZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQYWdlQ29sbGVjdGlvbihzaXRlLCBwYWdlcyk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEZvcmJpZGRlbkVycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgTm90Rm91bmRFeGNlcHRpb24pIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBzZWFyY2ggcGFnZXM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBvciBlZGl0IGEgcGFnZVxuICAgKi9cbiAgc3RhdGljIGNyZWF0ZU9yRWRpdChcbiAgICBzaXRlOiBTaXRlLFxuICAgIGZ1bGxuYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9uczoge1xuICAgICAgcGFnZUlkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAgIHRpdGxlPzogc3RyaW5nO1xuICAgICAgc291cmNlPzogc3RyaW5nO1xuICAgICAgY29tbWVudD86IHN0cmluZztcbiAgICAgIGZvcmNlRWRpdD86IGJvb2xlYW47XG4gICAgICByYWlzZU9uRXhpc3RzPzogYm9vbGVhbjtcbiAgICB9ID0ge31cbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICBjb25zdCBsb2dpblJlc3VsdCA9IHNpdGUuY2xpZW50LnJlcXVpcmVMb2dpbigpO1xuICAgIGlmIChsb2dpblJlc3VsdC5pc0VycigpKSB7XG4gICAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAgIFByb21pc2UucmVqZWN0KGxvZ2luUmVzdWx0LmVycm9yKSxcbiAgICAgICAgKCkgPT4gbmV3IExvZ2luUmVxdWlyZWRFcnJvcignTG9naW4gcmVxdWlyZWQgdG8gY3JlYXRlL2VkaXQgcGFnZScpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBwYWdlSWQgPSBudWxsLFxuICAgICAgICAgIHRpdGxlID0gJycsXG4gICAgICAgICAgc291cmNlID0gJycsXG4gICAgICAgICAgY29tbWVudCA9ICcnLFxuICAgICAgICAgIGZvcmNlRWRpdCA9IGZhbHNlLFxuICAgICAgICAgIHJhaXNlT25FeGlzdHMgPSBmYWxzZSxcbiAgICAgICAgfSA9IG9wdGlvbnM7XG5cbiAgICAgICAgLy8gQWNxdWlyZSBwYWdlIGxvY2tcbiAgICAgICAgY29uc3QgbG9ja1JlcXVlc3RCb2R5OiBBTUNSZXF1ZXN0Qm9keSA9IHtcbiAgICAgICAgICBtb2RlOiAncGFnZScsXG4gICAgICAgICAgd2lraV9wYWdlOiBmdWxsbmFtZSxcbiAgICAgICAgICBtb2R1bGVOYW1lOiAnZWRpdC9QYWdlRWRpdE1vZHVsZScsXG4gICAgICAgIH07XG4gICAgICAgIGlmIChmb3JjZUVkaXQpIHtcbiAgICAgICAgICBsb2NrUmVxdWVzdEJvZHkuZm9yY2VfbG9jayA9ICd5ZXMnO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbG9ja1Jlc3VsdCA9IGF3YWl0IHNpdGUuYW1jUmVxdWVzdChbbG9ja1JlcXVlc3RCb2R5XSk7XG4gICAgICAgIGlmIChsb2NrUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBsb2NrUmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbG9ja1Jlc3BvbnNlID0gbG9ja1Jlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKGxvY2tSZXNwb25zZT8ubG9ja2VkIHx8IGxvY2tSZXNwb25zZT8ub3RoZXJfbG9ja3MpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEVycm9yKGBQYWdlICR7ZnVsbG5hbWV9IGlzIGxvY2tlZCBvciBvdGhlciBsb2NrcyBleGlzdGApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaXNFeGlzdCA9ICdwYWdlX3JldmlzaW9uX2lkJyBpbiAobG9ja1Jlc3BvbnNlID8/IHt9KTtcblxuICAgICAgICBpZiAocmFpc2VPbkV4aXN0cyAmJiBpc0V4aXN0KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFRhcmdldEV4aXN0c0Vycm9yKGBQYWdlICR7ZnVsbG5hbWV9IGFscmVhZHkgZXhpc3RzYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNFeGlzdCAmJiBwYWdlSWQgPT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEVycm9yKCdwYWdlX2lkIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gZWRpdGluZyBleGlzdGluZyBwYWdlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsb2NrSWQgPSBTdHJpbmcobG9ja1Jlc3BvbnNlPy5sb2NrX2lkID8/ICcnKTtcbiAgICAgICAgY29uc3QgbG9ja1NlY3JldCA9IFN0cmluZyhsb2NrUmVzcG9uc2U/LmxvY2tfc2VjcmV0ID8/ICcnKTtcbiAgICAgICAgY29uc3QgcGFnZVJldmlzaW9uSWQgPSBTdHJpbmcobG9ja1Jlc3BvbnNlPy5wYWdlX3JldmlzaW9uX2lkID8/ICcnKTtcblxuICAgICAgICAvLyBTYXZlIHBhZ2VcbiAgICAgICAgY29uc3QgZWRpdFJlcXVlc3RCb2R5OiBBTUNSZXF1ZXN0Qm9keSA9IHtcbiAgICAgICAgICBhY3Rpb246ICdXaWtpUGFnZUFjdGlvbicsXG4gICAgICAgICAgZXZlbnQ6ICdzYXZlUGFnZScsXG4gICAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgICBtb2RlOiAncGFnZScsXG4gICAgICAgICAgbG9ja19pZDogbG9ja0lkLFxuICAgICAgICAgIGxvY2tfc2VjcmV0OiBsb2NrU2VjcmV0LFxuICAgICAgICAgIHJldmlzaW9uX2lkOiBwYWdlUmV2aXNpb25JZCxcbiAgICAgICAgICB3aWtpX3BhZ2U6IGZ1bGxuYW1lLFxuICAgICAgICAgIHBhZ2VfaWQ6IHBhZ2VJZCA/PyAnJyxcbiAgICAgICAgICB0aXRsZSxcbiAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgY29tbWVudHM6IGNvbW1lbnQsXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgZWRpdFJlc3VsdCA9IGF3YWl0IHNpdGUuYW1jUmVxdWVzdChbZWRpdFJlcXVlc3RCb2R5XSk7XG4gICAgICAgIGlmIChlZGl0UmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBlZGl0UmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFRhcmdldEV4aXN0c0Vycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgTG9naW5SZXF1aXJlZEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gY3JlYXRlL2VkaXQgcGFnZTogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IHsgU2VhcmNoUGFnZXNRdWVyeSB9O1xuIiwKICAgICJpbXBvcnQgKiBhcyBjaGVlcmlvIGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0IHsgVW5leHBlY3RlZEVycm9yIH0gZnJvbSAnLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBQYWdlIH0gZnJvbSAnLi9wYWdlJztcblxuLyoqXG4gKiBQYWdlIGZpbGUgZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VGaWxlRGF0YSB7XG4gIHBhZ2U6IFBhZ2U7XG4gIGlkOiBudW1iZXI7XG4gIG5hbWU6IHN0cmluZztcbiAgdXJsOiBzdHJpbmc7XG4gIG1pbWVUeXBlOiBzdHJpbmc7XG4gIHNpemU6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQYWdlIGF0dGFjaG1lbnQgZmlsZVxuICovXG5leHBvcnQgY2xhc3MgUGFnZUZpbGUge1xuICBwdWJsaWMgcmVhZG9ubHkgcGFnZTogUGFnZTtcbiAgcHVibGljIHJlYWRvbmx5IGlkOiBudW1iZXI7XG4gIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSB1cmw6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IG1pbWVUeXBlOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBzaXplOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoZGF0YTogUGFnZUZpbGVEYXRhKSB7XG4gICAgdGhpcy5wYWdlID0gZGF0YS5wYWdlO1xuICAgIHRoaXMuaWQgPSBkYXRhLmlkO1xuICAgIHRoaXMubmFtZSA9IGRhdGEubmFtZTtcbiAgICB0aGlzLnVybCA9IGRhdGEudXJsO1xuICAgIHRoaXMubWltZVR5cGUgPSBkYXRhLm1pbWVUeXBlO1xuICAgIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQYWdlRmlsZShpZD0ke3RoaXMuaWR9LCBuYW1lPSR7dGhpcy5uYW1lfSwgc2l6ZT0ke3RoaXMuc2l6ZX0pYDtcbiAgfVxufVxuXG4vKipcbiAqIFBhZ2UgZmlsZSBjb2xsZWN0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBQYWdlRmlsZUNvbGxlY3Rpb24gZXh0ZW5kcyBBcnJheTxQYWdlRmlsZT4ge1xuICBwdWJsaWMgcmVhZG9ubHkgcGFnZTogUGFnZTtcblxuICBjb25zdHJ1Y3RvcihwYWdlOiBQYWdlLCBmaWxlcz86IFBhZ2VGaWxlW10pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucGFnZSA9IHBhZ2U7XG4gICAgaWYgKGZpbGVzKSB7XG4gICAgICB0aGlzLnB1c2goLi4uZmlsZXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGJ5IElEXG4gICAqL1xuICBmaW5kQnlJZChpZDogbnVtYmVyKTogUGFnZUZpbGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbmQoKGZpbGUpID0+IGZpbGUuaWQgPT09IGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGJ5IG5hbWVcbiAgICovXG4gIGZpbmRCeU5hbWUobmFtZTogc3RyaW5nKTogUGFnZUZpbGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbmQoKGZpbGUpID0+IGZpbGUubmFtZSA9PT0gbmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBzaXplIHN0cmluZyB0byBieXRlcyAocHVibGljIGZvciBiYXRjaCBvcGVyYXRpb25zKVxuICAgKi9cbiAgc3RhdGljIHBhcnNlU2l6ZShzaXplVGV4dDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCB0ZXh0ID0gc2l6ZVRleHQudHJpbSgpO1xuICAgIGlmICh0ZXh0LmluY2x1ZGVzKCdCeXRlcycpKSB7XG4gICAgICByZXR1cm4gTWF0aC5mbG9vcihOdW1iZXIucGFyc2VGbG9hdCh0ZXh0LnJlcGxhY2UoJ0J5dGVzJywgJycpLnRyaW0oKSkpO1xuICAgIH1cbiAgICBpZiAodGV4dC5pbmNsdWRlcygna0InKSkge1xuICAgICAgcmV0dXJuIE1hdGguZmxvb3IoTnVtYmVyLnBhcnNlRmxvYXQodGV4dC5yZXBsYWNlKCdrQicsICcnKS50cmltKCkpICogMTAwMCk7XG4gICAgfVxuICAgIGlmICh0ZXh0LmluY2x1ZGVzKCdNQicpKSB7XG4gICAgICByZXR1cm4gTWF0aC5mbG9vcihOdW1iZXIucGFyc2VGbG9hdCh0ZXh0LnJlcGxhY2UoJ01CJywgJycpLnRyaW0oKSkgKiAxMDAwMDAwKTtcbiAgICB9XG4gICAgaWYgKHRleHQuaW5jbHVkZXMoJ0dCJykpIHtcbiAgICAgIHJldHVybiBNYXRoLmZsb29yKE51bWJlci5wYXJzZUZsb2F0KHRleHQucmVwbGFjZSgnR0InLCAnJykudHJpbSgpKSAqIDEwMDAwMDAwMDApO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBmaWxlIGluZm9ybWF0aW9uIGZyb20gSFRNTCByZXNwb25zZVxuICAgKiBJbnRlcm5hbCBoZWxwZXIgZm9yIGFjcXVpcmUoKSBhbmQgUGFnZUNvbGxlY3Rpb24uYWNxdWlyZVBhZ2VGaWxlcygpXG4gICAqL1xuICBzdGF0aWMgX3BhcnNlRnJvbUh0bWwocGFnZTogUGFnZSwgJDogY2hlZXJpby5DaGVlcmlvQVBJKTogUGFnZUZpbGVbXSB7XG4gICAgY29uc3QgZmlsZXNUYWJsZSA9ICQoJ3RhYmxlLnBhZ2UtZmlsZXMnKTtcbiAgICBpZiAoZmlsZXNUYWJsZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlczogUGFnZUZpbGVbXSA9IFtdO1xuXG4gICAgZmlsZXNUYWJsZS5maW5kKFwidGJvZHkgdHJbaWRePSdmaWxlLXJvdy0nXVwiKS5lYWNoKChfaSwgcm93KSA9PiB7XG4gICAgICBjb25zdCByb3dJZCA9ICQocm93KS5hdHRyKCdpZCcpO1xuICAgICAgaWYgKCFyb3dJZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBmaWxlSWQgPSBOdW1iZXIucGFyc2VJbnQocm93SWQucmVwbGFjZSgnZmlsZS1yb3ctJywgJycpLCAxMCk7XG4gICAgICBjb25zdCB0ZHMgPSAkKHJvdykuZmluZCgndGQnKTtcbiAgICAgIGlmICh0ZHMubGVuZ3RoIDwgMykgcmV0dXJuO1xuXG4gICAgICBjb25zdCBsaW5rRWxlbSA9ICQodGRzWzBdKS5maW5kKCdhJyk7XG4gICAgICBpZiAobGlua0VsZW0ubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IG5hbWUgPSBsaW5rRWxlbS50ZXh0KCkudHJpbSgpO1xuICAgICAgY29uc3QgaHJlZiA9IGxpbmtFbGVtLmF0dHIoJ2hyZWYnKSA/PyAnJztcbiAgICAgIGNvbnN0IHVybCA9IGAke3BhZ2Uuc2l0ZS5nZXRCYXNlVXJsKCl9JHtocmVmfWA7XG5cbiAgICAgIGNvbnN0IG1pbWVFbGVtID0gJCh0ZHNbMV0pLmZpbmQoJ3NwYW4nKTtcbiAgICAgIGNvbnN0IG1pbWVUeXBlID0gbWltZUVsZW0uYXR0cigndGl0bGUnKSA/PyAnJztcblxuICAgICAgY29uc3Qgc2l6ZVRleHQgPSAkKHRkc1syXSkudGV4dCgpLnRyaW0oKTtcbiAgICAgIGNvbnN0IHNpemUgPSBQYWdlRmlsZUNvbGxlY3Rpb24ucGFyc2VTaXplKHNpemVUZXh0KTtcblxuICAgICAgZmlsZXMucHVzaChcbiAgICAgICAgbmV3IFBhZ2VGaWxlKHtcbiAgICAgICAgICBwYWdlLFxuICAgICAgICAgIGlkOiBmaWxlSWQsXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICB1cmwsXG4gICAgICAgICAgbWltZVR5cGUsXG4gICAgICAgICAgc2l6ZSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZmlsZXM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxpc3Qgb2YgZmlsZXMgYXR0YWNoZWQgdG8gcGFnZVxuICAgKi9cbiAgc3RhdGljIGFjcXVpcmUocGFnZTogUGFnZSk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlRmlsZUNvbGxlY3Rpb24+IHtcbiAgICBpZiAocGFnZS5pZCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgICBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ1BhZ2UgSUQgbm90IGFjcXVpcmVkJykpLFxuICAgICAgICAoKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKCdQYWdlIElEIG11c3QgYmUgYWNxdWlyZWQgYmVmb3JlIGdldHRpbmcgZmlsZXMnKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYWdlSWQgPSBwYWdlLmlkO1xuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGFnZS5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdmaWxlcy9QYWdlRmlsZXNNb2R1bGUnLFxuICAgICAgICAgICAgcGFnZV9pZDogcGFnZUlkLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRFcnJvcignRW1wdHkgcmVzcG9uc2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGh0bWwgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoaHRtbCk7XG4gICAgICAgIGNvbnN0IGZpbGVzID0gUGFnZUZpbGVDb2xsZWN0aW9uLl9wYXJzZUZyb21IdG1sKHBhZ2UsICQpO1xuXG4gICAgICAgIHJldHVybiBuZXcgUGFnZUZpbGVDb2xsZWN0aW9uKHBhZ2UsIGZpbGVzKTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBhY3F1aXJlIGZpbGVzOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG59XG4iLAogICAgImltcG9ydCB7IExvZ2luUmVxdWlyZWRFcnJvciwgTm9FbGVtZW50RXJyb3IsIFVuZXhwZWN0ZWRFcnJvciB9IGZyb20gJy4uLy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgUGFnZVJlZiB9IGZyb20gJy4uL3R5cGVzJztcblxuLyoqXG4gKiBQYWdlIG1ldGEgdGFnIGRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYWdlTWV0YURhdGEge1xuICBwYWdlOiBQYWdlUmVmO1xuICBuYW1lOiBzdHJpbmc7XG4gIGNvbnRlbnQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYWdlIG1ldGEgdGFnXG4gKi9cbmV4cG9ydCBjbGFzcyBQYWdlTWV0YSB7XG4gIHB1YmxpYyByZWFkb25seSBwYWdlOiBQYWdlUmVmO1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICBwdWJsaWMgY29udGVudDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IFBhZ2VNZXRhRGF0YSkge1xuICAgIHRoaXMucGFnZSA9IGRhdGEucGFnZTtcbiAgICB0aGlzLm5hbWUgPSBkYXRhLm5hbWU7XG4gICAgdGhpcy5jb250ZW50ID0gZGF0YS5jb250ZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBtZXRhIHRhZyB2YWx1ZVxuICAgKiBAcGFyYW0gY29udGVudCAtIE5ldyB2YWx1ZVxuICAgKi9cbiAgdXBkYXRlKGNvbnRlbnQ6IHN0cmluZyk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIFBhZ2VNZXRhQ29sbGVjdGlvbi5zZXRNZXRhKHRoaXMucGFnZSwgdGhpcy5uYW1lLCBjb250ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgbWV0YSB0YWdcbiAgICovXG4gIGRlbGV0ZSgpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiBQYWdlTWV0YUNvbGxlY3Rpb24uZGVsZXRlTWV0YSh0aGlzLnBhZ2UsIHRoaXMubmFtZSk7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUGFnZU1ldGEobmFtZT0ke3RoaXMubmFtZX0sIGNvbnRlbnQ9JHt0aGlzLmNvbnRlbnR9KWA7XG4gIH1cbn1cblxuLyoqXG4gKiBQYWdlIG1ldGEgdGFnIGNvbGxlY3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2VNZXRhQ29sbGVjdGlvbiBleHRlbmRzIEFycmF5PFBhZ2VNZXRhPiB7XG4gIHB1YmxpYyByZWFkb25seSBwYWdlOiBQYWdlUmVmO1xuXG4gIGNvbnN0cnVjdG9yKHBhZ2U6IFBhZ2VSZWYsIG1ldGFzPzogUGFnZU1ldGFbXSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5wYWdlID0gcGFnZTtcbiAgICBpZiAobWV0YXMpIHtcbiAgICAgIHRoaXMucHVzaCguLi5tZXRhcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYnkgbmFtZVxuICAgKiBAcGFyYW0gbmFtZSAtIE1ldGEgdGFnIG5hbWVcbiAgICogQHJldHVybnMgTWV0YSB0YWcgKHVuZGVmaW5lZCBpZiBub3QgZm91bmQpXG4gICAqL1xuICBmaW5kQnlOYW1lKG5hbWU6IHN0cmluZyk6IFBhZ2VNZXRhIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5maW5kKChtZXRhKSA9PiBtZXRhLm5hbWUgPT09IG5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBwYWdlIG1ldGEgdGFnc1xuICAgKiBAcGFyYW0gcGFnZSAtIFBhZ2UgcmVmZXJlbmNlXG4gICAqIEByZXR1cm5zIE1ldGEgdGFnIGNvbGxlY3Rpb25cbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlKHBhZ2U6IFBhZ2VSZWYpOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZU1ldGFDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGFnZS5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdlZGl0L0VkaXRNZXRhTW9kdWxlJyxcbiAgICAgICAgICAgIHBhZ2VJZDogcGFnZS5pZCxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcblxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcignRW1wdHkgcmVzcG9uc2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGh0bWwgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgIGNvbnN0IG1ldGFzOiBQYWdlTWV0YVtdID0gW107XG5cbiAgICAgICAgLy8gUGFyc2UgSFRNTC1lbmNvZGVkIG1ldGEgdGFncyB3aXRoIHJlZ2V4XG4gICAgICAgIC8vIEZvcm1hdDogJmx0O21ldGEgbmFtZT1cInh4eFwiIGNvbnRlbnQ9XCJ5eXlcIi8mZ3Q7XG4gICAgICAgIGNvbnN0IG1ldGFSZWdleCA9IC8mbHQ7bWV0YSBuYW1lPVwiKFteXCJdKylcIiBjb250ZW50PVwiKFteXCJdKilcIlxcLz8mZ3Q7L2c7XG4gICAgICAgIGZvciAoY29uc3QgbWF0Y2ggb2YgaHRtbC5tYXRjaEFsbChtZXRhUmVnZXgpKSB7XG4gICAgICAgICAgY29uc3QgbmFtZSA9IG1hdGNoWzFdO1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBtYXRjaFsyXTtcbiAgICAgICAgICBpZiAobmFtZSkge1xuICAgICAgICAgICAgbWV0YXMucHVzaChcbiAgICAgICAgICAgICAgbmV3IFBhZ2VNZXRhKHtcbiAgICAgICAgICAgICAgICBwYWdlLFxuICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgY29udGVudDogY29udGVudCA/PyAnJyxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQYWdlTWV0YUNvbGxlY3Rpb24ocGFnZSwgbWV0YXMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgcGFnZSBtZXRhczogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IG1ldGEgdGFnXG4gICAqIEBwYXJhbSBwYWdlIC0gUGFnZSByZWZlcmVuY2VcbiAgICogQHBhcmFtIG5hbWUgLSBNZXRhIHRhZyBuYW1lXG4gICAqIEBwYXJhbSBjb250ZW50IC0gTWV0YSB0YWcgdmFsdWVcbiAgICovXG4gIHN0YXRpYyBzZXRNZXRhKHBhZ2U6IFBhZ2VSZWYsIG5hbWU6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICBjb25zdCBsb2dpblJlc3VsdCA9IHBhZ2Uuc2l0ZS5jbGllbnQucmVxdWlyZUxvZ2luKCk7XG4gICAgaWYgKGxvZ2luUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgICAgUHJvbWlzZS5yZWplY3QobG9naW5SZXN1bHQuZXJyb3IpLFxuICAgICAgICAoKSA9PiBuZXcgTG9naW5SZXF1aXJlZEVycm9yKCdMb2dpbiByZXF1aXJlZCB0byBzZXQgbWV0YSB0YWcnKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYWdlLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uOiAnV2lraVBhZ2VBY3Rpb24nLFxuICAgICAgICAgICAgZXZlbnQ6ICdzYXZlTWV0YVRhZycsXG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnZWRpdC9FZGl0TWV0YU1vZHVsZScsXG4gICAgICAgICAgICBwYWdlSWQ6IHBhZ2UuaWQsXG4gICAgICAgICAgICBtZXRhTmFtZTogbmFtZSxcbiAgICAgICAgICAgIG1ldGFDb250ZW50OiBjb250ZW50LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBMb2dpblJlcXVpcmVkRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBzZXQgbWV0YSB0YWc6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBtZXRhIHRhZ1xuICAgKiBAcGFyYW0gcGFnZSAtIFBhZ2UgcmVmZXJlbmNlXG4gICAqIEBwYXJhbSBuYW1lIC0gTWV0YSB0YWcgbmFtZVxuICAgKi9cbiAgc3RhdGljIGRlbGV0ZU1ldGEocGFnZTogUGFnZVJlZiwgbmFtZTogc3RyaW5nKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICBjb25zdCBsb2dpblJlc3VsdCA9IHBhZ2Uuc2l0ZS5jbGllbnQucmVxdWlyZUxvZ2luKCk7XG4gICAgaWYgKGxvZ2luUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgICAgUHJvbWlzZS5yZWplY3QobG9naW5SZXN1bHQuZXJyb3IpLFxuICAgICAgICAoKSA9PiBuZXcgTG9naW5SZXF1aXJlZEVycm9yKCdMb2dpbiByZXF1aXJlZCB0byBkZWxldGUgbWV0YSB0YWcnKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYWdlLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uOiAnV2lraVBhZ2VBY3Rpb24nLFxuICAgICAgICAgICAgZXZlbnQ6ICdkZWxldGVNZXRhVGFnJyxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdlZGl0L0VkaXRNZXRhTW9kdWxlJyxcbiAgICAgICAgICAgIHBhZ2VJZDogcGFnZS5pZCxcbiAgICAgICAgICAgIG1ldGFOYW1lOiBuYW1lLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBMb2dpblJlcXVpcmVkRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBkZWxldGUgbWV0YSB0YWc6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG59XG4iLAogICAgImltcG9ydCAqIGFzIGNoZWVyaW8gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQgeyBOb0VsZW1lbnRFcnJvciwgVW5leHBlY3RlZEVycm9yIH0gZnJvbSAnLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdFVzZXIgfSBmcm9tICcuLi91c2VyJztcbmltcG9ydCB0eXBlIHsgUGFnZSB9IGZyb20gJy4vcGFnZSc7XG5pbXBvcnQgdHlwZSB7IFBhZ2VTb3VyY2UgfSBmcm9tICcuL3BhZ2Utc291cmNlJztcblxuLyoqXG4gKiBQYWdlIHJldmlzaW9uIGRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYWdlUmV2aXNpb25EYXRhIHtcbiAgcGFnZTogUGFnZTtcbiAgaWQ6IG51bWJlcjtcbiAgcmV2Tm86IG51bWJlcjtcbiAgY3JlYXRlZEJ5OiBBYnN0cmFjdFVzZXI7XG4gIGNyZWF0ZWRBdDogRGF0ZTtcbiAgY29tbWVudDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhZ2UgcmV2aXNpb24gKHZlcnNpb24gaW4gZWRpdCBoaXN0b3J5KVxuICovXG5leHBvcnQgY2xhc3MgUGFnZVJldmlzaW9uIHtcbiAgLyoqIFBhZ2UgdGhpcyByZXZpc2lvbiBiZWxvbmdzIHRvICovXG4gIHB1YmxpYyByZWFkb25seSBwYWdlOiBQYWdlO1xuXG4gIC8qKiBSZXZpc2lvbiBJRCAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaWQ6IG51bWJlcjtcblxuICAvKiogUmV2aXNpb24gbnVtYmVyICovXG4gIHB1YmxpYyByZWFkb25seSByZXZObzogbnVtYmVyO1xuXG4gIC8qKiBSZXZpc2lvbiBjcmVhdG9yICovXG4gIHB1YmxpYyByZWFkb25seSBjcmVhdGVkQnk6IEFic3RyYWN0VXNlcjtcblxuICAvKiogUmV2aXNpb24gY3JlYXRpb24gZGF0ZSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY3JlYXRlZEF0OiBEYXRlO1xuXG4gIC8qKiBFZGl0IGNvbW1lbnQgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNvbW1lbnQ6IHN0cmluZztcblxuICAvKiogU291cmNlIGNvZGUgKGludGVybmFsIGNhY2hlKSAqL1xuICBwcml2YXRlIF9zb3VyY2U6IFBhZ2VTb3VyY2UgfCBudWxsID0gbnVsbDtcblxuICAvKiogSFRNTCBkaXNwbGF5IChpbnRlcm5hbCBjYWNoZSkgKi9cbiAgcHJpdmF0ZSBfaHRtbDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoZGF0YTogUGFnZVJldmlzaW9uRGF0YSkge1xuICAgIHRoaXMucGFnZSA9IGRhdGEucGFnZTtcbiAgICB0aGlzLmlkID0gZGF0YS5pZDtcbiAgICB0aGlzLnJldk5vID0gZGF0YS5yZXZObztcbiAgICB0aGlzLmNyZWF0ZWRCeSA9IGRhdGEuY3JlYXRlZEJ5O1xuICAgIHRoaXMuY3JlYXRlZEF0ID0gZGF0YS5jcmVhdGVkQXQ7XG4gICAgdGhpcy5jb21tZW50ID0gZGF0YS5jb21tZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgc291cmNlIGNvZGUgaGFzIGJlZW4gYWNxdWlyZWRcbiAgICovXG4gIGlzU291cmNlQWNxdWlyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NvdXJjZSAhPT0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIEhUTUwgZGlzcGxheSBoYXMgYmVlbiBhY3F1aXJlZFxuICAgKi9cbiAgaXNIdG1sQWNxdWlyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2h0bWwgIT09IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNvdXJjZSBjb2RlIChjYWNoZWQpXG4gICAqL1xuICBnZXQgc291cmNlKCk6IFBhZ2VTb3VyY2UgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fc291cmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBzb3VyY2UgY29kZVxuICAgKi9cbiAgc2V0IHNvdXJjZSh2YWx1ZTogUGFnZVNvdXJjZSB8IG51bGwpIHtcbiAgICB0aGlzLl9zb3VyY2UgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgSFRNTCBkaXNwbGF5IChjYWNoZWQpXG4gICAqL1xuICBnZXQgaHRtbCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5faHRtbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgSFRNTCBkaXNwbGF5XG4gICAqL1xuICBzZXQgaHRtbCh2YWx1ZTogc3RyaW5nIHwgbnVsbCkge1xuICAgIHRoaXMuX2h0bWwgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcmV2aXNpb24gc291cmNlIChSRVYtMDAxKVxuICAgKiBAcmV0dXJucyBTb3VyY2Ugc3RyaW5nXG4gICAqL1xuICBnZXRTb3VyY2UoKTogV2lraWRvdFJlc3VsdEFzeW5jPHN0cmluZz4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIFJldHVybiBjYWNoZSBpZiBhdmFpbGFibGVcbiAgICAgICAgaWYgKHRoaXMuX3NvdXJjZSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9zb3VyY2Uud2lraVRleHQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnBhZ2Uuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnaGlzdG9yeS9QYWdlU291cmNlTW9kdWxlJyxcbiAgICAgICAgICAgIHJldmlzaW9uX2lkOiB0aGlzLmlkLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdFbXB0eSByZXNwb25zZSBmcm9tIFBhZ2VTb3VyY2VNb2R1bGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGh0bWwgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoaHRtbCk7XG5cbiAgICAgICAgLy8gU291cmNlIGNvZGUgaXMgaW5zaWRlIDxkaXYgY2xhc3M9XCJwYWdlLXNvdXJjZVwiPlxuICAgICAgICBjb25zdCBzb3VyY2VFbGVtID0gJCgnZGl2LnBhZ2Utc291cmNlJyk7XG4gICAgICAgIGlmIChzb3VyY2VFbGVtLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcignU291cmNlIGVsZW1lbnQgbm90IGZvdW5kJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzb3VyY2VUZXh0ID0gc291cmNlRWxlbS50ZXh0KCk7XG4gICAgICAgIHJldHVybiBzb3VyY2VUZXh0O1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCByZXZpc2lvbiBzb3VyY2U6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCByZXZpc2lvbiBIVE1MIChSRVYtMDAyKVxuICAgKiBAcmV0dXJucyBIVE1MIHN0cmluZ1xuICAgKi9cbiAgZ2V0SHRtbCgpOiBXaWtpZG90UmVzdWx0QXN5bmM8c3RyaW5nPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gUmV0dXJuIGNhY2hlIGlmIGF2YWlsYWJsZVxuICAgICAgICBpZiAodGhpcy5faHRtbCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9odG1sO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5wYWdlLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2hpc3RvcnkvUGFnZVZlcnNpb25Nb2R1bGUnLFxuICAgICAgICAgICAgcmV2aXNpb25faWQ6IHRoaXMuaWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ0VtcHR5IHJlc3BvbnNlIGZyb20gUGFnZVZlcnNpb25Nb2R1bGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGh0bWwgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoaHRtbCk7XG5cbiAgICAgICAgLy8gSFRNTCBjb250ZW50IGlzIGluc2lkZSA8ZGl2IGlkPVwicGFnZS1jb250ZW50XCI+XG4gICAgICAgIGNvbnN0IGNvbnRlbnRFbGVtID0gJCgnI3BhZ2UtY29udGVudCcpO1xuICAgICAgICBpZiAoY29udGVudEVsZW0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgLy8gUmV0dXJuIGVudGlyZSBib2R5IGlmIHBhZ2UtY29udGVudCBkb2Vzbid0IGV4aXN0XG4gICAgICAgICAgdGhpcy5faHRtbCA9IGh0bWw7XG4gICAgICAgICAgcmV0dXJuIGh0bWw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb250ZW50SHRtbCA9IGNvbnRlbnRFbGVtLmh0bWwoKSA/PyAnJztcbiAgICAgICAgdGhpcy5faHRtbCA9IGNvbnRlbnRIdG1sO1xuICAgICAgICByZXR1cm4gY29udGVudEh0bWw7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHJldmlzaW9uIEhUTUw6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBhZ2VSZXZpc2lvbihpZD0ke3RoaXMuaWR9LCByZXZObz0ke3RoaXMucmV2Tm99KWA7XG4gIH1cbn1cblxuLyoqXG4gKiBQYWdlIHJldmlzaW9uIGNvbGxlY3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2VSZXZpc2lvbkNvbGxlY3Rpb24gZXh0ZW5kcyBBcnJheTxQYWdlUmV2aXNpb24+IHtcbiAgcHVibGljIHJlYWRvbmx5IHBhZ2U6IFBhZ2UgfCBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKHBhZ2U6IFBhZ2UgfCBudWxsLCByZXZpc2lvbnM/OiBQYWdlUmV2aXNpb25bXSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5wYWdlID0gcGFnZTtcbiAgICBpZiAocmV2aXNpb25zKSB7XG4gICAgICB0aGlzLnB1c2goLi4ucmV2aXNpb25zKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBieSBJRFxuICAgKiBAcGFyYW0gaWQgLSBSZXZpc2lvbiBJRFxuICAgKiBAcmV0dXJucyBSZXZpc2lvbiAodW5kZWZpbmVkIGlmIG5vdCBmb3VuZClcbiAgICovXG4gIGZpbmRCeUlkKGlkOiBudW1iZXIpOiBQYWdlUmV2aXNpb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbmQoKHJldmlzaW9uKSA9PiByZXZpc2lvbi5pZCA9PT0gaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzb3VyY2VzIGZvciBhbGwgcmV2aXNpb25zXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIHNvdXJjZSBzdHJpbmdzXG4gICAqL1xuICBnZXRTb3VyY2VzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxzdHJpbmdbXT4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICB0aGlzLm1hcChhc3luYyAocmV2aXNpb24pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJldmlzaW9uLmdldFNvdXJjZSgpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQudmFsdWU7XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHNvdXJjZXM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBIVE1MIGZvciBhbGwgcmV2aXNpb25zXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIEhUTUwgc3RyaW5nc1xuICAgKi9cbiAgZ2V0SHRtbHMoKTogV2lraWRvdFJlc3VsdEFzeW5jPHN0cmluZ1tdPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIHRoaXMubWFwKGFzeW5jIChyZXZpc2lvbikgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmV2aXNpb24uZ2V0SHRtbCgpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQudmFsdWU7XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IEhUTUxzOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFBhZ2UgfSBmcm9tICcuL3BhZ2UnO1xuXG4vKipcbiAqIFBhZ2Ugc291cmNlIGRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYWdlU291cmNlRGF0YSB7XG4gIHBhZ2U6IFBhZ2U7XG4gIHdpa2lUZXh0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFnZSBzb3VyY2UgY29kZSAoV2lraWRvdCBzeW50YXgpXG4gKi9cbmV4cG9ydCBjbGFzcyBQYWdlU291cmNlIHtcbiAgLyoqIFBhZ2UgdGhpcyBzb3VyY2UgYmVsb25ncyB0byAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGFnZTogUGFnZTtcblxuICAvKiogU291cmNlIGNvZGUgKFdpa2lkb3Qgc3ludGF4KSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgd2lraVRleHQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBQYWdlU291cmNlRGF0YSkge1xuICAgIHRoaXMucGFnZSA9IGRhdGEucGFnZTtcbiAgICB0aGlzLndpa2lUZXh0ID0gZGF0YS53aWtpVGV4dDtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQYWdlU291cmNlKHBhZ2U9JHt0aGlzLnBhZ2UuZnVsbG5hbWV9LCBsZW5ndGg9JHt0aGlzLndpa2lUZXh0Lmxlbmd0aH0pYDtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IEFic3RyYWN0VXNlciB9IGZyb20gJy4uL3VzZXInO1xuaW1wb3J0IHR5cGUgeyBQYWdlIH0gZnJvbSAnLi9wYWdlJztcblxuLyoqXG4gKiBQYWdlIHZvdGUgZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VWb3RlRGF0YSB7XG4gIHBhZ2U6IFBhZ2U7XG4gIHVzZXI6IEFic3RyYWN0VXNlcjtcbiAgdmFsdWU6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQYWdlIHZvdGUgKHJhdGluZylcbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2VWb3RlIHtcbiAgLyoqIFBhZ2UgdGhpcyB2b3RlIGJlbG9uZ3MgdG8gKi9cbiAgcHVibGljIHJlYWRvbmx5IHBhZ2U6IFBhZ2U7XG5cbiAgLyoqIFVzZXIgd2hvIHZvdGVkICovXG4gIHB1YmxpYyByZWFkb25seSB1c2VyOiBBYnN0cmFjdFVzZXI7XG5cbiAgLyoqIFZvdGUgdmFsdWUgKCsxLy0xIG9yIG51bWVyaWMpICovXG4gIHB1YmxpYyByZWFkb25seSB2YWx1ZTogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IFBhZ2VWb3RlRGF0YSkge1xuICAgIHRoaXMucGFnZSA9IGRhdGEucGFnZTtcbiAgICB0aGlzLnVzZXIgPSBkYXRhLnVzZXI7XG4gICAgdGhpcy52YWx1ZSA9IGRhdGEudmFsdWU7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUGFnZVZvdGUodXNlcj0ke3RoaXMudXNlci5uYW1lfSwgdmFsdWU9JHt0aGlzLnZhbHVlfSlgO1xuICB9XG59XG5cbi8qKlxuICogUGFnZSB2b3RlIGNvbGxlY3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2VWb3RlQ29sbGVjdGlvbiBleHRlbmRzIEFycmF5PFBhZ2VWb3RlPiB7XG4gIHB1YmxpYyByZWFkb25seSBwYWdlOiBQYWdlO1xuXG4gIGNvbnN0cnVjdG9yKHBhZ2U6IFBhZ2UsIHZvdGVzPzogUGFnZVZvdGVbXSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5wYWdlID0gcGFnZTtcbiAgICBpZiAodm90ZXMpIHtcbiAgICAgIHRoaXMucHVzaCguLi52b3Rlcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYnkgdXNlclxuICAgKiBAcGFyYW0gdXNlciAtIFVzZXIgdG8gc2VhcmNoIGZvclxuICAgKiBAcmV0dXJucyBWb3RlICh1bmRlZmluZWQgaWYgbm90IGZvdW5kKVxuICAgKi9cbiAgZmluZEJ5VXNlcih1c2VyOiBBYnN0cmFjdFVzZXIpOiBQYWdlVm90ZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmluZCgodm90ZSkgPT4gdm90ZS51c2VyLmlkID09PSB1c2VyLmlkKTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IEFic3RyYWN0VXNlciB9IGZyb20gJy4uL3VzZXInO1xuXG4vKipcbiAqIFBhZ2Ugc2VhcmNoIHF1ZXJ5IHBhcmFtZXRlcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hQYWdlc1F1ZXJ5UGFyYW1zIHtcbiAgLyoqIFBhZ2UgdHlwZSAoZS5nLiwgJ25vcm1hbCcsICdhZG1pbicpICovXG4gIHBhZ2V0eXBlPzogc3RyaW5nO1xuICAvKiogQ2F0ZWdvcnkgbmFtZSAqL1xuICBjYXRlZ29yeT86IHN0cmluZztcbiAgLyoqIFRhZ3MgdG8gc2VhcmNoIChBTkQgY29uZGl0aW9uKSAqL1xuICB0YWdzPzogc3RyaW5nIHwgc3RyaW5nW107XG4gIC8qKiBQYXJlbnQgcGFnZSBuYW1lICovXG4gIHBhcmVudD86IHN0cmluZztcbiAgLyoqIExpbmtlZCBwYWdlIG5hbWUgKi9cbiAgbGlua1RvPzogc3RyaW5nO1xuICAvKiogQ3JlYXRlZCBkYXRlIGNvbmRpdGlvbiAqL1xuICBjcmVhdGVkQXQ/OiBzdHJpbmc7XG4gIC8qKiBVcGRhdGVkIGRhdGUgY29uZGl0aW9uICovXG4gIHVwZGF0ZWRBdD86IHN0cmluZztcbiAgLyoqIENyZWF0b3IgKi9cbiAgY3JlYXRlZEJ5PzogQWJzdHJhY3RVc2VyIHwgc3RyaW5nO1xuICAvKiogUmF0aW5nIGNvbmRpdGlvbiAqL1xuICByYXRpbmc/OiBzdHJpbmc7XG4gIC8qKiBWb3RlIGNvdW50IGNvbmRpdGlvbiAqL1xuICB2b3Rlcz86IHN0cmluZztcbiAgLyoqIFBhZ2UgbmFtZSBjb25kaXRpb24gKi9cbiAgbmFtZT86IHN0cmluZztcbiAgLyoqIEZ1bGxuYW1lIChleGFjdCBtYXRjaCkgKi9cbiAgZnVsbG5hbWU/OiBzdHJpbmc7XG4gIC8qKiBSYW5nZSBzcGVjaWZpY2F0aW9uICovXG4gIHJhbmdlPzogc3RyaW5nO1xuICAvKiogU29ydCBvcmRlciAoZS5nLiwgJ2NyZWF0ZWRfYXQgZGVzYycpICovXG4gIG9yZGVyPzogc3RyaW5nO1xuICAvKiogU3RhcnQgb2Zmc2V0ICovXG4gIG9mZnNldD86IG51bWJlcjtcbiAgLyoqIFJlc3VsdCBsaW1pdCAqL1xuICBsaW1pdD86IG51bWJlcjtcbiAgLyoqIEl0ZW1zIHBlciBwYWdlICovXG4gIHBlclBhZ2U/OiBudW1iZXI7XG4gIC8qKiBTZXBhcmF0ZSBkaXNwbGF5ICovXG4gIHNlcGFyYXRlPzogc3RyaW5nO1xuICAvKiogV3JhcHBlciBkaXNwbGF5ICovXG4gIHdyYXBwZXI/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogRGVmYXVsdCBpdGVtcyBwZXIgcGFnZVxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9QRVJfUEFHRSA9IDI1MDtcblxuLyoqXG4gKiBEZWZhdWx0IG1vZHVsZSBib2R5IGZpZWxkc1xuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9NT0RVTEVfQk9EWSA9IFtcbiAgJ2Z1bGxuYW1lJyxcbiAgJ2NhdGVnb3J5JyxcbiAgJ25hbWUnLFxuICAndGl0bGUnLFxuICAnY3JlYXRlZF9hdCcsXG4gICdjcmVhdGVkX2J5X2xpbmtlZCcsXG4gICd1cGRhdGVkX2F0JyxcbiAgJ3VwZGF0ZWRfYnlfbGlua2VkJyxcbiAgJ2NvbW1lbnRlZF9hdCcsXG4gICdjb21tZW50ZWRfYnlfbGlua2VkJyxcbiAgJ3BhcmVudF9mdWxsbmFtZScsXG4gICdjb21tZW50cycsXG4gICdzaXplJyxcbiAgJ2NoaWxkcmVuJyxcbiAgJ3JhdGluZ192b3RlcycsXG4gICdyYXRpbmcnLFxuICAncmF0aW5nX3BlcmNlbnQnLFxuICAncmV2aXNpb25zJyxcbiAgJ3RhZ3MnLFxuICAnX3RhZ3MnLFxuXSBhcyBjb25zdDtcblxuLyoqXG4gKiBQYWdlIHNlYXJjaCBxdWVyeVxuICovXG5leHBvcnQgY2xhc3MgU2VhcmNoUGFnZXNRdWVyeSB7XG4gIC8qKiBQYWdlIHR5cGUgKi9cbiAgcGFnZXR5cGU6IHN0cmluZztcbiAgLyoqIENhdGVnb3J5ICovXG4gIGNhdGVnb3J5OiBzdHJpbmc7XG4gIC8qKiBUYWdzICovXG4gIHRhZ3M6IHN0cmluZyB8IHN0cmluZ1tdIHwgbnVsbDtcbiAgLyoqIFBhcmVudCBwYWdlICovXG4gIHBhcmVudDogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIExpbmsgdGFyZ2V0ICovXG4gIGxpbmtUbzogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIENyZWF0ZWQgZGF0ZSBjb25kaXRpb24gKi9cbiAgY3JlYXRlZEF0OiBzdHJpbmcgfCBudWxsO1xuICAvKiogVXBkYXRlZCBkYXRlIGNvbmRpdGlvbiAqL1xuICB1cGRhdGVkQXQ6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBDcmVhdG9yICovXG4gIGNyZWF0ZWRCeTogQWJzdHJhY3RVc2VyIHwgc3RyaW5nIHwgbnVsbDtcbiAgLyoqIFJhdGluZyBjb25kaXRpb24gKi9cbiAgcmF0aW5nOiBzdHJpbmcgfCBudWxsO1xuICAvKiogVm90ZSBjb3VudCBjb25kaXRpb24gKi9cbiAgdm90ZXM6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBQYWdlIG5hbWUgY29uZGl0aW9uICovXG4gIG5hbWU6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBGdWxsbmFtZSBjb25kaXRpb24gKi9cbiAgZnVsbG5hbWU6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBSYW5nZSAqL1xuICByYW5nZTogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIFNvcnQgb3JkZXIgKi9cbiAgb3JkZXI6IHN0cmluZztcbiAgLyoqIE9mZnNldCAqL1xuICBvZmZzZXQ6IG51bWJlcjtcbiAgLyoqIFJlc3VsdCBsaW1pdCAqL1xuICBsaW1pdDogbnVtYmVyIHwgbnVsbDtcbiAgLyoqIEl0ZW1zIHBlciBwYWdlICovXG4gIHBlclBhZ2U6IG51bWJlcjtcbiAgLyoqIFNlcGFyYXRlIGRpc3BsYXkgKi9cbiAgc2VwYXJhdGU6IHN0cmluZztcbiAgLyoqIFdyYXBwZXIgZGlzcGxheSAqL1xuICB3cmFwcGVyOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IocGFyYW1zOiBTZWFyY2hQYWdlc1F1ZXJ5UGFyYW1zID0ge30pIHtcbiAgICB0aGlzLnBhZ2V0eXBlID0gcGFyYW1zLnBhZ2V0eXBlID8/ICcqJztcbiAgICB0aGlzLmNhdGVnb3J5ID0gcGFyYW1zLmNhdGVnb3J5ID8/ICcqJztcbiAgICB0aGlzLnRhZ3MgPSBwYXJhbXMudGFncyA/PyBudWxsO1xuICAgIHRoaXMucGFyZW50ID0gcGFyYW1zLnBhcmVudCA/PyBudWxsO1xuICAgIHRoaXMubGlua1RvID0gcGFyYW1zLmxpbmtUbyA/PyBudWxsO1xuICAgIHRoaXMuY3JlYXRlZEF0ID0gcGFyYW1zLmNyZWF0ZWRBdCA/PyBudWxsO1xuICAgIHRoaXMudXBkYXRlZEF0ID0gcGFyYW1zLnVwZGF0ZWRBdCA/PyBudWxsO1xuICAgIHRoaXMuY3JlYXRlZEJ5ID0gcGFyYW1zLmNyZWF0ZWRCeSA/PyBudWxsO1xuICAgIHRoaXMucmF0aW5nID0gcGFyYW1zLnJhdGluZyA/PyBudWxsO1xuICAgIHRoaXMudm90ZXMgPSBwYXJhbXMudm90ZXMgPz8gbnVsbDtcbiAgICB0aGlzLm5hbWUgPSBwYXJhbXMubmFtZSA/PyBudWxsO1xuICAgIHRoaXMuZnVsbG5hbWUgPSBwYXJhbXMuZnVsbG5hbWUgPz8gbnVsbDtcbiAgICB0aGlzLnJhbmdlID0gcGFyYW1zLnJhbmdlID8/IG51bGw7XG4gICAgdGhpcy5vcmRlciA9IHBhcmFtcy5vcmRlciA/PyAnY3JlYXRlZF9hdCBkZXNjJztcbiAgICB0aGlzLm9mZnNldCA9IHBhcmFtcy5vZmZzZXQgPz8gMDtcbiAgICB0aGlzLmxpbWl0ID0gcGFyYW1zLmxpbWl0ID8/IG51bGw7XG4gICAgdGhpcy5wZXJQYWdlID0gcGFyYW1zLnBlclBhZ2UgPz8gREVGQVVMVF9QRVJfUEFHRTtcbiAgICB0aGlzLnNlcGFyYXRlID0gcGFyYW1zLnNlcGFyYXRlID8/ICdubyc7XG4gICAgdGhpcy53cmFwcGVyID0gcGFyYW1zLndyYXBwZXIgPz8gJ25vJztcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IHRvIGRpY3Rpb25hcnkgZm9ybWF0XG4gICAqL1xuICBhc0RpY3QoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAgIC8vIHBhZ2V0eXBlIGFuZCBjYXRlZ29yeSBtdXN0IGFsd2F5cyBiZSBpbmNsdWRlZFxuICAgIC8vIFdpa2lkb3QgZGVmYXVsdHM6IHBhZ2V0eXBlPVwibm9ybWFsXCIsIGNhdGVnb3J5PVwiLlwiIChjdXJyZW50IGNhdGVnb3J5KVxuICAgIC8vIFRvIGdldCBhbGwgcGFnZXMsIHdlIG5lZWQgdG8gZXhwbGljaXRseSBzZW5kIFwiKlwiXG4gICAgcmVzdWx0LnBhZ2V0eXBlID0gdGhpcy5wYWdldHlwZTtcbiAgICByZXN1bHQuY2F0ZWdvcnkgPSB0aGlzLmNhdGVnb3J5O1xuICAgIGlmICh0aGlzLnRhZ3MgIT09IG51bGwpIHtcbiAgICAgIHJlc3VsdC50YWdzID0gQXJyYXkuaXNBcnJheSh0aGlzLnRhZ3MpID8gdGhpcy50YWdzLmpvaW4oJyAnKSA6IHRoaXMudGFncztcbiAgICB9XG4gICAgaWYgKHRoaXMucGFyZW50ICE9PSBudWxsKSByZXN1bHQucGFyZW50ID0gdGhpcy5wYXJlbnQ7XG4gICAgaWYgKHRoaXMubGlua1RvICE9PSBudWxsKSByZXN1bHQubGlua190byA9IHRoaXMubGlua1RvO1xuICAgIGlmICh0aGlzLmNyZWF0ZWRBdCAhPT0gbnVsbCkgcmVzdWx0LmNyZWF0ZWRfYXQgPSB0aGlzLmNyZWF0ZWRBdDtcbiAgICBpZiAodGhpcy51cGRhdGVkQXQgIT09IG51bGwpIHJlc3VsdC51cGRhdGVkX2F0ID0gdGhpcy51cGRhdGVkQXQ7XG4gICAgaWYgKHRoaXMuY3JlYXRlZEJ5ICE9PSBudWxsKSB7XG4gICAgICByZXN1bHQuY3JlYXRlZF9ieSA9IHR5cGVvZiB0aGlzLmNyZWF0ZWRCeSA9PT0gJ3N0cmluZycgPyB0aGlzLmNyZWF0ZWRCeSA6IHRoaXMuY3JlYXRlZEJ5Lm5hbWU7XG4gICAgfVxuICAgIGlmICh0aGlzLnJhdGluZyAhPT0gbnVsbCkgcmVzdWx0LnJhdGluZyA9IHRoaXMucmF0aW5nO1xuICAgIGlmICh0aGlzLnZvdGVzICE9PSBudWxsKSByZXN1bHQudm90ZXMgPSB0aGlzLnZvdGVzO1xuICAgIGlmICh0aGlzLm5hbWUgIT09IG51bGwpIHJlc3VsdC5uYW1lID0gdGhpcy5uYW1lO1xuICAgIGlmICh0aGlzLmZ1bGxuYW1lICE9PSBudWxsKSByZXN1bHQuZnVsbG5hbWUgPSB0aGlzLmZ1bGxuYW1lO1xuICAgIGlmICh0aGlzLnJhbmdlICE9PSBudWxsKSByZXN1bHQucmFuZ2UgPSB0aGlzLnJhbmdlO1xuXG4gICAgcmVzdWx0Lm9yZGVyID0gdGhpcy5vcmRlcjtcbiAgICByZXN1bHQub2Zmc2V0ID0gdGhpcy5vZmZzZXQ7XG4gICAgaWYgKHRoaXMubGltaXQgIT09IG51bGwpIHJlc3VsdC5saW1pdCA9IHRoaXMubGltaXQ7XG4gICAgcmVzdWx0LnBlclBhZ2UgPSB0aGlzLnBlclBhZ2U7XG4gICAgcmVzdWx0LnNlcGFyYXRlID0gdGhpcy5zZXBhcmF0ZTtcbiAgICByZXN1bHQud3JhcHBlciA9IHRoaXMud3JhcHBlcjtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0ICogYXMgY2hlZXJpbyBmcm9tICdjaGVlcmlvJztcbmltcG9ydCB7IE5vRWxlbWVudEVycm9yLCBVbmV4cGVjdGVkRXJyb3IgfSBmcm9tICcuLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyBwYXJzZU9kYXRlLCBwYXJzZVVzZXIgfSBmcm9tICcuLi8uLi91dGlsL3BhcnNlcic7XG5pbXBvcnQgdHlwZSB7IFNpdGUgfSBmcm9tICcuLi9zaXRlJztcbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RVc2VyIH0gZnJvbSAnLi4vdXNlcic7XG5cbi8qKlxuICogU2l0ZSBjaGFuZ2UgaGlzdG9yeSBkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2l0ZUNoYW5nZURhdGEge1xuICBzaXRlOiBTaXRlO1xuICBwYWdlRnVsbG5hbWU6IHN0cmluZztcbiAgcGFnZVRpdGxlOiBzdHJpbmc7XG4gIHJldmlzaW9uTm86IG51bWJlcjtcbiAgY2hhbmdlZEJ5OiBBYnN0cmFjdFVzZXIgfCBudWxsO1xuICBjaGFuZ2VkQXQ6IERhdGUgfCBudWxsO1xuICBmbGFnczogc3RyaW5nW107XG4gIGNvbW1lbnQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBTaXRlIGNoYW5nZSBoaXN0b3J5XG4gKi9cbmV4cG9ydCBjbGFzcyBTaXRlQ2hhbmdlIHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG4gIHB1YmxpYyByZWFkb25seSBwYWdlRnVsbG5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHBhZ2VUaXRsZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgcmV2aXNpb25ObzogbnVtYmVyO1xuICBwdWJsaWMgcmVhZG9ubHkgY2hhbmdlZEJ5OiBBYnN0cmFjdFVzZXIgfCBudWxsO1xuICBwdWJsaWMgcmVhZG9ubHkgY2hhbmdlZEF0OiBEYXRlIHwgbnVsbDtcbiAgcHVibGljIHJlYWRvbmx5IGZsYWdzOiBzdHJpbmdbXTtcbiAgcHVibGljIHJlYWRvbmx5IGNvbW1lbnQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBTaXRlQ2hhbmdlRGF0YSkge1xuICAgIHRoaXMuc2l0ZSA9IGRhdGEuc2l0ZTtcbiAgICB0aGlzLnBhZ2VGdWxsbmFtZSA9IGRhdGEucGFnZUZ1bGxuYW1lO1xuICAgIHRoaXMucGFnZVRpdGxlID0gZGF0YS5wYWdlVGl0bGU7XG4gICAgdGhpcy5yZXZpc2lvbk5vID0gZGF0YS5yZXZpc2lvbk5vO1xuICAgIHRoaXMuY2hhbmdlZEJ5ID0gZGF0YS5jaGFuZ2VkQnk7XG4gICAgdGhpcy5jaGFuZ2VkQXQgPSBkYXRhLmNoYW5nZWRBdDtcbiAgICB0aGlzLmZsYWdzID0gZGF0YS5mbGFncztcbiAgICB0aGlzLmNvbW1lbnQgPSBkYXRhLmNvbW1lbnQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBhZ2UgVVJMXG4gICAqL1xuICBnZXRQYWdlVXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuc2l0ZS5nZXRCYXNlVXJsKCl9LyR7dGhpcy5wYWdlRnVsbG5hbWV9YDtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBTaXRlQ2hhbmdlKHBhZ2U9JHt0aGlzLnBhZ2VGdWxsbmFtZX0sIHJldj0ke3RoaXMucmV2aXNpb25Ob30sIGJ5PSR7dGhpcy5jaGFuZ2VkQnl9KWA7XG4gIH1cbn1cblxuLyoqXG4gKiBTaXRlIGNoYW5nZSBoaXN0b3J5IGNvbGxlY3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFNpdGVDaGFuZ2VDb2xsZWN0aW9uIGV4dGVuZHMgQXJyYXk8U2l0ZUNoYW5nZT4ge1xuICBwdWJsaWMgcmVhZG9ubHkgc2l0ZTogU2l0ZTtcblxuICBjb25zdHJ1Y3RvcihzaXRlOiBTaXRlLCBjaGFuZ2VzPzogU2l0ZUNoYW5nZVtdKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnNpdGUgPSBzaXRlO1xuICAgIGlmIChjaGFuZ2VzKSB7XG4gICAgICB0aGlzLnB1c2goLi4uY2hhbmdlcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCByZWNlbnQgY2hhbmdlIGhpc3RvcnlcbiAgICogQHBhcmFtIHNpdGUgLSBTaXRlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uc1xuICAgKiBAcmV0dXJucyBDaGFuZ2UgaGlzdG9yeSBjb2xsZWN0aW9uXG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZShcbiAgICBzaXRlOiBTaXRlLFxuICAgIG9wdGlvbnM/OiB7IHBlclBhZ2U/OiBudW1iZXI7IHBhZ2U/OiBudW1iZXI7IGxpbWl0PzogbnVtYmVyIH1cbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPFNpdGVDaGFuZ2VDb2xsZWN0aW9uPiB7XG4gICAgY29uc3QgcGVyUGFnZSA9IG9wdGlvbnM/LnBlclBhZ2UgPz8gMjA7XG4gICAgY29uc3QgcGFnZSA9IG9wdGlvbnM/LnBhZ2UgPz8gMTtcbiAgICBjb25zdCBsaW1pdCA9IG9wdGlvbnM/LmxpbWl0O1xuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnY2hhbmdlcy9TaXRlQ2hhbmdlc0xpc3RNb2R1bGUnLFxuICAgICAgICAgICAgcGVycGFnZTogcGVyUGFnZSxcbiAgICAgICAgICAgIHBhZ2U6IHBhZ2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ0VtcHR5IHJlc3BvbnNlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBodG1sID0gU3RyaW5nKHJlc3BvbnNlLmJvZHkgPz8gJycpO1xuICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGh0bWwpO1xuICAgICAgICBjb25zdCBjaGFuZ2VzOiBTaXRlQ2hhbmdlW10gPSBbXTtcblxuICAgICAgICAvLyBQYXJzZSB0YWJsZSByb3dzXG4gICAgICAgICQoJ3RhYmxlLndpa2ktY29udGVudC10YWJsZSB0cicpLmVhY2goKF9pLCBlbGVtKSA9PiB7XG4gICAgICAgICAgY29uc3QgJHJvdyA9ICQoZWxlbSk7XG4gICAgICAgICAgY29uc3QgJGNlbGxzID0gJHJvdy5maW5kKCd0ZCcpO1xuICAgICAgICAgIGlmICgkY2VsbHMubGVuZ3RoIDwgNCkgcmV0dXJuO1xuXG4gICAgICAgICAgLy8gUGFnZSBsaW5rXG4gICAgICAgICAgY29uc3QgcGFnZUxpbmsgPSAkKCRjZWxsc1swXSkuZmluZCgnYScpO1xuICAgICAgICAgIGNvbnN0IGhyZWYgPSBwYWdlTGluay5hdHRyKCdocmVmJykgPz8gJyc7XG4gICAgICAgICAgY29uc3QgcGFnZUZ1bGxuYW1lID0gaHJlZi5yZXBsYWNlKC9eXFwvLywgJycpLnNwbGl0KCcvJylbMF0gPz8gJyc7XG4gICAgICAgICAgY29uc3QgcGFnZVRpdGxlID0gcGFnZUxpbmsudGV4dCgpLnRyaW0oKTtcblxuICAgICAgICAgIC8vIFJldmlzaW9uIG51bWJlclxuICAgICAgICAgIGNvbnN0IHJldlRleHQgPSAkKCRjZWxsc1sxXSkudGV4dCgpLnRyaW0oKTtcbiAgICAgICAgICBjb25zdCByZXZNYXRjaCA9IHJldlRleHQubWF0Y2goLyhcXGQrKS8pO1xuICAgICAgICAgIGNvbnN0IHJldmlzaW9uTm8gPSByZXZNYXRjaD8uWzFdID8gTnVtYmVyLnBhcnNlSW50KHJldk1hdGNoWzFdLCAxMCkgOiAwO1xuXG4gICAgICAgICAgLy8gRmxhZ3NcbiAgICAgICAgICBjb25zdCBmbGFnc0NlbGwgPSAkKCRjZWxsc1syXSk7XG4gICAgICAgICAgY29uc3QgZmxhZ3M6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgZmxhZ3NDZWxsLmZpbmQoJ3NwYW4nKS5lYWNoKChfaiwgZmxhZ0VsZW0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZsYWdDbGFzcyA9ICQoZmxhZ0VsZW0pLmF0dHIoJ2NsYXNzJykgPz8gJyc7XG4gICAgICAgICAgICBpZiAoZmxhZ0NsYXNzLmluY2x1ZGVzKCdzcGFudGlwJykpIHtcbiAgICAgICAgICAgICAgY29uc3QgdGl0bGUgPSAkKGZsYWdFbGVtKS5hdHRyKCd0aXRsZScpID8/ICcnO1xuICAgICAgICAgICAgICBpZiAodGl0bGUpIGZsYWdzLnB1c2godGl0bGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gVXNlciBhbmQgdGltZXN0YW1wXG4gICAgICAgICAgY29uc3QgaW5mb0NlbGwgPSAkKCRjZWxsc1szXSk7XG4gICAgICAgICAgY29uc3QgdXNlckVsZW0gPSBpbmZvQ2VsbC5maW5kKCdzcGFuLnByaW50dXNlcicpO1xuICAgICAgICAgIGNvbnN0IGNoYW5nZWRCeSA9IHVzZXJFbGVtLmxlbmd0aCA+IDAgPyBwYXJzZVVzZXIoc2l0ZS5jbGllbnQsIHVzZXJFbGVtKSA6IG51bGw7XG5cbiAgICAgICAgICBjb25zdCBvZGF0ZUVsZW0gPSBpbmZvQ2VsbC5maW5kKCdzcGFuLm9kYXRlJyk7XG4gICAgICAgICAgY29uc3QgY2hhbmdlZEF0ID0gb2RhdGVFbGVtLmxlbmd0aCA+IDAgPyBwYXJzZU9kYXRlKG9kYXRlRWxlbSkgOiBudWxsO1xuXG4gICAgICAgICAgLy8gQ29tbWVudFxuICAgICAgICAgIGNvbnN0IGNvbW1lbnRFbGVtID0gaW5mb0NlbGwuZmluZCgnc3Bhbi5jb21tZW50cycpO1xuICAgICAgICAgIGNvbnN0IGNvbW1lbnQgPSBjb21tZW50RWxlbVxuICAgICAgICAgICAgLnRleHQoKVxuICAgICAgICAgICAgLnRyaW0oKVxuICAgICAgICAgICAgLnJlcGxhY2UoL15bXCJcIl18W1wiXCJdJC9nLCAnJyk7XG5cbiAgICAgICAgICBjaGFuZ2VzLnB1c2goXG4gICAgICAgICAgICBuZXcgU2l0ZUNoYW5nZSh7XG4gICAgICAgICAgICAgIHNpdGUsXG4gICAgICAgICAgICAgIHBhZ2VGdWxsbmFtZSxcbiAgICAgICAgICAgICAgcGFnZVRpdGxlLFxuICAgICAgICAgICAgICByZXZpc2lvbk5vLFxuICAgICAgICAgICAgICBjaGFuZ2VkQnksXG4gICAgICAgICAgICAgIGNoYW5nZWRBdCxcbiAgICAgICAgICAgICAgZmxhZ3MsXG4gICAgICAgICAgICAgIGNvbW1lbnQsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIExpbWl0IHJlc3VsdHMgaWYgbGltaXQgaXMgc3BlY2lmaWVkXG4gICAgICAgIGNvbnN0IGxpbWl0ZWRDaGFuZ2VzID0gbGltaXQgIT09IHVuZGVmaW5lZCA/IGNoYW5nZXMuc2xpY2UoMCwgbGltaXQpIDogY2hhbmdlcztcbiAgICAgICAgcmV0dXJuIG5ldyBTaXRlQ2hhbmdlQ29sbGVjdGlvbihzaXRlLCBsaW1pdGVkQ2hhbmdlcyk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSBzaXRlIGNoYW5nZXM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG59XG4iLAogICAgImltcG9ydCB7IFVuZXhwZWN0ZWRFcnJvciB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB7IHBhcnNlVXNlciB9IGZyb20gJy4uLy4uLy4uL3V0aWwvcGFyc2VyJztcbmltcG9ydCB7XG4gIFBhZ2UsXG4gIFBhZ2VDb2xsZWN0aW9uLFxuICBTZWFyY2hQYWdlc1F1ZXJ5LFxuICB0eXBlIFNlYXJjaFBhZ2VzUXVlcnlQYXJhbXMsXG4gIFNpdGVDaGFuZ2VDb2xsZWN0aW9uLFxufSBmcm9tICcuLi8uLi9wYWdlJztcbmltcG9ydCB0eXBlIHsgU2l0ZSB9IGZyb20gJy4uL3NpdGUnO1xuXG4vKipcbiAqIFBhZ2UgbGlzdCBvcGVyYXRpb25zIGFjY2Vzc29yXG4gKi9cbmV4cG9ydCBjbGFzcyBQYWdlc0FjY2Vzc29yIHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG5cbiAgY29uc3RydWN0b3Ioc2l0ZTogU2l0ZSkge1xuICAgIHRoaXMuc2l0ZSA9IHNpdGU7XG4gIH1cblxuICAvKipcbiAgICogU2VhcmNoIHBhZ2VzIG1hdGNoaW5nIGNvbmRpdGlvbnNcbiAgICogQHBhcmFtIHBhcmFtcyAtIFNlYXJjaCBjb25kaXRpb25zXG4gICAqIEByZXR1cm5zIFBhZ2UgY29sbGVjdGlvblxuICAgKi9cbiAgc2VhcmNoKHBhcmFtcz86IFNlYXJjaFBhZ2VzUXVlcnlQYXJhbXMpOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBxdWVyeSA9IG5ldyBTZWFyY2hQYWdlc1F1ZXJ5KHBhcmFtcyk7XG4gICAgICAgIGNvbnN0IHVzZXJQYXJzZXIgPSBwYXJzZVVzZXIuYmluZChudWxsLCB0aGlzLnNpdGUuY2xpZW50KTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQYWdlQ29sbGVjdGlvbi5zZWFyY2hQYWdlcyh0aGlzLnNpdGUsIHVzZXJQYXJzZXIsIHF1ZXJ5KTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBzZWFyY2ggcGFnZXM6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBwYWdlc1xuICAgKiBAcmV0dXJucyBQYWdlIGNvbGxlY3Rpb25cbiAgICovXG4gIGFsbCgpOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gdGhpcy5zZWFyY2goe30pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCByZWNlbnQgY2hhbmdlc1xuICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnNcbiAgICogQHBhcmFtIG9wdGlvbnMucGVyUGFnZSAtIEl0ZW1zIHBlciBwYWdlIChkZWZhdWx0OiAyMClcbiAgICogQHBhcmFtIG9wdGlvbnMucGFnZSAtIFBhZ2UgbnVtYmVyIChkZWZhdWx0OiAxKVxuICAgKiBAcmV0dXJucyBDaGFuZ2UgaGlzdG9yeSBjb2xsZWN0aW9uXG4gICAqL1xuICBnZXRSZWNlbnRDaGFuZ2VzKG9wdGlvbnM/OiB7XG4gICAgcGVyUGFnZT86IG51bWJlcjtcbiAgICBwYWdlPzogbnVtYmVyO1xuICB9KTogV2lraWRvdFJlc3VsdEFzeW5jPFNpdGVDaGFuZ2VDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIFNpdGVDaGFuZ2VDb2xsZWN0aW9uLmFjcXVpcmUodGhpcy5zaXRlLCBvcHRpb25zKTtcbiAgfVxufVxuXG5leHBvcnQge1xuICBQYWdlLFxuICBQYWdlQ29sbGVjdGlvbixcbiAgU2VhcmNoUGFnZXNRdWVyeSxcbiAgU2l0ZUNoYW5nZUNvbGxlY3Rpb24sXG4gIHR5cGUgU2VhcmNoUGFnZXNRdWVyeVBhcmFtcyxcbn07XG4iLAogICAgImltcG9ydCAqIGFzIGNoZWVyaW8gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQgeyBOb0VsZW1lbnRFcnJvciwgTm90Rm91bmRFeGNlcHRpb24sIFVuZXhwZWN0ZWRFcnJvciB9IGZyb20gJy4uLy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgQU1DUmVxdWVzdEJvZHksIEFNQ1Jlc3BvbnNlIH0gZnJvbSAnLi4vLi4vY29ubmVjdG9yJztcbmltcG9ydCB7IGZldGNoV2l0aFJldHJ5IH0gZnJvbSAnLi4vLi4vdXRpbC9odHRwJztcbmltcG9ydCB0eXBlIHsgQ2xpZW50IH0gZnJvbSAnLi4vY2xpZW50L2NsaWVudCc7XG5pbXBvcnQgeyBGb3J1bUFjY2Vzc29yIH0gZnJvbSAnLi9hY2Nlc3NvcnMvZm9ydW0tYWNjZXNzb3InO1xuaW1wb3J0IHsgTWVtYmVyQWNjZXNzb3IgfSBmcm9tICcuL2FjY2Vzc29ycy9tZW1iZXItYWNjZXNzb3InO1xuaW1wb3J0IHsgUGFnZUFjY2Vzc29yIH0gZnJvbSAnLi9hY2Nlc3NvcnMvcGFnZS1hY2Nlc3Nvcic7XG5pbXBvcnQgeyBQYWdlc0FjY2Vzc29yIH0gZnJvbSAnLi9hY2Nlc3NvcnMvcGFnZXMtYWNjZXNzb3InO1xuXG4vKipcbiAqIFNpdGUgZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpdGVEYXRhIHtcbiAgaWQ6IG51bWJlcjtcbiAgdGl0bGU6IHN0cmluZztcbiAgdW5peE5hbWU6IHN0cmluZztcbiAgZG9tYWluOiBzdHJpbmc7XG4gIHNzbFN1cHBvcnRlZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBTaXRlIGNsYXNzXG4gKi9cbmV4cG9ydCBjbGFzcyBTaXRlIHtcbiAgcHVibGljIHJlYWRvbmx5IGNsaWVudDogQ2xpZW50O1xuXG4gIC8qKiBTaXRlIElEICovXG4gIHB1YmxpYyByZWFkb25seSBpZDogbnVtYmVyO1xuXG4gIC8qKiBTaXRlIHRpdGxlICovXG4gIHB1YmxpYyByZWFkb25seSB0aXRsZTogc3RyaW5nO1xuXG4gIC8qKiBVTklYIG5hbWUgKGUuZy4sIHNjcC1qcCkgKi9cbiAgcHVibGljIHJlYWRvbmx5IHVuaXhOYW1lOiBzdHJpbmc7XG5cbiAgLyoqIERvbWFpbiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZG9tYWluOiBzdHJpbmc7XG5cbiAgLyoqIFNTTCBzdXBwb3J0IGZsYWcgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNzbFN1cHBvcnRlZDogYm9vbGVhbjtcblxuICAvKiogUGFnZSBhY2Nlc3NvciAqL1xuICBwcml2YXRlIF9wYWdlOiBQYWdlQWNjZXNzb3IgfCBudWxsID0gbnVsbDtcblxuICAvKiogUGFnZXMgYWNjZXNzb3IgKi9cbiAgcHJpdmF0ZSBfcGFnZXM6IFBhZ2VzQWNjZXNzb3IgfCBudWxsID0gbnVsbDtcblxuICAvKiogRm9ydW0gYWNjZXNzb3IgKi9cbiAgcHJpdmF0ZSBfZm9ydW06IEZvcnVtQWNjZXNzb3IgfCBudWxsID0gbnVsbDtcblxuICAvKiogTWVtYmVyIGFjY2Vzc29yICovXG4gIHByaXZhdGUgX21lbWJlcjogTWVtYmVyQWNjZXNzb3IgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihjbGllbnQ6IENsaWVudCwgZGF0YTogU2l0ZURhdGEpIHtcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICB0aGlzLmlkID0gZGF0YS5pZDtcbiAgICB0aGlzLnRpdGxlID0gZGF0YS50aXRsZTtcbiAgICB0aGlzLnVuaXhOYW1lID0gZGF0YS51bml4TmFtZTtcbiAgICB0aGlzLmRvbWFpbiA9IGRhdGEuZG9tYWluO1xuICAgIHRoaXMuc3NsU3VwcG9ydGVkID0gZGF0YS5zc2xTdXBwb3J0ZWQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBhZ2UgYWNjZXNzb3JcbiAgICovXG4gIGdldCBwYWdlKCk6IFBhZ2VBY2Nlc3NvciB7XG4gICAgaWYgKCF0aGlzLl9wYWdlKSB7XG4gICAgICB0aGlzLl9wYWdlID0gbmV3IFBhZ2VBY2Nlc3Nvcih0aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBhZ2VzIGFjY2Vzc29yXG4gICAqL1xuICBnZXQgcGFnZXMoKTogUGFnZXNBY2Nlc3NvciB7XG4gICAgaWYgKCF0aGlzLl9wYWdlcykge1xuICAgICAgdGhpcy5fcGFnZXMgPSBuZXcgUGFnZXNBY2Nlc3Nvcih0aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2VzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBmb3J1bSBhY2Nlc3NvclxuICAgKi9cbiAgZ2V0IGZvcnVtKCk6IEZvcnVtQWNjZXNzb3Ige1xuICAgIGlmICghdGhpcy5fZm9ydW0pIHtcbiAgICAgIHRoaXMuX2ZvcnVtID0gbmV3IEZvcnVtQWNjZXNzb3IodGhpcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9mb3J1bTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbWVtYmVyIGFjY2Vzc29yXG4gICAqL1xuICBnZXQgbWVtYmVyKCk6IE1lbWJlckFjY2Vzc29yIHtcbiAgICBpZiAoIXRoaXMuX21lbWJlcikge1xuICAgICAgdGhpcy5fbWVtYmVyID0gbmV3IE1lbWJlckFjY2Vzc29yKHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fbWVtYmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBiYXNlIFVSTCBvZiB0aGUgc2l0ZVxuICAgKi9cbiAgZ2V0QmFzZVVybCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHByb3RvY29sID0gdGhpcy5zc2xTdXBwb3J0ZWQgPyAnaHR0cHMnIDogJ2h0dHAnO1xuICAgIHJldHVybiBgJHtwcm90b2NvbH06Ly8ke3RoaXMuZG9tYWlufWA7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBBTUMgcmVxdWVzdCB0byB0aGlzIHNpdGVcbiAgICogQHBhcmFtIGJvZGllcyAtIFJlcXVlc3QgYm9keSBhcnJheVxuICAgKiBAcmV0dXJucyBBTUMgcmVzcG9uc2UgYXJyYXlcbiAgICovXG4gIGFtY1JlcXVlc3QoYm9kaWVzOiBBTUNSZXF1ZXN0Qm9keVtdKTogV2lraWRvdFJlc3VsdEFzeW5jPEFNQ1Jlc3BvbnNlW10+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuYW1jQ2xpZW50LnJlcXVlc3QoYm9kaWVzLCB0aGlzLnVuaXhOYW1lLCB0aGlzLnNzbFN1cHBvcnRlZCk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBhIHNpbmdsZSBBTUMgcmVxdWVzdFxuICAgKiBAcGFyYW0gYm9keSAtIFJlcXVlc3QgYm9keVxuICAgKiBAcmV0dXJucyBBTUMgcmVzcG9uc2VcbiAgICovXG4gIGFtY1JlcXVlc3RTaW5nbGUoYm9keTogQU1DUmVxdWVzdEJvZHkpOiBXaWtpZG90UmVzdWx0QXN5bmM8QU1DUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmFtY1JlcXVlc3QoW2JvZHldKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRFcnJvcignQU1DIHJlcXVlc3QgcmV0dXJuZWQgZW1wdHkgcmVzcG9uc2UnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFVuZXhwZWN0ZWRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgQU1DIHJlcXVlc3QgZmFpbGVkOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc2l0ZSBmcm9tIFVOSVggbmFtZVxuICAgKiBAcGFyYW0gY2xpZW50IC0gQ2xpZW50XG4gICAqIEBwYXJhbSB1bml4TmFtZSAtIFNpdGUgVU5JWCBuYW1lIChlLmcuLCAnc2NwLWpwJylcbiAgICogQHJldHVybnMgU2l0ZVxuICAgKi9cbiAgc3RhdGljIGZyb21Vbml4TmFtZShjbGllbnQ6IENsaWVudCwgdW5peE5hbWU6IHN0cmluZyk6IFdpa2lkb3RSZXN1bHRBc3luYzxTaXRlPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gRmV0Y2ggc2l0ZSBwYWdlIChIVFRQIHJlcXVlc3QsIGZvbGxvd2luZyByZWRpcmVjdHMsIHdpdGggcmV0cnkpXG4gICAgICAgIGNvbnN0IHVybCA9IGBodHRwOi8vJHt1bml4TmFtZX0ud2lraWRvdC5jb21gO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoV2l0aFJldHJ5KHVybCwgY2xpZW50LmFtY0NsaWVudC5jb25maWcsIHtcbiAgICAgICAgICBoZWFkZXJzOiBjbGllbnQuYW1jQ2xpZW50LmhlYWRlci5nZXRIZWFkZXJzKCksXG4gICAgICAgICAgY2hlY2tPazogZmFsc2UsIC8vIEhhbmRsZSBIVFRQIGVycm9ycyBtYW51YWxseSBmb3IgYmV0dGVyIGVycm9yIG1lc3NhZ2VzXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihgU2l0ZSBub3QgZm91bmQ6ICR7dW5peE5hbWV9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBmZXRjaCBzaXRlOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGh0bWwgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoaHRtbCk7XG5cbiAgICAgICAgLy8gUGFyc2UgV0lLSVJFUVVFU1QuaW5mb1xuICAgICAgICBjb25zdCBzY3JpcHRzID0gJCgnc2NyaXB0JykudG9BcnJheSgpO1xuICAgICAgICBsZXQgc2l0ZUlkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICAgICAgbGV0IHNpdGVVbml4TmFtZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgICAgIGxldCBkb21haW46IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgICAgICBsZXQgdGl0bGU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgIGZvciAoY29uc3Qgc2NyaXB0IG9mIHNjcmlwdHMpIHtcbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gJChzY3JpcHQpLmh0bWwoKTtcbiAgICAgICAgICBpZiAoIWNvbnRlbnQgfHwgIWNvbnRlbnQuaW5jbHVkZXMoJ1dJS0lSRVFVRVNUJykpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIHNpdGVJZFxuICAgICAgICAgIGNvbnN0IHNpdGVJZE1hdGNoID0gY29udGVudC5tYXRjaCgvV0lLSVJFUVVFU1RcXC5pbmZvXFwuc2l0ZUlkXFxzKj1cXHMqKFxcZCspLyk7XG4gICAgICAgICAgaWYgKHNpdGVJZE1hdGNoPy5bMV0pIHtcbiAgICAgICAgICAgIHNpdGVJZCA9IE51bWJlci5wYXJzZUludChzaXRlSWRNYXRjaFsxXSwgMTApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIHNpdGVVbml4TmFtZVxuICAgICAgICAgIGNvbnN0IHNpdGVVbml4TmFtZU1hdGNoID0gY29udGVudC5tYXRjaChcbiAgICAgICAgICAgIC9XSUtJUkVRVUVTVFxcLmluZm9cXC5zaXRlVW5peE5hbWVcXHMqPVxccypbXCInXShbXlwiJ10rKVtcIiddL1xuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHNpdGVVbml4TmFtZU1hdGNoPy5bMV0pIHtcbiAgICAgICAgICAgIHNpdGVVbml4TmFtZSA9IHNpdGVVbml4TmFtZU1hdGNoWzFdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGRvbWFpblxuICAgICAgICAgIGNvbnN0IGRvbWFpbk1hdGNoID0gY29udGVudC5tYXRjaCgvV0lLSVJFUVVFU1RcXC5pbmZvXFwuZG9tYWluXFxzKj1cXHMqW1wiJ10oW15cIiddKylbXCInXS8pO1xuICAgICAgICAgIGlmIChkb21haW5NYXRjaD8uWzFdKSB7XG4gICAgICAgICAgICBkb21haW4gPSBkb21haW5NYXRjaFsxXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0aXRsZSBmcm9tIDx0aXRsZT4gdGFnXG4gICAgICAgIHRpdGxlID0gJCgndGl0bGUnKS50ZXh0KCkudHJpbSgpIHx8IG51bGw7XG4gICAgICAgIC8vIFJlbW92ZSBcIiAtIFdpa2lkb3RcIiBzdWZmaXggaWYgcHJlc2VudFxuICAgICAgICBpZiAodGl0bGU/LmVuZHNXaXRoKCcgLSBXaWtpZG90JykpIHtcbiAgICAgICAgICB0aXRsZSA9IHRpdGxlLnNsaWNlKDAsIC0xMCkudHJpbSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNpdGVJZCA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcignU2l0ZSBJRCBub3QgZm91bmQgaW4gV0lLSVJFUVVFU1QnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2l0ZVVuaXhOYW1lID09PSBudWxsKSB7XG4gICAgICAgICAgc2l0ZVVuaXhOYW1lID0gdW5peE5hbWU7IC8vIEZhbGxiYWNrXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRvbWFpbiA9PT0gbnVsbCkge1xuICAgICAgICAgIGRvbWFpbiA9IGAke3VuaXhOYW1lfS53aWtpZG90LmNvbWA7IC8vIEZhbGxiYWNrXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRpdGxlID09PSBudWxsKSB7XG4gICAgICAgICAgdGl0bGUgPSB1bml4TmFtZTsgLy8gRmFsbGJhY2tcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIFNTTCBzdXBwb3J0IChiYXNlZCBvbiB3aGV0aGVyIHRoZSByZWRpcmVjdCBVUkwgc3RhcnRzIHdpdGggaHR0cHMpXG4gICAgICAgIGNvbnN0IHNzbFN1cHBvcnRlZCA9IHJlc3BvbnNlLnVybC5zdGFydHNXaXRoKCdodHRwcycpO1xuXG4gICAgICAgIHJldHVybiBuZXcgU2l0ZShjbGllbnQsIHtcbiAgICAgICAgICBpZDogc2l0ZUlkLFxuICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgIHVuaXhOYW1lOiBzaXRlVW5peE5hbWUsXG4gICAgICAgICAgZG9tYWluLFxuICAgICAgICAgIHNzbFN1cHBvcnRlZCxcbiAgICAgICAgfSk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vdEZvdW5kRXhjZXB0aW9uIHx8IGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgc2l0ZTogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgU2l0ZShpZD0ke3RoaXMuaWR9LCB1bml4TmFtZT0ke3RoaXMudW5peE5hbWV9LCB0aXRsZT0ke3RoaXMudGl0bGV9KWA7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgU2l0ZSB9IGZyb20gJy4uLy4uL3NpdGUnO1xuaW1wb3J0IHR5cGUgeyBDbGllbnQgfSBmcm9tICcuLi9jbGllbnQnO1xuXG4vKipcbiAqIFNpdGUgb3BlcmF0aW9ucyBhY2Nlc3NvclxuICovXG5leHBvcnQgY2xhc3MgU2l0ZUFjY2Vzc29yIHtcbiAgcHVibGljIHJlYWRvbmx5IGNsaWVudDogQ2xpZW50O1xuXG4gIGNvbnN0cnVjdG9yKGNsaWVudDogQ2xpZW50KSB7XG4gICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNpdGUgYnkgVU5JWCBuYW1lXG4gICAqXG4gICAqIEBwYXJhbSB1bml4TmFtZSAtIFNpdGUgVU5JWCBuYW1lIChlLmcuLCAnc2NwLWpwJylcbiAgICogQHJldHVybnMgU2l0ZSBvYmplY3Qgd3JhcHBlZCBpbiBSZXN1bHQgdHlwZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHNpdGVSZXN1bHQgPSBhd2FpdCBjbGllbnQuc2l0ZS5nZXQoJ3NjcC1qcCcpO1xuICAgKiBpZiAoIXNpdGVSZXN1bHQuaXNPaygpKSB7XG4gICAqICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gZ2V0IHNpdGUnKTtcbiAgICogfVxuICAgKiBjb25zdCBzaXRlID0gc2l0ZVJlc3VsdC52YWx1ZTtcbiAgICogYGBgXG4gICAqL1xuICBnZXQodW5peE5hbWU6IHN0cmluZyk6IFdpa2lkb3RSZXN1bHRBc3luYzxTaXRlPiB7XG4gICAgcmV0dXJuIFNpdGUuZnJvbVVuaXhOYW1lKHRoaXMuY2xpZW50LCB1bml4TmFtZSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgU2l0ZSB9O1xuIiwKICAgICJpbXBvcnQgeyBOb3RGb3VuZEV4Y2VwdGlvbiB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMsIHdkRXJyQXN5bmMsIHdkT2tBc3luYyB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyBVc2VyLCB0eXBlIFVzZXJDb2xsZWN0aW9uIH0gZnJvbSAnLi4vLi4vdXNlcic7XG5pbXBvcnQgdHlwZSB7IENsaWVudCB9IGZyb20gJy4uL2NsaWVudCc7XG5cbi8qKlxuICogVXNlciByZXRyaWV2YWwgb3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldFVzZXJPcHRpb25zIHtcbiAgLyoqIFRocm93IGVycm9yIGlmIHVzZXIgbm90IGZvdW5kIChkZWZhdWx0OiBmYWxzZSkgKi9cbiAgcmFpc2VXaGVuTm90Rm91bmQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFVzZXIgb3BlcmF0aW9ucyBhY2Nlc3NvclxuICovXG5leHBvcnQgY2xhc3MgVXNlckFjY2Vzc29yIHtcbiAgcHVibGljIHJlYWRvbmx5IGNsaWVudDogQ2xpZW50O1xuXG4gIGNvbnN0cnVjdG9yKGNsaWVudDogQ2xpZW50KSB7XG4gICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHVzZXIgYnkgdXNlcm5hbWVcbiAgICpcbiAgICogQHBhcmFtIG5hbWUgLSBVc2VybmFtZVxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFJldHJpZXZhbCBvcHRpb25zXG4gICAqIEByZXR1cm5zIFVzZXIgd3JhcHBlZCBpbiBSZXN1bHQgdHlwZSAobnVsbCBpZiBub3QgZm91bmQsIGVycm9yIGlmIHJhaXNlV2hlbk5vdEZvdW5kIGlzIHRydWUpXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgdXNlclJlc3VsdCA9IGF3YWl0IGNsaWVudC51c2VyLmdldCgndXNlcm5hbWUnKTtcbiAgICogaWYgKCF1c2VyUmVzdWx0LmlzT2soKSkge1xuICAgKiAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGdldCB1c2VyJyk7XG4gICAqIH1cbiAgICogY29uc3QgdXNlciA9IHVzZXJSZXN1bHQudmFsdWU7XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0KG5hbWU6IHN0cmluZywgb3B0aW9uczogR2V0VXNlck9wdGlvbnMgPSB7fSk6IFdpa2lkb3RSZXN1bHRBc3luYzxVc2VyIHwgbnVsbD4ge1xuICAgIGNvbnN0IHsgcmFpc2VXaGVuTm90Rm91bmQgPSBmYWxzZSB9ID0gb3B0aW9ucztcblxuICAgIHJldHVybiBVc2VyLmZyb21OYW1lKHRoaXMuY2xpZW50LCBuYW1lKS5hbmRUaGVuKCh1c2VyKSA9PiB7XG4gICAgICBpZiAodXNlciA9PT0gbnVsbCAmJiByYWlzZVdoZW5Ob3RGb3VuZCkge1xuICAgICAgICByZXR1cm4gd2RFcnJBc3luYyhuZXcgTm90Rm91bmRFeGNlcHRpb24oYFVzZXIgbm90IGZvdW5kOiAke25hbWV9YCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHdkT2tBc3luYyh1c2VyKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdXNlcnMgZnJvbSBtdWx0aXBsZSB1c2VybmFtZXNcbiAgICogQHBhcmFtIG5hbWVzIC0gQXJyYXkgb2YgdXNlcm5hbWVzXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gUmV0cmlldmFsIG9wdGlvbnNcbiAgICogQHJldHVybnMgVXNlciBjb2xsZWN0aW9uIChudWxsIGZvciBub24tZXhpc3RlbnQgdXNlcnMsIGVycm9yIGlmIHJhaXNlV2hlbk5vdEZvdW5kIGlzIHRydWUpXG4gICAqL1xuICBnZXRNYW55KG5hbWVzOiBzdHJpbmdbXSwgb3B0aW9uczogR2V0VXNlck9wdGlvbnMgPSB7fSk6IFdpa2lkb3RSZXN1bHRBc3luYzxVc2VyQ29sbGVjdGlvbj4ge1xuICAgIGNvbnN0IHsgcmFpc2VXaGVuTm90Rm91bmQgPSBmYWxzZSB9ID0gb3B0aW9ucztcblxuICAgIHJldHVybiBVc2VyLmZyb21OYW1lcyh0aGlzLmNsaWVudCwgbmFtZXMpLmFuZFRoZW4oKGNvbGxlY3Rpb24pID0+IHtcbiAgICAgIGlmIChyYWlzZVdoZW5Ob3RGb3VuZCkge1xuICAgICAgICBjb25zdCBub3RGb3VuZE5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgbmFtZSA9IG5hbWVzW2ldO1xuICAgICAgICAgIGlmIChjb2xsZWN0aW9uW2ldID09PSBudWxsICYmIG5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbm90Rm91bmROYW1lcy5wdXNoKG5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobm90Rm91bmROYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcmV0dXJuIHdkRXJyQXN5bmMobmV3IE5vdEZvdW5kRXhjZXB0aW9uKGBVc2VycyBub3QgZm91bmQ6ICR7bm90Rm91bmROYW1lcy5qb2luKCcsICcpfWApKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHdkT2tBc3luYyhjb2xsZWN0aW9uKTtcbiAgICB9KTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBMb2dpblJlcXVpcmVkRXJyb3IgfSBmcm9tICcuLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7XG4gIGZyb21Qcm9taXNlLFxuICB0eXBlIFdpa2lkb3RSZXN1bHQsXG4gIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jLFxuICB3ZEVycixcbiAgd2RPayxcbiAgd2RPa0FzeW5jLFxufSBmcm9tICcuLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgQU1DQ2xpZW50LCB0eXBlIEFNQ0NvbmZpZywgbG9naW4sIGxvZ291dCB9IGZyb20gJy4uLy4uL2Nvbm5lY3Rvcic7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnLi4vdXNlci91c2VyJztcbmltcG9ydCB7IFByaXZhdGVNZXNzYWdlQWNjZXNzb3IgfSBmcm9tICcuL2FjY2Vzc29ycy9wbS1hY2Nlc3Nvcic7XG5pbXBvcnQgeyBTaXRlQWNjZXNzb3IgfSBmcm9tICcuL2FjY2Vzc29ycy9zaXRlLWFjY2Vzc29yJztcbmltcG9ydCB7IFVzZXJBY2Nlc3NvciB9IGZyb20gJy4vYWNjZXNzb3JzL3VzZXItYWNjZXNzb3InO1xuXG4vKipcbiAqIENsaWVudCBjcmVhdGlvbiBvcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpZW50T3B0aW9ucyB7XG4gIC8qKiBXaWtpZG90IHVzZXJuYW1lICovXG4gIHVzZXJuYW1lPzogc3RyaW5nO1xuXG4gIC8qKiBXaWtpZG90IHBhc3N3b3JkICovXG4gIHBhc3N3b3JkPzogc3RyaW5nO1xuXG4gIC8qKiBCYXNlIGRvbWFpbiAoZGVmYXVsdDogd2lraWRvdC5jb20pICovXG4gIGRvbWFpbj86IHN0cmluZztcblxuICAvKiogQU1DIGNvbmZpZ3VyYXRpb24gb3ZlcnJpZGUgKi9cbiAgYW1jQ29uZmlnPzogUGFydGlhbDxBTUNDb25maWc+O1xufVxuXG4vKipcbiAqIFdpa2lkb3QgY2xpZW50XG4gKiBNYWluIGVudHJ5IHBvaW50IG9mIHRoZSBsaWJyYXJ5XG4gKi9cbmV4cG9ydCBjbGFzcyBDbGllbnQge1xuICAvKiogQU1DIGNsaWVudCAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYW1jQ2xpZW50OiBBTUNDbGllbnQ7XG5cbiAgLyoqIEJhc2UgZG9tYWluICovXG4gIHB1YmxpYyByZWFkb25seSBkb21haW46IHN0cmluZztcblxuICAvKiogVXNlciBvcGVyYXRpb25zIGFjY2Vzc29yICovXG4gIHB1YmxpYyByZWFkb25seSB1c2VyOiBVc2VyQWNjZXNzb3I7XG5cbiAgLyoqIFNpdGUgb3BlcmF0aW9ucyBhY2Nlc3NvciAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc2l0ZTogU2l0ZUFjY2Vzc29yO1xuXG4gIC8qKiBQcml2YXRlIG1lc3NhZ2Ugb3BlcmF0aW9ucyBhY2Nlc3NvciAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcHJpdmF0ZU1lc3NhZ2U6IFByaXZhdGVNZXNzYWdlQWNjZXNzb3I7XG5cbiAgLyoqIFVzZXJuYW1lIG9mIHRoZSBsb2dnZWQtaW4gdXNlciAqL1xuICBwcml2YXRlIF91c2VybmFtZTogc3RyaW5nIHwgbnVsbDtcblxuICAvKiogTG9nZ2VkLWluIHVzZXIgKi9cbiAgcHJpdmF0ZSBfbWU6IFVzZXIgfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogUHJpdmF0ZSBjb25zdHJ1Y3RvclxuICAgKiBVc2UgdGhlIGNyZWF0ZSBtZXRob2QgdG8gY3JlYXRlIGFuIGluc3RhbmNlXG4gICAqL1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKGFtY0NsaWVudDogQU1DQ2xpZW50LCBkb21haW46IHN0cmluZywgdXNlcm5hbWU6IHN0cmluZyB8IG51bGwgPSBudWxsKSB7XG4gICAgdGhpcy5hbWNDbGllbnQgPSBhbWNDbGllbnQ7XG4gICAgdGhpcy5kb21haW4gPSBkb21haW47XG4gICAgdGhpcy5fdXNlcm5hbWUgPSB1c2VybmFtZTtcblxuICAgIC8vIEluaXRpYWxpemUgYWNjZXNzb3JzXG4gICAgdGhpcy51c2VyID0gbmV3IFVzZXJBY2Nlc3Nvcih0aGlzKTtcbiAgICB0aGlzLnNpdGUgPSBuZXcgU2l0ZUFjY2Vzc29yKHRoaXMpO1xuICAgIHRoaXMucHJpdmF0ZU1lc3NhZ2UgPSBuZXcgUHJpdmF0ZU1lc3NhZ2VBY2Nlc3Nvcih0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHVzZXJuYW1lIG9mIHRoZSBsb2dnZWQtaW4gdXNlclxuICAgKi9cbiAgZ2V0IHVzZXJuYW1lKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl91c2VybmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGxvZ2dlZC1pbiB1c2VyXG4gICAqIFJldHVybnMgbnVsbCBpZiBub3QgbG9nZ2VkIGluXG4gICAqL1xuICBnZXQgbWUoKTogVXNlciB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9tZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBjbGllbnRcbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBDbGllbnQgb3B0aW9uc1xuICAgKiBAcmV0dXJucyBDbGllbnQgaW5zdGFuY2Ugd3JhcHBlZCBpbiBSZXN1bHQgdHlwZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGltcG9ydCB7IENsaWVudCB9IGZyb20gJ0B1a3doYXRuL3dpa2lkb3QnO1xuICAgKlxuICAgKiAvLyBDcmVhdGUgYSBjbGllbnRcbiAgICogY29uc3QgY2xpZW50UmVzdWx0ID0gYXdhaXQgQ2xpZW50LmNyZWF0ZSh7XG4gICAqICAgdXNlcm5hbWU6ICd5b3VyX3VzZXJuYW1lJyxcbiAgICogICBwYXNzd29yZDogJ3lvdXJfcGFzc3dvcmQnLFxuICAgKiB9KTtcbiAgICpcbiAgICogLy8gUmVzdWx0IHR5cGUgcmVxdWlyZXMgaXNPaygpIGNoZWNrIGJlZm9yZSBhY2Nlc3NpbmcgLnZhbHVlXG4gICAqIGlmICghY2xpZW50UmVzdWx0LmlzT2soKSkge1xuICAgKiAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGNyZWF0ZSBjbGllbnQnKTtcbiAgICogfVxuICAgKiBjb25zdCBjbGllbnQgPSBjbGllbnRSZXN1bHQudmFsdWU7XG4gICAqXG4gICAqIC8vIE5vdyB5b3UgY2FuIGFjY2VzcyBjbGllbnQuc2l0ZSwgZXRjLlxuICAgKiBjb25zdCBzaXRlUmVzdWx0ID0gYXdhaXQgY2xpZW50LnNpdGUuZ2V0KCdzY3AtanAnKTtcbiAgICogYGBgXG4gICAqL1xuICBzdGF0aWMgY3JlYXRlKG9wdGlvbnM6IENsaWVudE9wdGlvbnMgPSB7fSk6IFdpa2lkb3RSZXN1bHRBc3luYzxDbGllbnQ+IHtcbiAgICBjb25zdCB7IHVzZXJuYW1lLCBwYXNzd29yZCwgZG9tYWluID0gJ3dpa2lkb3QuY29tJywgYW1jQ29uZmlnID0ge30gfSA9IG9wdGlvbnM7XG5cbiAgICAvLyBDcmVhdGUgQU1DIGNsaWVudFxuICAgIGNvbnN0IGFtY0NsaWVudCA9IG5ldyBBTUNDbGllbnQoYW1jQ29uZmlnLCBkb21haW4pO1xuXG4gICAgLy8gTG9naW4gaWYgY3JlZGVudGlhbHMgYXJlIHByb3ZpZGVkXG4gICAgaWYgKHVzZXJuYW1lICYmIHBhc3N3b3JkKSB7XG4gICAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgY2xpZW50ID0gbmV3IENsaWVudChhbWNDbGllbnQsIGRvbWFpbiwgdXNlcm5hbWUpO1xuICAgICAgICAgIGNvbnN0IGxvZ2luUmVzdWx0ID0gYXdhaXQgbG9naW4oY2xpZW50LCB1c2VybmFtZSwgcGFzc3dvcmQpO1xuICAgICAgICAgIGlmIChsb2dpblJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgICB0aHJvdyBsb2dpblJlc3VsdC5lcnJvcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBHZXQgbG9nZ2VkLWluIHVzZXIgaW5mb3JtYXRpb25cbiAgICAgICAgICBjb25zdCB1c2VyUmVzdWx0ID0gYXdhaXQgVXNlci5mcm9tTmFtZShjbGllbnQsIHVzZXJuYW1lKTtcbiAgICAgICAgICBpZiAodXNlclJlc3VsdC5pc09rKCkgJiYgdXNlclJlc3VsdC52YWx1ZSkge1xuICAgICAgICAgICAgY2xpZW50Ll9tZSA9IHVzZXJSZXN1bHQudmFsdWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGNsaWVudDtcbiAgICAgICAgfSkoKSxcbiAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTG9naW5SZXF1aXJlZEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgTG9naW5SZXF1aXJlZEVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIGNsaWVudDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFJldHVybiB1bmF1dGhlbnRpY2F0ZWQgY2xpZW50XG4gICAgcmV0dXJuIHdkT2tBc3luYyhuZXcgQ2xpZW50KGFtY0NsaWVudCwgZG9tYWluKSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIHVuYXV0aGVudGljYXRlZCBjbGllbnRcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBDbGllbnQgb3B0aW9ucyAoZXhjbHVkaW5nIGNyZWRlbnRpYWxzKVxuICAgKiBAcmV0dXJucyBDbGllbnQgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBjcmVhdGVBbm9ueW1vdXMob3B0aW9uczogT21pdDxDbGllbnRPcHRpb25zLCAndXNlcm5hbWUnIHwgJ3Bhc3N3b3JkJz4gPSB7fSk6IENsaWVudCB7XG4gICAgY29uc3QgeyBkb21haW4gPSAnd2lraWRvdC5jb20nLCBhbWNDb25maWcgPSB7fSB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBhbWNDbGllbnQgPSBuZXcgQU1DQ2xpZW50KGFtY0NvbmZpZywgZG9tYWluKTtcbiAgICByZXR1cm4gbmV3IENsaWVudChhbWNDbGllbnQsIGRvbWFpbik7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgbG9naW4gc3RhdHVzXG4gICAqIEByZXR1cm5zIHRydWUgaWYgbG9nZ2VkIGluXG4gICAqL1xuICBpc0xvZ2dlZEluKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl91c2VybmFtZSAhPT0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1aXJlIGxvZ2luXG4gICAqIFJldHVybnMgTG9naW5SZXF1aXJlZEVycm9yIGlmIG5vdCBsb2dnZWQgaW5cbiAgICogQHJldHVybnMgdm9pZCBvbiBzdWNjZXNzXG4gICAqL1xuICByZXF1aXJlTG9naW4oKTogV2lraWRvdFJlc3VsdDx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmlzTG9nZ2VkSW4oKSkge1xuICAgICAgcmV0dXJuIHdkRXJyKG5ldyBMb2dpblJlcXVpcmVkRXJyb3IoKSk7XG4gICAgfVxuICAgIHJldHVybiB3ZE9rKHVuZGVmaW5lZCk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgdGhlIGNsaWVudFxuICAgKiBBdHRlbXB0cyB0byBsb2dvdXQgaWYgYSBzZXNzaW9uIGV4aXN0c1xuICAgKi9cbiAgY2xvc2UoKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pc0xvZ2dlZEluKCkpIHtcbiAgICAgIHJldHVybiBsb2dvdXQodGhpcykubWFwKCgpID0+IHtcbiAgICAgICAgdGhpcy5fdXNlcm5hbWUgPSBudWxsO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB3ZE9rQXN5bmModW5kZWZpbmVkKTtcbiAgfVxufVxuIiwKICAgICJleHBvcnQgKiBmcm9tICcuL2NsaWVudCc7XG5leHBvcnQgKiBmcm9tICcuL2ZvcnVtJztcbmV4cG9ydCAqIGZyb20gJy4vcGFnZSc7XG5leHBvcnQgKiBmcm9tICcuL3ByaXZhdGUtbWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL3NpdGUnO1xuZXhwb3J0ICogZnJvbSAnLi90eXBlcyc7XG5leHBvcnQgKiBmcm9tICcuL3VzZXInO1xuIiwKICAgICJleHBvcnQgKiBmcm9tICcuL3BhcnNlcic7XG5leHBv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LElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFB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LE1BQU0sWUFBWSxJQUFJLFVBQVUsV0FBVyxNQUFNO0FBQUEsSUFHakQsSUFBSSxZQUFZLFVBQVU7QUFBQSxNQUN4QixPQUFPLGFBQ0osWUFBWTtBQUFBLFFBQ1gsTUFBTSxTQUFTLElBQUksT0FBTyxXQUFXLFFBQVEsUUFBUTtBQUFBLFFBQ3JELE1BQU0sY0FBYyxNQUFNLE1BQU0sUUFBUSxVQUFVLFFBQVE7QUFBQSxRQUMxRCxJQUFJLFlBQVksTUFBTSxHQUFHO0FBQUEsVUFDdkIsTUFBTSxZQUFZO0FBQUEsUUFDcEI7QUFBQSxRQUdBLE1BQU0sYUFBYSxNQUFNLEtBQUssU0FBUyxRQUFRLFFBQVE7QUFBQSxRQUN2RCxJQUFJLFdBQVcsS0FBSyxLQUFLLFdBQVcsT0FBTztBQUFBLFVBQ3pDLE9BQU8sTUFBTSxXQUFXO0FBQUEsUUFDMUI7QUFBQSxRQUVBLE9BQU87QUFBQSxTQUNOLEdBQ0gsQ0FBQyxVQUFVO0FBQUEsUUFDVCxJQUFJLGlCQUFpQixvQkFBb0I7QUFBQSxVQUN2QyxPQUFPO0FBQUEsUUFDVDtBQUFBLFFBQ0EsT0FBTyxJQUFJLG1CQUFtQiw0QkFBNEIsT0FBTyxLQUFLLEdBQUc7QUFBQSxPQUU3RTtBQUFBLElBQ0Y7QUFBQSxJQUdBLE9BQU8sVUFBVSxJQUFJLE9BQU8sV0FBVyxNQUFNLENBQUM7QUFBQTtBQUFBLFNBUXpDLGVBQWUsQ0FBQyxVQUF3RCxDQUFDLEdBQVc7QUFBQSxJQUN6RixRQUFRLFNBQVMsZUFBZSxZQUFZLENBQUMsTUFBTTtBQUFBLElBQ25ELE1BQU0sWUFBWSxJQUFJLFVBQVUsV0FBVyxNQUFNO0FBQUEsSUFDakQsT0FBTyxJQUFJLE9BQU8sV0FBVyxNQUFNO0FBQUE7QUFBQSxFQU9yQyxVQUFVLEdBQVk7QUFBQSxJQUNwQixPQUFPLEtBQUssY0FBYztBQUFBO0FBQUEsRUFRNUIsWUFBWSxHQUF3QjtBQUFBLElBQ2xDLElBQUksQ0FBQyxLQUFLLFdBQVcsR0FBRztBQUFBLE1BQ3RCLE9BQU8sTUFBTSxJQUFJLGtCQUFvQjtBQUFBLElBQ3ZDO0FBQUEsSUFDQSxPQUFPLEtBQUssU0FBUztBQUFBO0FBQUEsRUFPdkIsS0FBSyxHQUE2QjtBQUFBLElBQ2hDLElBQUksS0FBSyxXQUFXLEdBQUc7QUFBQSxNQUNyQixPQUFPLE9BQU8sSUFBSSxFQUFFLElBQUksTUFBTTtBQUFBLFFBQzVCLEtBQUssWUFBWTtBQUFBLFFBQ2pCO0FBQUEsT0FDRDtBQUFBLElBQ0g7QUFBQSxJQUNBLE9BQU8sVUFBVSxTQUFTO0FBQUE7QUFFOUI7O0FDbE1BO0FBS0E7O0FDTkE7IiwKICAiZGVidWdJZCI6ICJFNDUxRTQ1RUY4REI2NDI3NjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
5328
+ //# debugId=6EC73883EC0F6B0E64756E2164756E21
5329
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2NvbW1vbi9lcnJvcnMvYmFzZS50cyIsICJzcmMvY29tbW9uL2Vycm9ycy9hbWMudHMiLCAic3JjL2NvbW1vbi9lcnJvcnMvc2Vzc2lvbi50cyIsICJzcmMvY29tbW9uL2Vycm9ycy90YXJnZXQudHMiLCAic3JjL2NvbW1vbi9lcnJvcnMvaW5kZXgudHMiLCAic3JjL2NvbW1vbi9sb2dnZXIudHMiLCAic3JjL2NvbW1vbi90eXBlcy9yZXN1bHQudHMiLCAic3JjL2NvbW1vbi90eXBlcy9pbmRleC50cyIsICJzcmMvY29ubmVjdG9yL2FtYy1jb25maWcudHMiLCAic3JjL3V0aWwvaHR0cC50cyIsICJzcmMvbW9kdWxlL3VzZXIvYW5vbnltb3VzLXVzZXIudHMiLCAic3JjL21vZHVsZS91c2VyL2RlbGV0ZWQtdXNlci50cyIsICJzcmMvbW9kdWxlL3VzZXIvZ3Vlc3QtdXNlci50cyIsICJzcmMvdXRpbC90YWJsZS9jaGFyLXRhYmxlLnRzIiwgInNyYy91dGlsL3N0cmluZy11dGlsLnRzIiwgInNyYy9tb2R1bGUvdXNlci91c2VyLWNvbGxlY3Rpb24udHMiLCAic3JjL21vZHVsZS91c2VyL3VzZXIudHMiLCAic3JjL21vZHVsZS91c2VyL3dpa2lkb3QtdXNlci50cyIsICJzcmMvbW9kdWxlL3VzZXIvaW5kZXgudHMiLCAic3JjL3V0aWwvcGFyc2VyL3VzZXIudHMiLCAic3JjL3V0aWwvcGFyc2VyL2luZGV4LnRzIiwgInNyYy9jb21tb24vZGVjb3JhdG9ycy50cyIsICJzcmMvbW9kdWxlL2ZvcnVtL2ZvcnVtLXBvc3QtcmV2aXNpb24udHMiLCAic3JjL21vZHVsZS9mb3J1bS9mb3J1bS1wb3N0LnRzIiwgInNyYy9tb2R1bGUvZm9ydW0vZm9ydW0tdGhyZWFkLnRzIiwgInNyYy9tb2R1bGUvZm9ydW0vZm9ydW0tY2F0ZWdvcnkudHMiLCAic3JjL21vZHVsZS9mb3J1bS9pbmRleC50cyIsICJzcmMvaW5kZXgudHMiLCAic3JjL2Nvbm5lY3Rvci9hbWMtY2xpZW50LnRzIiwgInNyYy9jb25uZWN0b3IvYW1jLWhlYWRlci50cyIsICJzcmMvY29ubmVjdG9yL2FtYy10eXBlcy50cyIsICJzcmMvY29ubmVjdG9yL2luZGV4LnRzIiwgInNyYy9jb25uZWN0b3IvYXV0aC50cyIsICJzcmMvbW9kdWxlL3ByaXZhdGUtbWVzc2FnZS9wcml2YXRlLW1lc3NhZ2UudHMiLCAic3JjL21vZHVsZS9jbGllbnQvYWNjZXNzb3JzL3BtLWFjY2Vzc29yLnRzIiwgInNyYy9tb2R1bGUvc2l0ZS9hY2Nlc3NvcnMvZm9ydW0tYWNjZXNzb3IudHMiLCAic3JjL21vZHVsZS9zaXRlL2FjY2Vzc29ycy9tZW1iZXItYWNjZXNzb3IudHMiLCAic3JjL3V0aWwvcXVpY2stbW9kdWxlLnRzIiwgInNyYy9tb2R1bGUvc2l0ZS9zaXRlLWFwcGxpY2F0aW9uLnRzIiwgInNyYy9tb2R1bGUvc2l0ZS9zaXRlLW1lbWJlci50cyIsICJzcmMvbW9kdWxlL3NpdGUvYWNjZXNzb3JzL3BhZ2UtYWNjZXNzb3IudHMiLCAic3JjL21vZHVsZS9wYWdlL3BhZ2UudHMiLCAic3JjL21vZHVsZS9wYWdlL3BhZ2UtZmlsZS50cyIsICJzcmMvbW9kdWxlL3BhZ2UvcGFnZS1tZXRhLnRzIiwgInNyYy9tb2R1bGUvcGFnZS9wYWdlLXJldmlzaW9uLnRzIiwgInNyYy9tb2R1bGUvcGFnZS9wYWdlLXNvdXJjZS50cyIsICJzcmMvbW9kdWxlL3BhZ2UvcGFnZS12b3RlLnRzIiwgInNyYy9tb2R1bGUvcGFnZS9zZWFyY2gtcXVlcnkudHMiLCAic3JjL21vZHVsZS9wYWdlL3NpdGUtY2hhbmdlLnRzIiwgInNyYy9tb2R1bGUvc2l0ZS9hY2Nlc3NvcnMvcGFnZXMtYWNjZXNzb3IudHMiLCAic3JjL21vZHVsZS9zaXRlL3NpdGUudHMiLCAic3JjL21vZHVsZS9jbGllbnQvYWNjZXNzb3JzL3NpdGUtYWNjZXNzb3IudHMiLCAic3JjL21vZHVsZS9jbGllbnQvYWNjZXNzb3JzL3VzZXItYWNjZXNzb3IudHMiLCAic3JjL21vZHVsZS9jbGllbnQvY2xpZW50LnRzIiwgInNyYy9tb2R1bGUvaW5kZXgudHMiLCAic3JjL3V0aWwvaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiLyoqXG4gKiBCYXNlIGVycm9yIGNsYXNzIGZvciB0aGUgV2lraWRvdCBsaWJyYXJ5XG4gKiBBbGwgY3VzdG9tIGVycm9ycyBpbmhlcml0IGZyb20gdGhpcyBjbGFzc1xuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgV2lraWRvdEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKiogRXJyb3IgbmFtZSAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gbWVzc2FnZSAtIEVycm9yIG1lc3NhZ2VcbiAgICovXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZTtcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgbmV3LnRhcmdldC5wcm90b3R5cGUpO1xuICB9XG59XG5cbi8qKlxuICogVW5leHBlY3RlZCBlcnJvclxuICogUmVwcmVzZW50cyBpbnRlcm5hbCBpbmNvbnNpc3RlbmNpZXMgb3IgYnVnc1xuICovXG5leHBvcnQgY2xhc3MgVW5leHBlY3RlZEVycm9yIGV4dGVuZHMgV2lraWRvdEVycm9yIHt9XG4iLAogICAgImltcG9ydCB7IFdpa2lkb3RFcnJvciB9IGZyb20gJy4vYmFzZSc7XG5cbi8qKlxuICogQmFzZSBlcnJvciBmb3IgQWpheCBNb2R1bGUgQ29ubmVjdG9yIHJlbGF0ZWQgaXNzdWVzXG4gKi9cbmV4cG9ydCBjbGFzcyBBTUNFcnJvciBleHRlbmRzIFdpa2lkb3RFcnJvciB7fVxuXG4vKipcbiAqIEhUVFAgc3RhdHVzIGNvZGUgZXJyb3JcbiAqIFRocm93biB3aGVuIGFuIEFNQyByZXF1ZXN0IGZhaWxzIHdpdGggYW4gSFRUUCBlcnJvclxuICovXG5leHBvcnQgY2xhc3MgQU1DSHR0cEVycm9yIGV4dGVuZHMgQU1DRXJyb3Ige1xuICAvKiogSFRUUCBzdGF0dXMgY29kZSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc3RhdHVzQ29kZTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gbWVzc2FnZSAtIEVycm9yIG1lc3NhZ2VcbiAgICogQHBhcmFtIHN0YXR1c0NvZGUgLSBIVFRQIHN0YXR1cyBjb2RlXG4gICAqL1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIHN0YXR1c0NvZGU6IG51bWJlcikge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMuc3RhdHVzQ29kZSA9IHN0YXR1c0NvZGU7XG4gIH1cbn1cblxuLyoqXG4gKiBXaWtpZG90IHN0YXR1cyBjb2RlIGVycm9yXG4gKiBUaHJvd24gd2hlbiBBTUMgcmVzcG9uc2Ugc3RhdHVzIGlzIG5vdCBva1xuICovXG5leHBvcnQgY2xhc3MgV2lraWRvdFN0YXR1c0Vycm9yIGV4dGVuZHMgQU1DRXJyb3Ige1xuICAvKiogV2lraWRvdCBzdGF0dXMgY29kZSBzdHJpbmcgKi9cbiAgcHVibGljIHJlYWRvbmx5IHN0YXR1c0NvZGU6IHN0cmluZztcblxuICAvKipcbiAgICogQHBhcmFtIG1lc3NhZ2UgLSBFcnJvciBtZXNzYWdlXG4gICAqIEBwYXJhbSBzdGF0dXNDb2RlIC0gU3RhdHVzIGNvZGUgKGUuZy4sICdub3Rfb2snLCAndHJ5X2FnYWluJylcbiAgICovXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgc3RhdHVzQ29kZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5zdGF0dXNDb2RlID0gc3RhdHVzQ29kZTtcbiAgfVxufVxuXG4vKipcbiAqIFJlc3BvbnNlIGRhdGEgZXJyb3JcbiAqIFRocm93biB3aGVuIHJlc3BvbnNlIHBhcnNpbmcgZmFpbHNcbiAqL1xuZXhwb3J0IGNsYXNzIFJlc3BvbnNlRGF0YUVycm9yIGV4dGVuZHMgQU1DRXJyb3Ige31cbiIsCiAgICAiaW1wb3J0IHsgV2lraWRvdEVycm9yIH0gZnJvbSAnLi9iYXNlJztcblxuLyoqXG4gKiBCYXNlIGVycm9yIGZvciBzZXNzaW9uIHJlbGF0ZWQgaXNzdWVzXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXNzaW9uRXJyb3IgZXh0ZW5kcyBXaWtpZG90RXJyb3Ige31cblxuLyoqXG4gKiBTZXNzaW9uIGNyZWF0aW9uIGZhaWx1cmUgZXJyb3JcbiAqIFRocm93biB3aGVuIGEgbG9naW4gYXR0ZW1wdCBmYWlsc1xuICovXG5leHBvcnQgY2xhc3MgU2Vzc2lvbkNyZWF0ZUVycm9yIGV4dGVuZHMgU2Vzc2lvbkVycm9yIHt9XG5cbi8qKlxuICogTG9naW4gcmVxdWlyZWQgZXJyb3JcbiAqIFRocm93biB3aGVuIGFuIGF1dGhlbnRpY2F0ZWQgb3BlcmF0aW9uIGlzIGF0dGVtcHRlZCB3aXRob3V0IGxvZ2luXG4gKi9cbmV4cG9ydCBjbGFzcyBMb2dpblJlcXVpcmVkRXJyb3IgZXh0ZW5kcyBTZXNzaW9uRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlID0gJ0xvZ2luIGlzIHJlcXVpcmVkIGZvciB0aGlzIG9wZXJhdGlvbicpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBXaWtpZG90RXJyb3IgfSBmcm9tICcuL2Jhc2UnO1xuXG4vKipcbiAqIFJlc291cmNlIG5vdCBmb3VuZCBlcnJvclxuICogVGhyb3duIHdoZW4gdGhlIHJlcXVlc3RlZCByZXNvdXJjZSBkb2VzIG5vdCBleGlzdFxuICovXG5leHBvcnQgY2xhc3MgTm90Rm91bmRFeGNlcHRpb24gZXh0ZW5kcyBXaWtpZG90RXJyb3Ige31cblxuLyoqXG4gKiBSZXNvdXJjZSBhbHJlYWR5IGV4aXN0cyBlcnJvclxuICogVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBjcmVhdGUgYSByZXNvdXJjZSB0aGF0IGFscmVhZHkgZXhpc3RzXG4gKi9cbmV4cG9ydCBjbGFzcyBUYXJnZXRFeGlzdHNFcnJvciBleHRlbmRzIFdpa2lkb3RFcnJvciB7fVxuXG4vKipcbiAqIFRhcmdldCBzdGF0ZSBlcnJvclxuICogVGhyb3duIHdoZW4gYSByZXNvdXJjZSBpcyBpbiBhbiBpbm9wZXJhYmxlIHN0YXRlIChlLmcuLCBsb2NrZWQpXG4gKi9cbmV4cG9ydCBjbGFzcyBUYXJnZXRFcnJvciBleHRlbmRzIFdpa2lkb3RFcnJvciB7fVxuXG4vKipcbiAqIEFjY2VzcyBkZW5pZWQgZXJyb3JcbiAqIFRocm93biB3aGVuIGFuIG9wZXJhdGlvbiBpcyBkZW5pZWQgZHVlIHRvIGluc3VmZmljaWVudCBwZXJtaXNzaW9uc1xuICovXG5leHBvcnQgY2xhc3MgRm9yYmlkZGVuRXJyb3IgZXh0ZW5kcyBXaWtpZG90RXJyb3Ige31cblxuLyoqXG4gKiBIVE1MIGVsZW1lbnQgbm90IGZvdW5kIGVycm9yXG4gKiBUaHJvd24gd2hlbiBhIHJlcXVpcmVkIGVsZW1lbnQgaXMgbm90IGZvdW5kIGR1cmluZyBwYXJzaW5nXG4gKi9cbmV4cG9ydCBjbGFzcyBOb0VsZW1lbnRFcnJvciBleHRlbmRzIFdpa2lkb3RFcnJvciB7fVxuIiwKICAgICIvLyBCYXNlIGVycm9yc1xuXG4vLyBBTUMgZXJyb3JzXG5leHBvcnQgeyBBTUNFcnJvciwgQU1DSHR0cEVycm9yLCBSZXNwb25zZURhdGFFcnJvciwgV2lraWRvdFN0YXR1c0Vycm9yIH0gZnJvbSAnLi9hbWMnO1xuZXhwb3J0IHsgVW5leHBlY3RlZEVycm9yLCBXaWtpZG90RXJyb3IgfSBmcm9tICcuL2Jhc2UnO1xuLy8gU2Vzc2lvbiBlcnJvcnNcbmV4cG9ydCB7IExvZ2luUmVxdWlyZWRFcnJvciwgU2Vzc2lvbkNyZWF0ZUVycm9yLCBTZXNzaW9uRXJyb3IgfSBmcm9tICcuL3Nlc3Npb24nO1xuXG4vLyBUYXJnZXQgZXJyb3JzXG5leHBvcnQge1xuICBGb3JiaWRkZW5FcnJvcixcbiAgTm9FbGVtZW50RXJyb3IsXG4gIE5vdEZvdW5kRXhjZXB0aW9uLFxuICBUYXJnZXRFcnJvcixcbiAgVGFyZ2V0RXhpc3RzRXJyb3IsXG59IGZyb20gJy4vdGFyZ2V0JztcbiIsCiAgICAiLyoqXG4gKiBNb2R1bGUgcHJvdmlkaW5nIGxvZ2dpbmcgZnVuY3Rpb25hbGl0eVxuICpcbiAqIFRoaXMgbW9kdWxlIGNvbmZpZ3VyZXMgYW5kIHByb3ZpZGVzIGxvZ2dlcnMgdXNlZCB0aHJvdWdob3V0IHRoZSBsaWJyYXJ5LlxuICogQnkgZGVmYXVsdCwgaXQgZG9lcyBub3Qgb3V0cHV0IGFueXRoaW5nLCBhbGxvd2luZyBhcHBsaWNhdGlvbi1zaWRlIGxvZyBjb250cm9sLlxuICovXG5cbi8qKlxuICogTG9nIGxldmVsXG4gKi9cbmV4cG9ydCB0eXBlIExvZ0xldmVsID0gJ2RlYnVnJyB8ICdpbmZvJyB8ICd3YXJuJyB8ICdlcnJvcic7XG5cbi8qKlxuICogTG9nIGxldmVsIHByaW9yaXR5IChoaWdoZXIgbnVtYmVyID0gbW9yZSBpbXBvcnRhbnQpXG4gKi9cbmNvbnN0IExPR19MRVZFTF9QUklPUklUWTogUmVjb3JkPExvZ0xldmVsLCBudW1iZXI+ID0ge1xuICBkZWJ1ZzogMCxcbiAgaW5mbzogMSxcbiAgd2FybjogMixcbiAgZXJyb3I6IDMsXG59O1xuXG4vKipcbiAqIExvZ2dlciBoYW5kbGVyXG4gKi9cbmV4cG9ydCB0eXBlIExvZ0hhbmRsZXIgPSAoXG4gIGxldmVsOiBMb2dMZXZlbCxcbiAgbmFtZTogc3RyaW5nLFxuICBtZXNzYWdlOiBzdHJpbmcsXG4gIC4uLmFyZ3M6IHVua25vd25bXVxuKSA9PiB2b2lkO1xuXG4vKipcbiAqIE51bGxIYW5kbGVyOiBPdXRwdXRzIG5vdGhpbmcgKGRlZmF1bHQpXG4gKi9cbmV4cG9ydCBjb25zdCBudWxsSGFuZGxlcjogTG9nSGFuZGxlciA9ICgpID0+IHtcbiAgLy8gRG8gbm90aGluZ1xufTtcblxuLyoqXG4gKiBDb25zb2xlSGFuZGxlcjogT3V0cHV0cyB0byBjb25zb2xlXG4gKi9cbmV4cG9ydCBjb25zdCBjb25zb2xlSGFuZGxlcjogTG9nSGFuZGxlciA9IChcbiAgbGV2ZWw6IExvZ0xldmVsLFxuICBuYW1lOiBzdHJpbmcsXG4gIG1lc3NhZ2U6IHN0cmluZyxcbiAgLi4uYXJnczogdW5rbm93bltdXG4pID0+IHtcbiAgY29uc3QgdGltZXN0YW1wID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICBjb25zdCBmb3JtYXR0ZWRNZXNzYWdlID0gYCR7dGltZXN0YW1wfSBbJHtuYW1lfS8ke2xldmVsLnRvVXBwZXJDYXNlKCl9XSAke21lc3NhZ2V9YDtcblxuICBzd2l0Y2ggKGxldmVsKSB7XG4gICAgY2FzZSAnZGVidWcnOlxuICAgICAgY29uc29sZS5kZWJ1Zyhmb3JtYXR0ZWRNZXNzYWdlLCAuLi5hcmdzKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2luZm8nOlxuICAgICAgY29uc29sZS5pbmZvKGZvcm1hdHRlZE1lc3NhZ2UsIC4uLmFyZ3MpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnd2Fybic6XG4gICAgICBjb25zb2xlLndhcm4oZm9ybWF0dGVkTWVzc2FnZSwgLi4uYXJncyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdlcnJvcic6XG4gICAgICBjb25zb2xlLmVycm9yKGZvcm1hdHRlZE1lc3NhZ2UsIC4uLmFyZ3MpO1xuICAgICAgYnJlYWs7XG4gIH1cbn07XG5cbi8qKlxuICogTG9nZ2VyIGNsYXNzXG4gKi9cbmV4cG9ydCBjbGFzcyBMb2dnZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSBoYW5kbGVyOiBMb2dIYW5kbGVyO1xuICBwcml2YXRlIGxldmVsOiBMb2dMZXZlbDtcblxuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIGhhbmRsZXI6IExvZ0hhbmRsZXIgPSBudWxsSGFuZGxlciwgbGV2ZWw6IExvZ0xldmVsID0gJ3dhcm4nKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmhhbmRsZXIgPSBoYW5kbGVyO1xuICAgIHRoaXMubGV2ZWwgPSBsZXZlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgaGFuZGxlclxuICAgKi9cbiAgc2V0SGFuZGxlcihoYW5kbGVyOiBMb2dIYW5kbGVyKTogdm9pZCB7XG4gICAgdGhpcy5oYW5kbGVyID0gaGFuZGxlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgbG9nIGxldmVsXG4gICAqL1xuICBzZXRMZXZlbChsZXZlbDogTG9nTGV2ZWwpOiB2b2lkIHtcbiAgICB0aGlzLmxldmVsID0gbGV2ZWw7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIHNwZWNpZmllZCBsZXZlbCBzaG91bGQgYmUgbG9nZ2VkXG4gICAqL1xuICBwcml2YXRlIHNob3VsZExvZyhsZXZlbDogTG9nTGV2ZWwpOiBib29sZWFuIHtcbiAgICByZXR1cm4gTE9HX0xFVkVMX1BSSU9SSVRZW2xldmVsXSA+PSBMT0dfTEVWRUxfUFJJT1JJVFlbdGhpcy5sZXZlbF07XG4gIH1cblxuICAvKipcbiAgICogT3V0cHV0IGxvZ1xuICAgKi9cbiAgcHJpdmF0ZSBsb2cobGV2ZWw6IExvZ0xldmVsLCBtZXNzYWdlOiBzdHJpbmcsIC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNob3VsZExvZyhsZXZlbCkpIHtcbiAgICAgIHRoaXMuaGFuZGxlcihsZXZlbCwgdGhpcy5uYW1lLCBtZXNzYWdlLCAuLi5hcmdzKTtcbiAgICB9XG4gIH1cblxuICBkZWJ1ZyhtZXNzYWdlOiBzdHJpbmcsIC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuICAgIHRoaXMubG9nKCdkZWJ1ZycsIG1lc3NhZ2UsIC4uLmFyZ3MpO1xuICB9XG5cbiAgaW5mbyhtZXNzYWdlOiBzdHJpbmcsIC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuICAgIHRoaXMubG9nKCdpbmZvJywgbWVzc2FnZSwgLi4uYXJncyk7XG4gIH1cblxuICB3YXJuKG1lc3NhZ2U6IHN0cmluZywgLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgdGhpcy5sb2coJ3dhcm4nLCBtZXNzYWdlLCAuLi5hcmdzKTtcbiAgfVxuXG4gIGVycm9yKG1lc3NhZ2U6IHN0cmluZywgLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgdGhpcy5sb2coJ2Vycm9yJywgbWVzc2FnZSwgLi4uYXJncyk7XG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgbG9nZ2VyXG4gKiBAcGFyYW0gbmFtZSAtIExvZ2dlciBuYW1lIChkZWZhdWx0OiBcIndpa2lkb3RcIilcbiAqIEByZXR1cm5zIExvZ2dlciBpbnN0YW5jZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TG9nZ2VyKG5hbWUgPSAnd2lraWRvdCcpOiBMb2dnZXIge1xuICByZXR1cm4gbmV3IExvZ2dlcihuYW1lKTtcbn1cblxuLyoqXG4gKiBTZXR1cCBjb25zb2xlIG91dHB1dCBoYW5kbGVyXG4gKiBAcGFyYW0gbG9nZ2VyIC0gTG9nZ2VyIHRvIGNvbmZpZ3VyZVxuICogQHBhcmFtIGxldmVsIC0gTG9nIGxldmVsIChkZWZhdWx0OiBcIndhcm5cIilcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldHVwQ29uc29sZUhhbmRsZXIobG9nZ2VyOiBMb2dnZXIsIGxldmVsOiBMb2dMZXZlbCA9ICd3YXJuJyk6IHZvaWQge1xuICBsb2dnZXIuc2V0SGFuZGxlcihjb25zb2xlSGFuZGxlcik7XG4gIGxvZ2dlci5zZXRMZXZlbChsZXZlbCk7XG59XG5cbi8qKlxuICogRGVmYXVsdCBsb2dnZXIgdXNlZCB0aHJvdWdob3V0IHRoZSBwYWNrYWdlXG4gKi9cbmV4cG9ydCBjb25zdCBsb2dnZXI6IExvZ2dlciA9IGdldExvZ2dlcigpO1xuIiwKICAgICJpbXBvcnQgeyBlcnIsIGVyckFzeW5jLCBvaywgb2tBc3luYywgdHlwZSBSZXN1bHQsIFJlc3VsdEFzeW5jIH0gZnJvbSAnbmV2ZXJ0aHJvdyc7XG5pbXBvcnQgdHlwZSB7IFdpa2lkb3RFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbi8qKiBTeW5jaHJvbm91cyBSZXN1bHQgdHlwZSBhbGlhcyAqL1xuZXhwb3J0IHR5cGUgV2lraWRvdFJlc3VsdDxUPiA9IFJlc3VsdDxULCBXaWtpZG90RXJyb3I+O1xuXG4vKiogQXN5bmNocm9ub3VzIFJlc3VsdCB0eXBlIGFsaWFzICovXG5leHBvcnQgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmM8VD4gPSBSZXN1bHRBc3luYzxULCBXaWtpZG90RXJyb3I+O1xuXG4vKiogQ3JlYXRlIHN1Y2Nlc3MgUmVzdWx0ICovXG5leHBvcnQgY29uc3Qgd2RPayA9IDxUPih2YWx1ZTogVCk6IFdpa2lkb3RSZXN1bHQ8VD4gPT4gb2sodmFsdWUpO1xuXG4vKiogQ3JlYXRlIGVycm9yIFJlc3VsdCAqL1xuZXhwb3J0IGNvbnN0IHdkRXJyID0gPEUgZXh0ZW5kcyBXaWtpZG90RXJyb3I+KGVycm9yOiBFKTogV2lraWRvdFJlc3VsdDxuZXZlcj4gPT4gZXJyKGVycm9yKTtcblxuLyoqIENyZWF0ZSBzdWNjZXNzIFJlc3VsdEFzeW5jICovXG5leHBvcnQgY29uc3Qgd2RPa0FzeW5jID0gPFQ+KHZhbHVlOiBUKTogV2lraWRvdFJlc3VsdEFzeW5jPFQ+ID0+IG9rQXN5bmModmFsdWUpO1xuXG4vKiogQ3JlYXRlIGVycm9yIFJlc3VsdEFzeW5jICovXG5leHBvcnQgY29uc3Qgd2RFcnJBc3luYyA9IDxFIGV4dGVuZHMgV2lraWRvdEVycm9yPihlcnJvcjogRSk6IFdpa2lkb3RSZXN1bHRBc3luYzxuZXZlcj4gPT5cbiAgZXJyQXN5bmMoZXJyb3IpO1xuXG4vKiogQ29udmVydCBmcm9tIFByb21pc2UgKi9cbmV4cG9ydCBjb25zdCBmcm9tUHJvbWlzZSA9IDxUPihcbiAgcHJvbWlzZTogUHJvbWlzZTxUPixcbiAgZXJyb3JNYXBwZXI6IChlcnJvcjogdW5rbm93bikgPT4gV2lraWRvdEVycm9yXG4pOiBXaWtpZG90UmVzdWx0QXN5bmM8VD4gPT4gUmVzdWx0QXN5bmMuZnJvbVByb21pc2UocHJvbWlzZSwgZXJyb3JNYXBwZXIpO1xuXG4vKiogQ29tYmluZSBtdWx0aXBsZSBSZXN1bHRBc3luYyAqL1xuZXhwb3J0IGNvbnN0IGNvbWJpbmVSZXN1bHRzID0gPFQ+KHJlc3VsdHM6IFdpa2lkb3RSZXN1bHRBc3luYzxUPltdKTogV2lraWRvdFJlc3VsdEFzeW5jPFRbXT4gPT5cbiAgUmVzdWx0QXN5bmMuY29tYmluZShyZXN1bHRzKTtcbiIsCiAgICAiZXhwb3J0ICogZnJvbSAnLi9jb21tb24nO1xuZXhwb3J0ICogZnJvbSAnLi9yZXN1bHQnO1xuIiwKICAgICIvKipcbiAqIEFqYXggTW9kdWxlIENvbm5lY3RvciBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQU1DQ29uZmlnIHtcbiAgLyoqIFJlcXVlc3QgdGltZW91dCAobWlsbGlzZWNvbmRzKSAqL1xuICB0aW1lb3V0OiBudW1iZXI7XG5cbiAgLyoqIE1heGltdW0gcmV0cnkgY291bnQgKi9cbiAgcmV0cnlMaW1pdDogbnVtYmVyO1xuXG4gIC8qKiBCYXNlIHJldHJ5IGludGVydmFsIChtaWxsaXNlY29uZHMpICovXG4gIHJldHJ5SW50ZXJ2YWw6IG51bWJlcjtcblxuICAvKiogTWF4aW11bSBiYWNrb2ZmIChtaWxsaXNlY29uZHMpICovXG4gIG1heEJhY2tvZmY6IG51bWJlcjtcblxuICAvKiogQmFja29mZiBmYWN0b3IgKi9cbiAgYmFja29mZkZhY3RvcjogbnVtYmVyO1xuXG4gIC8qKiBNYXhpbXVtIGNvbmN1cnJlbnQgcmVxdWVzdHMgKi9cbiAgc2VtYXBob3JlTGltaXQ6IG51bWJlcjtcblxuICAvKiogQmF0Y2ggc2l6ZSBmb3IgYW1jUmVxdWVzdFdpdGhSZXRyeSAqL1xuICByZXRyeUJhdGNoU2l6ZTogbnVtYmVyO1xuXG4gIC8qKiBNYXhpbXVtIHJldHJ5IGF0dGVtcHRzIGZvciBhbWNSZXF1ZXN0V2l0aFJldHJ5ICovXG4gIHJldHJ5TWF4UmV0cmllczogbnVtYmVyO1xufVxuXG4vKiogRGVmYXVsdCBBTUMgY29uZmlndXJhdGlvbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfQU1DX0NPTkZJRzogQU1DQ29uZmlnID0ge1xuICB0aW1lb3V0OiAyMDAwMCxcbiAgcmV0cnlMaW1pdDogNSxcbiAgcmV0cnlJbnRlcnZhbDogMTAwMCxcbiAgbWF4QmFja29mZjogNjAwMDAsXG4gIGJhY2tvZmZGYWN0b3I6IDIuMCxcbiAgc2VtYXBob3JlTGltaXQ6IDEwLFxuICByZXRyeUJhdGNoU2l6ZTogNTAsXG4gIHJldHJ5TWF4UmV0cmllczogMyxcbn07XG5cbi8qKlxuICogRml4ZWQgdG9rZW4gdmFsdWUgcmVxdWlyZWQgYnkgV2lraWRvdFxuICogVGhpcyBpcyBhIGZpeGVkIHZhbHVlIG9idGFpbmVkIGZyb20gV2lraWRvdCdzIGZyb250ZW5kLFxuICogdXNlZCBhcyBhbiBpZGVudGlmaWVyIHJhdGhlciB0aGFuIGEgc2VjdXJpdHkgdG9rZW5cbiAqL1xuZXhwb3J0IGNvbnN0IFdJS0lET1RfVE9LRU43ID0gJzEyMzQ1Nic7XG5cbi8qKlxuICogRmFsbGJhY2sgSFRUUCBzdGF0dXMgY29kZSBmb3IgSFRUUCBlcnJvcnNcbiAqIFVzZWQgd2hlbiBzdGF0dXMgY29kZSBjYW5ub3QgYmUgcmV0cmlldmVkIGZyb20gcmVzcG9uc2VcbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfSFRUUF9TVEFUVVNfQ09ERSA9IDk5OTtcbiIsCiAgICAiLyoqXG4gKiBIVFRQIHV0aWxpdGllcyB3aXRoIHJldHJ5IG1lY2hhbmlzbVxuICovXG5pbXBvcnQgdHlwZSB7IEFNQ0NvbmZpZyB9IGZyb20gJy4uL2Nvbm5lY3Rvci9hbWMtY29uZmlnJztcbmltcG9ydCB7IERFRkFVTFRfQU1DX0NPTkZJRyB9IGZyb20gJy4uL2Nvbm5lY3Rvci9hbWMtY29uZmlnJztcblxuLyoqXG4gKiBDYWxjdWxhdGUgYmFja29mZiB0aW1lIHdpdGggZXhwb25lbnRpYWwgYmFja29mZiBhbmQgaml0dGVyXG4gKiBAcGFyYW0gcmV0cnlDb3VudCAtIEN1cnJlbnQgcmV0cnkgY291bnQgKDEtYmFzZWQpXG4gKiBAcGFyYW0gYmFzZUludGVydmFsIC0gQmFzZSBpbnRlcnZhbCBpbiBtaWxsaXNlY29uZHNcbiAqIEBwYXJhbSBiYWNrb2ZmRmFjdG9yIC0gRXhwb25lbnRpYWwgYmFja29mZiBmYWN0b3JcbiAqIEBwYXJhbSBtYXhCYWNrb2ZmIC0gTWF4aW11bSBiYWNrb2ZmIHRpbWUgaW4gbWlsbGlzZWNvbmRzXG4gKiBAcmV0dXJucyBCYWNrb2ZmIHRpbWUgaW4gbWlsbGlzZWNvbmRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVCYWNrb2ZmKFxuICByZXRyeUNvdW50OiBudW1iZXIsXG4gIGJhc2VJbnRlcnZhbDogbnVtYmVyLFxuICBiYWNrb2ZmRmFjdG9yOiBudW1iZXIsXG4gIG1heEJhY2tvZmY6IG51bWJlclxuKTogbnVtYmVyIHtcbiAgY29uc3QgYmFja29mZiA9IGJhc2VJbnRlcnZhbCAqIGJhY2tvZmZGYWN0b3IgKiogKHJldHJ5Q291bnQgLSAxKTtcbiAgY29uc3Qgaml0dGVyID0gTWF0aC5yYW5kb20oKSAqIGJhY2tvZmYgKiAwLjE7XG4gIHJldHVybiBNYXRoLm1pbihiYWNrb2ZmICsgaml0dGVyLCBtYXhCYWNrb2ZmKTtcbn1cblxuLyoqXG4gKiBTbGVlcCBmb3Igc3BlY2lmaWVkIG1pbGxpc2Vjb25kc1xuICovXG5mdW5jdGlvbiBzbGVlcChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGZldGNoV2l0aFJldHJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmV0Y2hXaXRoUmV0cnlPcHRpb25zIGV4dGVuZHMgT21pdDxSZXF1ZXN0SW5pdCwgJ3NpZ25hbCc+IHtcbiAgLyoqIFdoZXRoZXIgdG8gY2hlY2sgcmVzcG9uc2Uub2sgKGRlZmF1bHQ6IHRydWUpICovXG4gIGNoZWNrT2s/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIEhUVFAgc3RhdHVzIGNvZGUgaXMgcmV0cnlhYmxlICg1eHggc2VydmVyIGVycm9ycylcbiAqL1xuZnVuY3Rpb24gaXNSZXRyeWFibGVTdGF0dXMoc3RhdHVzOiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIHN0YXR1cyA+PSA1MDAgJiYgc3RhdHVzIDwgNjAwO1xufVxuXG4vKipcbiAqIEZldGNoIHdpdGggYXV0b21hdGljIHJldHJ5IG9uIHRpbWVvdXQvbmV0d29yayBlcnJvcnMgYW5kIDV4eCBlcnJvcnNcbiAqIEBwYXJhbSB1cmwgLSBVUkwgdG8gZmV0Y2hcbiAqIEBwYXJhbSBjb25maWcgLSBBTUMgY29uZmlndXJhdGlvbiAodXNlcyB0aW1lb3V0LCByZXRyeUxpbWl0LCByZXRyeUludGVydmFsLCBtYXhCYWNrb2ZmLCBiYWNrb2ZmRmFjdG9yKVxuICogQHBhcmFtIG9wdGlvbnMgLSBGZXRjaCBvcHRpb25zIChSZXF1ZXN0SW5pdCB3aXRob3V0IHNpZ25hbClcbiAqIEByZXR1cm5zIFJlc3BvbnNlXG4gKiBAdGhyb3dzIEVycm9yIG9uIGFsbCByZXRyaWVzIGV4aGF1c3RlZCBvciBub24tcmV0cnlhYmxlIGVycm9ycyAoNHh4KVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hXaXRoUmV0cnkoXG4gIHVybDogc3RyaW5nLFxuICBjb25maWc6IEFNQ0NvbmZpZyA9IERFRkFVTFRfQU1DX0NPTkZJRyxcbiAgb3B0aW9uczogRmV0Y2hXaXRoUmV0cnlPcHRpb25zID0ge31cbik6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgY29uc3QgeyBjaGVja09rID0gdHJ1ZSwgLi4uZmV0Y2hPcHRpb25zIH0gPSBvcHRpb25zO1xuXG4gIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDwgY29uZmlnLnJldHJ5TGltaXQ7IGF0dGVtcHQrKykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgICAgICAuLi5mZXRjaE9wdGlvbnMsXG4gICAgICAgIHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dChjb25maWcudGltZW91dCksXG4gICAgICB9KTtcblxuICAgICAgLy8gRG9uJ3QgcmV0cnkgNHh4IGVycm9ycyAtIHRoZXkgYXJlIGNsaWVudCBlcnJvcnMgdGhhdCB3b24ndCBjaGFuZ2Ugb24gcmV0cnlcbiAgICAgIGlmIChjaGVja09rICYmICFyZXNwb25zZS5vaykge1xuICAgICAgICBpZiAoIWlzUmV0cnlhYmxlU3RhdHVzKHJlc3BvbnNlLnN0YXR1cykpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9OiAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNXh4IGVycm9ycyBhcmUgcmV0cnlhYmxlLCBjb250aW51ZSB0byByZXRyeSBsb2dpYyBiZWxvd1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9OiAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIERvbid0IHJldHJ5IGlmIGl0J3MgYSBub24tcmV0cnlhYmxlIEhUVFAgZXJyb3IgKDR4eClcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm1lc3NhZ2Uuc3RhcnRzV2l0aCgnSFRUUCA0JykpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoYXR0ZW1wdCA+PSBjb25maWcucmV0cnlMaW1pdCAtIDEpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBjb25zdCBiYWNrb2ZmID0gY2FsY3VsYXRlQmFja29mZihcbiAgICAgICAgYXR0ZW1wdCArIDEsXG4gICAgICAgIGNvbmZpZy5yZXRyeUludGVydmFsLFxuICAgICAgICBjb25maWcuYmFja29mZkZhY3RvcixcbiAgICAgICAgY29uZmlnLm1heEJhY2tvZmZcbiAgICAgICk7XG4gICAgICBhd2FpdCBzbGVlcChiYWNrb2ZmKTtcbiAgICB9XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdVbnJlYWNoYWJsZScpO1xufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IENsaWVudFJlZiB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RVc2VyLCBVc2VyVHlwZSB9IGZyb20gJy4vYWJzdHJhY3QtdXNlcic7XG5cbi8qKlxuICogQW5vbnltb3VzIHVzZXJcbiAqL1xuZXhwb3J0IGNsYXNzIEFub255bW91c1VzZXIgaW1wbGVtZW50cyBBYnN0cmFjdFVzZXIge1xuICBwdWJsaWMgcmVhZG9ubHkgY2xpZW50OiBDbGllbnRSZWY7XG5cbiAgLyoqIFVzZXIgSUQgKDAgZm9yIGFub255bW91cykgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlkOiBudW1iZXIgPSAwO1xuXG4gIC8qKiBVc2VybmFtZSAoXCJBbm9ueW1vdXNcIiBmb3IgYW5vbnltb3VzIHVzZXJzKSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nID0gJ0Fub255bW91cyc7XG5cbiAgLyoqIFVOSVggZm9ybWF0IHVzZXJuYW1lICovXG4gIHB1YmxpYyByZWFkb25seSB1bml4TmFtZTogc3RyaW5nID0gJ2Fub255bW91cyc7XG5cbiAgLyoqIEF2YXRhciBVUkwgKG51bGwgZm9yIGFub255bW91cykgKi9cbiAgcHVibGljIHJlYWRvbmx5IGF2YXRhclVybDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIElQIGFkZHJlc3MgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlwOiBzdHJpbmc7XG5cbiAgLyoqIFVzZXIgdHlwZSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdXNlclR5cGU6IFVzZXJUeXBlID0gJ2Fub255bW91cyc7XG5cbiAgY29uc3RydWN0b3IoY2xpZW50OiBDbGllbnRSZWYsIGlwOiBzdHJpbmcpIHtcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICB0aGlzLmlwID0gaXA7XG4gIH1cblxuICAvLyBBYnN0cmFjdFVzZXIgaW1wbGVtZW50YXRpb25cbiAgaXNVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpc0RlbGV0ZWRVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpc0Fub255bW91c1VzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaXNHdWVzdFVzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlzV2lraWRvdFVzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYEFub255bW91c1VzZXIobmFtZT0ke3RoaXMubmFtZX0sIHVuaXhOYW1lPSR7dGhpcy51bml4TmFtZX0sIGlwPSR7dGhpcy5pcH0pYDtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IENsaWVudFJlZiB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RVc2VyLCBVc2VyVHlwZSB9IGZyb20gJy4vYWJzdHJhY3QtdXNlcic7XG5cbi8qKlxuICogRGVsZXRlZCB1c2VyXG4gKi9cbmV4cG9ydCBjbGFzcyBEZWxldGVkVXNlciBpbXBsZW1lbnRzIEFic3RyYWN0VXNlciB7XG4gIHB1YmxpYyByZWFkb25seSBjbGllbnQ6IENsaWVudFJlZjtcblxuICAvKiogRGVsZXRlZCB1c2VyIElEICovXG4gIHB1YmxpYyByZWFkb25seSBpZDogbnVtYmVyO1xuXG4gIC8qKiBVc2VybmFtZSAoXCJhY2NvdW50IGRlbGV0ZWRcIiBmb3IgZGVsZXRlZCB1c2VycykgKi9cbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZyA9ICdhY2NvdW50IGRlbGV0ZWQnO1xuXG4gIC8qKiBVTklYIGZvcm1hdCB1c2VybmFtZSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdW5peE5hbWU6IHN0cmluZyA9ICdhY2NvdW50X2RlbGV0ZWQnO1xuXG4gIC8qKiBBdmF0YXIgVVJMIChudWxsIGZvciBkZWxldGVkKSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYXZhdGFyVXJsOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvKiogSVAgYWRkcmVzcyAobnVsbCBmb3IgZGVsZXRlZCkgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlwOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvKiogVXNlciB0eXBlICovXG4gIHB1YmxpYyByZWFkb25seSB1c2VyVHlwZTogVXNlclR5cGUgPSAnZGVsZXRlZCc7XG5cbiAgY29uc3RydWN0b3IoY2xpZW50OiBDbGllbnRSZWYsIGlkOiBudW1iZXIpIHtcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICB0aGlzLmlkID0gaWQ7XG4gIH1cblxuICAvLyBBYnN0cmFjdFVzZXIgaW1wbGVtZW50YXRpb25cbiAgaXNVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpc0RlbGV0ZWRVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlzQW5vbnltb3VzVXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaXNHdWVzdFVzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlzV2lraWRvdFVzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYERlbGV0ZWRVc2VyKGlkPSR7dGhpcy5pZH0sIG5hbWU9JHt0aGlzLm5hbWV9LCB1bml4TmFtZT0ke3RoaXMudW5peE5hbWV9KWA7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBDbGllbnRSZWYgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0VXNlciwgVXNlclR5cGUgfSBmcm9tICcuL2Fic3RyYWN0LXVzZXInO1xuXG4vKipcbiAqIEd1ZXN0IHVzZXJcbiAqL1xuZXhwb3J0IGNsYXNzIEd1ZXN0VXNlciBpbXBsZW1lbnRzIEFic3RyYWN0VXNlciB7XG4gIHB1YmxpYyByZWFkb25seSBjbGllbnQ6IENsaWVudFJlZjtcblxuICAvKiogVXNlciBJRCAoMCBmb3IgZ3Vlc3QpICovXG4gIHB1YmxpYyByZWFkb25seSBpZDogbnVtYmVyID0gMDtcblxuICAvKiogR3Vlc3QgbmFtZSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKiBVTklYIGZvcm1hdCB1c2VybmFtZSAobnVsbCBmb3IgZ3Vlc3QpICovXG4gIHB1YmxpYyByZWFkb25seSB1bml4TmFtZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIEF2YXRhciBVUkwgKG1heSBiZSBHcmF2YXRhcikgKi9cbiAgcHVibGljIHJlYWRvbmx5IGF2YXRhclVybDogc3RyaW5nIHwgbnVsbDtcblxuICAvKiogSVAgYWRkcmVzcyAobnVsbCBmb3IgZ3Vlc3QpICovXG4gIHB1YmxpYyByZWFkb25seSBpcDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIFVzZXIgdHlwZSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdXNlclR5cGU6IFVzZXJUeXBlID0gJ2d1ZXN0JztcblxuICBjb25zdHJ1Y3RvcihjbGllbnQ6IENsaWVudFJlZiwgbmFtZTogc3RyaW5nLCBhdmF0YXJVcmw6IHN0cmluZyB8IG51bGwgPSBudWxsKSB7XG4gICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmF2YXRhclVybCA9IGF2YXRhclVybDtcbiAgfVxuXG4gIC8vIEFic3RyYWN0VXNlciBpbXBsZW1lbnRhdGlvblxuICBpc1VzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlzRGVsZXRlZFVzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlzQW5vbnltb3VzVXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaXNHdWVzdFVzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaXNXaWtpZG90VXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgR3Vlc3RVc2VyKG5hbWU9JHt0aGlzLm5hbWV9KWA7XG4gIH1cbn1cbiIsCiAgICAiLyoqXG4gKiBNYXBwaW5nIHRhYmxlIGZvciBjb252ZXJ0aW5nIHNwZWNpYWwgc3ltYm9scyBhbmQgbm9uLUVuZ2xpc2ggYWxwaGFiZXRzIHRvIEVuZ2xpc2ggYWxwaGFiZXRzXG4gKlxuICogUHJvdmlkZXMgbWFwcGluZyBmb3IgY29udmVydGluZyBub24tQVNDSUkgY2hhcmFjdGVycyB0byBjb3JyZXNwb25kaW5nIEFTQ0lJIGNoYXJhY3RlcnMuXG4gKiBNYWlubHkgdXNlZCBmb3IgVVJMIGdlbmVyYXRpb24gYW5kIHBhZ2UgbmFtZSBjb252ZXJzaW9uIHRvIHVuaXggZm9ybWF0LlxuICovXG5cbmV4cG9ydCBjb25zdCBzcGVjaWFsQ2hhck1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgJ1xcdTAwQzAnOiAnYScsXG4gICdcXHUwMEMxJzogJ2EnLFxuICAnXFx1MDBDMic6ICdhJyxcbiAgJ1xcdTAwQzMnOiAnYScsXG4gICdcXHUwMEM0JzogJ2FlJyxcbiAgJ1xcdTAwQzUnOiAnYScsXG4gICdcXHUwMEM2JzogJ2FlJyxcbiAgJ1xcdTAwQzcnOiAnYycsXG4gICdcXHUwMEM4JzogJ2UnLFxuICAnXFx1MDBDOSc6ICdlJyxcbiAgJ1xcdTAwQ0EnOiAnZScsXG4gICdcXHUwMENCJzogJ2UnLFxuICAnXFx1MDBDQyc6ICdpJyxcbiAgJ1xcdTAwQ0QnOiAnaScsXG4gICdcXHUwMENFJzogJ2knLFxuICAnXFx1MDBDRic6ICdpJyxcbiAgJ1xcdTAwRDAnOiAnZCcsXG4gICdcXHUwMEQxJzogJ24nLFxuICAnXFx1MDBEMic6ICdvJyxcbiAgJ1xcdTAwRDMnOiAnbycsXG4gICdcXHUwMEQ0JzogJ28nLFxuICAnXFx1MDBENSc6ICdvJyxcbiAgJ1xcdTAwRDYnOiAnb2UnLFxuICAnXFx1MDBEOCc6ICdvJyxcbiAgJ1xcdTAwRDknOiAndScsXG4gICdcXHUwMERBJzogJ3UnLFxuICAnXFx1MDBEQic6ICd1JyxcbiAgJ1xcdTAwREMnOiAndWUnLFxuICAnXFx1MDBERCc6ICd5JyxcbiAgJ1xcdTAwREUnOiAndCcsXG4gICdcXHUwMERGJzogJ3NzJyxcbiAgJ1xcdTAwRTAnOiAnYScsXG4gICdcXHUwMEUxJzogJ2EnLFxuICAnXFx1MDBFMic6ICdhJyxcbiAgJ1xcdTAwRTMnOiAnYScsXG4gICdcXHUwMEU0JzogJ2FlJyxcbiAgJ1xcdTAwRTUnOiAnYScsXG4gICdcXHUwMEU2JzogJ2FlJyxcbiAgJ1xcdTAwRTcnOiAnYycsXG4gICdcXHUwMEU4JzogJ2UnLFxuICAnXFx1MDBFOSc6ICdlJyxcbiAgJ1xcdTAwRUEnOiAnZScsXG4gICdcXHUwMEVCJzogJ2UnLFxuICAnXFx1MDBFQyc6ICdpJyxcbiAgJ1xcdTAwRUQnOiAnaScsXG4gICdcXHUwMEVFJzogJ2knLFxuICAnXFx1MDBFRic6ICdpJyxcbiAgJ1xcdTAwRjAnOiAnZCcsXG4gICdcXHUwMEYxJzogJ24nLFxuICAnXFx1MDBGMic6ICdvJyxcbiAgJ1xcdTAwRjMnOiAnbycsXG4gICdcXHUwMEY0JzogJ28nLFxuICAnXFx1MDBGNSc6ICdvJyxcbiAgJ1xcdTAwRjYnOiAnb2UnLFxuICAnXFx1MDBGOCc6ICdvJyxcbiAgJ1xcdTAwRjknOiAndScsXG4gICdcXHUwMEZBJzogJ3UnLFxuICAnXFx1MDBGQic6ICd1JyxcbiAgJ1xcdTAwRkMnOiAndWUnLFxuICAnXFx1MDBGRCc6ICd5JyxcbiAgJ1xcdTAwRkUnOiAndCcsXG4gICdcXHUwMEZGJzogJ3knLFxuICAnXFx1MDEwMCc6ICdhJyxcbiAgJ1xcdTAxMDEnOiAnYScsXG4gICdcXHUwMTAyJzogJ2EnLFxuICAnXFx1MDEwMyc6ICdhJyxcbiAgJ1xcdTAxMDQnOiAnYScsXG4gICdcXHUwMTA1JzogJ2EnLFxuICAnXFx1MDEwNic6ICdjJyxcbiAgJ1xcdTAxMDcnOiAnYycsXG4gICdcXHUwMTA4JzogJ2MnLFxuICAnXFx1MDEwOSc6ICdjJyxcbiAgJ1xcdTAxMEEnOiAnYycsXG4gICdcXHUwMTBCJzogJ2MnLFxuICAnXFx1MDEwQyc6ICdjJyxcbiAgJ1xcdTAxMEQnOiAnYycsXG4gICdcXHUwMTBFJzogJ2QnLFxuICAnXFx1MDEwRic6ICdkJyxcbiAgJ1xcdTAxMTAnOiAnZCcsXG4gICdcXHUwMTExJzogJ2QnLFxuICAnXFx1MDExMic6ICdlJyxcbiAgJ1xcdTAxMTMnOiAnZScsXG4gICdcXHUwMTE0JzogJ2UnLFxuICAnXFx1MDExNSc6ICdlJyxcbiAgJ1xcdTAxMTYnOiAnZScsXG4gICdcXHUwMTE3JzogJ2UnLFxuICAnXFx1MDExOCc6ICdlJyxcbiAgJ1xcdTAxMTknOiAnZScsXG4gICdcXHUwMTFBJzogJ2UnLFxuICAnXFx1MDExQic6ICdlJyxcbiAgJ1xcdTAxMUMnOiAnZycsXG4gICdcXHUwMTFEJzogJ2cnLFxuICAnXFx1MDExRSc6ICdnJyxcbiAgJ1xcdTAxMUYnOiAnZycsXG4gICdcXHUwMTIwJzogJ2cnLFxuICAnXFx1MDEyMSc6ICdnJyxcbiAgJ1xcdTAxMjInOiAnZycsXG4gICdcXHUwMTIzJzogJ2cnLFxuICAnXFx1MDEyNCc6ICdoJyxcbiAgJ1xcdTAxMjUnOiAnaCcsXG4gICdcXHUwMTI2JzogJ2gnLFxuICAnXFx1MDEyNyc6ICdoJyxcbiAgJ1xcdTAxMjgnOiAnaScsXG4gICdcXHUwMTI5JzogJ2knLFxuICAnXFx1MDEyQSc6ICdpJyxcbiAgJ1xcdTAxMkInOiAnaScsXG4gICdcXHUwMTJDJzogJ2knLFxuICAnXFx1MDEyRCc6ICdpJyxcbiAgJ1xcdTAxMkUnOiAnaScsXG4gICdcXHUwMTJGJzogJ2knLFxuICAnXFx1MDEzMCc6ICdpJyxcbiAgJ1xcdTAxMzEnOiAnaScsXG4gICdcXHUwMTMyJzogJ2lqJyxcbiAgJ1xcdTAxMzMnOiAnaWonLFxuICAnXFx1MDEzNCc6ICdqJyxcbiAgJ1xcdTAxMzUnOiAnaicsXG4gICdcXHUwMTM2JzogJ2snLFxuICAnXFx1MDEzNyc6ICdrJyxcbiAgJ1xcdTAxMzgnOiAnaycsXG4gICdcXHUwMTM5JzogJ2wnLFxuICAnXFx1MDEzQSc6ICdsJyxcbiAgJ1xcdTAxM0InOiAnbCcsXG4gICdcXHUwMTNDJzogJ2wnLFxuICAnXFx1MDEzRCc6ICdsJyxcbiAgJ1xcdTAxM0UnOiAnbCcsXG4gICdcXHUwMTNGJzogJ2wnLFxuICAnXFx1MDE0MCc6ICdsJyxcbiAgJ1xcdTAxNDEnOiAnbCcsXG4gICdcXHUwMTQyJzogJ2wnLFxuICAnXFx1MDE0Myc6ICduJyxcbiAgJ1xcdTAxNDQnOiAnbicsXG4gICdcXHUwMTQ1JzogJ24nLFxuICAnXFx1MDE0Nic6ICduJyxcbiAgJ1xcdTAxNDcnOiAnbicsXG4gICdcXHUwMTQ4JzogJ24nLFxuICAnXFx1MDE0OSc6ICduJyxcbiAgJ1xcdTAxNEEnOiAnbicsXG4gICdcXHUwMTRCJzogJ24nLFxuICAnXFx1MDE0Qyc6ICdvJyxcbiAgJ1xcdTAxNEQnOiAnbycsXG4gICdcXHUwMTRFJzogJ28nLFxuICAnXFx1MDE0Ric6ICdvJyxcbiAgJ1xcdTAxNTAnOiAnbycsXG4gICdcXHUwMTUxJzogJ28nLFxuICAnXFx1MDE1Mic6ICdvZScsXG4gICdcXHUwMTUzJzogJ29lJyxcbiAgJ1xcdTAxNTQnOiAncicsXG4gICdcXHUwMTU1JzogJ3InLFxuICAnXFx1MDE1Nic6ICdyJyxcbiAgJ1xcdTAxNTcnOiAncicsXG4gICdcXHUwMTU4JzogJ3InLFxuICAnXFx1MDE1OSc6ICdyJyxcbiAgJ1xcdTAxNUEnOiAncycsXG4gICdcXHUwMTVCJzogJ3MnLFxuICAnXFx1MDE1Qyc6ICdzJyxcbiAgJ1xcdTAxNUQnOiAncycsXG4gICdcXHUwMTVFJzogJ3MnLFxuICAnXFx1MDE1Ric6ICdzJyxcbiAgJ1xcdTAxNjAnOiAncycsXG4gICdcXHUwMTYxJzogJ3MnLFxuICAnXFx1MDE2Mic6ICd0JyxcbiAgJ1xcdTAxNjMnOiAndCcsXG4gICdcXHUwMTY0JzogJ3QnLFxuICAnXFx1MDE2NSc6ICd0JyxcbiAgJ1xcdTAxNjYnOiAndCcsXG4gICdcXHUwMTY3JzogJ3QnLFxuICAnXFx1MDE2OCc6ICd1JyxcbiAgJ1xcdTAxNjknOiAndScsXG4gICdcXHUwMTZBJzogJ3UnLFxuICAnXFx1MDE2Qic6ICd1JyxcbiAgJ1xcdTAxNkMnOiAndScsXG4gICdcXHUwMTZEJzogJ3UnLFxuICAnXFx1MDE2RSc6ICd1JyxcbiAgJ1xcdTAxNkYnOiAndScsXG4gICdcXHUwMTcwJzogJ3UnLFxuICAnXFx1MDE3MSc6ICd1JyxcbiAgJ1xcdTAxNzInOiAndScsXG4gICdcXHUwMTczJzogJ3UnLFxuICAnXFx1MDE3NCc6ICd3JyxcbiAgJ1xcdTAxNzUnOiAndycsXG4gICdcXHUwMTc2JzogJ3knLFxuICAnXFx1MDE3Nyc6ICd5JyxcbiAgJ1xcdTAxNzgnOiAneScsXG4gICdcXHUwMTc5JzogJ3onLFxuICAnXFx1MDE3QSc6ICd6JyxcbiAgJ1xcdTAxN0InOiAneicsXG4gICdcXHUwMTdDJzogJ3onLFxuICAnXFx1MDE3RCc6ICd6JyxcbiAgJ1xcdTAxN0UnOiAneicsXG4gICdcXHUwMTdGJzogJ3NzJyxcbiAgJ1xcdTAxOTEnOiAnZicsXG4gICdcXHUwMTkyJzogJ2YnLFxuICAnXFx1MDIxOCc6ICdzJyxcbiAgJ1xcdTAyMTknOiAncycsXG4gICdcXHUwMjFBJzogJ3QnLFxuICAnXFx1MDIxQic6ICd0JyxcbiAgJ1xcdTAzODYnOiAnYScsXG4gICdcXHUwMzg4JzogJ2UnLFxuICAnXFx1MDM4OSc6ICdpJyxcbiAgJ1xcdTAzOEEnOiAnaScsXG4gICdcXHUwMzhDJzogJ28nLFxuICAnXFx1MDM4RSc6ICd5JyxcbiAgJ1xcdTAzOEYnOiAnbycsXG4gICdcXHUwMzkwJzogJ2knLFxuICAnXFx1MDM5MSc6ICdhJyxcbiAgJ1xcdTAzOTInOiAndicsXG4gICdcXHUwMzkzJzogJ2cnLFxuICAnXFx1MDM5NCc6ICdkJyxcbiAgJ1xcdTAzOTUnOiAnZScsXG4gICdcXHUwMzk2JzogJ3onLFxuICAnXFx1MDM5Nyc6ICdpJyxcbiAgJ1xcdTAzOTgnOiAndGgnLFxuICAnXFx1MDM5OSc6ICdpJyxcbiAgJ1xcdTAzOUEnOiAnaycsXG4gICdcXHUwMzlCJzogJ2wnLFxuICAnXFx1MDM5Qyc6ICdtJyxcbiAgJ1xcdTAzOUQnOiAnbicsXG4gICdcXHUwMzlFJzogJ3gnLFxuICAnXFx1MDM5Ric6ICdvJyxcbiAgJ1xcdTAzQTAnOiAncCcsXG4gICdcXHUwM0ExJzogJ3InLFxuICAnXFx1MDNBMyc6ICdzJyxcbiAgJ1xcdTAzQTQnOiAndCcsXG4gICdcXHUwM0E1JzogJ3knLFxuICAnXFx1MDNBNic6ICdmJyxcbiAgJ1xcdTAzQTcnOiAnY2gnLFxuICAnXFx1MDNBOCc6ICdwcycsXG4gICdcXHUwM0E5JzogJ28nLFxuICAnXFx1MDNBQSc6ICdpJyxcbiAgJ1xcdTAzQUInOiAneScsXG4gICdcXHUwM0FDJzogJ2EnLFxuICAnXFx1MDNBRCc6ICdlJyxcbiAgJ1xcdTAzQUUnOiAnaScsXG4gICdcXHUwM0FGJzogJ2knLFxuICAnXFx1MDNCMCc6ICd5JyxcbiAgJ1xcdTAzQjEnOiAnYScsXG4gICdcXHUwM0IyJzogJ3YnLFxuICAnXFx1MDNCMyc6ICdnJyxcbiAgJ1xcdTAzQjQnOiAnZCcsXG4gICdcXHUwM0I1JzogJ2UnLFxuICAnXFx1MDNCNic6ICd6JyxcbiAgJ1xcdTAzQjcnOiAnaScsXG4gICdcXHUwM0I4JzogJ3RoJyxcbiAgJ1xcdTAzQjknOiAnaScsXG4gICdcXHUwM0JBJzogJ2snLFxuICAnXFx1MDNCQic6ICdsJyxcbiAgJ1xcdTAzQkMnOiAnbScsXG4gICdcXHUwM0JEJzogJ24nLFxuICAnXFx1MDNCRSc6ICd4JyxcbiAgJ1xcdTAzQkYnOiAnbycsXG4gICdcXHUwM0MwJzogJ3AnLFxuICAnXFx1MDNDMSc6ICdyJyxcbiAgJ1xcdTAzQzInOiAncycsXG4gICdcXHUwM0MzJzogJ3MnLFxuICAnXFx1MDNDNCc6ICd0JyxcbiAgJ1xcdTAzQzUnOiAneScsXG4gICdcXHUwM0M2JzogJ2YnLFxuICAnXFx1MDNDNyc6ICdjaCcsXG4gICdcXHUwM0M4JzogJ3BzJyxcbiAgJ1xcdTAzQzknOiAnbycsXG4gICdcXHUwM0NBJzogJ2knLFxuICAnXFx1MDNDQic6ICd5JyxcbiAgJ1xcdTAzQ0MnOiAnbycsXG4gICdcXHUwM0NEJzogJ3knLFxuICAnXFx1MDNDRSc6ICdvJyxcbiAgJ1xcdTAzRDEnOiAndGgnLFxuICAnXFx1MDQwMSc6ICdlJyxcbiAgJ1xcdTA0MDInOiAnZCcsXG4gICdcXHUwNDAzJzogJ2cnLFxuICAnXFx1MDQwNCc6ICdlJyxcbiAgJ1xcdTA0MDUnOiAneicsXG4gICdcXHUwNDA2JzogJ2knLFxuICAnXFx1MDQwNyc6ICdpJyxcbiAgJ1xcdTA0MDgnOiAnaicsXG4gICdcXHUwNDA5JzogJ2wnLFxuICAnXFx1MDQwQSc6ICduJyxcbiAgJ1xcdTA0MEInOiAnYycsXG4gICdcXHUwNDBDJzogJ2snLFxuICAnXFx1MDQwRSc6ICd1JyxcbiAgJ1xcdTA0MEYnOiAnZCcsXG4gICdcXHUwNDEwJzogJ2EnLFxuICAnXFx1MDQxMSc6ICdiJyxcbiAgJ1xcdTA0MTInOiAndicsXG4gICdcXHUwNDEzJzogJ2cnLFxuICAnXFx1MDQxNCc6ICdkJyxcbiAgJ1xcdTA0MTUnOiAnZScsXG4gICdcXHUwNDE2JzogJ3onLFxuICAnXFx1MDQxNyc6ICd6JyxcbiAgJ1xcdTA0MTgnOiAnaScsXG4gICdcXHUwNDE5JzogJ2onLFxuICAnXFx1MDQxQSc6ICdrJyxcbiAgJ1xcdTA0MUInOiAnbCcsXG4gICdcXHUwNDFDJzogJ20nLFxuICAnXFx1MDQxRCc6ICduJyxcbiAgJ1xcdTA0MUUnOiAnbycsXG4gICdcXHUwNDFGJzogJ3AnLFxuICAnXFx1MDQyMCc6ICdyJyxcbiAgJ1xcdTA0MjEnOiAncycsXG4gICdcXHUwNDIyJzogJ3QnLFxuICAnXFx1MDQyMyc6ICd1JyxcbiAgJ1xcdTA0MjQnOiAnZicsXG4gICdcXHUwNDI1JzogJ2gnLFxuICAnXFx1MDQyNic6ICdjJyxcbiAgJ1xcdTA0MjcnOiAnYycsXG4gICdcXHUwNDI4JzogJ3MnLFxuICAnXFx1MDQyOSc6ICdzJyxcbiAgJ1xcdTA0MkInOiAneScsXG4gICdcXHUwNDJEJzogJ2UnLFxuICAnXFx1MDQyRSc6ICd1JyxcbiAgJ1xcdTA0MkYnOiAnYScsXG4gICdcXHUwNDMwJzogJ2EnLFxuICAnXFx1MDQzMSc6ICdiJyxcbiAgJ1xcdTA0MzInOiAndicsXG4gICdcXHUwNDMzJzogJ2cnLFxuICAnXFx1MDQzNCc6ICdkJyxcbiAgJ1xcdTA0MzUnOiAnZScsXG4gICdcXHUwNDM2JzogJ3onLFxuICAnXFx1MDQzNyc6ICd6JyxcbiAgJ1xcdTA0MzgnOiAnaScsXG4gICdcXHUwNDM5JzogJ2onLFxuICAnXFx1MDQzQSc6ICdrJyxcbiAgJ1xcdTA0M0InOiAnbCcsXG4gICdcXHUwNDNDJzogJ20nLFxuICAnXFx1MDQzRCc6ICduJyxcbiAgJ1xcdTA0M0UnOiAnbycsXG4gICdcXHUwNDNGJzogJ3AnLFxuICAnXFx1MDQ0MCc6ICdyJyxcbiAgJ1xcdTA0NDEnOiAncycsXG4gICdcXHUwNDQyJzogJ3QnLFxuICAnXFx1MDQ0Myc6ICd1JyxcbiAgJ1xcdTA0NDQnOiAnZicsXG4gICdcXHUwNDQ1JzogJ2gnLFxuICAnXFx1MDQ0Nic6ICdjJyxcbiAgJ1xcdTA0NDcnOiAnYycsXG4gICdcXHUwNDQ4JzogJ3MnLFxuICAnXFx1MDQ0OSc6ICdzJyxcbiAgJ1xcdTA0NEInOiAneScsXG4gICdcXHUwNDREJzogJ2UnLFxuICAnXFx1MDQ0RSc6ICd1JyxcbiAgJ1xcdTA0NEYnOiAnYScsXG4gICdcXHUwNDUxJzogJ2UnLFxuICAnXFx1MDQ1Mic6ICdkJyxcbiAgJ1xcdTA0NTMnOiAnZycsXG4gICdcXHUwNDU0JzogJ2UnLFxuICAnXFx1MDQ1NSc6ICd6JyxcbiAgJ1xcdTA0NTYnOiAnaScsXG4gICdcXHUwNDU3JzogJ2knLFxuICAnXFx1MDQ1OCc6ICdqJyxcbiAgJ1xcdTA0NTknOiAnbCcsXG4gICdcXHUwNDVBJzogJ24nLFxuICAnXFx1MDQ1Qic6ICdjJyxcbiAgJ1xcdTA0NUMnOiAnaycsXG4gICdcXHUwNDVFJzogJ3UnLFxuICAnXFx1MDQ1Ric6ICdkJyxcbiAgJ1xcdTA0NjInOiAnZScsXG4gICdcXHUwNDYzJzogJ2UnLFxuICAnXFx1MDQ2QSc6ICdhJyxcbiAgJ1xcdTA0NkInOiAnYScsXG4gICdcXHUwNDcyJzogJ2YnLFxuICAnXFx1MDQ3Myc6ICdmJyxcbiAgJ1xcdTA0NzQnOiAneScsXG4gICdcXHUwNDc1JzogJ3knLFxuICAnXFx1MDQ5MCc6ICdnJyxcbiAgJ1xcdTA0OTEnOiAnZycsXG4gICdcXHUwNDkyJzogJ2cnLFxuICAnXFx1MDQ5Myc6ICdnJyxcbiAgJ1xcdTA0OTQnOiAnZycsXG4gICdcXHUwNDk1JzogJ2cnLFxuICAnXFx1MDQ5Nic6ICd6JyxcbiAgJ1xcdTA0OTcnOiAneicsXG4gICdcXHUwNDlBJzogJ2snLFxuICAnXFx1MDQ5Qic6ICdrJyxcbiAgJ1xcdTA0OUMnOiAnaycsXG4gICdcXHUwNDlEJzogJ2snLFxuICAnXFx1MDQ5RSc6ICdrJyxcbiAgJ1xcdTA0OUYnOiAnaycsXG4gICdcXHUwNEEwJzogJ2snLFxuICAnXFx1MDRBMSc6ICdrJyxcbiAgJ1xcdTA0QTInOiAnbicsXG4gICdcXHUwNEEzJzogJ24nLFxuICAnXFx1MDRBNCc6ICduJyxcbiAgJ1xcdTA0QTUnOiAnbicsXG4gICdcXHUwNEE2JzogJ3AnLFxuICAnXFx1MDRBNyc6ICdwJyxcbiAgJ1xcdTA0QTgnOiAnbycsXG4gICdcXHUwNEE5JzogJ28nLFxuICAnXFx1MDRBQSc6ICdzJyxcbiAgJ1xcdTA0QUInOiAncycsXG4gICdcXHUwNEFDJzogJ3QnLFxuICAnXFx1MDRBRCc6ICd0JyxcbiAgJ1xcdTA0QUUnOiAndScsXG4gICdcXHUwNEFGJzogJ3UnLFxuICAnXFx1MDRCMCc6ICd1JyxcbiAgJ1xcdTA0QjEnOiAndScsXG4gICdcXHUwNEIyJzogJ2gnLFxuICAnXFx1MDRCMyc6ICdoJyxcbiAgJ1xcdTA0QjQnOiAnYycsXG4gICdcXHUwNEI1JzogJ2MnLFxuICAnXFx1MDRCNic6ICdjJyxcbiAgJ1xcdTA0QjcnOiAnYycsXG4gICdcXHUwNEI4JzogJ2MnLFxuICAnXFx1MDRCOSc6ICdjJyxcbiAgJ1xcdTA0QkEnOiAnaCcsXG4gICdcXHUwNEJCJzogJ2gnLFxuICAnXFx1MDRCQyc6ICdjJyxcbiAgJ1xcdTA0QkQnOiAnYycsXG4gICdcXHUwNEJFJzogJ2MnLFxuICAnXFx1MDRCRic6ICdjJyxcbiAgJ1xcdTA0QzEnOiAneicsXG4gICdcXHUwNEMyJzogJ3onLFxuICAnXFx1MDRDMyc6ICdrJyxcbiAgJ1xcdTA0QzQnOiAnaycsXG4gICdcXHUwNEM1JzogJ2wnLFxuICAnXFx1MDRDNic6ICdsJyxcbiAgJ1xcdTA0QzcnOiAnbicsXG4gICdcXHUwNEM4JzogJ24nLFxuICAnXFx1MDRDOSc6ICduJyxcbiAgJ1xcdTA0Q0EnOiAnbicsXG4gICdcXHUwNENCJzogJ2MnLFxuICAnXFx1MDRDQyc6ICdjJyxcbiAgJ1xcdTA0RDAnOiAnYScsXG4gICdcXHUwNEQxJzogJ2EnLFxuICAnXFx1MDREMic6ICdhJyxcbiAgJ1xcdTA0RDMnOiAnYScsXG4gICdcXHUwNEQ0JzogJ2FlJyxcbiAgJ1xcdTA0RDUnOiAnYWUnLFxuICAnXFx1MDRENic6ICdlJyxcbiAgJ1xcdTA0RDcnOiAnZScsXG4gICdcXHUwNEQ4JzogJ2EnLFxuICAnXFx1MDREOSc6ICdhJyxcbiAgJ1xcdTA0REEnOiAnYScsXG4gICdcXHUwNERCJzogJ2EnLFxuICAnXFx1MDREQyc6ICd6JyxcbiAgJ1xcdTA0REQnOiAneicsXG4gICdcXHUwNERFJzogJ3onLFxuICAnXFx1MDRERic6ICd6JyxcbiAgJ1xcdTA0RTAnOiAneicsXG4gICdcXHUwNEUxJzogJ3onLFxuICAnXFx1MDRFMic6ICdpJyxcbiAgJ1xcdTA0RTMnOiAnaScsXG4gICdcXHUwNEU0JzogJ2knLFxuICAnXFx1MDRFNSc6ICdpJyxcbiAgJ1xcdTA0RTYnOiAnbycsXG4gICdcXHUwNEU3JzogJ28nLFxuICAnXFx1MDRFOCc6ICdvJyxcbiAgJ1xcdTA0RTknOiAnbycsXG4gICdcXHUwNEVBJzogJ28nLFxuICAnXFx1MDRFQic6ICdvJyxcbiAgJ1xcdTA0RUUnOiAndScsXG4gICdcXHUwNEVGJzogJ3UnLFxuICAnXFx1MDRGMCc6ICd1JyxcbiAgJ1xcdTA0RjEnOiAndScsXG4gICdcXHUwNEYyJzogJ3UnLFxuICAnXFx1MDRGMyc6ICd1JyxcbiAgJ1xcdTA0RjQnOiAnYycsXG4gICdcXHUwNEY1JzogJ2MnLFxuICAnXFx1MDRGOCc6ICd5JyxcbiAgJ1xcdTA0RjknOiAneScsXG4gICdcXHUwNTBBJzogJ24nLFxuICAnXFx1MDUwQic6ICduJyxcbiAgJ1xcdTA1MEUnOiAndCcsXG4gICdcXHUwNTBGJzogJ3QnLFxuICAnXFx1MDUxQSc6ICdxJyxcbiAgJ1xcdTA1MUInOiAncScsXG4gICdcXHUwNTFDJzogJ3cnLFxuICAnXFx1MDUxRCc6ICd3Jyxcbn07XG4iLAogICAgIi8qKlxuICogU3RyaW5nIHV0aWxpdGllc1xuICovXG5cbmltcG9ydCB7IHNwZWNpYWxDaGFyTWFwIH0gZnJvbSAnLi90YWJsZS9jaGFyLXRhYmxlJztcblxuLyoqXG4gKiBDb252ZXJ0IHN0cmluZyB0byBVbml4IGZvcm1hdFxuICpcbiAqIFBlcmZvcm1zIGNvbnZlcnNpb24gZm9sbG93aW5nIGxlZ2FjeSB3aWtpZG90IGltcGxlbWVudGF0aW9uLlxuICogLSBDb252ZXJ0cyBzcGVjaWFsIGNoYXJhY3RlcnMgdG8gQVNDSUkgY2hhcmFjdGVyc1xuICogLSBDb252ZXJ0cyB0byBsb3dlcmNhc2VcbiAqIC0gQ29udmVydHMgbm9uLUFTQ0lJIGNoYXJhY3RlcnMgdG8gaHlwaGVuc1xuICogLSBSZWR1Y2VzIGNvbnNlY3V0aXZlIGh5cGhlbnMvY29sb25zIHRvIHNpbmdsZVxuICogLSBSZW1vdmVzIGxlYWRpbmcvdHJhaWxpbmcgaHlwaGVucy9jb2xvbnNcbiAqXG4gKiBAcGFyYW0gdGFyZ2V0U3RyIC0gU3RyaW5nIHRvIGNvbnZlcnRcbiAqIEByZXR1cm5zIENvbnZlcnRlZCBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvVW5peCh0YXJnZXRTdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIENvbnZlcnQgc3BlY2lhbCBjaGFyYWN0ZXJzXG4gIGxldCByZXN1bHQgPSAnJztcbiAgZm9yIChjb25zdCBjaGFyIG9mIHRhcmdldFN0cikge1xuICAgIGNvbnN0IG1hcHBlZCA9IHNwZWNpYWxDaGFyTWFwW2NoYXJdO1xuICAgIHJlc3VsdCArPSBtYXBwZWQgIT09IHVuZGVmaW5lZCA/IG1hcHBlZCA6IGNoYXI7XG4gIH1cblxuICAvLyBDb252ZXJ0IHRvIGxvd2VyY2FzZVxuICByZXN1bHQgPSByZXN1bHQudG9Mb3dlckNhc2UoKTtcblxuICAvLyBSZW1vdmUgbm9uLUFTQ0lJIGNoYXJhY3RlcnNcbiAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoL1teYS16MC05XFwtOl9dL2csICctJyk7XG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC9eXy8sICc6XycpO1xuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvKD88ITopXy9nLCAnLScpO1xuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXi0qLywgJycpO1xuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvLSokLywgJycpO1xuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvLXsyLH0vZywgJy0nKTtcbiAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoLzp7Mix9L2csICc6Jyk7XG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC86LS9nLCAnOicpO1xuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvLTovZywgJzonKTtcbiAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoL18tL2csICdfJyk7XG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC8tXy9nLCAnXycpO1xuXG4gIC8vIFJlbW92ZSBsZWFkaW5nIGFuZCB0cmFpbGluZyBjb2xvbnNcbiAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoL146LywgJycpO1xuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvOiQvLCAnJyk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBTdHJpbmdVdGlsIGNsYXNzIChQeXRob24gY29tcGF0aWJsZSlcbiAqL1xuZXhwb3J0IGNvbnN0IFN0cmluZ1V0aWwgPSB7XG4gIHRvVW5peCxcbn07XG4iLAogICAgImltcG9ydCB0eXBlIHsgVXNlciB9IGZyb20gJy4vdXNlcic7XG5cbi8qKlxuICogVXNlciBjb2xsZWN0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBVc2VyQ29sbGVjdGlvbiBleHRlbmRzIEFycmF5PFVzZXIgfCBudWxsPiB7XG4gIGNvbnN0cnVjdG9yKHVzZXJzPzogKFVzZXIgfCBudWxsKVtdKSB7XG4gICAgc3VwZXIoKTtcbiAgICBpZiAodXNlcnMpIHtcbiAgICAgIHRoaXMucHVzaCguLi51c2Vycyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYnkgdXNlcm5hbWVcbiAgICogQHBhcmFtIG5hbWUgLSBVc2VybmFtZVxuICAgKiBAcmV0dXJucyBVc2VyIG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgZmluZEJ5TmFtZShuYW1lOiBzdHJpbmcpOiBVc2VyIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBsb3dlck5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgZm9yIChjb25zdCB1c2VyIG9mIHRoaXMpIHtcbiAgICAgIGlmICh1c2VyICYmIHVzZXIubmFtZS50b0xvd2VyQ2FzZSgpID09PSBsb3dlck5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHVzZXI7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBieSB1c2VyIElEXG4gICAqIEBwYXJhbSBpZCAtIFVzZXIgSURcbiAgICogQHJldHVybnMgVXNlciBvciB1bmRlZmluZWRcbiAgICovXG4gIGZpbmRCeUlkKGlkOiBudW1iZXIpOiBVc2VyIHwgdW5kZWZpbmVkIHtcbiAgICBmb3IgKGNvbnN0IHVzZXIgb2YgdGhpcykge1xuICAgICAgaWYgKHVzZXIgJiYgdXNlci5pZCA9PT0gaWQpIHtcbiAgICAgICAgcmV0dXJuIHVzZXI7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIG9ubHkgbm9uLW51bGwgdXNlcnNcbiAgICogQHJldHVybnMgQXJyYXkgb2Ygbm9uLW51bGwgdXNlcnNcbiAgICovXG4gIGZpbHRlck5vbk51bGwoKTogVXNlcltdIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXIoKHVzZXIpOiB1c2VyIGlzIFVzZXIgPT4gdXNlciAhPT0gbnVsbCk7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0ICogYXMgY2hlZXJpbyBmcm9tICdjaGVlcmlvJztcbmltcG9ydCBwTGltaXQgZnJvbSAncC1saW1pdCc7XG5pbXBvcnQgeyBOb0VsZW1lbnRFcnJvciwgTm90Rm91bmRFeGNlcHRpb24sIFVuZXhwZWN0ZWRFcnJvciB9IGZyb20gJy4uLy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB7IERFRkFVTFRfQU1DX0NPTkZJRyB9IGZyb20gJy4uLy4uL2Nvbm5lY3Rvci9hbWMtY29uZmlnJztcbmltcG9ydCB7IGZldGNoV2l0aFJldHJ5IH0gZnJvbSAnLi4vLi4vdXRpbC9odHRwJztcbmltcG9ydCB7IHRvVW5peCB9IGZyb20gJy4uLy4uL3V0aWwvc3RyaW5nLXV0aWwnO1xuaW1wb3J0IHR5cGUgeyBDbGllbnRSZWYgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0VXNlciwgVXNlclR5cGUgfSBmcm9tICcuL2Fic3RyYWN0LXVzZXInO1xuaW1wb3J0IHsgVXNlckNvbGxlY3Rpb24gfSBmcm9tICcuL3VzZXItY29sbGVjdGlvbic7XG5cbi8qKlxuICogVXNlciBkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlckRhdGEge1xuICBpZDogbnVtYmVyO1xuICBuYW1lOiBzdHJpbmc7XG4gIGRpc3BsYXlOYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgYXZhdGFyVXJsPzogc3RyaW5nIHwgbnVsbDtcbiAgdW5peE5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVndWxhciB1c2VyXG4gKi9cbmV4cG9ydCBjbGFzcyBVc2VyIGltcGxlbWVudHMgQWJzdHJhY3RVc2VyIHtcbiAgcHVibGljIHJlYWRvbmx5IGNsaWVudDogQ2xpZW50UmVmO1xuXG4gIC8qKiBVc2VyIElEICovXG4gIHB1YmxpYyByZWFkb25seSBpZDogbnVtYmVyO1xuXG4gIC8qKiBVc2VybmFtZSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKiBEaXNwbGF5IG5hbWUgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRpc3BsYXlOYW1lOiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKiBBdmF0YXIgVVJMICovXG4gIHB1YmxpYyByZWFkb25seSBhdmF0YXJVcmw6IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqIFVOSVggZm9ybWF0IHVzZXJuYW1lICovXG4gIHB1YmxpYyByZWFkb25seSB1bml4TmFtZTogc3RyaW5nO1xuXG4gIC8qKiBJUCBhZGRyZXNzIChudWxsIGZvciByZWd1bGFyIHVzZXJzKSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXA6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBVc2VyIHR5cGUgKi9cbiAgcHVibGljIHJlYWRvbmx5IHVzZXJUeXBlOiBVc2VyVHlwZSA9ICd1c2VyJztcblxuICBjb25zdHJ1Y3RvcihjbGllbnQ6IENsaWVudFJlZiwgZGF0YTogVXNlckRhdGEpIHtcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICB0aGlzLmlkID0gZGF0YS5pZDtcbiAgICB0aGlzLm5hbWUgPSBkYXRhLm5hbWU7XG4gICAgdGhpcy5kaXNwbGF5TmFtZSA9IGRhdGEuZGlzcGxheU5hbWUgPz8gbnVsbDtcbiAgICB0aGlzLmF2YXRhclVybCA9IGRhdGEuYXZhdGFyVXJsID8/IGBodHRwczovL3d3dy53aWtpZG90LmNvbS9hdmF0YXIucGhwP3VzZXJpZD0ke2RhdGEuaWR9YDtcbiAgICB0aGlzLnVuaXhOYW1lID0gZGF0YS51bml4TmFtZSA/PyB0b1VuaXgoZGF0YS5uYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdXNlciBmcm9tIHVzZXJuYW1lXG4gICAqIEBwYXJhbSBjbGllbnQgLSBDbGllbnRcbiAgICogQHBhcmFtIG5hbWUgLSBVc2VybmFtZVxuICAgKiBAcmV0dXJucyBVc2VyIChudWxsIGlmIG5vdCBmb3VuZClcbiAgICovXG4gIHN0YXRpYyBmcm9tTmFtZShjbGllbnQ6IENsaWVudFJlZiwgbmFtZTogc3RyaW5nKTogV2lraWRvdFJlc3VsdEFzeW5jPFVzZXIgfCBudWxsPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdW5peE5hbWUgPSB0b1VuaXgobmFtZSk7XG4gICAgICAgIGNvbnN0IHVybCA9IGBodHRwczovL3d3dy53aWtpZG90LmNvbS91c2VyOmluZm8vJHt1bml4TmFtZX1gO1xuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hXaXRoUmV0cnkodXJsLCBERUZBVUxUX0FNQ19DT05GSUcsIHtcbiAgICAgICAgICBjaGVja09rOiBmYWxzZSwgLy8gSGFuZGxlIEhUVFAgZXJyb3JzIG1hbnVhbGx5XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGZldGNoIHVzZXIgaW5mbzogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBodG1sID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGh0bWwpO1xuXG4gICAgICAgIC8vIENoZWNrIGV4aXN0ZW5jZVxuICAgICAgICBpZiAoJCgnZGl2LmVycm9yLWJsb2NrJykubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IGlkXG4gICAgICAgIGNvbnN0IHVzZXJJZEVsZW0gPSAkKCdhLmJ0bi5idG4tZGVmYXVsdC5idG4teHMnKTtcbiAgICAgICAgaWYgKHVzZXJJZEVsZW0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdVc2VyIElEIGVsZW1lbnQgbm90IGZvdW5kJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaHJlZiA9IHVzZXJJZEVsZW0uYXR0cignaHJlZicpO1xuICAgICAgICBpZiAoIWhyZWYpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ1VzZXIgSUQgaHJlZiBub3QgZm91bmQnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1c2VySWQgPSBOdW1iZXIucGFyc2VJbnQoaHJlZi5zcGxpdCgnLycpLnBvcCgpID8/ICcwJywgMTApO1xuXG4gICAgICAgIC8vIEdldCBuYW1lXG4gICAgICAgIGNvbnN0IG5hbWVFbGVtID0gJCgnaDEucHJvZmlsZS10aXRsZScpO1xuICAgICAgICBpZiAobmFtZUVsZW0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdVc2VyIG5hbWUgZWxlbWVudCBub3QgZm91bmQnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1c2VyTmFtZSA9IG5hbWVFbGVtLnRleHQoKS50cmltKCk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBVc2VyKGNsaWVudCwge1xuICAgICAgICAgIGlkOiB1c2VySWQsXG4gICAgICAgICAgbmFtZTogdXNlck5hbWUsXG4gICAgICAgICAgdW5peE5hbWUsXG4gICAgICAgIH0pO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb3RGb3VuZEV4Y2VwdGlvbiB8fCBlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHVzZXI6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB1c2VycyBmcm9tIG11bHRpcGxlIHVzZXJuYW1lc1xuICAgKiBAcGFyYW0gY2xpZW50IC0gQ2xpZW50XG4gICAqIEBwYXJhbSBuYW1lcyAtIEFycmF5IG9mIHVzZXJuYW1lc1xuICAgKiBAcmV0dXJucyBVc2VyIGNvbGxlY3Rpb25cbiAgICovXG4gIHN0YXRpYyBmcm9tTmFtZXMoY2xpZW50OiBDbGllbnRSZWYsIG5hbWVzOiBzdHJpbmdbXSk6IFdpa2lkb3RSZXN1bHRBc3luYzxVc2VyQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIExpbWl0IGNvbmN1cnJlbnQgY29ubmVjdGlvbnNcbiAgICAgICAgY29uc3QgbGltaXQgPSBwTGltaXQoREVGQVVMVF9BTUNfQ09ORklHLnNlbWFwaG9yZUxpbWl0KTtcblxuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgbmFtZXMubWFwKChuYW1lKSA9PlxuICAgICAgICAgICAgbGltaXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBVc2VyLmZyb21OYW1lKGNsaWVudCwgbmFtZSk7XG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQuaXNPaygpID8gcmVzdWx0LnZhbHVlIDogbnVsbDtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbmV3IFVzZXJDb2xsZWN0aW9uKHJlc3VsdHMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCB1c2VyczogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8vIEFic3RyYWN0VXNlciBpbXBsZW1lbnRhdGlvblxuICBpc1VzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaXNEZWxldGVkVXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaXNBbm9ueW1vdXNVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpc0d1ZXN0VXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaXNXaWtpZG90VXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgVXNlcihpZD0ke3RoaXMuaWR9LCBuYW1lPSR7dGhpcy5uYW1lfSwgdW5peE5hbWU9JHt0aGlzLnVuaXhOYW1lfSlgO1xuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQ2xpZW50UmVmIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdFVzZXIsIFVzZXJUeXBlIH0gZnJvbSAnLi9hYnN0cmFjdC11c2VyJztcblxuLyoqXG4gKiBXaWtpZG90IHN5c3RlbSB1c2VyXG4gKi9cbmV4cG9ydCBjbGFzcyBXaWtpZG90VXNlciBpbXBsZW1lbnRzIEFic3RyYWN0VXNlciB7XG4gIHB1YmxpYyByZWFkb25seSBjbGllbnQ6IENsaWVudFJlZjtcblxuICAvKiogVXNlciBJRCAoMCBmb3IgV2lraWRvdCBzeXN0ZW0pICovXG4gIHB1YmxpYyByZWFkb25seSBpZDogbnVtYmVyID0gMDtcblxuICAvKiogVXNlcm5hbWUgKi9cbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZyA9ICdXaWtpZG90JztcblxuICAvKiogVU5JWCBmb3JtYXQgdXNlcm5hbWUgKi9cbiAgcHVibGljIHJlYWRvbmx5IHVuaXhOYW1lOiBzdHJpbmcgPSAnd2lraWRvdCc7XG5cbiAgLyoqIEF2YXRhciBVUkwgKG51bGwgZm9yIHN5c3RlbSB1c2VyKSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYXZhdGFyVXJsOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvKiogSVAgYWRkcmVzcyAobnVsbCBmb3Igc3lzdGVtIHVzZXIpICovXG4gIHB1YmxpYyByZWFkb25seSBpcDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIFVzZXIgdHlwZSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdXNlclR5cGU6IFVzZXJUeXBlID0gJ3dpa2lkb3QnO1xuXG4gIGNvbnN0cnVjdG9yKGNsaWVudDogQ2xpZW50UmVmKSB7XG4gICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XG4gIH1cblxuICAvLyBBYnN0cmFjdFVzZXIgaW1wbGVtZW50YXRpb25cbiAgaXNVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpc0RlbGV0ZWRVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpc0Fub255bW91c1VzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlzR3Vlc3RVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpc1dpa2lkb3RVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFdpa2lkb3RVc2VyKG5hbWU9JHt0aGlzLm5hbWV9LCB1bml4TmFtZT0ke3RoaXMudW5peE5hbWV9KWA7XG4gIH1cbn1cbiIsCiAgICAiZXhwb3J0IHR5cGUgeyBBYnN0cmFjdFVzZXIsIFVzZXJUeXBlIH0gZnJvbSAnLi9hYnN0cmFjdC11c2VyJztcbmV4cG9ydCB7IEFub255bW91c1VzZXIgfSBmcm9tICcuL2Fub255bW91cy11c2VyJztcbmV4cG9ydCB7IERlbGV0ZWRVc2VyIH0gZnJvbSAnLi9kZWxldGVkLXVzZXInO1xuZXhwb3J0IHsgR3Vlc3RVc2VyIH0gZnJvbSAnLi9ndWVzdC11c2VyJztcbmV4cG9ydCB7IFVzZXIsIHR5cGUgVXNlckRhdGEgfSBmcm9tICcuL3VzZXInO1xuZXhwb3J0IHsgVXNlckNvbGxlY3Rpb24gfSBmcm9tICcuL3VzZXItY29sbGVjdGlvbic7XG5leHBvcnQgeyBXaWtpZG90VXNlciB9IGZyb20gJy4vd2lraWRvdC11c2VyJztcbiIsCiAgICAiaW1wb3J0IHR5cGUgKiBhcyBjaGVlcmlvIGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0IHR5cGUgeyBBbnlOb2RlIH0gZnJvbSAnZG9taGFuZGxlcic7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi9jb21tb24vbG9nZ2VyJztcbmltcG9ydCB0eXBlIHsgQ2xpZW50UmVmIH0gZnJvbSAnLi4vLi4vbW9kdWxlL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RVc2VyIH0gZnJvbSAnLi4vLi4vbW9kdWxlL3VzZXInO1xuaW1wb3J0IHsgQW5vbnltb3VzVXNlciwgRGVsZXRlZFVzZXIsIEd1ZXN0VXNlciwgVXNlciwgV2lraWRvdFVzZXIgfSBmcm9tICcuLi8uLi9tb2R1bGUvdXNlcic7XG5cbi8qKlxuICogUGFyc2UgcHJpbnR1c2VyIGVsZW1lbnQgYW5kIHJldHVybiB1c2VyIG9iamVjdFxuICpcbiAqIEBwYXJhbSBjbGllbnQgLSBXaWtpZG90IGNsaWVudFxuICogQHBhcmFtIGVsZW0gLSBFbGVtZW50IHRvIHBhcnNlIChlbGVtZW50IHdpdGggcHJpbnR1c2VyIGNsYXNzKVxuICogQHJldHVybnMgUGFyc2VkIHVzZXIgb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVVzZXIoY2xpZW50OiBDbGllbnRSZWYsIGVsZW06IGNoZWVyaW8uQ2hlZXJpbzxBbnlOb2RlPik6IEFic3RyYWN0VXNlciB7XG4gIGNvbnN0IGNsYXNzQXR0ciA9IGVsZW0uYXR0cignY2xhc3MnKSA/PyAnJztcbiAgY29uc3QgY2xhc3NlcyA9IGNsYXNzQXR0ci5zcGxpdCgvXFxzKy8pO1xuXG4gIC8vIENoZWNrIGZvciBkZWxldGVkIHVzZXJcbiAgaWYgKGNsYXNzZXMuaW5jbHVkZXMoJ2RlbGV0ZWQnKSkge1xuICAgIGNvbnN0IGRhdGFJZCA9IGVsZW0uYXR0cignZGF0YS1pZCcpO1xuICAgIGNvbnN0IHVzZXJJZCA9IGRhdGFJZCA/IE51bWJlci5wYXJzZUludChkYXRhSWQsIDEwKSA6IDA7XG4gICAgcmV0dXJuIG5ldyBEZWxldGVkVXNlcihjbGllbnQsIHVzZXJJZCk7XG4gIH1cblxuICAvLyBJZiB0ZXh0IGlzIFwiKHVzZXIgZGVsZXRlZClcIlxuICBjb25zdCB0ZXh0ID0gZWxlbS50ZXh0KCkudHJpbSgpO1xuICBpZiAodGV4dCA9PT0gJyh1c2VyIGRlbGV0ZWQpJykge1xuICAgIHJldHVybiBuZXcgRGVsZXRlZFVzZXIoY2xpZW50LCAwKTtcbiAgfVxuXG4gIC8vIENoZWNrIGZvciBhbm9ueW1vdXMgdXNlclxuICBpZiAoY2xhc3Nlcy5pbmNsdWRlcygnYW5vbnltb3VzJykpIHtcbiAgICBjb25zdCBpcEVsZW0gPSBlbGVtLmZpbmQoJ3NwYW4uaXAnKTtcbiAgICBpZiAoaXBFbGVtLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGlwID0gaXBFbGVtLnRleHQoKS5yZXBsYWNlKC9bKCldL2csICcnKS50cmltKCk7XG4gICAgICByZXR1cm4gbmV3IEFub255bW91c1VzZXIoY2xpZW50LCBpcCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQW5vbnltb3VzVXNlcihjbGllbnQsICcnKTtcbiAgfVxuXG4gIC8vIENoZWNrIGZvciBndWVzdCB1c2VyIChoYXMgR3JhdmF0YXIgYXZhdGFyKVxuICBjb25zdCBpbWdFbGVtID0gZWxlbS5maW5kKCdpbWcnKTtcbiAgaWYgKGltZ0VsZW0ubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IHNyYyA9IGltZ0VsZW0uYXR0cignc3JjJykgPz8gJyc7XG4gICAgaWYgKHNyYy5pbmNsdWRlcygnZ3JhdmF0YXIuY29tJykpIHtcbiAgICAgIGNvbnN0IGd1ZXN0TmFtZSA9IHRleHQuc3BsaXQoJyAnKVswXSA/PyAnR3Vlc3QnO1xuICAgICAgcmV0dXJuIG5ldyBHdWVzdFVzZXIoY2xpZW50LCBndWVzdE5hbWUsIHNyYyk7XG4gICAgfVxuICB9XG5cbiAgLy8gQ2hlY2sgZm9yIFdpa2lkb3Qgc3lzdGVtIHVzZXJcbiAgaWYgKHRleHQgPT09ICdXaWtpZG90Jykge1xuICAgIHJldHVybiBuZXcgV2lraWRvdFVzZXIoY2xpZW50KTtcbiAgfVxuXG4gIC8vIFJlZ3VsYXIgdXNlclxuICBjb25zdCBsaW5rcyA9IGVsZW0uZmluZCgnYScpO1xuICBpZiAobGlua3MubGVuZ3RoID09PSAwKSB7XG4gICAgLy8gVHJlYXQgYXMgRGVsZXRlZFVzZXIgaWYgbm8gbGlua1xuICAgIHJldHVybiBuZXcgRGVsZXRlZFVzZXIoY2xpZW50LCAwKTtcbiAgfVxuXG4gIC8vIExhc3QgbGluayBpcyB0aGUgdXNlciBsaW5rXG4gIGNvbnN0IHVzZXJMaW5rID0gbGlua3MubGFzdCgpO1xuICBjb25zdCB1c2VyTmFtZSA9IHVzZXJMaW5rLnRleHQoKS50cmltKCk7XG4gIGNvbnN0IGhyZWYgPSB1c2VyTGluay5hdHRyKCdocmVmJykgPz8gJyc7XG4gIGNvbnN0IG9uY2xpY2sgPSB1c2VyTGluay5hdHRyKCdvbmNsaWNrJykgPz8gJyc7XG5cbiAgLy8gRXh0cmFjdCB1bml4X25hbWUgZnJvbSBocmVmXG4gIGNvbnN0IHVuaXhOYW1lID0gaHJlZi5yZXBsYWNlKC9eLipcXC91c2VyOmluZm9cXC8vLCAnJykucmVwbGFjZSgvXFwvJC8sICcnKTtcblxuICAvLyBFeHRyYWN0IHVzZXJfaWQgZnJvbSBvbmNsaWNrXG4gIC8vIFBhdHRlcm46IFwiV0lLSURPVC5wYWdlLmxpc3RlbmVycy51c2VySW5mbygxMjM0NTYpOyByZXR1cm4gZmFsc2U7XCJcbiAgY29uc3QgdXNlcklkTWF0Y2ggPSBvbmNsaWNrLm1hdGNoKC91c2VySW5mb1xcKChcXGQrKVxcKS8pO1xuICBjb25zdCB1c2VySWQgPSB1c2VySWRNYXRjaD8uWzFdID8gTnVtYmVyLnBhcnNlSW50KHVzZXJJZE1hdGNoWzFdLCAxMCkgOiAwO1xuXG4gIC8vIEdlbmVyYXRlIGF2YXRhciBVUkxcbiAgY29uc3QgYXZhdGFyVXJsID0gdXNlcklkID4gMCA/IGBodHRwOi8vd3d3Lndpa2lkb3QuY29tL2F2YXRhci5waHA/dXNlcmlkPSR7dXNlcklkfWAgOiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIG5ldyBVc2VyKGNsaWVudCwge1xuICAgIGlkOiB1c2VySWQsXG4gICAgbmFtZTogdXNlck5hbWUsXG4gICAgdW5peE5hbWUsXG4gICAgYXZhdGFyVXJsLFxuICB9KTtcbn1cblxuLyoqXG4gKiBQYXJzZSBkYXRlIGZyb20gb2RhdGUgZWxlbWVudFxuICpcbiAqIEBwYXJhbSBlbGVtIC0gRWxlbWVudCB0byBwYXJzZSAob2RhdGUgZWxlbWVudClcbiAqIEByZXR1cm5zIFBhcnNlZCBEYXRlLCBvciBudWxsIG9uIHBhcnNlIGZhaWx1cmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlT2RhdGUoZWxlbTogY2hlZXJpby5DaGVlcmlvPEFueU5vZGU+KTogRGF0ZSB8IG51bGwge1xuICBjb25zdCBjbGFzc0F0dHIgPSBlbGVtLmF0dHIoJ2NsYXNzJykgPz8gJyc7XG5cbiAgLy8gRXh0cmFjdCBVbml4IHRpbWVzdGFtcCBmcm9tIGNsYXNzXG4gIC8vIFBhdHRlcm46IFwib2RhdGUgdGltZV8xMjM0NTY3ODkwIGZvcm1hdF8uLi5cIiBmb3JtYXRcbiAgY29uc3QgdGltZU1hdGNoID0gY2xhc3NBdHRyLm1hdGNoKC90aW1lXyhcXGQrKS8pO1xuICBpZiAodGltZU1hdGNoPy5bMV0pIHtcbiAgICBjb25zdCB1bml4VGltZSA9IE51bWJlci5wYXJzZUludCh0aW1lTWF0Y2hbMV0sIDEwKTtcbiAgICByZXR1cm4gbmV3IERhdGUodW5peFRpbWUgKiAxMDAwKTtcbiAgfVxuXG4gIC8vIEZhbGxiYWNrOiBwYXJzZSBmcm9tIHRleHRcbiAgY29uc3QgdGV4dCA9IGVsZW0udGV4dCgpLnRyaW0oKTtcbiAgY29uc3QgcGFyc2VkID0gRGF0ZS5wYXJzZSh0ZXh0KTtcbiAgaWYgKCFOdW1iZXIuaXNOYU4ocGFyc2VkKSkge1xuICAgIHJldHVybiBuZXcgRGF0ZShwYXJzZWQpO1xuICB9XG5cbiAgLy8gUmV0dXJuIG51bGwgYW5kIGxvZyB3YXJuaW5nIGlmIHBhcnNpbmcgZmFpbHNcbiAgbG9nZ2VyLndhcm4oYEZhaWxlZCB0byBwYXJzZSBvZGF0ZSBlbGVtZW50OiBjbGFzcz1cIiR7Y2xhc3NBdHRyfVwiLCB0ZXh0PVwiJHt0ZXh0fVwiYCk7XG4gIHJldHVybiBudWxsO1xufVxuIiwKICAgICJleHBvcnQgeyBwYXJzZU9kYXRlLCBwYXJzZVVzZXIgfSBmcm9tICcuL3VzZXInO1xuIiwKICAgICIvKipcbiAqIERlY29yYXRvciB1dGlsaXRpZXNcbiAqL1xuXG5pbXBvcnQgeyBMb2dpblJlcXVpcmVkRXJyb3IgfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMsIHdkRXJyQXN5bmMgfSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBUeXBlIGZvciBvYmplY3RzIHRoYXQgaGF2ZSBhIGNsaWVudCByZWZlcmVuY2VcbiAqL1xuaW50ZXJmYWNlIEhhc0NsaWVudCB7XG4gIGNsaWVudD86IHsgcmVxdWlyZUxvZ2luKCk6IHsgaXNFcnIoKTogYm9vbGVhbjsgZXJyb3I/OiBFcnJvciB9IH07XG4gIHNpdGU/OiB7IGNsaWVudDogeyByZXF1aXJlTG9naW4oKTogeyBpc0VycigpOiBib29sZWFuOyBlcnJvcj86IEVycm9yIH0gfSB9O1xuICB0aHJlYWQ/OiB7IHNpdGU6IHsgY2xpZW50OiB7IHJlcXVpcmVMb2dpbigpOiB7IGlzRXJyKCk6IGJvb2xlYW47IGVycm9yPzogRXJyb3IgfSB9IH0gfTtcbn1cblxuLyoqXG4gKiBHZXQgY2xpZW50IHJlZmVyZW5jZSBmcm9tIGFuIG9iamVjdFxuICovXG5mdW5jdGlvbiBnZXRDbGllbnRSZWYoXG4gIG9iajogSGFzQ2xpZW50XG4pOiB7IHJlcXVpcmVMb2dpbigpOiB7IGlzRXJyKCk6IGJvb2xlYW47IGVycm9yPzogRXJyb3IgfSB9IHwgbnVsbCB7XG4gIGlmIChvYmouY2xpZW50KSByZXR1cm4gb2JqLmNsaWVudDtcbiAgaWYgKG9iai5zaXRlPy5jbGllbnQpIHJldHVybiBvYmouc2l0ZS5jbGllbnQ7XG4gIGlmIChvYmoudGhyZWFkPy5zaXRlPy5jbGllbnQpIHJldHVybiBvYmoudGhyZWFkLnNpdGUuY2xpZW50O1xuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBMb2dpbiByZXF1aXJlZCBtZXRob2QgZGVjb3JhdG9yXG4gKlxuICogTWV0aG9kcyBkZWNvcmF0ZWQgd2l0aCB0aGlzIHdpbGwgY2hlY2sgbG9naW4gc3RhdHVzIGJlZm9yZSBleGVjdXRpb24uXG4gKiBSZXR1cm5zIExvZ2luUmVxdWlyZWRFcnJvciBpZiBub3QgbG9nZ2VkIGluLlxuICpcbiAqIEBleGFtcGxlXG4gKiBjbGFzcyBQYWdlIHtcbiAqICAgQFJlcXVpcmVMb2dpblxuICogICBkZXN0cm95KCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gKiAgICAgcmV0dXJuIGZyb21Qcm9taXNlKGFzeW5jICgpID0+IHsgLi4uIH0sIChlKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKC4uLikpO1xuICogICB9XG4gKiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBSZXF1aXJlTG9naW48XG4gIFRoaXMgZXh0ZW5kcyBIYXNDbGllbnQsXG4gIEFyZ3MgZXh0ZW5kcyB1bmtub3duW10sXG4gIFJldHVybiBleHRlbmRzIFdpa2lkb3RSZXN1bHRBc3luYzx1bmtub3duPixcbj4oXG4gIHRhcmdldDogKHRoaXM6IFRoaXMsIC4uLmFyZ3M6IEFyZ3MpID0+IFJldHVybixcbiAgX2NvbnRleHQ6IENsYXNzTWV0aG9kRGVjb3JhdG9yQ29udGV4dDxUaGlzLCAodGhpczogVGhpcywgLi4uYXJnczogQXJncykgPT4gUmV0dXJuPlxuKTogKHRoaXM6IFRoaXMsIC4uLmFyZ3M6IEFyZ3MpID0+IFJldHVybiB7XG4gIHJldHVybiBmdW5jdGlvbiAodGhpczogVGhpcywgLi4uYXJnczogQXJncyk6IFJldHVybiB7XG4gICAgY29uc3QgY2xpZW50UmVmID0gZ2V0Q2xpZW50UmVmKHRoaXMpO1xuICAgIGlmICghY2xpZW50UmVmKSB7XG4gICAgICByZXR1cm4gd2RFcnJBc3luYyhuZXcgTG9naW5SZXF1aXJlZEVycm9yKCdDbGllbnQgcmVmZXJlbmNlIG5vdCBmb3VuZCcpKSBhcyB1bmtub3duIGFzIFJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBsb2dpblJlc3VsdCA9IGNsaWVudFJlZi5yZXF1aXJlTG9naW4oKTtcbiAgICBpZiAobG9naW5SZXN1bHQuaXNFcnIoKSkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgICBQcm9taXNlLnJlamVjdChsb2dpblJlc3VsdC5lcnJvciksXG4gICAgICAgICgpID0+IG5ldyBMb2dpblJlcXVpcmVkRXJyb3IoJ0xvZ2luIHJlcXVpcmVkJylcbiAgICAgICkgYXMgdW5rbm93biBhcyBSZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhcmdldC5jYWxsKHRoaXMsIC4uLmFyZ3MpO1xuICB9O1xufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IENoZWVyaW8sIENoZWVyaW9BUEkgfSBmcm9tICdjaGVlcmlvJztcbmltcG9ydCAqIGFzIGNoZWVyaW8gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQgdHlwZSB7IEFueU5vZGUgfSBmcm9tICdkb21oYW5kbGVyJztcbmltcG9ydCB7IE5vRWxlbWVudEVycm9yLCBVbmV4cGVjdGVkRXJyb3IgfSBmcm9tICcuLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyBwYXJzZU9kYXRlLCBwYXJzZVVzZXIgfSBmcm9tICcuLi8uLi91dGlsL3BhcnNlcic7XG5pbXBvcnQgdHlwZSB7IENsaWVudCB9IGZyb20gJy4uL2NsaWVudCc7XG5pbXBvcnQgdHlwZSB7IEZvcnVtUG9zdFJlZiB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RVc2VyIH0gZnJvbSAnLi4vdXNlcic7XG5cbi8qKlxuICogRm9ydW0gcG9zdCByZXZpc2lvbiBkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRm9ydW1Qb3N0UmV2aXNpb25EYXRhIHtcbiAgcG9zdDogRm9ydW1Qb3N0UmVmO1xuICBpZDogbnVtYmVyO1xuICByZXZObzogbnVtYmVyO1xuICBjcmVhdGVkQnk6IEFic3RyYWN0VXNlcjtcbiAgY3JlYXRlZEF0OiBEYXRlO1xufVxuXG4vKipcbiAqIEZvcnVtIHBvc3QgcmV2aXNpb24gKHZlcnNpb24gaW4gZWRpdCBoaXN0b3J5KVxuICovXG5leHBvcnQgY2xhc3MgRm9ydW1Qb3N0UmV2aXNpb24ge1xuICAvKiogUG9zdCB0aGlzIHJldmlzaW9uIGJlbG9uZ3MgdG8gKi9cbiAgcHVibGljIHJlYWRvbmx5IHBvc3Q6IEZvcnVtUG9zdFJlZjtcblxuICAvKiogUmV2aXNpb24gSUQgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlkOiBudW1iZXI7XG5cbiAgLyoqIFJldmlzaW9uIG51bWJlciAoMCA9IGluaXRpYWwgdmVyc2lvbikgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJldk5vOiBudW1iZXI7XG5cbiAgLyoqIFJldmlzaW9uIGNyZWF0b3IgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZWRCeTogQWJzdHJhY3RVc2VyO1xuXG4gIC8qKiBSZXZpc2lvbiBjcmVhdGlvbiBkYXRlICovXG4gIHB1YmxpYyByZWFkb25seSBjcmVhdGVkQXQ6IERhdGU7XG5cbiAgLyoqIEhUTUwgY29udGVudCAoaW50ZXJuYWwgY2FjaGUpICovXG4gIHByaXZhdGUgX2h0bWw6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IEZvcnVtUG9zdFJldmlzaW9uRGF0YSkge1xuICAgIHRoaXMucG9zdCA9IGRhdGEucG9zdDtcbiAgICB0aGlzLmlkID0gZGF0YS5pZDtcbiAgICB0aGlzLnJldk5vID0gZGF0YS5yZXZObztcbiAgICB0aGlzLmNyZWF0ZWRCeSA9IGRhdGEuY3JlYXRlZEJ5O1xuICAgIHRoaXMuY3JlYXRlZEF0ID0gZGF0YS5jcmVhdGVkQXQ7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBIVE1MIGNvbnRlbnQgaGFzIGJlZW4gYWNxdWlyZWRcbiAgICovXG4gIGlzSHRtbEFjcXVpcmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9odG1sICE9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBIVE1MIGNvbnRlbnQgKGNhY2hlZClcbiAgICovXG4gIGdldCBodG1sKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9odG1sO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBIVE1MIGNvbnRlbnRcbiAgICovXG4gIHNldCBodG1sKHZhbHVlOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgdGhpcy5faHRtbCA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCByZXZpc2lvbiBIVE1MIGNvbnRlbnRcbiAgICogQHJldHVybnMgSFRNTCBzdHJpbmdcbiAgICovXG4gIGdldEh0bWwoKTogV2lraWRvdFJlc3VsdEFzeW5jPHN0cmluZz4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9odG1sICE9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2h0bWw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnBvc3QudGhyZWFkLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2ZvcnVtL3N1Yi9Gb3J1bVBvc3RSZXZpc2lvbk1vZHVsZScsXG4gICAgICAgICAgICByZXZpc2lvbklkOiB0aGlzLmlkLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdFbXB0eSByZXNwb25zZSBmcm9tIEZvcnVtUG9zdFJldmlzaW9uTW9kdWxlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb250ZW50ID0gU3RyaW5nKHJlc3BvbnNlLmNvbnRlbnQgPz8gJycpO1xuICAgICAgICB0aGlzLl9odG1sID0gY29udGVudDtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHJldmlzaW9uIEhUTUw6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYEZvcnVtUG9zdFJldmlzaW9uKGlkPSR7dGhpcy5pZH0sIHJldk5vPSR7dGhpcy5yZXZOb30pYDtcbiAgfVxufVxuXG4vKipcbiAqIEZvcnVtIHBvc3QgcmV2aXNpb24gY29sbGVjdGlvblxuICovXG5leHBvcnQgY2xhc3MgRm9ydW1Qb3N0UmV2aXNpb25Db2xsZWN0aW9uIGV4dGVuZHMgQXJyYXk8Rm9ydW1Qb3N0UmV2aXNpb24+IHtcbiAgcHVibGljIHJlYWRvbmx5IHBvc3Q6IEZvcnVtUG9zdFJlZjtcblxuICBjb25zdHJ1Y3Rvcihwb3N0OiBGb3J1bVBvc3RSZWYsIHJldmlzaW9ucz86IEZvcnVtUG9zdFJldmlzaW9uW10pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucG9zdCA9IHBvc3Q7XG4gICAgaWYgKHJldmlzaW9ucykge1xuICAgICAgdGhpcy5wdXNoKC4uLnJldmlzaW9ucyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYnkgSURcbiAgICogQHBhcmFtIGlkIC0gUmV2aXNpb24gSURcbiAgICogQHJldHVybnMgUmV2aXNpb24gKHVuZGVmaW5lZCBpZiBub3QgZm91bmQpXG4gICAqL1xuICBmaW5kQnlJZChpZDogbnVtYmVyKTogRm9ydW1Qb3N0UmV2aXNpb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbmQoKHJldmlzaW9uKSA9PiByZXZpc2lvbi5pZCA9PT0gaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYnkgcmV2aXNpb24gbnVtYmVyXG4gICAqIEBwYXJhbSByZXZObyAtIFJldmlzaW9uIG51bWJlclxuICAgKiBAcmV0dXJucyBSZXZpc2lvbiAodW5kZWZpbmVkIGlmIG5vdCBmb3VuZClcbiAgICovXG4gIGZpbmRCeVJldk5vKHJldk5vOiBudW1iZXIpOiBGb3J1bVBvc3RSZXZpc2lvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmluZCgocmV2aXNpb24pID0+IHJldmlzaW9uLnJldk5vID09PSByZXZObyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IEhUTUwgZm9yIGFsbCByZXZpc2lvbnNcbiAgICogQHJldHVybnMgQXJyYXkgb2YgSFRNTCBzdHJpbmdzXG4gICAqL1xuICBnZXRIdG1scygpOiBXaWtpZG90UmVzdWx0QXN5bmM8c3RyaW5nW10+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgdGhpcy5tYXAoYXN5bmMgKHJldmlzaW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXZpc2lvbi5nZXRIdG1sKCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgSFRNTHM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIHJldmlzaW9ucyBmcm9tIEhUTUwgKGludGVybmFsIG1ldGhvZClcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIF9wYXJzZShwb3N0OiBGb3J1bVBvc3RSZWYsICQ6IENoZWVyaW9BUEkpOiBGb3J1bVBvc3RSZXZpc2lvbltdIHtcbiAgICBjb25zdCByZXZpc2lvbnM6IEZvcnVtUG9zdFJldmlzaW9uW10gPSBbXTtcblxuICAgICQoJ3RhYmxlLnRhYmxlIHRyJykuZWFjaCgoX2ksIHJvd0VsZW0pID0+IHtcbiAgICAgIGNvbnN0ICRyb3cgPSAkKHJvd0VsZW0pO1xuXG4gICAgICAvLyBTa2lwIGhlYWRlciByb3dcbiAgICAgIGlmICgkcm93Lmhhc0NsYXNzKCdoZWFkJykpIHJldHVybjtcblxuICAgICAgLy8gR2V0IHVzZXIgZWxlbWVudFxuICAgICAgY29uc3QgJHVzZXJFbGVtID0gJHJvdy5maW5kKCdzcGFuLnByaW50dXNlcicpO1xuICAgICAgaWYgKCR1c2VyRWxlbS5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgLy8gR2V0IG9kYXRlIGVsZW1lbnRcbiAgICAgIGNvbnN0ICRvZGF0ZUVsZW0gPSAkcm93LmZpbmQoJ3NwYW4ub2RhdGUnKTtcbiAgICAgIGlmICgkb2RhdGVFbGVtLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICAvLyBHZXQgcmV2aXNpb24gSUQgZnJvbSBvbmNsaWNrIGF0dHJpYnV0ZVxuICAgICAgY29uc3QgJHJldmlzaW9uTGluayA9ICRyb3cuZmluZCgnYVtvbmNsaWNrKj1cInNob3dSZXZpc2lvblwiXScpO1xuICAgICAgaWYgKCRyZXZpc2lvbkxpbmsubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IG9uY2xpY2sgPSAkcmV2aXNpb25MaW5rLmF0dHIoJ29uY2xpY2snKSA/PyAnJztcbiAgICAgIGNvbnN0IHJldmlzaW9uSWRNYXRjaCA9IG9uY2xpY2subWF0Y2goL3Nob3dSZXZpc2lvblxccypcXChcXHMqZXZlbnRcXHMqLFxccyooXFxkKylcXHMqXFwpLyk7XG4gICAgICBpZiAoIXJldmlzaW9uSWRNYXRjaD8uWzFdKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHJldmlzaW9uSWQgPSBOdW1iZXIucGFyc2VJbnQocmV2aXNpb25JZE1hdGNoWzFdLCAxMCk7XG4gICAgICBpZiAoTnVtYmVyLmlzTmFOKHJldmlzaW9uSWQpKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGNyZWF0ZWRCeSA9IHBhcnNlVXNlcihwb3N0LnRocmVhZC5zaXRlLmNsaWVudCBhcyBDbGllbnQsICR1c2VyRWxlbSBhcyBDaGVlcmlvPEFueU5vZGU+KTtcbiAgICAgIGNvbnN0IGNyZWF0ZWRBdCA9IHBhcnNlT2RhdGUoJG9kYXRlRWxlbSBhcyBDaGVlcmlvPEFueU5vZGU+KSA/PyBuZXcgRGF0ZSgpO1xuXG4gICAgICByZXZpc2lvbnMucHVzaChcbiAgICAgICAgbmV3IEZvcnVtUG9zdFJldmlzaW9uKHtcbiAgICAgICAgICBwb3N0LFxuICAgICAgICAgIGlkOiByZXZpc2lvbklkLFxuICAgICAgICAgIHJldk5vOiAwLCAvLyBXaWxsIGJlIHNldCBhZnRlciBwYXJzaW5nIGFsbCByZXZpc2lvbnNcbiAgICAgICAgICBjcmVhdGVkQnksXG4gICAgICAgICAgY3JlYXRlZEF0LFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIC8vIEFQSSByZXR1cm5zIG5ld2VzdCBmaXJzdCwgcmV2ZXJzZSB0byBnZXQgb2xkZXN0IGZpcnN0IGFuZCBzZXQgcmV2Tm9cbiAgICByZXZpc2lvbnMucmV2ZXJzZSgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmV2aXNpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvLyBVc2UgT2JqZWN0LmRlZmluZVByb3BlcnR5IHRvIHNldCByZWFkb25seSBwcm9wZXJ0eVxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldmlzaW9uc1tpXSwgJ3Jldk5vJywge1xuICAgICAgICB2YWx1ZTogaSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmV2aXNpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgcmV2aXNpb25zIGZvciBhIHBvc3RcbiAgICogQHBhcmFtIHBvc3QgLSBGb3J1bSBwb3N0IHJlZmVyZW5jZVxuICAgKiBAcmV0dXJucyBSZXZpc2lvbiBjb2xsZWN0aW9uXG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZUFsbChwb3N0OiBGb3J1bVBvc3RSZWYpOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1Qb3N0UmV2aXNpb25Db2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcG9zdC50aHJlYWQuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnZm9ydW0vc3ViL0ZvcnVtUG9zdFJldmlzaW9uc01vZHVsZScsXG4gICAgICAgICAgICBwb3N0SWQ6IHBvc3QuaWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ0VtcHR5IHJlc3BvbnNlIGZyb20gRm9ydW1Qb3N0UmV2aXNpb25zTW9kdWxlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBib2R5ID0gU3RyaW5nKHJlc3BvbnNlLmJvZHkgPz8gJycpO1xuICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGJvZHkpO1xuXG4gICAgICAgIGNvbnN0IHJldmlzaW9ucyA9IEZvcnVtUG9zdFJldmlzaW9uQ29sbGVjdGlvbi5fcGFyc2UocG9zdCwgJCk7XG4gICAgICAgIHJldHVybiBuZXcgRm9ydW1Qb3N0UmV2aXNpb25Db2xsZWN0aW9uKHBvc3QsIHJldmlzaW9ucyk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSByZXZpc2lvbnM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCByZXZpc2lvbnMgZm9yIG11bHRpcGxlIHBvc3RzXG4gICAqIEBwYXJhbSBwb3N0cyAtIEFycmF5IG9mIGZvcnVtIHBvc3QgcmVmZXJlbmNlc1xuICAgKiBAcGFyYW0gd2l0aEh0bWwgLSBXaGV0aGVyIHRvIGFsc28gZmV0Y2ggSFRNTCBjb250ZW50IGZvciBlYWNoIHJldmlzaW9uXG4gICAqIEByZXR1cm5zIE1hcCBvZiBwb3N0IElEIHRvIHJldmlzaW9uIGNvbGxlY3Rpb25cbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlQWxsRm9yUG9zdHMoXG4gICAgcG9zdHM6IEZvcnVtUG9zdFJlZltdLFxuICAgIHdpdGhIdG1sID0gZmFsc2VcbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPE1hcDxudW1iZXIsIEZvcnVtUG9zdFJldmlzaW9uQ29sbGVjdGlvbj4+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAocG9zdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBNYXA8bnVtYmVyLCBGb3J1bVBvc3RSZXZpc2lvbkNvbGxlY3Rpb24+KCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwPG51bWJlciwgRm9ydW1Qb3N0UmV2aXNpb25Db2xsZWN0aW9uPigpO1xuICAgICAgICBjb25zdCBzaXRlID0gcG9zdHNbMF0hLnRocmVhZC5zaXRlO1xuXG4gICAgICAgIC8vIFN0ZXAgMTogR2V0IHJldmlzaW9uIGxpc3RzIGZvciBhbGwgcG9zdHNcbiAgICAgICAgY29uc3QgcmV2aXNpb25zUmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFxuICAgICAgICAgIHBvc3RzLm1hcCgocG9zdCkgPT4gKHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdmb3J1bS9zdWIvRm9ydW1Qb3N0UmV2aXNpb25zTW9kdWxlJyxcbiAgICAgICAgICAgIHBvc3RJZDogcG9zdC5pZCxcbiAgICAgICAgICB9KSlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAocmV2aXNpb25zUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXZpc2lvbnNSZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGVwIDI6IFBhcnNlIHJldmlzaW9uc1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgcG9zdCA9IHBvc3RzW2ldITtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHJldmlzaW9uc1Jlc3VsdC52YWx1ZVtpXTtcbiAgICAgICAgICBpZiAoIXJlc3BvbnNlKSBjb250aW51ZTtcblxuICAgICAgICAgIGNvbnN0IGJvZHkgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChib2R5KTtcbiAgICAgICAgICBjb25zdCByZXZpc2lvbnMgPSBGb3J1bVBvc3RSZXZpc2lvbkNvbGxlY3Rpb24uX3BhcnNlKHBvc3QsICQpO1xuICAgICAgICAgIHJlc3VsdC5zZXQocG9zdC5pZCwgbmV3IEZvcnVtUG9zdFJldmlzaW9uQ29sbGVjdGlvbihwb3N0LCByZXZpc2lvbnMpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0ZXAgMzogR2V0IEhUTUwgY29udGVudCBpZiByZXF1ZXN0ZWRcbiAgICAgICAgaWYgKHdpdGhIdG1sKSB7XG4gICAgICAgICAgY29uc3QgYWxsUmV2aXNpb25zOiB7IHJldmlzaW9uOiBGb3J1bVBvc3RSZXZpc2lvbjsgcG9zdElkOiBudW1iZXIgfVtdID0gW107XG4gICAgICAgICAgZm9yIChjb25zdCBbcG9zdElkLCBjb2xsZWN0aW9uXSBvZiByZXN1bHQpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcmV2aXNpb24gb2YgY29sbGVjdGlvbikge1xuICAgICAgICAgICAgICBhbGxSZXZpc2lvbnMucHVzaCh7IHJldmlzaW9uLCBwb3N0SWQgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGFsbFJldmlzaW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBodG1sUmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFxuICAgICAgICAgICAgICBhbGxSZXZpc2lvbnMubWFwKCh7IHJldmlzaW9uIH0pID0+ICh7XG4gICAgICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2ZvcnVtL3N1Yi9Gb3J1bVBvc3RSZXZpc2lvbk1vZHVsZScsXG4gICAgICAgICAgICAgICAgcmV2aXNpb25JZDogcmV2aXNpb24uaWQsXG4gICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKGh0bWxSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgICAgICB0aHJvdyBodG1sUmVzdWx0LmVycm9yO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbFJldmlzaW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBjb25zdCB7IHJldmlzaW9uIH0gPSBhbGxSZXZpc2lvbnNbaV0hO1xuICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGh0bWxSZXN1bHQudmFsdWVbaV07XG4gICAgICAgICAgICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIHJldmlzaW9uLmh0bWwgPSBTdHJpbmcocmVzcG9uc2UuY29udGVudCA/PyAnJyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgcmV2aXNpb25zIGZvciBwb3N0czogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBDaGVlcmlvLCBDaGVlcmlvQVBJIH0gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQgKiBhcyBjaGVlcmlvIGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0IHR5cGUgeyBBbnlOb2RlLCBFbGVtZW50IH0gZnJvbSAnZG9taGFuZGxlcic7XG5pbXBvcnQgeyBSZXF1aXJlTG9naW4gfSBmcm9tICcuLi8uLi9jb21tb24vZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBMb2dpblJlcXVpcmVkRXJyb3IsIE5vRWxlbWVudEVycm9yLCBVbmV4cGVjdGVkRXJyb3IgfSBmcm9tICcuLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyBwYXJzZU9kYXRlLCBwYXJzZVVzZXIgfSBmcm9tICcuLi8uLi91dGlsL3BhcnNlcic7XG5pbXBvcnQgdHlwZSB7IENsaWVudCB9IGZyb20gJy4uL2NsaWVudCc7XG5pbXBvcnQgdHlwZSB7IEZvcnVtVGhyZWFkUmVmIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdFVzZXIgfSBmcm9tICcuLi91c2VyJztcbmltcG9ydCB7IEZvcnVtUG9zdFJldmlzaW9uQ29sbGVjdGlvbiB9IGZyb20gJy4vZm9ydW0tcG9zdC1yZXZpc2lvbic7XG5cbi8qKlxuICogRm9ydW0gcG9zdCBkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRm9ydW1Qb3N0RGF0YSB7XG4gIHRocmVhZDogRm9ydW1UaHJlYWRSZWY7XG4gIGlkOiBudW1iZXI7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIHRleHQ6IHN0cmluZztcbiAgZWxlbWVudDogRWxlbWVudDtcbiAgY3JlYXRlZEJ5OiBBYnN0cmFjdFVzZXI7XG4gIGNyZWF0ZWRBdDogRGF0ZTtcbiAgZWRpdGVkQnk/OiBBYnN0cmFjdFVzZXIgfCBudWxsO1xuICBlZGl0ZWRBdD86IERhdGUgfCBudWxsO1xuICBwYXJlbnRJZD86IG51bWJlciB8IG51bGw7XG59XG5cbi8qKlxuICogRm9ydW0gcG9zdFxuICovXG5leHBvcnQgY2xhc3MgRm9ydW1Qb3N0IHtcbiAgcHVibGljIHJlYWRvbmx5IHRocmVhZDogRm9ydW1UaHJlYWRSZWY7XG4gIHB1YmxpYyByZWFkb25seSBpZDogbnVtYmVyO1xuICBwdWJsaWMgdGl0bGU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHRleHQ6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGVsZW1lbnQ6IEVsZW1lbnQ7XG4gIHB1YmxpYyByZWFkb25seSBjcmVhdGVkQnk6IEFic3RyYWN0VXNlcjtcbiAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZWRBdDogRGF0ZTtcbiAgcHVibGljIHJlYWRvbmx5IGVkaXRlZEJ5OiBBYnN0cmFjdFVzZXIgfCBudWxsO1xuICBwdWJsaWMgcmVhZG9ubHkgZWRpdGVkQXQ6IERhdGUgfCBudWxsO1xuICBwcml2YXRlIF9wYXJlbnRJZDogbnVtYmVyIHwgbnVsbDtcbiAgcHJpdmF0ZSBfc291cmNlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfcmV2aXNpb25zOiBGb3J1bVBvc3RSZXZpc2lvbkNvbGxlY3Rpb24gfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBGb3J1bVBvc3REYXRhKSB7XG4gICAgdGhpcy50aHJlYWQgPSBkYXRhLnRocmVhZDtcbiAgICB0aGlzLmlkID0gZGF0YS5pZDtcbiAgICB0aGlzLnRpdGxlID0gZGF0YS50aXRsZTtcbiAgICB0aGlzLnRleHQgPSBkYXRhLnRleHQ7XG4gICAgdGhpcy5lbGVtZW50ID0gZGF0YS5lbGVtZW50O1xuICAgIHRoaXMuY3JlYXRlZEJ5ID0gZGF0YS5jcmVhdGVkQnk7XG4gICAgdGhpcy5jcmVhdGVkQXQgPSBkYXRhLmNyZWF0ZWRBdDtcbiAgICB0aGlzLmVkaXRlZEJ5ID0gZGF0YS5lZGl0ZWRCeSA/PyBudWxsO1xuICAgIHRoaXMuZWRpdGVkQXQgPSBkYXRhLmVkaXRlZEF0ID8/IG51bGw7XG4gICAgdGhpcy5fcGFyZW50SWQgPSBkYXRhLnBhcmVudElkID8/IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUGFyZW50IHBvc3QgSURcbiAgICovXG4gIGdldCBwYXJlbnRJZCgpOiBudW1iZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50SWQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNvdXJjZSBjb2RlIChjYWNoZWQpXG4gICAqL1xuICBnZXQgc291cmNlKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9zb3VyY2U7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHNvdXJjZSBjb2RlXG4gICAqL1xuICBzZXQgc291cmNlKHZhbHVlOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgdGhpcy5fc291cmNlID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNvdXJjZSBjb2RlIChXaWtpZG90IHN5bnRheClcbiAgICovXG4gIGdldFNvdXJjZSgpOiBXaWtpZG90UmVzdWx0QXN5bmM8c3RyaW5nPiB7XG4gICAgaWYgKHRoaXMuc291cmNlICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gZnJvbVByb21pc2UoUHJvbWlzZS5yZXNvbHZlKHRoaXMuc291cmNlKSwgKGUpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoU3RyaW5nKGUpKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgRm9ydW1Qb3N0Q29sbGVjdGlvbi5hY3F1aXJlUG9zdFNvdXJjZXModGhpcy50aHJlYWQsIFt0aGlzXSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zb3VyY2UgPT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ1NvdXJjZSB0ZXh0YXJlYSBub3QgZm91bmQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2U7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSByZXR1cm4gZXJyb3I7XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHBvc3Qgc291cmNlOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFZGl0IHBvc3RcbiAgICogQHBhcmFtIHNvdXJjZSAtIE5ldyBzb3VyY2UgKFdpa2lkb3Qgc3ludGF4KVxuICAgKiBAcGFyYW0gdGl0bGUgLSBOZXcgdGl0bGUgKGtlZXBzIGN1cnJlbnQgdGl0bGUgaWYgb21pdHRlZClcbiAgICovXG4gIEBSZXF1aXJlTG9naW5cbiAgZWRpdChzb3VyY2U6IHN0cmluZywgdGl0bGU/OiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIEdldCBjdXJyZW50IHJldmlzaW9uIElEXG4gICAgICAgIGNvbnN0IGZvcm1SZXN1bHQgPSBhd2FpdCB0aGlzLnRocmVhZC5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdmb3J1bS9zdWIvRm9ydW1FZGl0UG9zdEZvcm1Nb2R1bGUnLFxuICAgICAgICAgICAgdGhyZWFkSWQ6IHRoaXMudGhyZWFkLmlkLFxuICAgICAgICAgICAgcG9zdElkOiB0aGlzLmlkLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChmb3JtUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBmb3JtUmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZm9ybVJlc3BvbnNlID0gZm9ybVJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFmb3JtUmVzcG9uc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ0VtcHR5IGZvcm0gcmVzcG9uc2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoU3RyaW5nKGZvcm1SZXNwb25zZS5ib2R5ID8/ICcnKSk7XG4gICAgICAgIGNvbnN0IHJldmlzaW9uSW5wdXQgPSAkKFwiaW5wdXRbbmFtZT0nY3VycmVudFJldmlzaW9uSWQnXVwiKTtcbiAgICAgICAgaWYgKHJldmlzaW9uSW5wdXQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdDdXJyZW50IHJldmlzaW9uIElEIGlucHV0IG5vdCBmb3VuZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmV2aXNpb25WYWx1ZSA9IHJldmlzaW9uSW5wdXQudmFsKCk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRSZXZpc2lvbklkID0gTnVtYmVyLnBhcnNlSW50KFN0cmluZyhyZXZpc2lvblZhbHVlID8/ICcnKSwgMTApO1xuICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKGN1cnJlbnRSZXZpc2lvbklkKSkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcignSW52YWxpZCByZXZpc2lvbiBJRCB2YWx1ZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2F2ZSBlZGl0XG4gICAgICAgIGNvbnN0IGVkaXRSZXN1bHQgPSBhd2FpdCB0aGlzLnRocmVhZC5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ0ZvcnVtQWN0aW9uJyxcbiAgICAgICAgICAgIGV2ZW50OiAnc2F2ZUVkaXRQb3N0JyxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdFbXB0eScsXG4gICAgICAgICAgICBwb3N0SWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICBjdXJyZW50UmV2aXNpb25JZCxcbiAgICAgICAgICAgIHRpdGxlOiB0aXRsZSA/PyB0aGlzLnRpdGxlLFxuICAgICAgICAgICAgc291cmNlLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChlZGl0UmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBlZGl0UmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIGxvY2FsIHN0YXRlXG4gICAgICAgIGlmICh0aXRsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy50aXRsZSA9IHRpdGxlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGVkaXQgcG9zdDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcG9zdCBoYXMgYmVlbiBlZGl0ZWQgKGhhcyByZXZpc2lvbnMpXG4gICAqL1xuICBnZXQgaGFzUmV2aXNpb25zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmVkaXRlZEJ5ICE9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBwb3N0IHJldmlzaW9ucyAoZWRpdCBoaXN0b3J5KVxuICAgKiBAcmV0dXJucyBSZXZpc2lvbiBjb2xsZWN0aW9uXG4gICAqL1xuICBnZXRSZXZpc2lvbnMoKTogV2lraWRvdFJlc3VsdEFzeW5jPEZvcnVtUG9zdFJldmlzaW9uQ29sbGVjdGlvbj4ge1xuICAgIGlmICh0aGlzLl9yZXZpc2lvbnMgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiBmcm9tUHJvbWlzZShQcm9taXNlLnJlc29sdmUodGhpcy5fcmV2aXNpb25zKSwgKGUpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoU3RyaW5nKGUpKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgRm9ydW1Qb3N0UmV2aXNpb25Db2xsZWN0aW9uLmFjcXVpcmVBbGxGb3JQb3N0cyhbdGhpc10pO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcmV2aXNpb25zID0gcmVzdWx0LnZhbHVlLmdldCh0aGlzLmlkKSA/PyBuZXcgRm9ydW1Qb3N0UmV2aXNpb25Db2xsZWN0aW9uKHRoaXMsIFtdKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JldmlzaW9ucztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHJldHVybiBlcnJvcjtcbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgcmV2aXNpb25zOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBGb3J1bVBvc3QoaWQ9JHt0aGlzLmlkfSwgdGl0bGU9JHt0aGlzLnRpdGxlfSlgO1xuICB9XG59XG5cbi8qKlxuICogRm9ydW0gcG9zdCBjb2xsZWN0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBGb3J1bVBvc3RDb2xsZWN0aW9uIGV4dGVuZHMgQXJyYXk8Rm9ydW1Qb3N0PiB7XG4gIHB1YmxpYyByZWFkb25seSB0aHJlYWQ6IEZvcnVtVGhyZWFkUmVmO1xuXG4gIGNvbnN0cnVjdG9yKHRocmVhZDogRm9ydW1UaHJlYWRSZWYsIHBvc3RzPzogRm9ydW1Qb3N0W10pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMudGhyZWFkID0gdGhyZWFkO1xuICAgIGlmIChwb3N0cykge1xuICAgICAgdGhpcy5wdXNoKC4uLnBvc3RzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBieSBJRFxuICAgKiBAcGFyYW0gaWQgLSBQb3N0IElEXG4gICAqIEByZXR1cm5zIFBvc3QgKHVuZGVmaW5lZCBpZiBub3QgZm91bmQpXG4gICAqL1xuICBmaW5kQnlJZChpZDogbnVtYmVyKTogRm9ydW1Qb3N0IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5maW5kKChwb3N0KSA9PiBwb3N0LmlkID09PSBpZCk7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgcG9zdHMgZnJvbSBIVE1MIChpbnRlcm5hbCBtZXRob2QpXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBfcGFyc2UodGhyZWFkOiBGb3J1bVRocmVhZFJlZiwgJDogQ2hlZXJpb0FQSSk6IEZvcnVtUG9zdFtdIHtcbiAgICBjb25zdCBwb3N0czogRm9ydW1Qb3N0W10gPSBbXTtcblxuICAgICQoJ2Rpdi5wb3N0W2lkXj1cInBvc3QtXCJdJykuZWFjaCgoX2ksIHBvc3RFbGVtKSA9PiB7XG4gICAgICBjb25zdCAkcG9zdCA9ICQocG9zdEVsZW0pO1xuICAgICAgY29uc3QgcG9zdElkQXR0ciA9ICRwb3N0LmF0dHIoJ2lkJyk7XG4gICAgICBpZiAoIXBvc3RJZEF0dHIpIHJldHVybjtcblxuICAgICAgY29uc3QgcG9zdElkID0gTnVtYmVyLnBhcnNlSW50KHBvc3RJZEF0dHIucmVwbGFjZSgncG9zdC0nLCAnJyksIDEwKTtcbiAgICAgIGlmIChOdW1iZXIuaXNOYU4ocG9zdElkKSkgcmV0dXJuO1xuXG4gICAgICAvLyBHZXQgcGFyZW50IHBvc3QgSURcbiAgICAgIGxldCBwYXJlbnRJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgICBjb25zdCAkcGFyZW50Q29udGFpbmVyID0gJHBvc3QucGFyZW50KCk7XG4gICAgICBpZiAoJHBhcmVudENvbnRhaW5lci5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0ICRncmFuZHBhcmVudCA9ICRwYXJlbnRDb250YWluZXIucGFyZW50KCk7XG4gICAgICAgIGlmICgkZ3JhbmRwYXJlbnQubGVuZ3RoID4gMCAmJiAkZ3JhbmRwYXJlbnRbMF0/Lm5hbWUgIT09ICdib2R5Jykge1xuICAgICAgICAgIGNvbnN0IGdyYW5kcGFyZW50Q2xhc3NlcyA9ICRncmFuZHBhcmVudC5hdHRyKCdjbGFzcycpID8/ICcnO1xuICAgICAgICAgIGlmIChncmFuZHBhcmVudENsYXNzZXMuaW5jbHVkZXMoJ3Bvc3QtY29udGFpbmVyJykpIHtcbiAgICAgICAgICAgIGNvbnN0ICRwYXJlbnRQb3N0ID0gJGdyYW5kcGFyZW50LmZpbmQoJz4gZGl2LnBvc3QnKTtcbiAgICAgICAgICAgIGlmICgkcGFyZW50UG9zdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHBhcmVudFBvc3RJZEF0dHIgPSAkcGFyZW50UG9zdC5hdHRyKCdpZCcpO1xuICAgICAgICAgICAgICBpZiAocGFyZW50UG9zdElkQXR0cikge1xuICAgICAgICAgICAgICAgIHBhcmVudElkID0gTnVtYmVyLnBhcnNlSW50KHBhcmVudFBvc3RJZEF0dHIucmVwbGFjZSgncG9zdC0nLCAnJyksIDEwKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBHZXQgdGl0bGUgYW5kIGNvbnRlbnRcbiAgICAgIC8vIFVzZSBjaGlsZCBjb21iaW5hdG9yICg+KSB0byBhdm9pZCBtYXRjaGluZyBuZXN0ZWQgcHNldWRvLXBvc3RzIGluIGNvbnRlbnRcbiAgICAgIGNvbnN0ICR3cmFwcGVyID0gJHBvc3QuZmluZCgnPiBkaXYubG9uZycpO1xuICAgICAgaWYgKCR3cmFwcGVyLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCAkaGVhZCA9ICR3cmFwcGVyLmZpbmQoJz4gZGl2LmhlYWQnKTtcbiAgICAgIGlmICgkaGVhZC5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgY29uc3QgJHRpdGxlID0gJGhlYWQuZmluZCgnPiBkaXYudGl0bGUnKTtcbiAgICAgIGNvbnN0IHRpdGxlID0gJHRpdGxlLnRleHQoKS50cmltKCk7XG5cbiAgICAgIGNvbnN0ICRjb250ZW50ID0gJHdyYXBwZXIuZmluZCgnPiBkaXYuY29udGVudCcpO1xuICAgICAgY29uc3QgdGV4dCA9ICRjb250ZW50Lmh0bWwoKSA/PyAnJztcblxuICAgICAgLy8gQXV0aG9yIGFuZCB0aW1lc3RhbXBcbiAgICAgIGNvbnN0ICRpbmZvID0gJGhlYWQuZmluZCgnPiBkaXYuaW5mbycpO1xuICAgICAgaWYgKCRpbmZvLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCAkdXNlckVsZW0gPSAkaW5mby5maW5kKCdzcGFuLnByaW50dXNlcicpO1xuICAgICAgaWYgKCR1c2VyRWxlbS5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgY29uc3QgY3JlYXRlZEJ5ID0gcGFyc2VVc2VyKHRocmVhZC5zaXRlLmNsaWVudCBhcyBDbGllbnQsICR1c2VyRWxlbSBhcyBDaGVlcmlvPEFueU5vZGU+KTtcblxuICAgICAgY29uc3QgJG9kYXRlRWxlbSA9ICRpbmZvLmZpbmQoJ3NwYW4ub2RhdGUnKTtcbiAgICAgIGlmICgkb2RhdGVFbGVtLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBjcmVhdGVkQXQgPSBwYXJzZU9kYXRlKCRvZGF0ZUVsZW0gYXMgQ2hlZXJpbzxBbnlOb2RlPikgPz8gbmV3IERhdGUoKTtcblxuICAgICAgLy8gRWRpdCBpbmZvIChpZiBleGlzdHMpXG4gICAgICBsZXQgZWRpdGVkQnk6IEFic3RyYWN0VXNlciB8IG51bGwgPSBudWxsO1xuICAgICAgbGV0IGVkaXRlZEF0OiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gICAgICBjb25zdCAkY2hhbmdlcyA9ICR3cmFwcGVyLmZpbmQoJ2Rpdi5jaGFuZ2VzJyk7XG4gICAgICBpZiAoJGNoYW5nZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCAkZWRpdFVzZXJFbGVtID0gJGNoYW5nZXMuZmluZCgnc3Bhbi5wcmludHVzZXInKTtcbiAgICAgICAgY29uc3QgJGVkaXRPZGF0ZUVsZW0gPSAkY2hhbmdlcy5maW5kKCdzcGFuLm9kYXRlJyk7XG4gICAgICAgIGlmICgkZWRpdFVzZXJFbGVtLmxlbmd0aCA+IDAgJiYgJGVkaXRPZGF0ZUVsZW0ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGVkaXRlZEJ5ID0gcGFyc2VVc2VyKHRocmVhZC5zaXRlLmNsaWVudCBhcyBDbGllbnQsICRlZGl0VXNlckVsZW0gYXMgQ2hlZXJpbzxBbnlOb2RlPik7XG4gICAgICAgICAgZWRpdGVkQXQgPSBwYXJzZU9kYXRlKCRlZGl0T2RhdGVFbGVtIGFzIENoZWVyaW88QW55Tm9kZT4pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHBvc3RzLnB1c2goXG4gICAgICAgIG5ldyBGb3J1bVBvc3Qoe1xuICAgICAgICAgIHRocmVhZCxcbiAgICAgICAgICBpZDogcG9zdElkLFxuICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgIHRleHQsXG4gICAgICAgICAgZWxlbWVudDogcG9zdEVsZW0gYXMgRWxlbWVudCxcbiAgICAgICAgICBjcmVhdGVkQnksXG4gICAgICAgICAgY3JlYXRlZEF0LFxuICAgICAgICAgIGVkaXRlZEJ5LFxuICAgICAgICAgIGVkaXRlZEF0LFxuICAgICAgICAgIHBhcmVudElkLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBwb3N0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHBvc3RzIGluIGEgdGhyZWFkXG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZUFsbEluVGhyZWFkKHRocmVhZDogRm9ydW1UaHJlYWRSZWYpOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1Qb3N0Q29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBvc3RzOiBGb3J1bVBvc3RbXSA9IFtdO1xuXG4gICAgICAgIGNvbnN0IGZpcnN0UmVzdWx0ID0gYXdhaXQgdGhyZWFkLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2ZvcnVtL0ZvcnVtVmlld1RocmVhZFBvc3RzTW9kdWxlJyxcbiAgICAgICAgICAgIHBhZ2VObzogJzEnLFxuICAgICAgICAgICAgdDogU3RyaW5nKHRocmVhZC5pZCksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKGZpcnN0UmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBmaXJzdFJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpcnN0UmVzcG9uc2UgPSBmaXJzdFJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFmaXJzdFJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdFbXB0eSByZXNwb25zZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlyc3RCb2R5ID0gU3RyaW5nKGZpcnN0UmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgIGNvbnN0ICRmaXJzdCA9IGNoZWVyaW8ubG9hZChmaXJzdEJvZHkpO1xuXG4gICAgICAgIHBvc3RzLnB1c2goLi4uRm9ydW1Qb3N0Q29sbGVjdGlvbi5fcGFyc2UodGhyZWFkLCAkZmlyc3QpKTtcblxuICAgICAgICAvLyBDaGVjayBwYWdpbmF0aW9uXG4gICAgICAgIGNvbnN0ICRwYWdlciA9ICRmaXJzdCgnZGl2LnBhZ2VyJyk7XG4gICAgICAgIGlmICgkcGFnZXIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBGb3J1bVBvc3RDb2xsZWN0aW9uKHRocmVhZCwgcG9zdHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgJHBhZ2VyVGFyZ2V0cyA9ICRwYWdlci5maW5kKCdzcGFuLnRhcmdldCcpO1xuICAgICAgICBpZiAoJHBhZ2VyVGFyZ2V0cy5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBGb3J1bVBvc3RDb2xsZWN0aW9uKHRocmVhZCwgcG9zdHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IGxhc3QgcGFnZSBudW1iZXIgZnJvbSBzZWNvbmQgdG8gbGFzdCBwYWdlIGxpbmtcbiAgICAgICAgY29uc3QgbGFzdFBhZ2VUZXh0ID0gJHBhZ2VyVGFyZ2V0c1xuICAgICAgICAgIC5lcSgkcGFnZXJUYXJnZXRzLmxlbmd0aCAtIDIpXG4gICAgICAgICAgLnRleHQoKVxuICAgICAgICAgIC50cmltKCk7XG4gICAgICAgIGNvbnN0IGxhc3RQYWdlID0gTnVtYmVyLnBhcnNlSW50KGxhc3RQYWdlVGV4dCwgMTApO1xuICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKGxhc3RQYWdlKSB8fCBsYXN0UGFnZSA8PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBGb3J1bVBvc3RDb2xsZWN0aW9uKHRocmVhZCwgcG9zdHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IHJlbWFpbmluZyBwYWdlc1xuICAgICAgICBjb25zdCBib2RpZXM6IHsgbW9kdWxlTmFtZTogc3RyaW5nOyBwYWdlTm86IHN0cmluZzsgdDogc3RyaW5nIH1bXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBwYWdlID0gMjsgcGFnZSA8PSBsYXN0UGFnZTsgcGFnZSsrKSB7XG4gICAgICAgICAgYm9kaWVzLnB1c2goe1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2ZvcnVtL0ZvcnVtVmlld1RocmVhZFBvc3RzTW9kdWxlJyxcbiAgICAgICAgICAgIHBhZ2VObzogU3RyaW5nKHBhZ2UpLFxuICAgICAgICAgICAgdDogU3RyaW5nKHRocmVhZC5pZCksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhZGRpdGlvbmFsUmVzdWx0cyA9IGF3YWl0IHRocmVhZC5zaXRlLmFtY1JlcXVlc3QoYm9kaWVzKTtcbiAgICAgICAgaWYgKGFkZGl0aW9uYWxSZXN1bHRzLmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBhZGRpdGlvbmFsUmVzdWx0cy5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgcmVzcG9uc2Ugb2YgYWRkaXRpb25hbFJlc3VsdHMudmFsdWUpIHtcbiAgICAgICAgICBjb25zdCBib2R5ID0gU3RyaW5nKHJlc3BvbnNlPy5ib2R5ID8/ICcnKTtcbiAgICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGJvZHkpO1xuICAgICAgICAgIHBvc3RzLnB1c2goLi4uRm9ydW1Qb3N0Q29sbGVjdGlvbi5fcGFyc2UodGhyZWFkLCAkKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IEZvcnVtUG9zdENvbGxlY3Rpb24odGhyZWFkLCBwb3N0cyk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSByZXR1cm4gZXJyb3I7XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSBwb3N0czogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBwb3N0cyBmcm9tIG11bHRpcGxlIHRocmVhZHNcbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlQWxsSW5UaHJlYWRzKFxuICAgIHRocmVhZHM6IEZvcnVtVGhyZWFkUmVmW11cbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPE1hcDxudW1iZXIsIEZvcnVtUG9zdENvbGxlY3Rpb24+PiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKHRocmVhZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBNYXA8bnVtYmVyLCBGb3J1bVBvc3RDb2xsZWN0aW9uPigpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IE1hcDxudW1iZXIsIEZvcnVtUG9zdENvbGxlY3Rpb24+KCk7XG4gICAgICAgIGNvbnN0IHNpdGUgPSB0aHJlYWRzWzBdIS5zaXRlO1xuXG4gICAgICAgIC8vIFN0ZXAgMTogR2V0IGZpcnN0IHBhZ2Ugb2YgYWxsIHRocmVhZHNcbiAgICAgICAgY29uc3QgZmlyc3RQYWdlUmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0V2l0aFJldHJ5KFxuICAgICAgICAgIHRocmVhZHMubWFwKCh0aHJlYWQpID0+ICh7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnZm9ydW0vRm9ydW1WaWV3VGhyZWFkUG9zdHNNb2R1bGUnLFxuICAgICAgICAgICAgcGFnZU5vOiAnMScsXG4gICAgICAgICAgICB0OiBTdHJpbmcodGhyZWFkLmlkKSxcbiAgICAgICAgICB9KSlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoZmlyc3RQYWdlUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBmaXJzdFBhZ2VSZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGVwIDI6IFBhcnNlIGZpcnN0IHBhZ2VzIGFuZCBkZXRlcm1pbmUgcGFnaW5hdGlvblxuICAgICAgICBjb25zdCBhZGRpdGlvbmFsUmVxdWVzdHM6IHsgdGhyZWFkOiBGb3J1bVRocmVhZFJlZjsgcGFnZTogbnVtYmVyIH1bXSA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhyZWFkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHRocmVhZCA9IHRocmVhZHNbaV0hO1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gZmlyc3RQYWdlUmVzdWx0LnZhbHVlW2ldO1xuICAgICAgICAgIGlmICghcmVzcG9uc2UpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY29uc3QgYm9keSA9IFN0cmluZyhyZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGJvZHkpO1xuXG4gICAgICAgICAgY29uc3QgcG9zdHMgPSBGb3J1bVBvc3RDb2xsZWN0aW9uLl9wYXJzZSh0aHJlYWQsICQpO1xuICAgICAgICAgIHJlc3VsdC5zZXQodGhyZWFkLmlkLCBuZXcgRm9ydW1Qb3N0Q29sbGVjdGlvbih0aHJlYWQsIHBvc3RzKSk7XG5cbiAgICAgICAgICAvLyBDaGVjayBwYWdpbmF0aW9uXG4gICAgICAgICAgY29uc3QgJHBhZ2VyID0gJCgnZGl2LnBhZ2VyJyk7XG4gICAgICAgICAgaWYgKCRwYWdlci5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY29uc3QgJHBhZ2VyVGFyZ2V0cyA9ICRwYWdlci5maW5kKCdzcGFuLnRhcmdldCcpO1xuICAgICAgICAgIGlmICgkcGFnZXJUYXJnZXRzLmxlbmd0aCA8IDIpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY29uc3QgbGFzdFBhZ2VUZXh0ID0gJHBhZ2VyVGFyZ2V0c1xuICAgICAgICAgICAgLmVxKCRwYWdlclRhcmdldHMubGVuZ3RoIC0gMilcbiAgICAgICAgICAgIC50ZXh0KClcbiAgICAgICAgICAgIC50cmltKCk7XG4gICAgICAgICAgY29uc3QgbGFzdFBhZ2UgPSBOdW1iZXIucGFyc2VJbnQobGFzdFBhZ2VUZXh0LCAxMCk7XG4gICAgICAgICAgaWYgKE51bWJlci5pc05hTihsYXN0UGFnZSkgfHwgbGFzdFBhZ2UgPD0gMSkgY29udGludWU7XG5cbiAgICAgICAgICBmb3IgKGxldCBwYWdlID0gMjsgcGFnZSA8PSBsYXN0UGFnZTsgcGFnZSsrKSB7XG4gICAgICAgICAgICBhZGRpdGlvbmFsUmVxdWVzdHMucHVzaCh7IHRocmVhZCwgcGFnZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGVwIDM6IEZldGNoIGFkZGl0aW9uYWwgcGFnZXNcbiAgICAgICAgaWYgKGFkZGl0aW9uYWxSZXF1ZXN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgYWRkaXRpb25hbFJlc3VsdCA9IGF3YWl0IHNpdGUuYW1jUmVxdWVzdFdpdGhSZXRyeShcbiAgICAgICAgICAgIGFkZGl0aW9uYWxSZXF1ZXN0cy5tYXAoKHsgdGhyZWFkLCBwYWdlIH0pID0+ICh7XG4gICAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdmb3J1bS9Gb3J1bVZpZXdUaHJlYWRQb3N0c01vZHVsZScsXG4gICAgICAgICAgICAgIHBhZ2VObzogU3RyaW5nKHBhZ2UpLFxuICAgICAgICAgICAgICB0OiBTdHJpbmcodGhyZWFkLmlkKSxcbiAgICAgICAgICAgIH0pKVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoYWRkaXRpb25hbFJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgICB0aHJvdyBhZGRpdGlvbmFsUmVzdWx0LmVycm9yO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWRkaXRpb25hbFJlcXVlc3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCB7IHRocmVhZCB9ID0gYWRkaXRpb25hbFJlcXVlc3RzW2ldITtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYWRkaXRpb25hbFJlc3VsdC52YWx1ZVtpXTtcbiAgICAgICAgICAgIGlmICghcmVzcG9uc2UpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBjb25zdCBib2R5ID0gU3RyaW5nKHJlc3BvbnNlLmJvZHkgPz8gJycpO1xuICAgICAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChib2R5KTtcbiAgICAgICAgICAgIGNvbnN0IHBvc3RzID0gRm9ydW1Qb3N0Q29sbGVjdGlvbi5fcGFyc2UodGhyZWFkLCAkKTtcblxuICAgICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSByZXN1bHQuZ2V0KHRocmVhZC5pZCk7XG4gICAgICAgICAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgICAgICAgICAgZXhpc3RpbmcucHVzaCguLi5wb3N0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHJldHVybiBlcnJvcjtcbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBhY3F1aXJlIHBvc3RzOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gYWNxdWlyZSBwb3N0IHNvdXJjZXMgaW4gYnVsa1xuICAgKi9cbiAgc3RhdGljIGFjcXVpcmVQb3N0U291cmNlcyhcbiAgICB0aHJlYWQ6IEZvcnVtVGhyZWFkUmVmLFxuICAgIHBvc3RzOiBGb3J1bVBvc3RbXVxuICApOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1Qb3N0Q29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRhcmdldFBvc3RzID0gcG9zdHMuZmlsdGVyKChwb3N0KSA9PiBwb3N0LnNvdXJjZSA9PT0gbnVsbCk7XG5cbiAgICAgICAgaWYgKHRhcmdldFBvc3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBuZXcgRm9ydW1Qb3N0Q29sbGVjdGlvbih0aHJlYWQsIHBvc3RzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRocmVhZC5zaXRlLmFtY1JlcXVlc3QoXG4gICAgICAgICAgdGFyZ2V0UG9zdHMubWFwKChwb3N0KSA9PiAoe1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2ZvcnVtL3N1Yi9Gb3J1bUVkaXRQb3N0Rm9ybU1vZHVsZScsXG4gICAgICAgICAgICB0aHJlYWRJZDogdGhyZWFkLmlkLFxuICAgICAgICAgICAgcG9zdElkOiBwb3N0LmlkLFxuICAgICAgICAgIH0pKVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFyZ2V0UG9zdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBwb3N0ID0gdGFyZ2V0UG9zdHNbaV07XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbaV07XG4gICAgICAgICAgaWYgKCFwb3N0IHx8ICFyZXNwb25zZSkgY29udGludWU7XG4gICAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJykpO1xuICAgICAgICAgIGNvbnN0IHNvdXJjZUVsZW0gPSAkKFwidGV4dGFyZWFbbmFtZT0nc291cmNlJ11cIik7XG4gICAgICAgICAgaWYgKHNvdXJjZUVsZW0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoYFNvdXJjZSB0ZXh0YXJlYSBub3QgZm91bmQgZm9yIHBvc3Q6ICR7cG9zdC5pZH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcG9zdC5zb3VyY2UgPSBzb3VyY2VFbGVtLnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgRm9ydW1Qb3N0Q29sbGVjdGlvbih0aHJlYWQsIHBvc3RzKTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHJldHVybiBlcnJvcjtcbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBhY3F1aXJlIHBvc3Qgc291cmNlczogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNvdXJjZXMgZm9yIGFsbCBwb3N0cyBpbiB0aGUgY29sbGVjdGlvblxuICAgKiBAcmV0dXJucyBSZXN1bHQgY29udGFpbmluZyB0aGUgY29sbGVjdGlvbiAoZm9yIG1ldGhvZCBjaGFpbmluZylcbiAgICovXG4gIGdldFBvc3RTb3VyY2VzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxGb3J1bVBvc3RDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIEZvcnVtUG9zdENvbGxlY3Rpb24uYWNxdWlyZVBvc3RTb3VyY2VzKHRoaXMudGhyZWFkLCBBcnJheS5mcm9tKHRoaXMpKTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IENoZWVyaW8gfSBmcm9tICdjaGVlcmlvJztcbmltcG9ydCAqIGFzIGNoZWVyaW8gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQgdHlwZSB7IEFueU5vZGUgfSBmcm9tICdkb21oYW5kbGVyJztcbmltcG9ydCB7IFJlcXVpcmVMb2dpbiB9IGZyb20gJy4uLy4uL2NvbW1vbi9kZWNvcmF0b3JzJztcbmltcG9ydCB7IE5vRWxlbWVudEVycm9yLCBVbmV4cGVjdGVkRXJyb3IgfSBmcm9tICcuLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyBwYXJzZU9kYXRlLCBwYXJzZVVzZXIgfSBmcm9tICcuLi8uLi91dGlsL3BhcnNlcic7XG5pbXBvcnQgdHlwZSB7IFNpdGUgfSBmcm9tICcuLi9zaXRlJztcbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RVc2VyIH0gZnJvbSAnLi4vdXNlcic7XG5pbXBvcnQgdHlwZSB7IEZvcnVtQ2F0ZWdvcnkgfSBmcm9tICcuL2ZvcnVtLWNhdGVnb3J5JztcbmltcG9ydCB7IEZvcnVtUG9zdENvbGxlY3Rpb24gfSBmcm9tICcuL2ZvcnVtLXBvc3QnO1xuXG4vKipcbiAqIEZvcnVtIHRocmVhZCBkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRm9ydW1UaHJlYWREYXRhIHtcbiAgc2l0ZTogU2l0ZTtcbiAgaWQ6IG51bWJlcjtcbiAgdGl0bGU6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgY3JlYXRlZEJ5OiBBYnN0cmFjdFVzZXIgfCBudWxsO1xuICBjcmVhdGVkQXQ6IERhdGU7XG4gIHBvc3RDb3VudDogbnVtYmVyO1xuICBjYXRlZ29yeT86IEZvcnVtQ2F0ZWdvcnkgfCBudWxsO1xufVxuXG4vKipcbiAqIEZvcnVtIHRocmVhZFxuICovXG5leHBvcnQgY2xhc3MgRm9ydW1UaHJlYWQge1xuICBwdWJsaWMgcmVhZG9ubHkgc2l0ZTogU2l0ZTtcbiAgcHVibGljIHJlYWRvbmx5IGlkOiBudW1iZXI7XG4gIHB1YmxpYyByZWFkb25seSB0aXRsZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgZGVzY3JpcHRpb246IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZWRCeTogQWJzdHJhY3RVc2VyIHwgbnVsbDtcbiAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZWRBdDogRGF0ZTtcbiAgcHVibGljIHBvc3RDb3VudDogbnVtYmVyO1xuICBwdWJsaWMgcmVhZG9ubHkgY2F0ZWdvcnk6IEZvcnVtQ2F0ZWdvcnkgfCBudWxsO1xuICBwcml2YXRlIF9wb3N0czogRm9ydW1Qb3N0Q29sbGVjdGlvbiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IEZvcnVtVGhyZWFkRGF0YSkge1xuICAgIHRoaXMuc2l0ZSA9IGRhdGEuc2l0ZTtcbiAgICB0aGlzLmlkID0gZGF0YS5pZDtcbiAgICB0aGlzLnRpdGxlID0gZGF0YS50aXRsZTtcbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGF0YS5kZXNjcmlwdGlvbjtcbiAgICB0aGlzLmNyZWF0ZWRCeSA9IGRhdGEuY3JlYXRlZEJ5O1xuICAgIHRoaXMuY3JlYXRlZEF0ID0gZGF0YS5jcmVhdGVkQXQ7XG4gICAgdGhpcy5wb3N0Q291bnQgPSBkYXRhLnBvc3RDb3VudDtcbiAgICB0aGlzLmNhdGVnb3J5ID0gZGF0YS5jYXRlZ29yeSA/PyBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aHJlYWQgVVJMXG4gICAqL1xuICBnZXRVcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5zaXRlLmdldEJhc2VVcmwoKX0vZm9ydW0vdC0ke3RoaXMuaWR9L2A7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBvc3QgbGlzdFxuICAgKi9cbiAgZ2V0UG9zdHMoKTogV2lraWRvdFJlc3VsdEFzeW5jPEZvcnVtUG9zdENvbGxlY3Rpb24+IHtcbiAgICBpZiAodGhpcy5fcG9zdHMgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiBmcm9tUHJvbWlzZShQcm9taXNlLnJlc29sdmUodGhpcy5fcG9zdHMpLCAoZSkgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihTdHJpbmcoZSkpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBGb3J1bVBvc3RDb2xsZWN0aW9uLmFjcXVpcmVBbGxJblRocmVhZHMoW3RoaXNdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Bvc3RzID0gcmVzdWx0LnZhbHVlLmdldCh0aGlzLmlkKSA/PyBuZXcgRm9ydW1Qb3N0Q29sbGVjdGlvbih0aGlzLCBbXSk7XG4gICAgICAgIHJldHVybiB0aGlzLl9wb3N0cztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgcG9zdHM6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVwbHkgdG8gdGhyZWFkXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIHJlcGx5KFxuICAgIHNvdXJjZTogc3RyaW5nLFxuICAgIHRpdGxlID0gJycsXG4gICAgcGFyZW50UG9zdElkOiBudW1iZXIgfCBudWxsID0gbnVsbFxuICApOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1UaHJlYWQ+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdGhyZWFkSWQ6IFN0cmluZyh0aGlzLmlkKSxcbiAgICAgICAgICAgIHBhcmVudElkOiBwYXJlbnRQb3N0SWQgIT09IG51bGwgPyBTdHJpbmcocGFyZW50UG9zdElkKSA6ICcnLFxuICAgICAgICAgICAgdGl0bGUsXG4gICAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgICBhY3Rpb246ICdGb3J1bUFjdGlvbicsXG4gICAgICAgICAgICBldmVudDogJ3NhdmVQb3N0JyxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdFbXB0eScsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9wb3N0cyA9IG51bGw7XG4gICAgICAgIHRoaXMucG9zdENvdW50ICs9IDE7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIHJlcGx5OiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYEZvcnVtVGhyZWFkKGlkPSR7dGhpcy5pZH0sIHRpdGxlPSR7dGhpcy50aXRsZX0pYDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhyZWFkIGJ5IElEXG4gICAqL1xuICBzdGF0aWMgZ2V0RnJvbUlkKFxuICAgIHNpdGU6IFNpdGUsXG4gICAgdGhyZWFkSWQ6IG51bWJlcixcbiAgICBjYXRlZ29yeTogRm9ydW1DYXRlZ29yeSB8IG51bGwgPSBudWxsXG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzxGb3J1bVRocmVhZD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IEZvcnVtVGhyZWFkQ29sbGVjdGlvbi5hY3F1aXJlRnJvbVRocmVhZElkcyhzaXRlLCBbdGhyZWFkSWRdLCBjYXRlZ29yeSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0aHJlYWQgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghdGhyZWFkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKGBUaHJlYWQgbm90IGZvdW5kOiAke3RocmVhZElkfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aHJlYWQ7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSByZXR1cm4gZXJyb3I7XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHRocmVhZDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBGb3J1bSB0aHJlYWQgY29sbGVjdGlvblxuICovXG5leHBvcnQgY2xhc3MgRm9ydW1UaHJlYWRDb2xsZWN0aW9uIGV4dGVuZHMgQXJyYXk8Rm9ydW1UaHJlYWQ+IHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG5cbiAgY29uc3RydWN0b3Ioc2l0ZTogU2l0ZSwgdGhyZWFkcz86IEZvcnVtVGhyZWFkW10pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuc2l0ZSA9IHNpdGU7XG4gICAgaWYgKHRocmVhZHMpIHtcbiAgICAgIHRoaXMucHVzaCguLi50aHJlYWRzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBieSBJRFxuICAgKi9cbiAgZmluZEJ5SWQoaWQ6IG51bWJlcik6IEZvcnVtVGhyZWFkIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5maW5kKCh0aHJlYWQpID0+IHRocmVhZC5pZCA9PT0gaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgdGhyZWFkcyBpbiBjYXRlZ29yeVxuICAgKi9cbiAgc3RhdGljIGFjcXVpcmVBbGxJbkNhdGVnb3J5KGNhdGVnb3J5OiBGb3J1bUNhdGVnb3J5KTogV2lraWRvdFJlc3VsdEFzeW5jPEZvcnVtVGhyZWFkQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRocmVhZHM6IEZvcnVtVGhyZWFkW10gPSBbXTtcblxuICAgICAgICBjb25zdCBmaXJzdFJlc3VsdCA9IGF3YWl0IGNhdGVnb3J5LnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgcDogMSxcbiAgICAgICAgICAgIGM6IGNhdGVnb3J5LmlkLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2ZvcnVtL0ZvcnVtVmlld0NhdGVnb3J5TW9kdWxlJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcblxuICAgICAgICBpZiAoZmlyc3RSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IGZpcnN0UmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlyc3RSZXNwb25zZSA9IGZpcnN0UmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIWZpcnN0UmVzcG9uc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ0VtcHR5IHJlc3BvbnNlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaXJzdEJvZHkgPSBTdHJpbmcoZmlyc3RSZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgY29uc3QgJGZpcnN0ID0gY2hlZXJpby5sb2FkKGZpcnN0Qm9keSk7XG5cbiAgICAgICAgJGZpcnN0KCd0YWJsZS50YWJsZSB0ci5oZWFkfnRyJykuZWFjaCgoX2ksIGVsZW0pID0+IHtcbiAgICAgICAgICBjb25zdCAkcm93ID0gJGZpcnN0KGVsZW0pO1xuICAgICAgICAgIGNvbnN0IHRpdGxlRWxlbSA9ICRyb3cuZmluZCgnZGl2LnRpdGxlIGEnKTtcbiAgICAgICAgICBjb25zdCBocmVmID0gdGl0bGVFbGVtLmF0dHIoJ2hyZWYnKSA/PyAnJztcbiAgICAgICAgICBjb25zdCB0aHJlYWRJZE1hdGNoID0gaHJlZi5tYXRjaCgvdC0oXFxkKykvKTtcbiAgICAgICAgICBpZiAoIXRocmVhZElkTWF0Y2g/LlsxXSkgcmV0dXJuO1xuXG4gICAgICAgICAgY29uc3QgdGhyZWFkSWQgPSBOdW1iZXIucGFyc2VJbnQodGhyZWFkSWRNYXRjaFsxXSwgMTApO1xuICAgICAgICAgIGNvbnN0IHRpdGxlID0gdGl0bGVFbGVtLnRleHQoKS50cmltKCk7XG4gICAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSAkcm93LmZpbmQoJ2Rpdi5kZXNjcmlwdGlvbicpLnRleHQoKS50cmltKCk7XG4gICAgICAgICAgY29uc3QgcG9zdENvdW50ID0gTnVtYmVyLnBhcnNlSW50KCRyb3cuZmluZCgndGQucG9zdHMnKS50ZXh0KCkudHJpbSgpLCAxMCkgfHwgMDtcblxuICAgICAgICAgIC8vIFBhcnNlIHVzZXIgYW5kIHRpbWVzdGFtcFxuICAgICAgICAgIGNvbnN0ICR1c2VyRWxlbSA9ICRyb3cuZmluZCgndGQuc3RhcnRlZCBzcGFuLnByaW50dXNlcicpO1xuICAgICAgICAgIGNvbnN0ICRvZGF0ZUVsZW0gPSAkcm93LmZpbmQoJ3RkLnN0YXJ0ZWQgc3Bhbi5vZGF0ZScpO1xuXG4gICAgICAgICAgY29uc3QgY3JlYXRlZEJ5ID1cbiAgICAgICAgICAgICR1c2VyRWxlbS5sZW5ndGggPiAwXG4gICAgICAgICAgICAgID8gcGFyc2VVc2VyKGNhdGVnb3J5LnNpdGUuY2xpZW50LCAkdXNlckVsZW0gYXMgQ2hlZXJpbzxBbnlOb2RlPilcbiAgICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICAgIGNvbnN0IGNyZWF0ZWRBdCA9XG4gICAgICAgICAgICAkb2RhdGVFbGVtLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgPyAocGFyc2VPZGF0ZSgkb2RhdGVFbGVtIGFzIENoZWVyaW88QW55Tm9kZT4pID8/IG5ldyBEYXRlKCkpXG4gICAgICAgICAgICAgIDogbmV3IERhdGUoKTtcblxuICAgICAgICAgIHRocmVhZHMucHVzaChcbiAgICAgICAgICAgIG5ldyBGb3J1bVRocmVhZCh7XG4gICAgICAgICAgICAgIHNpdGU6IGNhdGVnb3J5LnNpdGUsXG4gICAgICAgICAgICAgIGlkOiB0aHJlYWRJZCxcbiAgICAgICAgICAgICAgdGl0bGUsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICBjcmVhdGVkQnksXG4gICAgICAgICAgICAgIGNyZWF0ZWRBdCxcbiAgICAgICAgICAgICAgcG9zdENvdW50LFxuICAgICAgICAgICAgICBjYXRlZ29yeSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQ2hlY2sgcGFnaW5hdGlvblxuICAgICAgICBjb25zdCBwYWdlciA9ICRmaXJzdCgnZGl2LnBhZ2VyJyk7XG4gICAgICAgIGlmIChwYWdlci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbmV3IEZvcnVtVGhyZWFkQ29sbGVjdGlvbihjYXRlZ29yeS5zaXRlLCB0aHJlYWRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhZ2VyTGlua3MgPSBwYWdlci5maW5kKCdhJyk7XG4gICAgICAgIGlmIChwYWdlckxpbmtzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IEZvcnVtVGhyZWFkQ29sbGVjdGlvbihjYXRlZ29yeS5zaXRlLCB0aHJlYWRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxhc3RQYWdlTGluayA9IHBhZ2VyTGlua3NbcGFnZXJMaW5rcy5sZW5ndGggLSAyXTtcbiAgICAgICAgY29uc3QgbGFzdFBhZ2VUZXh0ID0gbGFzdFBhZ2VMaW5rID8gJGZpcnN0KGxhc3RQYWdlTGluaykudGV4dCgpLnRyaW0oKSA6ICcxJztcbiAgICAgICAgY29uc3QgbGFzdFBhZ2UgPSBOdW1iZXIucGFyc2VJbnQobGFzdFBhZ2VUZXh0LCAxMCkgfHwgMTtcblxuICAgICAgICBpZiAobGFzdFBhZ2UgPD0gMSkge1xuICAgICAgICAgIHJldHVybiBuZXcgRm9ydW1UaHJlYWRDb2xsZWN0aW9uKGNhdGVnb3J5LnNpdGUsIHRocmVhZHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmV0Y2ggcmVtYWluaW5nIHBhZ2VzXG4gICAgICAgIGNvbnN0IGJvZGllczogeyBwOiBudW1iZXI7IGM6IG51bWJlcjsgbW9kdWxlTmFtZTogc3RyaW5nIH1bXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBwYWdlID0gMjsgcGFnZSA8PSBsYXN0UGFnZTsgcGFnZSsrKSB7XG4gICAgICAgICAgYm9kaWVzLnB1c2goe1xuICAgICAgICAgICAgcDogcGFnZSxcbiAgICAgICAgICAgIGM6IGNhdGVnb3J5LmlkLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2ZvcnVtL0ZvcnVtVmlld0NhdGVnb3J5TW9kdWxlJyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFkZGl0aW9uYWxSZXN1bHRzID0gYXdhaXQgY2F0ZWdvcnkuc2l0ZS5hbWNSZXF1ZXN0V2l0aFJldHJ5KGJvZGllcyk7XG4gICAgICAgIGlmIChhZGRpdGlvbmFsUmVzdWx0cy5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgYWRkaXRpb25hbFJlc3VsdHMuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IHJlc3BvbnNlIG9mIGFkZGl0aW9uYWxSZXN1bHRzLnZhbHVlKSB7XG4gICAgICAgICAgaWYgKCFyZXNwb25zZSkgY29udGludWU7XG4gICAgICAgICAgY29uc3QgYm9keSA9IFN0cmluZyhyZXNwb25zZT8uYm9keSA/PyAnJyk7XG4gICAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChib2R5KTtcblxuICAgICAgICAgICQoJ3RhYmxlLnRhYmxlIHRyLmhlYWR+dHInKS5lYWNoKChfaSwgZWxlbSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgJHJvdyA9ICQoZWxlbSk7XG4gICAgICAgICAgICBjb25zdCB0aXRsZUVsZW0gPSAkcm93LmZpbmQoJ2Rpdi50aXRsZSBhJyk7XG4gICAgICAgICAgICBjb25zdCBocmVmID0gdGl0bGVFbGVtLmF0dHIoJ2hyZWYnKSA/PyAnJztcbiAgICAgICAgICAgIGNvbnN0IHRocmVhZElkTWF0Y2ggPSBocmVmLm1hdGNoKC90LShcXGQrKS8pO1xuICAgICAgICAgICAgaWYgKCF0aHJlYWRJZE1hdGNoPy5bMV0pIHJldHVybjtcblxuICAgICAgICAgICAgY29uc3QgdGhyZWFkSWQgPSBOdW1iZXIucGFyc2VJbnQodGhyZWFkSWRNYXRjaFsxXSwgMTApO1xuICAgICAgICAgICAgY29uc3QgdGl0bGUgPSB0aXRsZUVsZW0udGV4dCgpLnRyaW0oKTtcbiAgICAgICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gJHJvdy5maW5kKCdkaXYuZGVzY3JpcHRpb24nKS50ZXh0KCkudHJpbSgpO1xuICAgICAgICAgICAgY29uc3QgcG9zdENvdW50ID0gTnVtYmVyLnBhcnNlSW50KCRyb3cuZmluZCgndGQucG9zdHMnKS50ZXh0KCkudHJpbSgpLCAxMCkgfHwgMDtcblxuICAgICAgICAgICAgLy8gUGFyc2UgdXNlciBhbmQgdGltZXN0YW1wXG4gICAgICAgICAgICBjb25zdCAkdXNlckVsZW0gPSAkcm93LmZpbmQoJ3RkLnN0YXJ0ZWQgc3Bhbi5wcmludHVzZXInKTtcbiAgICAgICAgICAgIGNvbnN0ICRvZGF0ZUVsZW0gPSAkcm93LmZpbmQoJ3RkLnN0YXJ0ZWQgc3Bhbi5vZGF0ZScpO1xuXG4gICAgICAgICAgICBjb25zdCBjcmVhdGVkQnkgPVxuICAgICAgICAgICAgICAkdXNlckVsZW0ubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgID8gcGFyc2VVc2VyKGNhdGVnb3J5LnNpdGUuY2xpZW50LCAkdXNlckVsZW0gYXMgQ2hlZXJpbzxBbnlOb2RlPilcbiAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgICAgICBjb25zdCBjcmVhdGVkQXQgPVxuICAgICAgICAgICAgICAkb2RhdGVFbGVtLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICA/IChwYXJzZU9kYXRlKCRvZGF0ZUVsZW0gYXMgQ2hlZXJpbzxBbnlOb2RlPikgPz8gbmV3IERhdGUoKSlcbiAgICAgICAgICAgICAgICA6IG5ldyBEYXRlKCk7XG5cbiAgICAgICAgICAgIHRocmVhZHMucHVzaChcbiAgICAgICAgICAgICAgbmV3IEZvcnVtVGhyZWFkKHtcbiAgICAgICAgICAgICAgICBzaXRlOiBjYXRlZ29yeS5zaXRlLFxuICAgICAgICAgICAgICAgIGlkOiB0aHJlYWRJZCxcbiAgICAgICAgICAgICAgICB0aXRsZSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICBjcmVhdGVkQnksXG4gICAgICAgICAgICAgICAgY3JlYXRlZEF0LFxuICAgICAgICAgICAgICAgIHBvc3RDb3VudCxcbiAgICAgICAgICAgICAgICBjYXRlZ29yeSxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IEZvcnVtVGhyZWFkQ29sbGVjdGlvbihjYXRlZ29yeS5zaXRlLCB0aHJlYWRzKTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHJldHVybiBlcnJvcjtcbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBhY3F1aXJlIHRocmVhZHM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHNpbmdsZSB0aHJlYWQgYnkgdGhyZWFkIElEXG4gICAqIEBwYXJhbSBzaXRlIC0gU2l0ZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gdGhyZWFkSWQgLSBUaHJlYWQgSURcbiAgICovXG4gIHN0YXRpYyBmcm9tSWQoc2l0ZTogU2l0ZSwgdGhyZWFkSWQ6IG51bWJlcik6IFdpa2lkb3RSZXN1bHRBc3luYzxGb3J1bVRocmVhZD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IEZvcnVtVGhyZWFkQ29sbGVjdGlvbi5hY3F1aXJlRnJvbVRocmVhZElkcyhzaXRlLCBbdGhyZWFkSWRdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRocmVhZCA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCF0aHJlYWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoYFRocmVhZCBub3QgZm91bmQ6ICR7dGhyZWFkSWR9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRocmVhZDtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHJldHVybiBlcnJvcjtcbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgdGhyZWFkOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhyZWFkcyBieSB0aHJlYWQgSURzXG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZUZyb21UaHJlYWRJZHMoXG4gICAgc2l0ZTogU2l0ZSxcbiAgICB0aHJlYWRJZHM6IG51bWJlcltdLFxuICAgIGNhdGVnb3J5OiBGb3J1bUNhdGVnb3J5IHwgbnVsbCA9IG51bGxcbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPEZvcnVtVGhyZWFkQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNpdGUuYW1jUmVxdWVzdChcbiAgICAgICAgICB0aHJlYWRJZHMubWFwKCh0aHJlYWRJZCkgPT4gKHtcbiAgICAgICAgICAgIHQ6IHRocmVhZElkLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2ZvcnVtL0ZvcnVtVmlld1RocmVhZE1vZHVsZScsXG4gICAgICAgICAgfSkpXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGhyZWFkczogRm9ydW1UaHJlYWRbXSA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhyZWFkSWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbaV07XG4gICAgICAgICAgY29uc3QgdGhyZWFkSWQgPSB0aHJlYWRJZHNbaV07XG4gICAgICAgICAgaWYgKCFyZXNwb25zZSB8fCAhdGhyZWFkSWQpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY29uc3QgYm9keSA9IFN0cmluZyhyZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGJvZHkpO1xuXG4gICAgICAgICAgLy8gUGFyc2UgdGhyZWFkIGluZm8gZnJvbSBwYWdlXG4gICAgICAgICAgY29uc3QgYmNFbGVtID0gJCgnZGl2LmZvcnVtLWJyZWFkY3J1bWJzJyk7XG4gICAgICAgICAgaWYgKGJjRWxlbS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcignQnJlYWRjcnVtYnMgbm90IGZvdW5kJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGJjUGFydHMgPSBiY0VsZW0udGV4dCgpLnNwbGl0KCfCuycpO1xuICAgICAgICAgIGNvbnN0IHRpdGxlID0gYmNQYXJ0cy5sZW5ndGggPiAwID8gKGJjUGFydHNbYmNQYXJ0cy5sZW5ndGggLSAxXT8udHJpbSgpID8/ICcnKSA6ICcnO1xuXG4gICAgICAgICAgY29uc3QgZGVzY0Jsb2NrRWxlbSA9ICQoJ2Rpdi5kZXNjcmlwdGlvbi1ibG9jaycpO1xuICAgICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gZGVzY0Jsb2NrRWxlbS50ZXh0KCkudHJpbSgpO1xuXG4gICAgICAgICAgY29uc3QgcG9zdENvdW50TWF0Y2ggPSAkKCdkaXYuc3RhdGlzdGljcycpLnRleHQoKS5tYXRjaCgvKFxcZCspLyk7XG4gICAgICAgICAgY29uc3QgcG9zdENvdW50ID0gcG9zdENvdW50TWF0Y2g/LlsxXSA/IE51bWJlci5wYXJzZUludChwb3N0Q291bnRNYXRjaFsxXSwgMTApIDogMDtcblxuICAgICAgICAgIHRocmVhZHMucHVzaChcbiAgICAgICAgICAgIG5ldyBGb3J1bVRocmVhZCh7XG4gICAgICAgICAgICAgIHNpdGUsXG4gICAgICAgICAgICAgIGlkOiB0aHJlYWRJZCxcbiAgICAgICAgICAgICAgdGl0bGUsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICBjcmVhdGVkQnk6IG51bGwsXG4gICAgICAgICAgICAgIGNyZWF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgcG9zdENvdW50LFxuICAgICAgICAgICAgICBjYXRlZ29yeSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgRm9ydW1UaHJlYWRDb2xsZWN0aW9uKHNpdGUsIHRocmVhZHMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgdGhyZWFkczogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0ICogYXMgY2hlZXJpbyBmcm9tICdjaGVlcmlvJztcbmltcG9ydCB7IFJlcXVpcmVMb2dpbiB9IGZyb20gJy4uLy4uL2NvbW1vbi9kZWNvcmF0b3JzJztcbmltcG9ydCB7IExvZ2luUmVxdWlyZWRFcnJvciwgTm9FbGVtZW50RXJyb3IsIFVuZXhwZWN0ZWRFcnJvciB9IGZyb20gJy4uLy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgU2l0ZSB9IGZyb20gJy4uL3NpdGUnO1xuaW1wb3J0IHsgRm9ydW1UaHJlYWQsIEZvcnVtVGhyZWFkQ29sbGVjdGlvbiB9IGZyb20gJy4vZm9ydW0tdGhyZWFkJztcblxuLyoqXG4gKiBGb3J1bSBjYXRlZ29yeSBkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRm9ydW1DYXRlZ29yeURhdGEge1xuICBzaXRlOiBTaXRlO1xuICBpZDogbnVtYmVyO1xuICB0aXRsZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICB0aHJlYWRzQ291bnQ6IG51bWJlcjtcbiAgcG9zdHNDb3VudDogbnVtYmVyO1xufVxuXG4vKipcbiAqIEZvcnVtIGNhdGVnb3J5XG4gKi9cbmV4cG9ydCBjbGFzcyBGb3J1bUNhdGVnb3J5IHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG4gIHB1YmxpYyByZWFkb25seSBpZDogbnVtYmVyO1xuICBwdWJsaWMgcmVhZG9ubHkgdGl0bGU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSB0aHJlYWRzQ291bnQ6IG51bWJlcjtcbiAgcHVibGljIHJlYWRvbmx5IHBvc3RzQ291bnQ6IG51bWJlcjtcbiAgcHJpdmF0ZSBfdGhyZWFkczogRm9ydW1UaHJlYWRDb2xsZWN0aW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoZGF0YTogRm9ydW1DYXRlZ29yeURhdGEpIHtcbiAgICB0aGlzLnNpdGUgPSBkYXRhLnNpdGU7XG4gICAgdGhpcy5pZCA9IGRhdGEuaWQ7XG4gICAgdGhpcy50aXRsZSA9IGRhdGEudGl0bGU7XG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRhdGEuZGVzY3JpcHRpb247XG4gICAgdGhpcy50aHJlYWRzQ291bnQgPSBkYXRhLnRocmVhZHNDb3VudDtcbiAgICB0aGlzLnBvc3RzQ291bnQgPSBkYXRhLnBvc3RzQ291bnQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRocmVhZCBsaXN0XG4gICAqL1xuICBnZXRUaHJlYWRzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxGb3J1bVRocmVhZENvbGxlY3Rpb24+IHtcbiAgICBpZiAodGhpcy5fdGhyZWFkcyAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFByb21pc2UucmVzb2x2ZSh0aGlzLl90aHJlYWRzKSwgKGUpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoU3RyaW5nKGUpKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgRm9ydW1UaHJlYWRDb2xsZWN0aW9uLmFjcXVpcmVBbGxJbkNhdGVnb3J5KHRoaXMpO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdGhyZWFkcyA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RocmVhZHM7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHRocmVhZHM6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVsb2FkIHRocmVhZCBsaXN0XG4gICAqL1xuICByZWxvYWRUaHJlYWRzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxGb3J1bVRocmVhZENvbGxlY3Rpb24+IHtcbiAgICB0aGlzLl90aHJlYWRzID0gbnVsbDtcbiAgICByZXR1cm4gdGhpcy5nZXRUaHJlYWRzKCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRocmVhZFxuICAgKi9cbiAgQFJlcXVpcmVMb2dpblxuICBjcmVhdGVUaHJlYWQoXG4gICAgdGl0bGU6IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nLFxuICAgIHNvdXJjZTogc3RyaW5nXG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzxGb3J1bVRocmVhZD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnRW1wdHknLFxuICAgICAgICAgICAgYWN0aW9uOiAnRm9ydW1BY3Rpb24nLFxuICAgICAgICAgICAgZXZlbnQ6ICduZXdUaHJlYWQnLFxuICAgICAgICAgICAgY2F0ZWdvcnlfaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICB0aXRsZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgc291cmNlLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXJlc3BvbnNlIHx8IHR5cGVvZiByZXNwb25zZS50aHJlYWRJZCAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ1RocmVhZCBJRCBub3QgZm91bmQgaW4gcmVzcG9uc2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRocmVhZElkID0gcmVzcG9uc2UudGhyZWFkSWQgYXMgbnVtYmVyO1xuICAgICAgICBjb25zdCB0aHJlYWRSZXN1bHQgPSBhd2FpdCBGb3J1bVRocmVhZC5nZXRGcm9tSWQodGhpcy5zaXRlLCB0aHJlYWRJZCwgdGhpcyk7XG4gICAgICAgIGlmICh0aHJlYWRSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHRocmVhZFJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhyZWFkUmVzdWx0LnZhbHVlO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSB0aHJlYWQ6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYEZvcnVtQ2F0ZWdvcnkoaWQ9JHt0aGlzLmlkfSwgdGl0bGU9JHt0aGlzLnRpdGxlfSlgO1xuICB9XG59XG5cbi8qKlxuICogRm9ydW0gY2F0ZWdvcnkgY29sbGVjdGlvblxuICovXG5leHBvcnQgY2xhc3MgRm9ydW1DYXRlZ29yeUNvbGxlY3Rpb24gZXh0ZW5kcyBBcnJheTxGb3J1bUNhdGVnb3J5PiB7XG4gIHB1YmxpYyByZWFkb25seSBzaXRlOiBTaXRlO1xuXG4gIGNvbnN0cnVjdG9yKHNpdGU6IFNpdGUsIGNhdGVnb3JpZXM/OiBGb3J1bUNhdGVnb3J5W10pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuc2l0ZSA9IHNpdGU7XG4gICAgaWYgKGNhdGVnb3JpZXMpIHtcbiAgICAgIHRoaXMucHVzaCguLi5jYXRlZ29yaWVzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBieSBJRFxuICAgKi9cbiAgZmluZEJ5SWQoaWQ6IG51bWJlcik6IEZvcnVtQ2F0ZWdvcnkgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbmQoKGNhdGVnb3J5KSA9PiBjYXRlZ29yeS5pZCA9PT0gaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgY2F0ZWdvcmllcyBmb3IgYSBzaXRlXG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZUFsbChzaXRlOiBTaXRlKTogV2lraWRvdFJlc3VsdEFzeW5jPEZvcnVtQ2F0ZWdvcnlDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnZm9ydW0vRm9ydW1TdGFydE1vZHVsZScsXG4gICAgICAgICAgICBoaWRkZW46ICd0cnVlJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcblxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcignRW1wdHkgcmVzcG9uc2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJvZHkgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoYm9keSk7XG5cbiAgICAgICAgY29uc3QgY2F0ZWdvcmllczogRm9ydW1DYXRlZ29yeVtdID0gW107XG5cbiAgICAgICAgJCgndGFibGUgdHIuaGVhZH50cicpLmVhY2goKF9pLCByb3cpID0+IHtcbiAgICAgICAgICBjb25zdCAkcm93ID0gJChyb3cpO1xuICAgICAgICAgIGNvbnN0IG5hbWVFbGVtID0gJHJvdy5maW5kKCd0ZC5uYW1lJyk7XG4gICAgICAgICAgY29uc3QgbmFtZUxpbmtFbGVtID0gbmFtZUVsZW0uZmluZCgnYScpO1xuICAgICAgICAgIGNvbnN0IGhyZWYgPSBuYW1lTGlua0VsZW0uYXR0cignaHJlZicpID8/ICcnO1xuXG4gICAgICAgICAgY29uc3QgY2F0ZWdvcnlJZE1hdGNoID0gaHJlZi5tYXRjaCgvYy0oXFxkKykvKTtcbiAgICAgICAgICBpZiAoIWNhdGVnb3J5SWRNYXRjaD8uWzFdKSByZXR1cm47XG5cbiAgICAgICAgICBjb25zdCBjYXRlZ29yeUlkID0gTnVtYmVyLnBhcnNlSW50KGNhdGVnb3J5SWRNYXRjaFsxXSwgMTApO1xuICAgICAgICAgIGNvbnN0IHRpdGxlID0gbmFtZUxpbmtFbGVtLnRleHQoKS50cmltKCk7XG4gICAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSBuYW1lRWxlbS5maW5kKCdkaXYuZGVzY3JpcHRpb24nKS50ZXh0KCkudHJpbSgpO1xuICAgICAgICAgIGNvbnN0IHRocmVhZHNDb3VudCA9IE51bWJlci5wYXJzZUludCgkcm93LmZpbmQoJ3RkLnRocmVhZHMnKS50ZXh0KCkudHJpbSgpLCAxMCkgfHwgMDtcbiAgICAgICAgICBjb25zdCBwb3N0c0NvdW50ID0gTnVtYmVyLnBhcnNlSW50KCRyb3cuZmluZCgndGQucG9zdHMnKS50ZXh0KCkudHJpbSgpLCAxMCkgfHwgMDtcblxuICAgICAgICAgIGNhdGVnb3JpZXMucHVzaChcbiAgICAgICAgICAgIG5ldyBGb3J1bUNhdGVnb3J5KHtcbiAgICAgICAgICAgICAgc2l0ZSxcbiAgICAgICAgICAgICAgaWQ6IGNhdGVnb3J5SWQsXG4gICAgICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgdGhyZWFkc0NvdW50LFxuICAgICAgICAgICAgICBwb3N0c0NvdW50LFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gbmV3IEZvcnVtQ2F0ZWdvcnlDb2xsZWN0aW9uKHNpdGUsIGNhdGVnb3JpZXMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgY2F0ZWdvcmllczogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cbiIsCiAgICAiZXhwb3J0IHsgRm9ydW1DYXRlZ29yeSwgRm9ydW1DYXRlZ29yeUNvbGxlY3Rpb24sIHR5cGUgRm9ydW1DYXRlZ29yeURhdGEgfSBmcm9tICcuL2ZvcnVtLWNhdGVnb3J5JztcbmV4cG9ydCB7IEZvcnVtUG9zdCwgRm9ydW1Qb3N0Q29sbGVjdGlvbiwgdHlwZSBGb3J1bVBvc3REYXRhIH0gZnJvbSAnLi9mb3J1bS1wb3N0JztcbmV4cG9ydCB7XG4gIEZvcnVtUG9zdFJldmlzaW9uLFxuICBGb3J1bVBvc3RSZXZpc2lvbkNvbGxlY3Rpb24sXG4gIHR5cGUgRm9ydW1Qb3N0UmV2aXNpb25EYXRhLFxufSBmcm9tICcuL2ZvcnVtLXBvc3QtcmV2aXNpb24nO1xuZXhwb3J0IHsgRm9ydW1UaHJlYWQsIEZvcnVtVGhyZWFkQ29sbGVjdGlvbiwgdHlwZSBGb3J1bVRocmVhZERhdGEgfSBmcm9tICcuL2ZvcnVtLXRocmVhZCc7XG4iLAogICAgIi8vIENvbW1vblxuZXhwb3J0ICogZnJvbSAnLi9jb21tb24vZXJyb3JzJztcbmV4cG9ydCAqIGZyb20gJy4vY29tbW9uL2xvZ2dlcic7XG5leHBvcnQgKiBmcm9tICcuL2NvbW1vbi90eXBlcyc7XG5cbi8vIENvbm5lY3RvclxuZXhwb3J0ICogZnJvbSAnLi9jb25uZWN0b3InO1xuXG4vLyBNb2R1bGVcbmV4cG9ydCAqIGZyb20gJy4vbW9kdWxlJztcblxuLy8gVXRpbFxuZXhwb3J0ICogZnJvbSAnLi91dGlsJztcbiIsCiAgICAiaW1wb3J0IGt5LCB7IHR5cGUgS3lJbnN0YW5jZSB9IGZyb20gJ2t5JztcbmltcG9ydCBwTGltaXQsIHsgdHlwZSBMaW1pdEZ1bmN0aW9uIH0gZnJvbSAncC1saW1pdCc7XG5pbXBvcnQge1xuICBBTUNIdHRwRXJyb3IsXG4gIEZvcmJpZGRlbkVycm9yLFxuICBOb3RGb3VuZEV4Y2VwdGlvbixcbiAgUmVzcG9uc2VEYXRhRXJyb3IsXG4gIFVuZXhwZWN0ZWRFcnJvcixcbiAgV2lraWRvdEVycm9yLFxuICBXaWtpZG90U3RhdHVzRXJyb3IsXG59IGZyb20gJy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jLCB3ZEVyckFzeW5jLCB3ZE9rQXN5bmMgfSBmcm9tICcuLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgZmV0Y2hXaXRoUmV0cnkgfSBmcm9tICcuLi91dGlsL2h0dHAnO1xuaW1wb3J0IHtcbiAgdHlwZSBBTUNDb25maWcsXG4gIERFRkFVTFRfQU1DX0NPTkZJRyxcbiAgREVGQVVMVF9IVFRQX1NUQVRVU19DT0RFLFxuICBXSUtJRE9UX1RPS0VONyxcbn0gZnJvbSAnLi9hbWMtY29uZmlnJztcbmltcG9ydCB7IEFNQ0hlYWRlciB9IGZyb20gJy4vYW1jLWhlYWRlcic7XG5pbXBvcnQgeyB0eXBlIEFNQ1JlcXVlc3RCb2R5LCB0eXBlIEFNQ1Jlc3BvbnNlLCBhbWNSZXNwb25zZVNjaGVtYSB9IGZyb20gJy4vYW1jLXR5cGVzJztcblxuLyoqXG4gKiBNYXNrIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbiAoZm9yIGxvZ2dpbmcpXG4gKiBAcGFyYW0gYm9keSAtIFJlcXVlc3QgYm9keSB0byBtYXNrXG4gKiBAcmV0dXJucyBNYXNrZWQgYm9keVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFza1NlbnNpdGl2ZURhdGEoYm9keTogQU1DUmVxdWVzdEJvZHkpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGNvbnN0IG1hc2tlZCA9IHsgLi4uYm9keSB9O1xuICBjb25zdCBzZW5zaXRpdmVLZXlzID0gWydwYXNzd29yZCcsICdsb2dpbicsICdXSUtJRE9UX1NFU1NJT05fSUQnLCAnd2lraWRvdF90b2tlbjcnXTtcbiAgZm9yIChjb25zdCBrZXkgb2Ygc2Vuc2l0aXZlS2V5cykge1xuICAgIGlmIChrZXkgaW4gbWFza2VkKSB7XG4gICAgICBtYXNrZWRba2V5XSA9ICcqKipNQVNLRUQqKionO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbWFza2VkO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZSBleHBvbmVudGlhbCBiYWNrb2ZmIGludGVydmFsICh3aXRoIGppdHRlcilcbiAqIEBwYXJhbSByZXRyeUNvdW50IC0gQ3VycmVudCByZXRyeSBjb3VudCAoc3RhcnRzIGZyb20gMSlcbiAqIEBwYXJhbSBiYXNlSW50ZXJ2YWwgLSBCYXNlIGludGVydmFsIChtaWxsaXNlY29uZHMpXG4gKiBAcGFyYW0gYmFja29mZkZhY3RvciAtIEJhY2tvZmYgZmFjdG9yXG4gKiBAcGFyYW0gbWF4QmFja29mZiAtIE1heGltdW0gYmFja29mZiBpbnRlcnZhbCAobWlsbGlzZWNvbmRzKVxuICogQHJldHVybnMgQ2FsY3VsYXRlZCBiYWNrb2ZmIGludGVydmFsIChtaWxsaXNlY29uZHMpXG4gKi9cbmZ1bmN0aW9uIGNhbGN1bGF0ZUJhY2tvZmYoXG4gIHJldHJ5Q291bnQ6IG51bWJlcixcbiAgYmFzZUludGVydmFsOiBudW1iZXIsXG4gIGJhY2tvZmZGYWN0b3I6IG51bWJlcixcbiAgbWF4QmFja29mZjogbnVtYmVyXG4pOiBudW1iZXIge1xuICBjb25zdCBiYWNrb2ZmID0gYmFzZUludGVydmFsICogYmFja29mZkZhY3RvciAqKiAocmV0cnlDb3VudCAtIDEpO1xuICBjb25zdCBqaXR0ZXIgPSBNYXRoLnJhbmRvbSgpICogYmFja29mZiAqIDAuMTtcbiAgcmV0dXJuIE1hdGgubWluKGJhY2tvZmYgKyBqaXR0ZXIsIG1heEJhY2tvZmYpO1xufVxuXG4vKipcbiAqIFNsZWVwIGZvciBzcGVjaWZpZWQgZHVyYXRpb25cbiAqIEBwYXJhbSBtcyAtIER1cmF0aW9uIGluIG1pbGxpc2Vjb25kc1xuICovXG5mdW5jdGlvbiBzbGVlcChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xufVxuXG4vKipcbiAqIEFNQyByZXF1ZXN0IG9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBTUNSZXF1ZXN0T3B0aW9ucyB7XG4gIC8qKiBTaXRlIG5hbWUgKGRlZmF1bHQ6IHd3dykgKi9cbiAgc2l0ZU5hbWU/OiBzdHJpbmc7XG4gIC8qKiBTU0wgc3VwcG9ydCAoYXV0by1kZXRlY3RlZCBpZiBvbWl0dGVkKSAqL1xuICBzc2xTdXBwb3J0ZWQ/OiBib29sZWFuO1xuICAvKiogSW5jbHVkZSBlcnJvcnMgaW4gcmVzdWx0cyBpbnN0ZWFkIG9mIHRocm93aW5nIChkZWZhdWx0OiBmYWxzZSkgKi9cbiAgcmV0dXJuRXhjZXB0aW9ucz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQWpheCBNb2R1bGUgQ29ubmVjdG9yIGNsaWVudFxuICogTWFuYWdlcyByZXF1ZXN0cyB0byBXaWtpZG90IEFNQyBlbmRwb2ludFxuICovXG5leHBvcnQgY2xhc3MgQU1DQ2xpZW50IHtcbiAgLyoqIGt5IGluc3RhbmNlICovXG4gIHByaXZhdGUgcmVhZG9ubHkga3k6IEt5SW5zdGFuY2U7XG5cbiAgLyoqIENvbmN1cnJlbnQgcmVxdWVzdCBsaW1pdGVyICovXG4gIHByaXZhdGUgcmVhZG9ubHkgbGltaXQ6IExpbWl0RnVuY3Rpb247XG5cbiAgLyoqIEhlYWRlciBtYW5hZ2VyICovXG4gIHB1YmxpYyByZWFkb25seSBoZWFkZXI6IEFNQ0hlYWRlcjtcblxuICAvKiogQ29uZmlndXJhdGlvbiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29uZmlnOiBBTUNDb25maWc7XG5cbiAgLyoqIEJhc2UgZG9tYWluICovXG4gIHB1YmxpYyByZWFkb25seSBkb21haW46IHN0cmluZztcblxuICAvKiogU1NMIHN1cHBvcnQgc3RhdHVzIGNhY2hlICovXG4gIHByaXZhdGUgc3NsQ2FjaGU6IE1hcDxzdHJpbmcsIGJvb2xlYW4+ID0gbmV3IE1hcCgpO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gY29uZmlnIC0gQU1DIGNvbmZpZ3VyYXRpb24gKHVzZXMgZGVmYXVsdHMgaWYgb21pdHRlZClcbiAgICogQHBhcmFtIGRvbWFpbiAtIEJhc2UgZG9tYWluIChkZWZhdWx0OiB3aWtpZG90LmNvbSlcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogUGFydGlhbDxBTUNDb25maWc+ID0ge30sIGRvbWFpbiA9ICd3aWtpZG90LmNvbScpIHtcbiAgICB0aGlzLmNvbmZpZyA9IHsgLi4uREVGQVVMVF9BTUNfQ09ORklHLCAuLi5jb25maWcgfTtcbiAgICB0aGlzLmRvbWFpbiA9IGRvbWFpbjtcbiAgICB0aGlzLmhlYWRlciA9IG5ldyBBTUNIZWFkZXIoKTtcbiAgICB0aGlzLmxpbWl0ID0gcExpbWl0KHRoaXMuY29uZmlnLnNlbWFwaG9yZUxpbWl0KTtcblxuICAgIHRoaXMua3kgPSBreS5jcmVhdGUoe1xuICAgICAgdGltZW91dDogdGhpcy5jb25maWcudGltZW91dCxcbiAgICAgIHJldHJ5OiAwLCAvLyBNYW51YWwgcmV0cnkgY29udHJvbFxuICAgIH0pO1xuXG4gICAgLy8gd3d3IGFsd2F5cyBzdXBwb3J0cyBTU0xcbiAgICB0aGlzLnNzbENhY2hlLnNldCgnd3d3JywgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgc2l0ZSBleGlzdGVuY2UgYW5kIFNTTCBzdXBwb3J0IHN0YXR1c1xuICAgKiBAcGFyYW0gc2l0ZU5hbWUgLSBTaXRlIG5hbWVcbiAgICogQHJldHVybnMgU1NMIHN1cHBvcnQgc3RhdHVzICh0cnVlOiBIVFRQUywgZmFsc2U6IEhUVFApXG4gICAqL1xuICBjaGVja1NpdGVTU0woc2l0ZU5hbWU6IHN0cmluZyk6IFdpa2lkb3RSZXN1bHRBc3luYzxib29sZWFuPiB7XG4gICAgLy8gUmV0dXJuIGNhY2hlZCB2YWx1ZSBpZiBleGlzdHNcbiAgICBjb25zdCBjYWNoZWQgPSB0aGlzLnNzbENhY2hlLmdldChzaXRlTmFtZSk7XG4gICAgaWYgKGNhY2hlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gd2RPa0FzeW5jKGNhY2hlZCk7XG4gICAgfVxuXG4gICAgLy8gd3d3IGFsd2F5cyBzdXBwb3J0cyBTU0xcbiAgICBpZiAoc2l0ZU5hbWUgPT09ICd3d3cnKSB7XG4gICAgICByZXR1cm4gd2RPa0FzeW5jKHRydWUpO1xuICAgIH1cblxuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hXaXRoUmV0cnkoYGh0dHA6Ly8ke3NpdGVOYW1lfS4ke3RoaXMuZG9tYWlufWAsIHRoaXMuY29uZmlnLCB7XG4gICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICByZWRpcmVjdDogJ21hbnVhbCcsXG4gICAgICAgICAgY2hlY2tPazogZmFsc2UsIC8vIERvbid0IHJldHJ5IG9uIEhUVFAgZXJyb3JzICgzMDEgaXMgZXhwZWN0ZWQpXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIDQwNCBtZWFucyBzaXRlIGRvZXMgbm90IGV4aXN0XG4gICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihgU2l0ZSBpcyBub3QgZm91bmQ6ICR7c2l0ZU5hbWV9LiR7dGhpcy5kb21haW59YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTU0wgc3VwcG9ydGVkIGlmIDMwMSByZWRpcmVjdCB0byBodHRwc1xuICAgICAgICBjb25zdCBpc1NTTCA9XG4gICAgICAgICAgcmVzcG9uc2Uuc3RhdHVzID09PSAzMDEgJiYgcmVzcG9uc2UuaGVhZGVycy5nZXQoJ0xvY2F0aW9uJyk/LnN0YXJ0c1dpdGgoJ2h0dHBzJykgPT09IHRydWU7XG5cbiAgICAgICAgLy8gU2F2ZSB0byBjYWNoZVxuICAgICAgICB0aGlzLnNzbENhY2hlLnNldChzaXRlTmFtZSwgaXNTU0wpO1xuICAgICAgICByZXR1cm4gaXNTU0w7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFdpa2lkb3RFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGNoZWNrIFNTTCBmb3IgJHtzaXRlTmFtZX06ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgQU1DIHJlcXVlc3RcbiAgICogQHBhcmFtIGJvZGllcyAtIFJlcXVlc3QgYm9keSBhcnJheVxuICAgKiBAcGFyYW0gc2l0ZU5hbWUgLSBTaXRlIG5hbWUgKGRlZmF1bHQ6IHd3dylcbiAgICogQHBhcmFtIHNzbFN1cHBvcnRlZCAtIFNTTCBzdXBwb3J0IChhdXRvLWRldGVjdGVkIGlmIG9taXR0ZWQpXG4gICAqIEByZXR1cm5zIFJlc3BvbnNlIGFycmF5XG4gICAqL1xuICByZXF1ZXN0KFxuICAgIGJvZGllczogQU1DUmVxdWVzdEJvZHlbXSxcbiAgICBzaXRlTmFtZSA9ICd3d3cnLFxuICAgIHNzbFN1cHBvcnRlZD86IGJvb2xlYW5cbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPEFNQ1Jlc3BvbnNlW10+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0V2l0aE9wdGlvbnMoYm9kaWVzLCB7XG4gICAgICBzaXRlTmFtZSxcbiAgICAgIHNzbFN1cHBvcnRlZCxcbiAgICAgIHJldHVybkV4Y2VwdGlvbnM6IGZhbHNlLFxuICAgIH0pIGFzIFdpa2lkb3RSZXN1bHRBc3luYzxBTUNSZXNwb25zZVtdPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIEFNQyByZXF1ZXN0ICh3aXRoIG9wdGlvbnMpXG4gICAqIEBwYXJhbSBib2RpZXMgLSBSZXF1ZXN0IGJvZHkgYXJyYXlcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBSZXF1ZXN0IG9wdGlvbnNcbiAgICogQHJldHVybnMgUmVzcG9uc2UgYXJyYXkgKGluY2x1ZGVzIGVycm9ycyBpZiByZXR1cm5FeGNlcHRpb25zIGlzIHRydWUpXG4gICAqL1xuICByZXF1ZXN0V2l0aE9wdGlvbnMoXG4gICAgYm9kaWVzOiBBTUNSZXF1ZXN0Qm9keVtdLFxuICAgIG9wdGlvbnM6IEFNQ1JlcXVlc3RPcHRpb25zID0ge31cbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPChBTUNSZXNwb25zZSB8IFdpa2lkb3RFcnJvcilbXT4ge1xuICAgIGNvbnN0IHsgc2l0ZU5hbWUgPSAnd3d3Jywgc3NsU3VwcG9ydGVkLCByZXR1cm5FeGNlcHRpb25zID0gZmFsc2UgfSA9IG9wdGlvbnM7XG5cbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyBHZXQgU1NMIHN1cHBvcnQgc3RhdHVzXG4gICAgICAgIGxldCBzc2wgPSBzc2xTdXBwb3J0ZWQ7XG4gICAgICAgIGlmIChzc2wgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IHNzbFJlc3VsdCA9IGF3YWl0IHRoaXMuY2hlY2tTaXRlU1NMKHNpdGVOYW1lKTtcbiAgICAgICAgICBpZiAoc3NsUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICAgIHRocm93IHNzbFJlc3VsdC5lcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3NsID0gc3NsUmVzdWx0LnZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJvdG9jb2wgPSBzc2wgPyAnaHR0cHMnIDogJ2h0dHAnO1xuICAgICAgICBjb25zdCB1cmwgPSBgJHtwcm90b2NvbH06Ly8ke3NpdGVOYW1lfS4ke3RoaXMuZG9tYWlufS9hamF4LW1vZHVsZS1jb25uZWN0b3IucGhwYDtcblxuICAgICAgICAvLyBFeGVjdXRlIHJlcXVlc3RzIGluIHBhcmFsbGVsXG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICBib2RpZXMubWFwKChib2R5KSA9PiB0aGlzLmxpbWl0KCgpID0+IHRoaXMuc2luZ2xlUmVxdWVzdChib2R5LCB1cmwpKSlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAocmV0dXJuRXhjZXB0aW9ucykge1xuICAgICAgICAgIC8vIFJldHVybiBhbGwgcmVzdWx0cyBpbmNsdWRpbmcgZXJyb3JzXG4gICAgICAgICAgcmV0dXJuIHJlc3VsdHMubWFwKChyKSA9PiB7XG4gICAgICAgICAgICBpZiAoci5pc09rKCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHIudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gci5lcnJvcjtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRocm93IGZpcnN0IGVycm9yIGlmIGFueVxuICAgICAgICBjb25zdCBmaXJzdEVycm9yID0gcmVzdWx0cy5maW5kKChyKSA9PiByLmlzRXJyKCkpO1xuICAgICAgICBpZiAoZmlyc3RFcnJvcj8uaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IGZpcnN0RXJyb3IuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0cy5tYXAoKHIpID0+IHtcbiAgICAgICAgICBpZiAoci5pc09rKCkpIHtcbiAgICAgICAgICAgIHJldHVybiByLnZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEVycm9yKCdVbmV4cGVjdGVkIGVycm9yIGluIHJlc3VsdCBwcm9jZXNzaW5nJyk7XG4gICAgICAgIH0pO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBXaWtpZG90RXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEFNQyByZXF1ZXN0IGZhaWxlZDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSW50ZXJuYWwgbWV0aG9kIHRvIGV4ZWN1dGUgYSBzaW5nbGUgcmVxdWVzdFxuICAgKiBAcGFyYW0gYm9keSAtIFJlcXVlc3QgYm9keVxuICAgKiBAcGFyYW0gdXJsIC0gUmVxdWVzdCBVUkxcbiAgICogQHJldHVybnMgUmVzcG9uc2VcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2luZ2xlUmVxdWVzdChcbiAgICBib2R5OiBBTUNSZXF1ZXN0Qm9keSxcbiAgICB1cmw6IHN0cmluZ1xuICApOiBQcm9taXNlPFdpa2lkb3RSZXN1bHRBc3luYzxBTUNSZXNwb25zZT4+IHtcbiAgICBsZXQgcmV0cnlDb3VudCA9IDA7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gQWRkIHdpa2lkb3RfdG9rZW43XG4gICAgICAgIGNvbnN0IHJlcXVlc3RCb2R5ID0geyAuLi5ib2R5LCB3aWtpZG90X3Rva2VuNzogV0lLSURPVF9UT0tFTjcgfTtcblxuICAgICAgICAvLyBDcmVhdGUgVVJMLWVuY29kZWQgYm9keVxuICAgICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmVxdWVzdEJvZHkpKSB7XG4gICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIFN0cmluZyh2YWx1ZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5reS5wb3N0KHVybCwge1xuICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVyLmdldEhlYWRlcnMoKSxcbiAgICAgICAgICBib2R5OiBmb3JtRGF0YS50b1N0cmluZygpLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBQYXJzZSBhcyBKU09OXG4gICAgICAgIGxldCByZXNwb25zZURhdGE6IHVua25vd247XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlVGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXNwb25zZURhdGEgPSBKU09OLnBhcnNlKHJlc3BvbnNlVGV4dCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIFJldHJ5IG9uIEpTT04gcGFyc2UgZXJyb3IgKGUuZy4sIGVtcHR5IHJlc3BvbnNlKVxuICAgICAgICAgIHJldHJ5Q291bnQrKztcbiAgICAgICAgICBpZiAocmV0cnlDb3VudCA+PSB0aGlzLmNvbmZpZy5yZXRyeUxpbWl0KSB7XG4gICAgICAgICAgICByZXR1cm4gd2RFcnJBc3luYyhcbiAgICAgICAgICAgICAgbmV3IFJlc3BvbnNlRGF0YUVycm9yKGBBTUMgcmVzcG9uZGVkIHdpdGggbm9uLUpTT04gZGF0YTogJHtyZXNwb25zZVRleHR9YClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGJhY2tvZmYgPSBjYWxjdWxhdGVCYWNrb2ZmKFxuICAgICAgICAgICAgcmV0cnlDb3VudCxcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLnJldHJ5SW50ZXJ2YWwsXG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5iYWNrb2ZmRmFjdG9yLFxuICAgICAgICAgICAgdGhpcy5jb25maWcubWF4QmFja29mZlxuICAgICAgICAgICk7XG4gICAgICAgICAgYXdhaXQgc2xlZXAoYmFja29mZik7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWYWxpZGF0ZSB3aXRoIHpvZFxuICAgICAgICBjb25zdCBwYXJzZVJlc3VsdCA9IGFtY1Jlc3BvbnNlU2NoZW1hLnNhZmVQYXJzZShyZXNwb25zZURhdGEpO1xuICAgICAgICBpZiAoIXBhcnNlUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICByZXR1cm4gd2RFcnJBc3luYyhcbiAgICAgICAgICAgIG5ldyBSZXNwb25zZURhdGFFcnJvcihgSW52YWxpZCBBTUMgcmVzcG9uc2UgZm9ybWF0OiAke3BhcnNlUmVzdWx0LmVycm9yLm1lc3NhZ2V9YClcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYW1jUmVzcG9uc2UgPSBwYXJzZVJlc3VsdC5kYXRhO1xuXG4gICAgICAgIC8vIFJldHJ5IGlmIHRyeV9hZ2FpblxuICAgICAgICBpZiAoYW1jUmVzcG9uc2Uuc3RhdHVzID09PSAndHJ5X2FnYWluJykge1xuICAgICAgICAgIHJldHJ5Q291bnQrKztcbiAgICAgICAgICBpZiAocmV0cnlDb3VudCA+PSB0aGlzLmNvbmZpZy5yZXRyeUxpbWl0KSB7XG4gICAgICAgICAgICByZXR1cm4gd2RFcnJBc3luYyhuZXcgV2lraWRvdFN0YXR1c0Vycm9yKCdBTUMgcmVzcG9uZGVkIHdpdGggdHJ5X2FnYWluJywgJ3RyeV9hZ2FpbicpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgYmFja29mZiA9IGNhbGN1bGF0ZUJhY2tvZmYoXG4gICAgICAgICAgICByZXRyeUNvdW50LFxuICAgICAgICAgICAgdGhpcy5jb25maWcucmV0cnlJbnRlcnZhbCxcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLmJhY2tvZmZGYWN0b3IsXG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5tYXhCYWNrb2ZmXG4gICAgICAgICAgKTtcbiAgICAgICAgICBhd2FpdCBzbGVlcChiYWNrb2ZmKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZvcmJpZGRlbkVycm9yIGlmIG5vX3Blcm1pc3Npb25cbiAgICAgICAgaWYgKGFtY1Jlc3BvbnNlLnN0YXR1cyA9PT0gJ25vX3Blcm1pc3Npb24nKSB7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0U3RyID0gYm9keS5tb2R1bGVOYW1lXG4gICAgICAgICAgICA/IGBtb2R1bGVOYW1lOiAke2JvZHkubW9kdWxlTmFtZX1gXG4gICAgICAgICAgICA6IGJvZHkuYWN0aW9uXG4gICAgICAgICAgICAgID8gYGFjdGlvbjogJHtib2R5LmFjdGlvbn0vJHtib2R5LmV2ZW50ID8/ICcnfWBcbiAgICAgICAgICAgICAgOiAndW5rbm93bic7XG4gICAgICAgICAgcmV0dXJuIHdkRXJyQXN5bmMoXG4gICAgICAgICAgICBuZXcgRm9yYmlkZGVuRXJyb3IoXG4gICAgICAgICAgICAgIGBZb3VyIGFjY291bnQgaGFzIG5vIHBlcm1pc3Npb24gdG8gcGVyZm9ybSB0aGlzIGFjdGlvbjogJHt0YXJnZXRTdHJ9YFxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFcnJvciBpZiBzdGF0dXMgaXMgbm90IG9rXG4gICAgICAgIGlmIChhbWNSZXNwb25zZS5zdGF0dXMgIT09ICdvaycpIHtcbiAgICAgICAgICByZXR1cm4gd2RFcnJBc3luYyhcbiAgICAgICAgICAgIG5ldyBXaWtpZG90U3RhdHVzRXJyb3IoXG4gICAgICAgICAgICAgIGBBTUMgcmVzcG9uZGVkIHdpdGggZXJyb3Igc3RhdHVzOiBcIiR7YW1jUmVzcG9uc2Uuc3RhdHVzfVwiYCxcbiAgICAgICAgICAgICAgYW1jUmVzcG9uc2Uuc3RhdHVzXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB3ZE9rQXN5bmMoYW1jUmVzcG9uc2UpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gUmV0cnkgb24gYWxsIGVycm9ycyAoSFRUUCBlcnJvcnMsIG5ldHdvcmsgZXJyb3JzLCB0aW1lb3V0cywgZXRjLilcbiAgICAgICAgLy8gV2lraWRvdCBzZXJ2ZXIgaGFzIGEgcmVsYXRpdmVseSBoaWdoIGVycm9yIHJhdGUsIHNvIHJldHJ5IGlzIGVzc2VudGlhbFxuICAgICAgICByZXRyeUNvdW50Kys7XG4gICAgICAgIGlmIChyZXRyeUNvdW50ID49IHRoaXMuY29uZmlnLnJldHJ5TGltaXQpIHtcbiAgICAgICAgICBjb25zdCBzdGF0dXNDb2RlID1cbiAgICAgICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgJ3Jlc3BvbnNlJyBpbiBlcnJvclxuICAgICAgICAgICAgICA/ICgoZXJyb3IgYXMgeyByZXNwb25zZT86IHsgc3RhdHVzPzogbnVtYmVyIH0gfSkucmVzcG9uc2U/LnN0YXR1cyA/P1xuICAgICAgICAgICAgICAgIERFRkFVTFRfSFRUUF9TVEFUVVNfQ09ERSlcbiAgICAgICAgICAgICAgOiBERUZBVUxUX0hUVFBfU1RBVFVTX0NPREU7XG4gICAgICAgICAgcmV0dXJuIHdkRXJyQXN5bmMobmV3IEFNQ0h0dHBFcnJvcihgQU1DIHJlcXVlc3QgZmFpbGVkOiAke1N0cmluZyhlcnJvcil9YCwgc3RhdHVzQ29kZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYmFja29mZiA9IGNhbGN1bGF0ZUJhY2tvZmYoXG4gICAgICAgICAgcmV0cnlDb3VudCxcbiAgICAgICAgICB0aGlzLmNvbmZpZy5yZXRyeUludGVydmFsLFxuICAgICAgICAgIHRoaXMuY29uZmlnLmJhY2tvZmZGYWN0b3IsXG4gICAgICAgICAgdGhpcy5jb25maWcubWF4QmFja29mZlxuICAgICAgICApO1xuICAgICAgICBhd2FpdCBzbGVlcChiYWNrb2ZmKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsCiAgICAiLyoqXG4gKiBDbGFzcyBmb3IgbWFuYWdpbmcgQU1DIHJlcXVlc3QgaGVhZGVyc1xuICovXG5leHBvcnQgY2xhc3MgQU1DSGVhZGVyIHtcbiAgcHJpdmF0ZSBjb29raWVzOiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xuICBwcml2YXRlIGNvbnRlbnRUeXBlOiBzdHJpbmc7XG4gIHByaXZhdGUgdXNlckFnZW50OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVmZXJlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIEhlYWRlciBpbml0aWFsaXphdGlvbiBvcHRpb25zXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRpb25zPzogeyBjb250ZW50VHlwZT86IHN0cmluZzsgdXNlckFnZW50Pzogc3RyaW5nOyByZWZlcmVyPzogc3RyaW5nIH0pIHtcbiAgICB0aGlzLmNvbnRlbnRUeXBlID0gb3B0aW9ucz8uY29udGVudFR5cGUgPz8gJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCc7XG4gICAgdGhpcy51c2VyQWdlbnQgPSBvcHRpb25zPy51c2VyQWdlbnQgPz8gJ1dpa2lkb3RUUyc7XG4gICAgdGhpcy5yZWZlcmVyID0gb3B0aW9ucz8ucmVmZXJlciA/PyAnaHR0cHM6Ly93d3cud2lraWRvdC5jb20vJztcbiAgICB0aGlzLmNvb2tpZXMgPSBuZXcgTWFwKFtbJ3dpa2lkb3RfdG9rZW43JywgJzEyMzQ1NiddXSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgY29va2llXG4gICAqIEBwYXJhbSBuYW1lIC0gQ29va2llIG5hbWVcbiAgICogQHBhcmFtIHZhbHVlIC0gQ29va2llIHZhbHVlXG4gICAqL1xuICBzZXRDb29raWUobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5jb29raWVzLnNldChuYW1lLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGEgY29va2llXG4gICAqIEBwYXJhbSBuYW1lIC0gQ29va2llIG5hbWVcbiAgICovXG4gIGRlbGV0ZUNvb2tpZShuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmNvb2tpZXMuZGVsZXRlKG5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIGNvb2tpZVxuICAgKiBAcGFyYW0gbmFtZSAtIENvb2tpZSBuYW1lXG4gICAqIEByZXR1cm5zIENvb2tpZSB2YWx1ZSwgdW5kZWZpbmVkIGlmIG5vdCBleGlzdHNcbiAgICovXG4gIGdldENvb2tpZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmNvb2tpZXMuZ2V0KG5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBIVFRQIGhlYWRlcnMgb2JqZWN0XG4gICAqIEByZXR1cm5zIEhlYWRlcnMgZGljdGlvbmFyeVxuICAgKi9cbiAgZ2V0SGVhZGVycygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICBjb25zdCBjb29raWVTdHJpbmcgPSBBcnJheS5mcm9tKHRoaXMuY29va2llcy5lbnRyaWVzKCkpXG4gICAgICAubWFwKChbbmFtZSwgdmFsdWVdKSA9PiBgJHtuYW1lfT0ke3ZhbHVlfWApXG4gICAgICAuam9pbignOyAnKTtcblxuICAgIHJldHVybiB7XG4gICAgICAnQ29udGVudC1UeXBlJzogdGhpcy5jb250ZW50VHlwZSxcbiAgICAgICdVc2VyLUFnZW50JzogdGhpcy51c2VyQWdlbnQsXG4gICAgICBSZWZlcmVyOiB0aGlzLnJlZmVyZXIsXG4gICAgICBDb29raWU6IGNvb2tpZVN0cmluZyxcbiAgICB9O1xuICB9XG59XG4iLAogICAgImltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuXG4vKipcbiAqIEFNQyByZXF1ZXN0IGJvZHkgdmFsdWUgdHlwZVxuICovXG5leHBvcnQgdHlwZSBBTUNSZXF1ZXN0Qm9keVZhbHVlID1cbiAgfCBzdHJpbmdcbiAgfCBudW1iZXJcbiAgfCBib29sZWFuXG4gIHwgbnVsbFxuICB8IHVuZGVmaW5lZFxuICB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIHwgQU1DUmVxdWVzdEJvZHlWYWx1ZVtdO1xuXG4vKipcbiAqIEFNQyByZXF1ZXN0IGJvZHkgdHlwZSBkZWZpbml0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQU1DUmVxdWVzdEJvZHkge1xuICBtb2R1bGVOYW1lPzogc3RyaW5nO1xuICBhY3Rpb24/OiBzdHJpbmc7XG4gIGV2ZW50Pzogc3RyaW5nO1xuICBba2V5OiBzdHJpbmddOiBBTUNSZXF1ZXN0Qm9keVZhbHVlO1xufVxuXG4vKipcbiAqIEFNQyByZXNwb25zZSBiYXNlIHNjaGVtYVxuICovXG5jb25zdCBiYXNlU2NoZW1hOiB6LlpvZE9iamVjdDx7XG4gIHN0YXR1czogei5ab2RTdHJpbmc7XG4gIGJvZHk6IHouWm9kT3B0aW9uYWw8ei5ab2RTdHJpbmc+O1xuICBtZXNzYWdlOiB6LlpvZE9wdGlvbmFsPHouWm9kU3RyaW5nPjtcbn0+ID0gei5vYmplY3Qoe1xuICBzdGF0dXM6IHouc3RyaW5nKCksXG4gIGJvZHk6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgbWVzc2FnZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxufSk7XG5cbi8qKlxuICogQU1DIHJlc3BvbnNlIHNjaGVtYVxuICovXG5leHBvcnQgY29uc3QgYW1jUmVzcG9uc2VTY2hlbWE6IHouWm9kVHlwZTx6LmluZmVyPHR5cGVvZiBiYXNlU2NoZW1hPiAmIFJlY29yZDxzdHJpbmcsIHVua25vd24+PiA9XG4gIGJhc2VTY2hlbWEucGFzc3Rocm91Z2goKTtcblxuLyoqXG4gKiBBTUMgcmVzcG9uc2UgdHlwZVxuICovXG5leHBvcnQgdHlwZSBBTUNSZXNwb25zZSA9IHouaW5mZXI8dHlwZW9mIGFtY1Jlc3BvbnNlU2NoZW1hPjtcblxuLyoqXG4gKiBTdWNjZXNzZnVsIEFNQyByZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFNQ1N1Y2Nlc3NSZXNwb25zZSB7XG4gIHN0YXR1czogJ29rJztcbiAgYm9keTogc3RyaW5nO1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgQU1DIHJlc3BvbnNlIGlzIHN1Y2Nlc3NmdWxcbiAqIEBwYXJhbSByZXNwb25zZSAtIEFNQyByZXNwb25zZVxuICogQHJldHVybnMgdHJ1ZSBpZiByZXNwb25zZSBpcyBzdWNjZXNzZnVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1N1Y2Nlc3NSZXNwb25zZShyZXNwb25zZTogQU1DUmVzcG9uc2UpOiByZXNwb25zZSBpcyBBTUNTdWNjZXNzUmVzcG9uc2Uge1xuICByZXR1cm4gcmVzcG9uc2Uuc3RhdHVzID09PSAnb2snO1xufVxuIiwKICAgICJleHBvcnQgeyBBTUNDbGllbnQsIHR5cGUgQU1DUmVxdWVzdE9wdGlvbnMsIG1hc2tTZW5zaXRpdmVEYXRhIH0gZnJvbSAnLi9hbWMtY2xpZW50JztcbmV4cG9ydCB7IHR5cGUgQU1DQ29uZmlnLCBERUZBVUxUX0FNQ19DT05GSUcgfSBmcm9tICcuL2FtYy1jb25maWcnO1xuZXhwb3J0IHsgQU1DSGVhZGVyIH0gZnJvbSAnLi9hbWMtaGVhZGVyJztcbmV4cG9ydCB7XG4gIHR5cGUgQU1DUmVxdWVzdEJvZHksXG4gIHR5cGUgQU1DUmVzcG9uc2UsXG4gIHR5cGUgQU1DU3VjY2Vzc1Jlc3BvbnNlLFxuICBhbWNSZXNwb25zZVNjaGVtYSxcbiAgaXNTdWNjZXNzUmVzcG9uc2UsXG59IGZyb20gJy4vYW1jLXR5cGVzJztcbmV4cG9ydCB7IGxvZ2luLCBsb2dvdXQgfSBmcm9tICcuL2F1dGgnO1xuIiwKICAgICJpbXBvcnQgeyBTZXNzaW9uQ3JlYXRlRXJyb3IgfSBmcm9tICcuLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYywgd2RPa0FzeW5jIH0gZnJvbSAnLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgQXV0aENsaWVudENvbnRleHQgfSBmcm9tICcuLi9tb2R1bGUvdHlwZXMnO1xuaW1wb3J0IHsgZmV0Y2hXaXRoUmV0cnkgfSBmcm9tICcuLi91dGlsL2h0dHAnO1xuaW1wb3J0IHsgREVGQVVMVF9BTUNfQ09ORklHIH0gZnJvbSAnLi9hbWMtY29uZmlnJztcblxuY29uc3QgTE9HSU5fVVJMID0gJ2h0dHBzOi8vd3d3Lndpa2lkb3QuY29tL2RlZmF1bHQtLWZsb3cvbG9naW5fX0xvZ2luUG9wdXBTY3JlZW4nO1xuXG4vKiogTG9naW4gcmV0cnkgbGltaXQgKHJlZHVjZWQgdG8gcHJldmVudCBhY2NvdW50IGxvY2tvdXQpICovXG5jb25zdCBMT0dJTl9SRVRSWV9MSU1JVCA9IDM7XG5cbi8qKlxuICogTG9naW4gdG8gV2lraWRvdCB3aXRoIHVzZXJuYW1lIGFuZCBwYXNzd29yZFxuICogQHBhcmFtIGNsaWVudCAtIENsaWVudCBjb250ZXh0IChvYmplY3Qgd2l0aCBBTUNDbGllbnQpXG4gKiBAcGFyYW0gdXNlcm5hbWUgLSBVc2VybmFtZVxuICogQHBhcmFtIHBhc3N3b3JkIC0gUGFzc3dvcmRcbiAqIEByZXR1cm5zIHZvaWQgb24gc3VjY2VzcywgU2Vzc2lvbkNyZWF0ZUVycm9yIG9uIGZhaWx1cmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvZ2luKFxuICBjbGllbnQ6IEF1dGhDbGllbnRDb250ZXh0LFxuICB1c2VybmFtZTogc3RyaW5nLFxuICBwYXNzd29yZDogc3RyaW5nXG4pOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7XG4gICAgICAgIGxvZ2luOiB1c2VybmFtZSxcbiAgICAgICAgcGFzc3dvcmQ6IHBhc3N3b3JkLFxuICAgICAgICBhY3Rpb246ICdMb2dpbjJBY3Rpb24nLFxuICAgICAgICBldmVudDogJ2xvZ2luJyxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBVc2UgcmVkdWNlZCByZXRyeSBsaW1pdCBmb3IgbG9naW4gdG8gcHJldmVudCBhY2NvdW50IGxvY2tvdXRcbiAgICAgIGNvbnN0IGxvZ2luQ29uZmlnID0ge1xuICAgICAgICAuLi5ERUZBVUxUX0FNQ19DT05GSUcsXG4gICAgICAgIHJldHJ5TGltaXQ6IExPR0lOX1JFVFJZX0xJTUlULFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hXaXRoUmV0cnkoTE9HSU5fVVJMLCBsb2dpbkNvbmZpZywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogY2xpZW50LmFtY0NsaWVudC5oZWFkZXIuZ2V0SGVhZGVycygpLFxuICAgICAgICBib2R5OiBmb3JtRGF0YS50b1N0cmluZygpLFxuICAgICAgICBjaGVja09rOiBmYWxzZSwgLy8gSGFuZGxlIEhUVFAgZXJyb3JzIG1hbnVhbGx5IGZvciBiZXR0ZXIgZXJyb3IgbWVzc2FnZXNcbiAgICAgIH0pO1xuXG4gICAgICAvLyBDaGVjayBzdGF0dXMgY29kZVxuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgU2Vzc2lvbkNyZWF0ZUVycm9yKFxuICAgICAgICAgIGBMb2dpbiBhdHRlbXB0IGZhaWxlZCBkdWUgdG8gSFRUUCBzdGF0dXMgY29kZTogJHtyZXNwb25zZS5zdGF0dXN9YFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBib2R5IGZvciBlcnJvciBtZXNzYWdlXG4gICAgICBjb25zdCBib2R5ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgaWYgKGJvZHkuaW5jbHVkZXMoJ1RoZSBsb2dpbiBhbmQgcGFzc3dvcmQgZG8gbm90IG1hdGNoJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlc3Npb25DcmVhdGVFcnJvcignTG9naW4gYXR0ZW1wdCBmYWlsZWQgZHVlIHRvIGludmFsaWQgdXNlcm5hbWUgb3IgcGFzc3dvcmQnKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgY29va2llc1xuICAgICAgY29uc3QgY29va2llcyA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdTZXQtQ29va2llJyk7XG4gICAgICBpZiAoIWNvb2tpZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlc3Npb25DcmVhdGVFcnJvcignTG9naW4gYXR0ZW1wdCBmYWlsZWQgZHVlIHRvIG1pc3NpbmcgY29va2llcycpO1xuICAgICAgfVxuXG4gICAgICAvLyBFeHRyYWN0IFdJS0lET1RfU0VTU0lPTl9JRCBmcm9tIGNvb2tpZXNcbiAgICAgIGNvbnN0IHNlc3Npb25JZE1hdGNoID0gY29va2llcy5tYXRjaCgvV0lLSURPVF9TRVNTSU9OX0lEPShbXjtdKykvKTtcbiAgICAgIGlmICghc2Vzc2lvbklkTWF0Y2g/LlsxXSkge1xuICAgICAgICB0aHJvdyBuZXcgU2Vzc2lvbkNyZWF0ZUVycm9yKFxuICAgICAgICAgICdMb2dpbiBhdHRlbXB0IGZhaWxlZCBkdWUgdG8gbWlzc2luZyBXSUtJRE9UX1NFU1NJT05fSUQgY29va2llJ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgc2Vzc2lvbiBjb29raWVcbiAgICAgIGNsaWVudC5hbWNDbGllbnQuaGVhZGVyLnNldENvb2tpZSgnV0lLSURPVF9TRVNTSU9OX0lEJywgc2Vzc2lvbklkTWF0Y2hbMV0pO1xuICAgIH0pKCksXG4gICAgKGVycm9yKSA9PiB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBTZXNzaW9uQ3JlYXRlRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBTZXNzaW9uQ3JlYXRlRXJyb3IoYExvZ2luIGZhaWxlZDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgIH1cbiAgKTtcbn1cblxuLyoqXG4gKiBMb2dvdXQgZnJvbSBXaWtpZG90XG4gKiBAcGFyYW0gY2xpZW50IC0gQ2xpZW50IGNvbnRleHQgKG9iamVjdCB3aXRoIEFNQ0NsaWVudClcbiAqIEByZXR1cm5zIHZvaWQgb24gc3VjY2Vzc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbG9nb3V0KGNsaWVudDogQXV0aENsaWVudENvbnRleHQpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAvLyBUcnkgdG8gbG9nb3V0IHZpYSBBTUMsIHRoZW4gYWx3YXlzIHJlbW92ZSBzZXNzaW9uIGNvb2tpZVxuICByZXR1cm4gY2xpZW50LmFtY0NsaWVudFxuICAgIC5yZXF1ZXN0KFtcbiAgICAgIHtcbiAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgYWN0aW9uOiAnTG9naW4yQWN0aW9uJyxcbiAgICAgICAgZXZlbnQ6ICdsb2dvdXQnLFxuICAgICAgfSxcbiAgICBdKVxuICAgIC5tYXAoKCkgPT4ge1xuICAgICAgLy8gTG9nb3V0IHN1Y2NlZWRlZCwgcmVtb3ZlIHNlc3Npb24gY29va2llXG4gICAgICBjbGllbnQuYW1jQ2xpZW50LmhlYWRlci5kZWxldGVDb29raWUoJ1dJS0lET1RfU0VTU0lPTl9JRCcpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9KVxuICAgIC5vckVsc2UoKCkgPT4ge1xuICAgICAgLy8gRXZlbiBpZiBsb2dvdXQgcmVxdWVzdCBmYWlscywgd2Ugc3RpbGwgd2FudCB0byBjbGVhciB0aGUgc2Vzc2lvbiBsb2NhbGx5XG4gICAgICBjbGllbnQuYW1jQ2xpZW50LmhlYWRlci5kZWxldGVDb29raWUoJ1dJS0lET1RfU0VTU0lPTl9JRCcpO1xuICAgICAgcmV0dXJuIHdkT2tBc3luYyh1bmRlZmluZWQpO1xuICAgIH0pO1xufVxuIiwKICAgICJpbXBvcnQgKiBhcyBjaGVlcmlvIGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0IHtcbiAgRm9yYmlkZGVuRXJyb3IsXG4gIExvZ2luUmVxdWlyZWRFcnJvcixcbiAgTm9FbGVtZW50RXJyb3IsXG4gIFVuZXhwZWN0ZWRFcnJvcixcbn0gZnJvbSAnLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgcGFyc2VPZGF0ZSwgcGFyc2VVc2VyIH0gZnJvbSAnLi4vLi4vdXRpbC9wYXJzZXInO1xuaW1wb3J0IHR5cGUgeyBDbGllbnQgfSBmcm9tICcuLi9jbGllbnQnO1xuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdFVzZXIgfSBmcm9tICcuLi91c2VyJztcbmltcG9ydCB0eXBlIHsgVXNlciB9IGZyb20gJy4uL3VzZXIvdXNlcic7XG5cbi8qKlxuICogUHJpdmF0ZSBtZXNzYWdlIGRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcml2YXRlTWVzc2FnZURhdGEge1xuICBjbGllbnQ6IENsaWVudDtcbiAgaWQ6IG51bWJlcjtcbiAgc2VuZGVyOiBBYnN0cmFjdFVzZXI7XG4gIHJlY2lwaWVudDogQWJzdHJhY3RVc2VyO1xuICBzdWJqZWN0OiBzdHJpbmc7XG4gIGJvZHk6IHN0cmluZztcbiAgY3JlYXRlZEF0OiBEYXRlO1xufVxuXG4vKipcbiAqIFByaXZhdGUgbWVzc2FnZVxuICovXG5leHBvcnQgY2xhc3MgUHJpdmF0ZU1lc3NhZ2Uge1xuICBwdWJsaWMgcmVhZG9ubHkgY2xpZW50OiBDbGllbnQ7XG4gIHB1YmxpYyByZWFkb25seSBpZDogbnVtYmVyO1xuICBwdWJsaWMgcmVhZG9ubHkgc2VuZGVyOiBBYnN0cmFjdFVzZXI7XG4gIHB1YmxpYyByZWFkb25seSByZWNpcGllbnQ6IEFic3RyYWN0VXNlcjtcbiAgcHVibGljIHJlYWRvbmx5IHN1YmplY3Q6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGJvZHk6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZWRBdDogRGF0ZTtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBQcml2YXRlTWVzc2FnZURhdGEpIHtcbiAgICB0aGlzLmNsaWVudCA9IGRhdGEuY2xpZW50O1xuICAgIHRoaXMuaWQgPSBkYXRhLmlkO1xuICAgIHRoaXMuc2VuZGVyID0gZGF0YS5zZW5kZXI7XG4gICAgdGhpcy5yZWNpcGllbnQgPSBkYXRhLnJlY2lwaWVudDtcbiAgICB0aGlzLnN1YmplY3QgPSBkYXRhLnN1YmplY3Q7XG4gICAgdGhpcy5ib2R5ID0gZGF0YS5ib2R5O1xuICAgIHRoaXMuY3JlYXRlZEF0ID0gZGF0YS5jcmVhdGVkQXQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IG1lc3NhZ2UgYnkgbWVzc2FnZSBJRFxuICAgKiBAcGFyYW0gY2xpZW50IC0gQ2xpZW50IGluc3RhbmNlXG4gICAqIEBwYXJhbSBtZXNzYWdlSWQgLSBNZXNzYWdlIElEXG4gICAqIEByZXR1cm5zIFByaXZhdGUgbWVzc2FnZVxuICAgKi9cbiAgc3RhdGljIGZyb21JZChjbGllbnQ6IENsaWVudCwgbWVzc2FnZUlkOiBudW1iZXIpOiBXaWtpZG90UmVzdWx0QXN5bmM8UHJpdmF0ZU1lc3NhZ2U+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24uZnJvbUlkcyhjbGllbnQsIFttZXNzYWdlSWRdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghbWVzc2FnZSkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcihgTWVzc2FnZSBub3QgZm91bmQ6ICR7bWVzc2FnZUlkfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBGb3JiaWRkZW5FcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IG1lc3NhZ2U6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgcHJpdmF0ZSBtZXNzYWdlXG4gICAqIEBwYXJhbSBjbGllbnQgLSBDbGllbnQgaW5zdGFuY2VcbiAgICogQHBhcmFtIHJlY2lwaWVudCAtIFJlY2lwaWVudFxuICAgKiBAcGFyYW0gc3ViamVjdCAtIFN1YmplY3RcbiAgICogQHBhcmFtIGJvZHkgLSBCb2R5XG4gICAqL1xuICBzdGF0aWMgc2VuZChcbiAgICBjbGllbnQ6IENsaWVudCxcbiAgICByZWNpcGllbnQ6IFVzZXIsXG4gICAgc3ViamVjdDogc3RyaW5nLFxuICAgIGJvZHk6IHN0cmluZ1xuICApOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIGNvbnN0IGxvZ2luUmVzdWx0ID0gY2xpZW50LnJlcXVpcmVMb2dpbigpO1xuICAgIGlmIChsb2dpblJlc3VsdC5pc0VycigpKSB7XG4gICAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAgIFByb21pc2UucmVqZWN0KGxvZ2luUmVzdWx0LmVycm9yKSxcbiAgICAgICAgKCkgPT4gbmV3IExvZ2luUmVxdWlyZWRFcnJvcignTG9naW4gcmVxdWlyZWQgdG8gc2VuZCBtZXNzYWdlJylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2xpZW50LmFtY0NsaWVudC5yZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzb3VyY2U6IGJvZHksXG4gICAgICAgICAgICBzdWJqZWN0LFxuICAgICAgICAgICAgdG9fdXNlcl9pZDogcmVjaXBpZW50LmlkLFxuICAgICAgICAgICAgYWN0aW9uOiAnRGFzaGJvYXJkTWVzc2FnZUFjdGlvbicsXG4gICAgICAgICAgICBldmVudDogJ3NlbmQnLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gc2VuZCBtZXNzYWdlOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFByaXZhdGVNZXNzYWdlKGlkPSR7dGhpcy5pZH0sIHNlbmRlcj0ke3RoaXMuc2VuZGVyfSwgcmVjaXBpZW50PSR7dGhpcy5yZWNpcGllbnR9LCBzdWJqZWN0PSR7dGhpcy5zdWJqZWN0fSlgO1xuICB9XG59XG5cbi8qKlxuICogUHJpdmF0ZSBtZXNzYWdlIGNvbGxlY3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFByaXZhdGVNZXNzYWdlQ29sbGVjdGlvbiBleHRlbmRzIEFycmF5PFByaXZhdGVNZXNzYWdlPiB7XG4gIHB1YmxpYyByZWFkb25seSBjbGllbnQ6IENsaWVudDtcblxuICBjb25zdHJ1Y3RvcihjbGllbnQ6IENsaWVudCwgbWVzc2FnZXM/OiBQcml2YXRlTWVzc2FnZVtdKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICBpZiAobWVzc2FnZXMpIHtcbiAgICAgIHRoaXMucHVzaCguLi5tZXNzYWdlcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYnkgSURcbiAgICovXG4gIGZpbmRCeUlkKGlkOiBudW1iZXIpOiBQcml2YXRlTWVzc2FnZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmluZCgobWVzc2FnZSkgPT4gbWVzc2FnZS5pZCA9PT0gaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBtZXNzYWdlcyBmcm9tIGxpc3Qgb2YgbWVzc2FnZSBJRHNcbiAgICovXG4gIHN0YXRpYyBmcm9tSWRzKFxuICAgIGNsaWVudDogQ2xpZW50LFxuICAgIG1lc3NhZ2VJZHM6IG51bWJlcltdXG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzxQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24+IHtcbiAgICBjb25zdCBsb2dpblJlc3VsdCA9IGNsaWVudC5yZXF1aXJlTG9naW4oKTtcbiAgICBpZiAobG9naW5SZXN1bHQuaXNFcnIoKSkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgICBQcm9taXNlLnJlamVjdChsb2dpblJlc3VsdC5lcnJvciksXG4gICAgICAgICgpID0+IG5ldyBMb2dpblJlcXVpcmVkRXJyb3IoJ0xvZ2luIHJlcXVpcmVkIHRvIGdldCBtZXNzYWdlcycpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJvZGllcyA9IG1lc3NhZ2VJZHMubWFwKChtZXNzYWdlSWQpID0+ICh7XG4gICAgICAgICAgaXRlbTogbWVzc2FnZUlkLFxuICAgICAgICAgIG1vZHVsZU5hbWU6ICdkYXNoYm9hcmQvbWVzc2FnZXMvRE1WaWV3TWVzc2FnZU1vZHVsZScsXG4gICAgICAgIH0pKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjbGllbnQuYW1jQ2xpZW50LnJlcXVlc3QoYm9kaWVzKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWVzc2FnZXM6IFByaXZhdGVNZXNzYWdlW10gPSBbXTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1lc3NhZ2VJZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVtpXTtcbiAgICAgICAgICBjb25zdCBtZXNzYWdlSWQgPSBtZXNzYWdlSWRzW2ldO1xuICAgICAgICAgIGlmICghcmVzcG9uc2UgfHwgbWVzc2FnZUlkID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY29uc3QgaHRtbCA9IFN0cmluZyhyZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGh0bWwpO1xuXG4gICAgICAgICAgLy8gR2V0IHVzZXIgaW5mb3JtYXRpb25cbiAgICAgICAgICBjb25zdCBwcmludHVzZXJFbGVtcyA9ICQoJ2Rpdi5wbWVzc2FnZSBkaXYuaGVhZGVyIHNwYW4ucHJpbnR1c2VyJyk7XG4gICAgICAgICAgaWYgKHByaW50dXNlckVsZW1zLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBGb3JiaWRkZW5FcnJvcihgRmFpbGVkIHRvIGdldCBtZXNzYWdlOiAke21lc3NhZ2VJZH1gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBzZW5kZXJFbGVtID0gJChwcmludHVzZXJFbGVtc1swXSk7XG4gICAgICAgICAgY29uc3QgcmVjaXBpZW50RWxlbSA9ICQocHJpbnR1c2VyRWxlbXNbMV0pO1xuXG4gICAgICAgICAgY29uc3Qgc2VuZGVyID0gcGFyc2VVc2VyKGNsaWVudCwgc2VuZGVyRWxlbSk7XG4gICAgICAgICAgY29uc3QgcmVjaXBpZW50ID0gcGFyc2VVc2VyKGNsaWVudCwgcmVjaXBpZW50RWxlbSk7XG5cbiAgICAgICAgICAvLyBTdWJqZWN0XG4gICAgICAgICAgY29uc3Qgc3ViamVjdEVsZW0gPSAkKCdkaXYucG1lc3NhZ2UgZGl2LmhlYWRlciBzcGFuLnN1YmplY3QnKTtcbiAgICAgICAgICBjb25zdCBzdWJqZWN0ID0gc3ViamVjdEVsZW0udGV4dCgpLnRyaW0oKTtcblxuICAgICAgICAgIC8vIEJvZHlcbiAgICAgICAgICBjb25zdCBib2R5RWxlbSA9ICQoJ2Rpdi5wbWVzc2FnZSBkaXYuYm9keScpO1xuICAgICAgICAgIGNvbnN0IGJvZHkgPSBib2R5RWxlbS50ZXh0KCkudHJpbSgpO1xuXG4gICAgICAgICAgLy8gVGltZXN0YW1wXG4gICAgICAgICAgY29uc3Qgb2RhdGVFbGVtID0gJCgnZGl2LmhlYWRlciBzcGFuLm9kYXRlJyk7XG4gICAgICAgICAgY29uc3QgY3JlYXRlZEF0ID1cbiAgICAgICAgICAgIG9kYXRlRWxlbS5sZW5ndGggPiAwID8gKHBhcnNlT2RhdGUob2RhdGVFbGVtKSA/PyBuZXcgRGF0ZSgwKSkgOiBuZXcgRGF0ZSgwKTtcblxuICAgICAgICAgIG1lc3NhZ2VzLnB1c2goXG4gICAgICAgICAgICBuZXcgUHJpdmF0ZU1lc3NhZ2Uoe1xuICAgICAgICAgICAgICBjbGllbnQsXG4gICAgICAgICAgICAgIGlkOiBtZXNzYWdlSWQsXG4gICAgICAgICAgICAgIHNlbmRlcixcbiAgICAgICAgICAgICAgcmVjaXBpZW50LFxuICAgICAgICAgICAgICBzdWJqZWN0LFxuICAgICAgICAgICAgICBib2R5LFxuICAgICAgICAgICAgICBjcmVhdGVkQXQsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IFByaXZhdGVNZXNzYWdlQ29sbGVjdGlvbihjbGllbnQsIG1lc3NhZ2VzKTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRm9yYmlkZGVuRXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBMb2dpblJlcXVpcmVkRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgbWVzc2FnZXM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVybmFsIG1ldGhvZCB0byBnZXQgbWVzc2FnZXMgZnJvbSBtb2R1bGVcbiAgICovXG4gIHByb3RlY3RlZCBzdGF0aWMgYWNxdWlyZUZyb21Nb2R1bGUoXG4gICAgY2xpZW50OiBDbGllbnQsXG4gICAgbW9kdWxlTmFtZTogc3RyaW5nXG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzxQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24+IHtcbiAgICBjb25zdCBsb2dpblJlc3VsdCA9IGNsaWVudC5yZXF1aXJlTG9naW4oKTtcbiAgICBpZiAobG9naW5SZXN1bHQuaXNFcnIoKSkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgICBQcm9taXNlLnJlamVjdChsb2dpblJlc3VsdC5lcnJvciksXG4gICAgICAgICgpID0+IG5ldyBMb2dpblJlcXVpcmVkRXJyb3IoJ0xvZ2luIHJlcXVpcmVkIHRvIGdldCBtZXNzYWdlcycpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIEdldCBwYWdlclxuICAgICAgICBjb25zdCBmaXJzdFJlc3VsdCA9IGF3YWl0IGNsaWVudC5hbWNDbGllbnQucmVxdWVzdChbeyBtb2R1bGVOYW1lIH1dKTtcbiAgICAgICAgaWYgKGZpcnN0UmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBmaXJzdFJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpcnN0UmVzcG9uc2UgPSBmaXJzdFJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFmaXJzdFJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdFbXB0eSByZXNwb25zZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlyc3RIdG1sID0gU3RyaW5nKGZpcnN0UmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgIGNvbnN0ICRmaXJzdCA9IGNoZWVyaW8ubG9hZChmaXJzdEh0bWwpO1xuXG4gICAgICAgIC8vIEdldCBwYWdlIGNvdW50XG4gICAgICAgIGNvbnN0IHBhZ2VyVGFyZ2V0cyA9ICRmaXJzdCgnZGl2LnBhZ2VyIHNwYW4udGFyZ2V0Jyk7XG4gICAgICAgIGxldCBtYXhQYWdlID0gMTtcbiAgICAgICAgaWYgKHBhZ2VyVGFyZ2V0cy5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgY29uc3QgbGFzdFBhZ2VUZXh0ID0gJGZpcnN0KHBhZ2VyVGFyZ2V0c1twYWdlclRhcmdldHMubGVuZ3RoIC0gMl0pXG4gICAgICAgICAgICAudGV4dCgpXG4gICAgICAgICAgICAudHJpbSgpO1xuICAgICAgICAgIG1heFBhZ2UgPSBOdW1iZXIucGFyc2VJbnQobGFzdFBhZ2VUZXh0LCAxMCkgfHwgMTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCBtZXNzYWdlIElEcyBmcm9tIGFsbCBwYWdlc1xuICAgICAgICBjb25zdCBtZXNzYWdlSWRzOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgICAgIGlmIChtYXhQYWdlID4gMSkge1xuICAgICAgICAgIGNvbnN0IGJvZGllcyA9IFtdO1xuICAgICAgICAgIGZvciAobGV0IHBhZ2UgPSAxOyBwYWdlIDw9IG1heFBhZ2U7IHBhZ2UrKykge1xuICAgICAgICAgICAgYm9kaWVzLnB1c2goeyBwYWdlLCBtb2R1bGVOYW1lIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBhZGRpdGlvbmFsUmVzdWx0cyA9IGF3YWl0IGNsaWVudC5hbWNDbGllbnQucmVxdWVzdChib2RpZXMpO1xuICAgICAgICAgIGlmIChhZGRpdGlvbmFsUmVzdWx0cy5pc0VycigpKSB7XG4gICAgICAgICAgICB0aHJvdyBhZGRpdGlvbmFsUmVzdWx0cy5lcnJvcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IHJlc3BvbnNlIG9mIGFkZGl0aW9uYWxSZXN1bHRzLnZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCBodG1sID0gU3RyaW5nKHJlc3BvbnNlPy5ib2R5ID8/ICcnKTtcbiAgICAgICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoaHRtbCk7XG4gICAgICAgICAgICAkKCd0ci5tZXNzYWdlJykuZWFjaCgoX2ksIGVsZW0pID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZGF0YUhyZWYgPSAkKGVsZW0pLmF0dHIoJ2RhdGEtaHJlZicpID8/ICcnO1xuICAgICAgICAgICAgICBjb25zdCBpZE1hdGNoID0gZGF0YUhyZWYubWF0Y2goL1xcLyhcXGQrKSQvKTtcbiAgICAgICAgICAgICAgaWYgKGlkTWF0Y2g/LlsxXSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VJZHMucHVzaChOdW1iZXIucGFyc2VJbnQoaWRNYXRjaFsxXSwgMTApKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICRmaXJzdCgndHIubWVzc2FnZScpLmVhY2goKF9pLCBlbGVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkYXRhSHJlZiA9ICRmaXJzdChlbGVtKS5hdHRyKCdkYXRhLWhyZWYnKSA/PyAnJztcbiAgICAgICAgICAgIGNvbnN0IGlkTWF0Y2ggPSBkYXRhSHJlZi5tYXRjaCgvXFwvKFxcZCspJC8pO1xuICAgICAgICAgICAgaWYgKGlkTWF0Y2g/LlsxXSkge1xuICAgICAgICAgICAgICBtZXNzYWdlSWRzLnB1c2goTnVtYmVyLnBhcnNlSW50KGlkTWF0Y2hbMV0sIDEwKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgbWVzc2FnZXNcbiAgICAgICAgY29uc3QgbWVzc2FnZXNSZXN1bHQgPSBhd2FpdCBQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24uZnJvbUlkcyhjbGllbnQsIG1lc3NhZ2VJZHMpO1xuICAgICAgICBpZiAobWVzc2FnZXNSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IG1lc3NhZ2VzUmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2VzUmVzdWx0LnZhbHVlO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBGb3JiaWRkZW5FcnJvciB8fFxuICAgICAgICAgIGVycm9yIGluc3RhbmNlb2YgTG9naW5SZXF1aXJlZEVycm9yIHx8XG4gICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvclxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBhY3F1aXJlIG1lc3NhZ2VzOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEluYm94XG4gKi9cbmV4cG9ydCBjbGFzcyBQcml2YXRlTWVzc2FnZUluYm94IGV4dGVuZHMgUHJpdmF0ZU1lc3NhZ2VDb2xsZWN0aW9uIHtcbiAgLyoqXG4gICAqIEdldCBhbGwgbWVzc2FnZXMgaW4gaW5ib3hcbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlKGNsaWVudDogQ2xpZW50KTogV2lraWRvdFJlc3VsdEFzeW5jPFByaXZhdGVNZXNzYWdlSW5ib3g+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24uYWNxdWlyZUZyb21Nb2R1bGUoXG4gICAgICAgICAgY2xpZW50LFxuICAgICAgICAgICdkYXNoYm9hcmQvbWVzc2FnZXMvRE1JbmJveE1vZHVsZSdcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGluYm94ID0gbmV3IFByaXZhdGVNZXNzYWdlSW5ib3goY2xpZW50KTtcbiAgICAgICAgaW5ib3gucHVzaCguLi5yZXN1bHQudmFsdWUpO1xuICAgICAgICByZXR1cm4gaW5ib3g7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEZvcmJpZGRlbkVycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgTG9naW5SZXF1aXJlZEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSBpbmJveDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBTZW50IGJveFxuICovXG5leHBvcnQgY2xhc3MgUHJpdmF0ZU1lc3NhZ2VTZW50Qm94IGV4dGVuZHMgUHJpdmF0ZU1lc3NhZ2VDb2xsZWN0aW9uIHtcbiAgLyoqXG4gICAqIEdldCBhbGwgbWVzc2FnZXMgaW4gc2VudCBib3hcbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlKGNsaWVudDogQ2xpZW50KTogV2lraWRvdFJlc3VsdEFzeW5jPFByaXZhdGVNZXNzYWdlU2VudEJveD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByaXZhdGVNZXNzYWdlQ29sbGVjdGlvbi5hY3F1aXJlRnJvbU1vZHVsZShcbiAgICAgICAgICBjbGllbnQsXG4gICAgICAgICAgJ2Rhc2hib2FyZC9tZXNzYWdlcy9ETVNlbnRNb2R1bGUnXG4gICAgICAgICk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZW50Qm94ID0gbmV3IFByaXZhdGVNZXNzYWdlU2VudEJveChjbGllbnQpO1xuICAgICAgICBzZW50Qm94LnB1c2goLi4ucmVzdWx0LnZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHNlbnRCb3g7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEZvcmJpZGRlbkVycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgTG9naW5SZXF1aXJlZEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSBzZW50IGJveDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHtcbiAgUHJpdmF0ZU1lc3NhZ2UsXG4gIFByaXZhdGVNZXNzYWdlQ29sbGVjdGlvbixcbiAgUHJpdmF0ZU1lc3NhZ2VJbmJveCxcbiAgUHJpdmF0ZU1lc3NhZ2VTZW50Qm94LFxufSBmcm9tICcuLi8uLi9wcml2YXRlLW1lc3NhZ2UnO1xuaW1wb3J0IHR5cGUgeyBVc2VyIH0gZnJvbSAnLi4vLi4vdXNlci91c2VyJztcbmltcG9ydCB0eXBlIHsgQ2xpZW50IH0gZnJvbSAnLi4vY2xpZW50JztcblxuLyoqXG4gKiBQcml2YXRlIG1lc3NhZ2Ugb3BlcmF0aW9ucyBhY2Nlc3NvclxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBHZXQgaW5ib3hcbiAqIGNvbnN0IGluYm94UmVzdWx0ID0gYXdhaXQgY2xpZW50LnByaXZhdGVNZXNzYWdlLmluYm94KCk7XG4gKiBpZiAoIWluYm94UmVzdWx0LmlzT2soKSkge1xuICogICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBnZXQgaW5ib3gnKTtcbiAqIH1cbiAqIGNvbnN0IGluYm94ID0gaW5ib3hSZXN1bHQudmFsdWU7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFByaXZhdGVNZXNzYWdlQWNjZXNzb3Ige1xuICBwdWJsaWMgcmVhZG9ubHkgY2xpZW50OiBDbGllbnQ7XG5cbiAgY29uc3RydWN0b3IoY2xpZW50OiBDbGllbnQpIHtcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbWVzc2FnZSBieSBtZXNzYWdlIElEXG4gICAqXG4gICAqIEBwYXJhbSBpZCAtIE1lc3NhZ2UgSURcbiAgICogQHJldHVybnMgTWVzc2FnZSBvYmplY3Qgd3JhcHBlZCBpbiBSZXN1bHQgdHlwZVxuICAgKi9cbiAgZ2V0KGlkOiBudW1iZXIpOiBXaWtpZG90UmVzdWx0QXN5bmM8UHJpdmF0ZU1lc3NhZ2U+IHtcbiAgICByZXR1cm4gUHJpdmF0ZU1lc3NhZ2UuZnJvbUlkKHRoaXMuY2xpZW50LCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IG1lc3NhZ2VzIGZyb20gbXVsdGlwbGUgbWVzc2FnZSBJRHNcbiAgICogQHBhcmFtIGlkcyAtIEFycmF5IG9mIG1lc3NhZ2UgSURzXG4gICAqIEByZXR1cm5zIE1lc3NhZ2UgY29sbGVjdGlvblxuICAgKi9cbiAgZ2V0TWVzc2FnZXMoaWRzOiBudW1iZXJbXSk6IFdpa2lkb3RSZXN1bHRBc3luYzxQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gUHJpdmF0ZU1lc3NhZ2VDb2xsZWN0aW9uLmZyb21JZHModGhpcy5jbGllbnQsIGlkcyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGluYm94IG1lc3NhZ2UgbGlzdFxuICAgKiBAcmV0dXJucyBJbmJveFxuICAgKi9cbiAgaW5ib3goKTogV2lraWRvdFJlc3VsdEFzeW5jPFByaXZhdGVNZXNzYWdlSW5ib3g+IHtcbiAgICByZXR1cm4gUHJpdmF0ZU1lc3NhZ2VJbmJveC5hY3F1aXJlKHRoaXMuY2xpZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc2VudCBib3ggbWVzc2FnZSBsaXN0XG4gICAqIEByZXR1cm5zIFNlbnQgYm94XG4gICAqL1xuICBzZW50Qm94KCk6IFdpa2lkb3RSZXN1bHRBc3luYzxQcml2YXRlTWVzc2FnZVNlbnRCb3g+IHtcbiAgICByZXR1cm4gUHJpdmF0ZU1lc3NhZ2VTZW50Qm94LmFjcXVpcmUodGhpcy5jbGllbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgYSBwcml2YXRlIG1lc3NhZ2VcbiAgICogQHBhcmFtIHJlY2lwaWVudCAtIFJlY2lwaWVudFxuICAgKiBAcGFyYW0gc3ViamVjdCAtIFN1YmplY3RcbiAgICogQHBhcmFtIGJvZHkgLSBCb2R5XG4gICAqL1xuICBzZW5kKHJlY2lwaWVudDogVXNlciwgc3ViamVjdDogc3RyaW5nLCBib2R5OiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiBQcml2YXRlTWVzc2FnZS5zZW5kKHRoaXMuY2xpZW50LCByZWNpcGllbnQsIHN1YmplY3QsIGJvZHkpO1xuICB9XG59XG5cbmV4cG9ydCB7IFByaXZhdGVNZXNzYWdlLCBQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24sIFByaXZhdGVNZXNzYWdlSW5ib3gsIFByaXZhdGVNZXNzYWdlU2VudEJveCB9O1xuIiwKICAgICJpbXBvcnQgdHlwZSB7IFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQge1xuICBGb3J1bUNhdGVnb3J5LFxuICBGb3J1bUNhdGVnb3J5Q29sbGVjdGlvbixcbiAgRm9ydW1Qb3N0LFxuICBGb3J1bVRocmVhZCxcbiAgRm9ydW1UaHJlYWRDb2xsZWN0aW9uLFxufSBmcm9tICcuLi8uLi9mb3J1bSc7XG5pbXBvcnQgdHlwZSB7IFNpdGUgfSBmcm9tICcuLi9zaXRlJztcblxuLyoqXG4gKiBGb3J1bSBvcGVyYXRpb25zIGFjY2Vzc29yXG4gKi9cbmV4cG9ydCBjbGFzcyBGb3J1bUFjY2Vzc29yIHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG5cbiAgY29uc3RydWN0b3Ioc2l0ZTogU2l0ZSkge1xuICAgIHRoaXMuc2l0ZSA9IHNpdGU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGZvcnVtIGNhdGVnb3J5IGxpc3RcbiAgICogQHJldHVybnMgQ2F0ZWdvcnkgbGlzdFxuICAgKi9cbiAgZ2V0Q2F0ZWdvcmllcygpOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1DYXRlZ29yeUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gRm9ydW1DYXRlZ29yeUNvbGxlY3Rpb24uYWNxdWlyZUFsbCh0aGlzLnNpdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aHJlYWRcbiAgICogQHBhcmFtIHRocmVhZElkIC0gVGhyZWFkIElEXG4gICAqIEByZXR1cm5zIFRocmVhZFxuICAgKi9cbiAgZ2V0VGhyZWFkKHRocmVhZElkOiBudW1iZXIpOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1UaHJlYWQ+IHtcbiAgICByZXR1cm4gRm9ydW1UaHJlYWQuZ2V0RnJvbUlkKHRoaXMuc2l0ZSwgdGhyZWFkSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBtdWx0aXBsZSB0aHJlYWRzXG4gICAqIEBwYXJhbSB0aHJlYWRJZHMgLSBBcnJheSBvZiB0aHJlYWQgSURzXG4gICAqIEByZXR1cm5zIFRocmVhZCBjb2xsZWN0aW9uXG4gICAqL1xuICBnZXRUaHJlYWRzKHRocmVhZElkczogbnVtYmVyW10pOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1UaHJlYWRDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIEZvcnVtVGhyZWFkQ29sbGVjdGlvbi5hY3F1aXJlRnJvbVRocmVhZElkcyh0aGlzLnNpdGUsIHRocmVhZElkcyk7XG4gIH1cbn1cblxuZXhwb3J0IHsgRm9ydW1DYXRlZ29yeSwgRm9ydW1DYXRlZ29yeUNvbGxlY3Rpb24sIEZvcnVtUG9zdCwgRm9ydW1UaHJlYWQsIEZvcnVtVGhyZWFkQ29sbGVjdGlvbiB9O1xuIiwKICAgICJpbXBvcnQgeyBSZXF1aXJlTG9naW4gfSBmcm9tICcuLi8uLi8uLi9jb21tb24vZGVjb3JhdG9ycyc7XG5pbXBvcnQge1xuICBMb2dpblJlcXVpcmVkRXJyb3IsXG4gIFRhcmdldEVycm9yLFxuICBVbmV4cGVjdGVkRXJyb3IsXG4gIFdpa2lkb3RTdGF0dXNFcnJvcixcbn0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgdHlwZSBRTUNVc2VyLCBRdWlja01vZHVsZSB9IGZyb20gJy4uLy4uLy4uL3V0aWwvcXVpY2stbW9kdWxlJztcbmltcG9ydCB0eXBlIHsgVXNlciB9IGZyb20gJy4uLy4uL3VzZXIvdXNlcic7XG5pbXBvcnQgdHlwZSB7IFNpdGUgfSBmcm9tICcuLi9zaXRlJztcbmltcG9ydCB7IFNpdGVBcHBsaWNhdGlvbiB9IGZyb20gJy4uL3NpdGUtYXBwbGljYXRpb24nO1xuaW1wb3J0IHsgU2l0ZU1lbWJlciB9IGZyb20gJy4uL3NpdGUtbWVtYmVyJztcblxuLyoqXG4gKiBTaXRlIG1lbWJlciBvcGVyYXRpb25zIGFjY2Vzc29yXG4gKi9cbmV4cG9ydCBjbGFzcyBNZW1iZXJBY2Nlc3NvciB7XG4gIHB1YmxpYyByZWFkb25seSBzaXRlOiBTaXRlO1xuXG4gIGNvbnN0cnVjdG9yKHNpdGU6IFNpdGUpIHtcbiAgICB0aGlzLnNpdGUgPSBzaXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgbWVtYmVyc1xuICAgKiBAcmV0dXJucyBNZW1iZXIgbGlzdFxuICAgKi9cbiAgZ2V0QWxsKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxTaXRlTWVtYmVyW10+IHtcbiAgICByZXR1cm4gU2l0ZU1lbWJlci5nZXRNZW1iZXJzKHRoaXMuc2l0ZSwgJycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBtb2RlcmF0b3IgbGlzdFxuICAgKiBAcmV0dXJucyBNb2RlcmF0b3IgbGlzdFxuICAgKi9cbiAgZ2V0TW9kZXJhdG9ycygpOiBXaWtpZG90UmVzdWx0QXN5bmM8U2l0ZU1lbWJlcltdPiB7XG4gICAgcmV0dXJuIFNpdGVNZW1iZXIuZ2V0TWVtYmVycyh0aGlzLnNpdGUsICdtb2RlcmF0b3JzJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFkbWluIGxpc3RcbiAgICogQHJldHVybnMgQWRtaW4gbGlzdFxuICAgKi9cbiAgZ2V0QWRtaW5zKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxTaXRlTWVtYmVyW10+IHtcbiAgICByZXR1cm4gU2l0ZU1lbWJlci5nZXRNZW1iZXJzKHRoaXMuc2l0ZSwgJ2FkbWlucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBwZW5kaW5nIG1lbWJlcnNoaXAgYXBwbGljYXRpb25zXG4gICAqIEByZXR1cm5zIEFwcGxpY2F0aW9uIGxpc3RcbiAgICovXG4gIGdldEFwcGxpY2F0aW9ucygpOiBXaWtpZG90UmVzdWx0QXN5bmM8U2l0ZUFwcGxpY2F0aW9uW10+IHtcbiAgICByZXR1cm4gU2l0ZUFwcGxpY2F0aW9uLmFjcXVpcmVBbGwodGhpcy5zaXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2ggbWVtYmVyc1xuICAgKiBAcGFyYW0gcXVlcnkgLSBTZWFyY2ggcXVlcnkgKHBhcnQgb2YgdXNlcm5hbWUpXG4gICAqIEByZXR1cm5zIE1hdGNoZWQgdXNlciBsaXN0IChRTUNVc2VyIGZvcm1hdClcbiAgICovXG4gIGxvb2t1cChxdWVyeTogc3RyaW5nKTogV2lraWRvdFJlc3VsdEFzeW5jPFFNQ1VzZXJbXT4ge1xuICAgIHJldHVybiBRdWlja01vZHVsZS5tZW1iZXJMb29rdXAodGhpcy5zaXRlLmlkLCBxdWVyeSk7XG4gIH1cblxuICAvKipcbiAgICogSW52aXRlIHVzZXIgdG8gc2l0ZVxuICAgKiBAcGFyYW0gdXNlciAtIFVzZXIgdG8gaW52aXRlXG4gICAqIEBwYXJhbSB0ZXh0IC0gSW52aXRhdGlvbiBtZXNzYWdlXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIGludml0ZSh1c2VyOiBVc2VyLCB0ZXh0OiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhY3Rpb246ICdNYW5hZ2VTaXRlTWVtYmVyc2hpcEFjdGlvbicsXG4gICAgICAgICAgICBldmVudDogJ2ludml0ZU1lbWJlcicsXG4gICAgICAgICAgICB1c2VyX2lkOiB1c2VyLmlkLFxuICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdFbXB0eScsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gcmVzdWx0LmVycm9yO1xuICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFdpa2lkb3RTdGF0dXNFcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1c0NvZGUgPT09ICdhbHJlYWR5X2ludml0ZWQnKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUYXJnZXRFcnJvcihcbiAgICAgICAgICAgICAgICBgVXNlciBpcyBhbHJlYWR5IGludml0ZWQgdG8gJHt0aGlzLnNpdGUudW5peE5hbWV9OiAke3VzZXIubmFtZX1gXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzQ29kZSA9PT0gJ2FscmVhZHlfbWVtYmVyJykge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgVGFyZ2V0RXJyb3IoXG4gICAgICAgICAgICAgICAgYFVzZXIgaXMgYWxyZWFkeSBhIG1lbWJlciBvZiAke3RoaXMuc2l0ZS51bml4TmFtZX06ICR7dXNlci5uYW1lfWBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgVGFyZ2V0RXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBMb2dpblJlcXVpcmVkRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBpbnZpdGUgdXNlcjogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IHsgU2l0ZUFwcGxpY2F0aW9uLCBTaXRlTWVtYmVyIH07XG4iLAogICAgIi8qKlxuICogUXVpY2tNb2R1bGUgLSBXaWtpZG90IGxpZ2h0d2VpZ2h0IEFQSVxuICpcbiAqIFNlYXJjaCBmdW5jdGlvbmFsaXR5IHVzaW5nIHF1aWNrbW9kdWxlLnBocCBlbmRwb2ludFxuICovXG5cbmltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuaW1wb3J0IHsgTm90Rm91bmRFeGNlcHRpb24sIFVuZXhwZWN0ZWRFcnJvciB9IGZyb20gJy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB7IERFRkFVTFRfQU1DX0NPTkZJRyB9IGZyb20gJy4uL2Nvbm5lY3Rvci9hbWMtY29uZmlnJztcbmltcG9ydCB7IGZldGNoV2l0aFJldHJ5IH0gZnJvbSAnLi9odHRwJztcblxuLyoqXG4gKiBRdWlja01vZHVsZSBtb2R1bGUgbmFtZVxuICovXG5leHBvcnQgdHlwZSBRdWlja01vZHVsZU5hbWUgPSAnTWVtYmVyTG9va3VwUU1vZHVsZScgfCAnVXNlckxvb2t1cFFNb2R1bGUnIHwgJ1BhZ2VMb29rdXBRTW9kdWxlJztcblxuLyoqXG4gKiBRdWlja01vZHVsZSB1c2VyIGluZm9ybWF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUU1DVXNlciB7XG4gIGlkOiBudW1iZXI7XG4gIG5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBRdWlja01vZHVsZSBwYWdlIGluZm9ybWF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUU1DUGFnZSB7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIHVuaXhOYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUXVpY2tNb2R1bGUgcmVzcG9uc2Ugc2NoZW1hXG4gKi9cbmNvbnN0IHF1aWNrTW9kdWxlVXNlclJlc3BvbnNlU2NoZW1hID0gei5vYmplY3Qoe1xuICB1c2Vyczogei51bmlvbihbXG4gICAgei5hcnJheShcbiAgICAgIHoub2JqZWN0KHtcbiAgICAgICAgdXNlcl9pZDogei51bmlvbihbei5zdHJpbmcoKSwgei5udW1iZXIoKV0pLFxuICAgICAgICBuYW1lOiB6LnN0cmluZygpLFxuICAgICAgfSlcbiAgICApLFxuICAgIHoubGl0ZXJhbChmYWxzZSksXG4gIF0pLFxufSk7XG5cbmNvbnN0IHF1aWNrTW9kdWxlUGFnZVJlc3BvbnNlU2NoZW1hID0gei5vYmplY3Qoe1xuICBwYWdlczogei51bmlvbihbXG4gICAgei5hcnJheShcbiAgICAgIHoub2JqZWN0KHtcbiAgICAgICAgdGl0bGU6IHouc3RyaW5nKCksXG4gICAgICAgIHVuaXhfbmFtZTogei5zdHJpbmcoKSxcbiAgICAgIH0pXG4gICAgKSxcbiAgICB6LmxpdGVyYWwoZmFsc2UpLFxuICBdKSxcbn0pO1xuXG4vKipcbiAqIFNlbmQgcmVxdWVzdCB0byBRdWlja01vZHVsZSBlbmRwb2ludFxuICovXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0UXVpY2tNb2R1bGUoXG4gIG1vZHVsZU5hbWU6IFF1aWNrTW9kdWxlTmFtZSxcbiAgc2l0ZUlkOiBudW1iZXIsXG4gIHF1ZXJ5OiBzdHJpbmdcbik6IFByb21pc2U8dW5rbm93bj4ge1xuICBjb25zdCB1cmwgPSBgaHR0cHM6Ly93d3cud2lraWRvdC5jb20vcXVpY2ttb2R1bGUucGhwP21vZHVsZT0ke21vZHVsZU5hbWV9JnM9JHtzaXRlSWR9JnE9JHtlbmNvZGVVUklDb21wb25lbnQocXVlcnkpfWA7XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaFdpdGhSZXRyeSh1cmwsIERFRkFVTFRfQU1DX0NPTkZJRywge1xuICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgaGVhZGVyczoge1xuICAgICAgQWNjZXB0OiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgfSxcbiAgICBjaGVja09rOiBmYWxzZSwgLy8gSGFuZGxlIEhUVFAgZXJyb3JzIG1hbnVhbGx5XG4gIH0pO1xuXG4gIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDUwMCkge1xuICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihgU2l0ZSBub3QgZm91bmQ6IHNpdGVJZD0ke3NpdGVJZH1gKTtcbiAgfVxuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEVycm9yKGBRdWlja01vZHVsZSByZXF1ZXN0IGZhaWxlZDogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gIH1cblxuICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xufVxuXG4vKipcbiAqIFNlYXJjaCBzaXRlIG1lbWJlcnNcbiAqIEBwYXJhbSBzaXRlSWQgLSBTaXRlIElEXG4gKiBAcGFyYW0gcXVlcnkgLSBTZWFyY2ggcXVlcnkgKHBhcnRpYWwgdXNlcm5hbWUpXG4gKiBAcmV0dXJucyBMaXN0IG9mIG1hdGNoaW5nIHVzZXJzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZW1iZXJMb29rdXAoc2l0ZUlkOiBudW1iZXIsIHF1ZXJ5OiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8UU1DVXNlcltdPiB7XG4gIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcXVlc3RRdWlja01vZHVsZSgnTWVtYmVyTG9va3VwUU1vZHVsZScsIHNpdGVJZCwgcXVlcnkpO1xuICAgICAgY29uc3QgcGFyc2VkID0gcXVpY2tNb2R1bGVVc2VyUmVzcG9uc2VTY2hlbWEucGFyc2UoZGF0YSk7XG5cbiAgICAgIGlmIChwYXJzZWQudXNlcnMgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHBhcnNlZC51c2Vycy5tYXAoKHVzZXIpID0+ICh7XG4gICAgICAgIGlkOiB0eXBlb2YgdXNlci51c2VyX2lkID09PSAnc3RyaW5nJyA/IE51bWJlci5wYXJzZUludCh1c2VyLnVzZXJfaWQsIDEwKSA6IHVzZXIudXNlcl9pZCxcbiAgICAgICAgbmFtZTogdXNlci5uYW1lLFxuICAgICAgfSkpO1xuICAgIH0pKCksXG4gICAgKGVycm9yKSA9PiB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb3RGb3VuZEV4Y2VwdGlvbikgcmV0dXJuIGVycm9yO1xuICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYE1lbWJlciBsb29rdXAgZmFpbGVkOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgfVxuICApO1xufVxuXG4vKipcbiAqIFNlYXJjaCB1c2VycyBhY3Jvc3MgYWxsIFdpa2lkb3RcbiAqIEBwYXJhbSBzaXRlSWQgLSBTaXRlIElEIChhbnkgc2l0ZSBJRCB3b3JrcylcbiAqIEBwYXJhbSBxdWVyeSAtIFNlYXJjaCBxdWVyeSAocGFydGlhbCB1c2VybmFtZSlcbiAqIEByZXR1cm5zIExpc3Qgb2YgbWF0Y2hpbmcgdXNlcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZXJMb29rdXAoc2l0ZUlkOiBudW1iZXIsIHF1ZXJ5OiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8UU1DVXNlcltdPiB7XG4gIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcXVlc3RRdWlja01vZHVsZSgnVXNlckxvb2t1cFFNb2R1bGUnLCBzaXRlSWQsIHF1ZXJ5KTtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHF1aWNrTW9kdWxlVXNlclJlc3BvbnNlU2NoZW1hLnBhcnNlKGRhdGEpO1xuXG4gICAgICBpZiAocGFyc2VkLnVzZXJzID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXJzZWQudXNlcnMubWFwKCh1c2VyKSA9PiAoe1xuICAgICAgICBpZDogdHlwZW9mIHVzZXIudXNlcl9pZCA9PT0gJ3N0cmluZycgPyBOdW1iZXIucGFyc2VJbnQodXNlci51c2VyX2lkLCAxMCkgOiB1c2VyLnVzZXJfaWQsXG4gICAgICAgIG5hbWU6IHVzZXIubmFtZSxcbiAgICAgIH0pKTtcbiAgICB9KSgpLFxuICAgIChlcnJvcikgPT4ge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm90Rm91bmRFeGNlcHRpb24pIHJldHVybiBlcnJvcjtcbiAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBVc2VyIGxvb2t1cCBmYWlsZWQ6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICB9XG4gICk7XG59XG5cbi8qKlxuICogU2VhcmNoIHBhZ2VzIHdpdGhpbiBzaXRlXG4gKiBAcGFyYW0gc2l0ZUlkIC0gU2l0ZSBJRFxuICogQHBhcmFtIHF1ZXJ5IC0gU2VhcmNoIHF1ZXJ5IChwYXJ0aWFsIHBhZ2UgbmFtZSlcbiAqIEByZXR1cm5zIExpc3Qgb2YgbWF0Y2hpbmcgcGFnZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhZ2VMb29rdXAoc2l0ZUlkOiBudW1iZXIsIHF1ZXJ5OiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8UU1DUGFnZVtdPiB7XG4gIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcXVlc3RRdWlja01vZHVsZSgnUGFnZUxvb2t1cFFNb2R1bGUnLCBzaXRlSWQsIHF1ZXJ5KTtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHF1aWNrTW9kdWxlUGFnZVJlc3BvbnNlU2NoZW1hLnBhcnNlKGRhdGEpO1xuXG4gICAgICBpZiAocGFyc2VkLnBhZ2VzID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXJzZWQucGFnZXMubWFwKChwYWdlKSA9PiAoe1xuICAgICAgICB0aXRsZTogcGFnZS50aXRsZSxcbiAgICAgICAgdW5peE5hbWU6IHBhZ2UudW5peF9uYW1lLFxuICAgICAgfSkpO1xuICAgIH0pKCksXG4gICAgKGVycm9yKSA9PiB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb3RGb3VuZEV4Y2VwdGlvbikgcmV0dXJuIGVycm9yO1xuICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYFBhZ2UgbG9va3VwIGZhaWxlZDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgIH1cbiAgKTtcbn1cblxuLyoqXG4gKiBRdWlja01vZHVsZSBBUEkgKG1haW50YWluZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5KVxuICogQGRlcHJlY2F0ZWQgVXNlIGluZGl2aWR1YWwgZnVuY3Rpb25zIChtZW1iZXJMb29rdXAsIHVzZXJMb29rdXAsIHBhZ2VMb29rdXApIGluc3RlYWRcbiAqL1xuZXhwb3J0IGNvbnN0IFF1aWNrTW9kdWxlOiB7XG4gIG1lbWJlckxvb2t1cDogdHlwZW9mIG1lbWJlckxvb2t1cDtcbiAgdXNlckxvb2t1cDogdHlwZW9mIHVzZXJMb29rdXA7XG4gIHBhZ2VMb29rdXA6IHR5cGVvZiBwYWdlTG9va3VwO1xufSA9IHtcbiAgbWVtYmVyTG9va3VwOiBtZW1iZXJMb29rdXAsXG4gIHVzZXJMb29rdXA6IHVzZXJMb29rdXAsXG4gIHBhZ2VMb29rdXA6IHBhZ2VMb29rdXAsXG59O1xuIiwKICAgICJpbXBvcnQgKiBhcyBjaGVlcmlvIGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0IHsgUmVxdWlyZUxvZ2luIH0gZnJvbSAnLi4vLi4vY29tbW9uL2RlY29yYXRvcnMnO1xuaW1wb3J0IHtcbiAgRm9yYmlkZGVuRXJyb3IsXG4gIExvZ2luUmVxdWlyZWRFcnJvcixcbiAgTm90Rm91bmRFeGNlcHRpb24sXG4gIFVuZXhwZWN0ZWRFcnJvcixcbiAgV2lraWRvdFN0YXR1c0Vycm9yLFxufSBmcm9tICcuLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyBwYXJzZVVzZXIgfSBmcm9tICcuLi8uLi91dGlsL3BhcnNlcic7XG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0VXNlciB9IGZyb20gJy4uL3VzZXInO1xuaW1wb3J0IHR5cGUgeyBTaXRlIH0gZnJvbSAnLi9zaXRlJztcblxuLyoqXG4gKiBTaXRlIG1lbWJlcnNoaXAgYXBwbGljYXRpb24gZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpdGVBcHBsaWNhdGlvbkRhdGEge1xuICBzaXRlOiBTaXRlO1xuICB1c2VyOiBBYnN0cmFjdFVzZXI7XG4gIHRleHQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBTaXRlIG1lbWJlcnNoaXAgYXBwbGljYXRpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFNpdGVBcHBsaWNhdGlvbiB7XG4gIHB1YmxpYyByZWFkb25seSBzaXRlOiBTaXRlO1xuICBwdWJsaWMgcmVhZG9ubHkgdXNlcjogQWJzdHJhY3RVc2VyO1xuICBwdWJsaWMgcmVhZG9ubHkgdGV4dDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IFNpdGVBcHBsaWNhdGlvbkRhdGEpIHtcbiAgICB0aGlzLnNpdGUgPSBkYXRhLnNpdGU7XG4gICAgdGhpcy51c2VyID0gZGF0YS51c2VyO1xuICAgIHRoaXMudGV4dCA9IGRhdGEudGV4dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHBlbmRpbmcgbWVtYmVyc2hpcCBhcHBsaWNhdGlvbnNcbiAgICogQHBhcmFtIHNpdGUgLSBUYXJnZXQgc2l0ZVxuICAgKi9cbiAgc3RhdGljIGFjcXVpcmVBbGwoc2l0ZTogU2l0ZSk6IFdpa2lkb3RSZXN1bHRBc3luYzxTaXRlQXBwbGljYXRpb25bXT4ge1xuICAgIGNvbnN0IGxvZ2luUmVzdWx0ID0gc2l0ZS5jbGllbnQucmVxdWlyZUxvZ2luKCk7XG4gICAgaWYgKGxvZ2luUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgICAgUHJvbWlzZS5yZWplY3QobG9naW5SZXN1bHQuZXJyb3IpLFxuICAgICAgICAoKSA9PiBuZXcgTG9naW5SZXF1aXJlZEVycm9yKCdMb2dpbiByZXF1aXJlZCB0byBnZXQgYXBwbGljYXRpb25zJylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7IG1vZHVsZU5hbWU6ICdtYW5hZ2VzaXRlL01hbmFnZVNpdGVNZW1iZXJzQXBwbGljYXRpb25zTW9kdWxlJyB9LFxuICAgICAgICBdKTtcblxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoJ0VtcHR5IHJlc3BvbnNlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBodG1sID0gU3RyaW5nKHJlc3BvbnNlLmJvZHkgPz8gJycpO1xuXG4gICAgICAgIC8vIFBlcm1pc3Npb24gY2hlY2tcbiAgICAgICAgaWYgKGh0bWwuaW5jbHVkZXMoJ1dJS0lET1QucGFnZS5saXN0ZW5lcnMubG9naW5DbGljayhldmVudCknKSkge1xuICAgICAgICAgIHRocm93IG5ldyBGb3JiaWRkZW5FcnJvcignWW91IGFyZSBub3QgYWxsb3dlZCB0byBhY2Nlc3MgdGhpcyBwYWdlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGh0bWwpO1xuICAgICAgICBjb25zdCBhcHBsaWNhdGlvbnM6IFNpdGVBcHBsaWNhdGlvbltdID0gW107XG5cbiAgICAgICAgY29uc3QgdXNlckVsZW1lbnRzID0gJCgnaDMgc3Bhbi5wcmludHVzZXInKS50b0FycmF5KCk7XG4gICAgICAgIGNvbnN0IHRleHRXcmFwcGVyRWxlbWVudHMgPSAkKCd0YWJsZScpLnRvQXJyYXkoKTtcblxuICAgICAgICBpZiAodXNlckVsZW1lbnRzLmxlbmd0aCAhPT0gdGV4dFdyYXBwZXJFbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEVycm9yKFxuICAgICAgICAgICAgJ0xlbmd0aCBvZiB1c2VyX2VsZW1lbnRzIGFuZCB0ZXh0X3dyYXBwZXJfZWxlbWVudHMgYXJlIGRpZmZlcmVudCdcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1c2VyRWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCB1c2VyRWxlbWVudCA9IHVzZXJFbGVtZW50c1tpXTtcbiAgICAgICAgICBjb25zdCB0ZXh0V3JhcHBlckVsZW1lbnQgPSB0ZXh0V3JhcHBlckVsZW1lbnRzW2ldO1xuXG4gICAgICAgICAgaWYgKCF1c2VyRWxlbWVudCB8fCAhdGV4dFdyYXBwZXJFbGVtZW50KSBjb250aW51ZTtcblxuICAgICAgICAgIGNvbnN0IHVzZXIgPSBwYXJzZVVzZXIoc2l0ZS5jbGllbnQsICQodXNlckVsZW1lbnQpKTtcbiAgICAgICAgICBjb25zdCB0ZXh0RWxlbWVudCA9ICQodGV4dFdyYXBwZXJFbGVtZW50KS5maW5kKCd0ZCcpLmVxKDEpO1xuICAgICAgICAgIGNvbnN0IHRleHQgPSB0ZXh0RWxlbWVudC50ZXh0KCkudHJpbSgpO1xuXG4gICAgICAgICAgYXBwbGljYXRpb25zLnB1c2gobmV3IFNpdGVBcHBsaWNhdGlvbih7IHNpdGUsIHVzZXIsIHRleHQgfSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFwcGxpY2F0aW9ucztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRm9yYmlkZGVuRXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBMb2dpblJlcXVpcmVkRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgYXBwbGljYXRpb25zOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gcHJvY2VzcyBhcHBsaWNhdGlvblxuICAgKi9cbiAgQFJlcXVpcmVMb2dpblxuICBwcml2YXRlIHByb2Nlc3MoYWN0aW9uOiAnYWNjZXB0JyB8ICdkZWNsaW5lJyk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ01hbmFnZVNpdGVNZW1iZXJzaGlwQWN0aW9uJyxcbiAgICAgICAgICAgIGV2ZW50OiAnYWNjZXB0QXBwbGljYXRpb24nLFxuICAgICAgICAgICAgdXNlcl9pZDogdGhpcy51c2VyLmlkLFxuICAgICAgICAgICAgdGV4dDogYHlvdXIgYXBwbGljYXRpb24gaGFzIGJlZW4gJHthY3Rpb259ZWRgLFxuICAgICAgICAgICAgdHlwZTogYWN0aW9uLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgY29uc3QgZXJyb3IgPSByZXN1bHQuZXJyb3I7XG4gICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgV2lraWRvdFN0YXR1c0Vycm9yICYmIGVycm9yLnN0YXR1c0NvZGUgPT09ICdub19hcHBsaWNhdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihgQXBwbGljYXRpb24gbm90IGZvdW5kOiAke3RoaXMudXNlci5uYW1lfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb3RGb3VuZEV4Y2VwdGlvbiB8fCBlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIHByb2Nlc3MgYXBwbGljYXRpb246ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjY2VwdCBtZW1iZXJzaGlwIGFwcGxpY2F0aW9uXG4gICAqL1xuICBhY2NlcHQoKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5wcm9jZXNzKCdhY2NlcHQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNsaW5lIG1lbWJlcnNoaXAgYXBwbGljYXRpb25cbiAgICovXG4gIGRlY2xpbmUoKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5wcm9jZXNzKCdkZWNsaW5lJyk7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgU2l0ZUFwcGxpY2F0aW9uKHVzZXI9JHt0aGlzLnVzZXIubmFtZX0sIHNpdGU9JHt0aGlzLnNpdGUudW5peE5hbWV9LCB0ZXh0PSR7dGhpcy50ZXh0fSlgO1xuICB9XG59XG4iLAogICAgImltcG9ydCAqIGFzIGNoZWVyaW8gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQgeyBSZXF1aXJlTG9naW4gfSBmcm9tICcuLi8uLi9jb21tb24vZGVjb3JhdG9ycyc7XG5pbXBvcnQge1xuICBMb2dpblJlcXVpcmVkRXJyb3IsXG4gIFRhcmdldEVycm9yLFxuICBVbmV4cGVjdGVkRXJyb3IsXG4gIFdpa2lkb3RTdGF0dXNFcnJvcixcbn0gZnJvbSAnLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgcGFyc2VPZGF0ZSwgcGFyc2VVc2VyIH0gZnJvbSAnLi4vLi4vdXRpbC9wYXJzZXInO1xuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdFVzZXIgfSBmcm9tICcuLi91c2VyJztcbmltcG9ydCB0eXBlIHsgU2l0ZSB9IGZyb20gJy4vc2l0ZSc7XG5cbi8qKlxuICogU2l0ZSBtZW1iZXIgZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpdGVNZW1iZXJEYXRhIHtcbiAgc2l0ZTogU2l0ZTtcbiAgdXNlcjogQWJzdHJhY3RVc2VyO1xuICBqb2luZWRBdDogRGF0ZSB8IG51bGw7XG59XG5cbi8qKlxuICogU2l0ZSBtZW1iZXJcbiAqL1xuZXhwb3J0IGNsYXNzIFNpdGVNZW1iZXIge1xuICBwdWJsaWMgcmVhZG9ubHkgc2l0ZTogU2l0ZTtcbiAgcHVibGljIHJlYWRvbmx5IHVzZXI6IEFic3RyYWN0VXNlcjtcbiAgcHVibGljIHJlYWRvbmx5IGpvaW5lZEF0OiBEYXRlIHwgbnVsbDtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBTaXRlTWVtYmVyRGF0YSkge1xuICAgIHRoaXMuc2l0ZSA9IGRhdGEuc2l0ZTtcbiAgICB0aGlzLnVzZXIgPSBkYXRhLnVzZXI7XG4gICAgdGhpcy5qb2luZWRBdCA9IGRhdGEuam9pbmVkQXQ7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgbWVtYmVyIGluZm9ybWF0aW9uIGZyb20gSFRNTFxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcGFyc2Uoc2l0ZTogU2l0ZSwgaHRtbDogc3RyaW5nKTogU2l0ZU1lbWJlcltdIHtcbiAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGh0bWwpO1xuICAgIGNvbnN0IG1lbWJlcnM6IFNpdGVNZW1iZXJbXSA9IFtdO1xuXG4gICAgJCgndGFibGUgdHInKS5lYWNoKChfaSwgcm93KSA9PiB7XG4gICAgICBjb25zdCB0ZHMgPSAkKHJvdykuZmluZCgndGQnKTtcbiAgICAgIGNvbnN0IHVzZXJFbGVtID0gJCh0ZHNbMF0pLmZpbmQoJy5wcmludHVzZXInKTtcblxuICAgICAgaWYgKHVzZXJFbGVtLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHVzZXIgPSBwYXJzZVVzZXIoc2l0ZS5jbGllbnQsIHVzZXJFbGVtKTtcblxuICAgICAgLy8gU2Vjb25kIHRkIGNvbnRhaW5zIGpvaW4gZGF0ZSBpZiBleGlzdHNcbiAgICAgIGxldCBqb2luZWRBdDogRGF0ZSB8IG51bGwgPSBudWxsO1xuICAgICAgaWYgKHRkcy5sZW5ndGggPj0gMikge1xuICAgICAgICBjb25zdCBvZGF0ZUVsZW0gPSAkKHRkc1sxXSkuZmluZCgnLm9kYXRlJyk7XG4gICAgICAgIGlmIChvZGF0ZUVsZW0ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGpvaW5lZEF0ID0gcGFyc2VPZGF0ZShvZGF0ZUVsZW0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG1lbWJlcnMucHVzaChuZXcgU2l0ZU1lbWJlcih7IHNpdGUsIHVzZXIsIGpvaW5lZEF0IH0pKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBtZW1iZXJzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzaXRlIG1lbWJlciBsaXN0XG4gICAqIEBwYXJhbSBzaXRlIC0gVGFyZ2V0IHNpdGVcbiAgICogQHBhcmFtIGdyb3VwIC0gR3JvdXAgKFwiYWRtaW5zXCIsIFwibW9kZXJhdG9yc1wiLCBvciBlbXB0eSBzdHJpbmcgZm9yIGFsbCBtZW1iZXJzKVxuICAgKi9cbiAgc3RhdGljIGdldE1lbWJlcnMoXG4gICAgc2l0ZTogU2l0ZSxcbiAgICBncm91cDogJ2FkbWlucycgfCAnbW9kZXJhdG9ycycgfCAnJyA9ICcnXG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzxTaXRlTWVtYmVyW10+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBtZW1iZXJzOiBTaXRlTWVtYmVyW10gPSBbXTtcblxuICAgICAgICAvLyBHZXQgZmlyc3QgcGFnZVxuICAgICAgICBjb25zdCBmaXJzdFJlc3VsdCA9IGF3YWl0IHNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ21lbWJlcnNoaXAvTWVtYmVyc0xpc3RNb2R1bGUnLFxuICAgICAgICAgICAgcGFnZTogMSxcbiAgICAgICAgICAgIGdyb3VwLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChmaXJzdFJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgZmlyc3RSZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaXJzdFJlc3BvbnNlID0gZmlyc3RSZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghZmlyc3RSZXNwb25zZSkge1xuICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoJ0VtcHR5IHJlc3BvbnNlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaXJzdEh0bWwgPSBTdHJpbmcoZmlyc3RSZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgbWVtYmVycy5wdXNoKC4uLlNpdGVNZW1iZXIucGFyc2Uoc2l0ZSwgZmlyc3RIdG1sKSk7XG5cbiAgICAgICAgLy8gQ2hlY2sgcGFnZXJcbiAgICAgICAgY29uc3QgJGZpcnN0ID0gY2hlZXJpby5sb2FkKGZpcnN0SHRtbCk7XG4gICAgICAgIGNvbnN0IHBhZ2VyTGlua3MgPSAkZmlyc3QoJ2Rpdi5wYWdlciBhJyk7XG4gICAgICAgIGlmIChwYWdlckxpbmtzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICByZXR1cm4gbWVtYmVycztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxhc3RQYWdlVGV4dCA9ICRmaXJzdChwYWdlckxpbmtzW3BhZ2VyTGlua3MubGVuZ3RoIC0gMl0pXG4gICAgICAgICAgLnRleHQoKVxuICAgICAgICAgIC50cmltKCk7XG4gICAgICAgIGNvbnN0IGxhc3RQYWdlID0gTnVtYmVyLnBhcnNlSW50KGxhc3RQYWdlVGV4dCwgMTApIHx8IDE7XG4gICAgICAgIGlmIChsYXN0UGFnZSA8PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIG1lbWJlcnM7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgcmVtYWluaW5nIHBhZ2VzXG4gICAgICAgIGNvbnN0IGJvZGllcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBwYWdlID0gMjsgcGFnZSA8PSBsYXN0UGFnZTsgcGFnZSsrKSB7XG4gICAgICAgICAgYm9kaWVzLnB1c2goe1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ21lbWJlcnNoaXAvTWVtYmVyc0xpc3RNb2R1bGUnLFxuICAgICAgICAgICAgcGFnZSxcbiAgICAgICAgICAgIGdyb3VwLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWRkaXRpb25hbFJlc3VsdHMgPSBhd2FpdCBzaXRlLmFtY1JlcXVlc3QoYm9kaWVzKTtcbiAgICAgICAgaWYgKGFkZGl0aW9uYWxSZXN1bHRzLmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBhZGRpdGlvbmFsUmVzdWx0cy5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgcmVzcG9uc2Ugb2YgYWRkaXRpb25hbFJlc3VsdHMudmFsdWUpIHtcbiAgICAgICAgICBjb25zdCBodG1sID0gU3RyaW5nKHJlc3BvbnNlPy5ib2R5ID8/ICcnKTtcbiAgICAgICAgICBtZW1iZXJzLnB1c2goLi4uU2l0ZU1lbWJlci5wYXJzZShzaXRlLCBodG1sKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWVtYmVycztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgbWVtYmVyczogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gY2hhbmdlIGdyb3VwXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIHByaXZhdGUgY2hhbmdlR3JvdXAoXG4gICAgZXZlbnQ6ICd0b01vZGVyYXRvcnMnIHwgJ3JlbW92ZU1vZGVyYXRvcicgfCAndG9BZG1pbnMnIHwgJ3JlbW92ZUFkbWluJ1xuICApOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhY3Rpb246ICdNYW5hZ2VTaXRlTWVtYmVyc2hpcEFjdGlvbicsXG4gICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgIHVzZXJfaWQ6IHRoaXMudXNlci5pZCxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICcnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBXaWtpZG90U3RhdHVzRXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXNDb2RlID09PSAnbm90X2FscmVhZHknKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUYXJnZXRFcnJvcihgVXNlciBpcyBub3QgbW9kZXJhdG9yL2FkbWluOiAke3RoaXMudXNlci5uYW1lfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1c0NvZGUgPT09ICdhbHJlYWR5X2FkbWluJyB8fCBlcnJvci5zdGF0dXNDb2RlID09PSAnYWxyZWFkeV9tb2RlcmF0b3InKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUYXJnZXRFcnJvcihcbiAgICAgICAgICAgICAgICBgVXNlciBpcyBhbHJlYWR5ICR7ZXJyb3Iuc3RhdHVzQ29kZS5yZXBsYWNlKCdhbHJlYWR5XycsICcnKX06ICR7dGhpcy51c2VyLm5hbWV9YFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBUYXJnZXRFcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGNoYW5nZSBtZW1iZXIgZ3JvdXA6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb21vdGUgdG8gbW9kZXJhdG9yXG4gICAqL1xuICB0b01vZGVyYXRvcigpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmNoYW5nZUdyb3VwKCd0b01vZGVyYXRvcnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgbW9kZXJhdG9yIHByaXZpbGVnZXNcbiAgICovXG4gIHJlbW92ZU1vZGVyYXRvcigpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmNoYW5nZUdyb3VwKCdyZW1vdmVNb2RlcmF0b3InKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9tb3RlIHRvIGFkbWluXG4gICAqL1xuICB0b0FkbWluKCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuY2hhbmdlR3JvdXAoJ3RvQWRtaW5zJyk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFkbWluIHByaXZpbGVnZXNcbiAgICovXG4gIHJlbW92ZUFkbWluKCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuY2hhbmdlR3JvdXAoJ3JlbW92ZUFkbWluJyk7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgU2l0ZU1lbWJlcih1c2VyPSR7dGhpcy51c2VyLm5hbWV9LCBzaXRlPSR7dGhpcy5zaXRlLnVuaXhOYW1lfSlgO1xuICB9XG59XG4iLAogICAgImltcG9ydCB7IE5vRWxlbWVudEVycm9yLCBVbmV4cGVjdGVkRXJyb3IgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyBwYXJzZVVzZXIgfSBmcm9tICcuLi8uLi8uLi91dGlsL3BhcnNlcic7XG5pbXBvcnQgeyBQYWdlLCBQYWdlQ29sbGVjdGlvbiwgU2VhcmNoUGFnZXNRdWVyeSB9IGZyb20gJy4uLy4uL3BhZ2UnO1xuaW1wb3J0IHR5cGUgeyBTaXRlIH0gZnJvbSAnLi4vc2l0ZSc7XG5cbi8qKlxuICogU2luZ2xlIHBhZ2Ugb3BlcmF0aW9ucyBhY2Nlc3NvclxuICovXG5leHBvcnQgY2xhc3MgUGFnZUFjY2Vzc29yIHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG5cbiAgY29uc3RydWN0b3Ioc2l0ZTogU2l0ZSkge1xuICAgIHRoaXMuc2l0ZSA9IHNpdGU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBhZ2UgYnkgVU5JWCBuYW1lXG4gICAqIEBwYXJhbSB1bml4TmFtZSAtIFBhZ2UgVU5JWCBuYW1lIChlLmcuLCAnc2NwLTE3MycpXG4gICAqIEByZXR1cm5zIFBhZ2UgKG51bGwgaWYgbm90IGZvdW5kKVxuICAgKi9cbiAgZ2V0KHVuaXhOYW1lOiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZSB8IG51bGw+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBxdWVyeSA9IG5ldyBTZWFyY2hQYWdlc1F1ZXJ5KHsgZnVsbG5hbWU6IHVuaXhOYW1lIH0pO1xuICAgICAgICBjb25zdCB1c2VyUGFyc2VyID0gcGFyc2VVc2VyLmJpbmQobnVsbCwgdGhpcy5zaXRlLmNsaWVudCk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUGFnZUNvbGxlY3Rpb24uc2VhcmNoUGFnZXModGhpcy5zaXRlLCB1c2VyUGFyc2VyLCBxdWVyeSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQudmFsdWUubGVuZ3RoID4gMCA/IChyZXN1bHQudmFsdWVbMF0gPz8gbnVsbCkgOiBudWxsO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCBwYWdlOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBwYWdlXG4gICAqIEBwYXJhbSBmdWxsbmFtZSAtIFBhZ2UgZnVsbG5hbWUgKGUuZy4sICdzY3AtMTczJylcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBDcmVhdGlvbiBvcHRpb25zXG4gICAqIEByZXR1cm5zIHZvaWRcbiAgICovXG4gIGNyZWF0ZShcbiAgICBmdWxsbmFtZTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIHRpdGxlPzogc3RyaW5nO1xuICAgICAgc291cmNlPzogc3RyaW5nO1xuICAgICAgY29tbWVudD86IHN0cmluZztcbiAgICAgIGZvcmNlRWRpdD86IGJvb2xlYW47XG4gICAgfSA9IHt9XG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIFBhZ2VDb2xsZWN0aW9uLmNyZWF0ZU9yRWRpdCh0aGlzLnNpdGUsIGZ1bGxuYW1lLCB7XG4gICAgICB0aXRsZTogb3B0aW9ucy50aXRsZSxcbiAgICAgIHNvdXJjZTogb3B0aW9ucy5zb3VyY2UsXG4gICAgICBjb21tZW50OiBvcHRpb25zLmNvbW1lbnQsXG4gICAgICBmb3JjZUVkaXQ6IG9wdGlvbnMuZm9yY2VFZGl0LFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCB7IFBhZ2UgfTtcbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBDaGVlcmlvIH0gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQgKiBhcyBjaGVlcmlvIGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0IHR5cGUgeyBBbnlOb2RlIH0gZnJvbSAnZG9taGFuZGxlcic7XG5pbXBvcnQgcExpbWl0IGZyb20gJ3AtbGltaXQnO1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5pbXBvcnQgeyBSZXF1aXJlTG9naW4gfSBmcm9tICcuLi8uLi9jb21tb24vZGVjb3JhdG9ycyc7XG5pbXBvcnQge1xuICBGb3JiaWRkZW5FcnJvcixcbiAgTG9naW5SZXF1aXJlZEVycm9yLFxuICBOb0VsZW1lbnRFcnJvcixcbiAgTm90Rm91bmRFeGNlcHRpb24sXG4gIFRhcmdldEV4aXN0c0Vycm9yLFxuICBVbmV4cGVjdGVkRXJyb3IsXG59IGZyb20gJy4uLy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgQU1DUmVxdWVzdEJvZHkgfSBmcm9tICcuLi8uLi9jb25uZWN0b3InO1xuaW1wb3J0IHsgZmV0Y2hXaXRoUmV0cnkgfSBmcm9tICcuLi8uLi91dGlsL2h0dHAnO1xuaW1wb3J0IHsgcGFyc2VPZGF0ZSwgcGFyc2VVc2VyIH0gZnJvbSAnLi4vLi4vdXRpbC9wYXJzZXInO1xuaW1wb3J0IHR5cGUgeyBTaXRlIH0gZnJvbSAnLi4vc2l0ZSc7XG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0VXNlciB9IGZyb20gJy4uL3VzZXInO1xuaW1wb3J0IHsgUGFnZUZpbGVDb2xsZWN0aW9uIH0gZnJvbSAnLi9wYWdlLWZpbGUnO1xuaW1wb3J0IHsgUGFnZU1ldGFDb2xsZWN0aW9uIH0gZnJvbSAnLi9wYWdlLW1ldGEnO1xuaW1wb3J0IHsgUGFnZVJldmlzaW9uLCBQYWdlUmV2aXNpb25Db2xsZWN0aW9uIH0gZnJvbSAnLi9wYWdlLXJldmlzaW9uJztcbmltcG9ydCB7IFBhZ2VTb3VyY2UgfSBmcm9tICcuL3BhZ2Utc291cmNlJztcbmltcG9ydCB7IFBhZ2VWb3RlLCBQYWdlVm90ZUNvbGxlY3Rpb24gfSBmcm9tICcuL3BhZ2Utdm90ZSc7XG5pbXBvcnQgeyBERUZBVUxUX01PRFVMRV9CT0RZLCBERUZBVUxUX1BFUl9QQUdFLCBTZWFyY2hQYWdlc1F1ZXJ5IH0gZnJvbSAnLi9zZWFyY2gtcXVlcnknO1xuXG4vKipcbiAqIFNjaGVtYSBmb3IgTGlzdFBhZ2VzTW9kdWxlIHBhcnNlIHJlc3VsdFxuICogVXNlcyBab2QgZm9yIHR5cGUtc2FmZSB2YWxpZGF0aW9uIG9mIHBhcnNlIHJlc3VsdHNcbiAqL1xuY29uc3QgcGFnZVBhcmFtc1NjaGVtYSA9IHoub2JqZWN0KHtcbiAgZnVsbG5hbWU6IHoucHJlcHJvY2VzcygodikgPT4gdiA/PyAnJywgei5zdHJpbmcoKSksXG4gIG5hbWU6IHoucHJlcHJvY2VzcygodikgPT4gdiA/PyAnJywgei5zdHJpbmcoKSksXG4gIGNhdGVnb3J5OiB6LnByZXByb2Nlc3MoKHYpID0+IHYgPz8gJycsIHouc3RyaW5nKCkpLFxuICB0aXRsZTogei5wcmVwcm9jZXNzKCh2KSA9PiB2ID8/ICcnLCB6LnN0cmluZygpKSxcbiAgY2hpbGRyZW5fY291bnQ6IHouY29lcmNlLm51bWJlcigpLmRlZmF1bHQoMCksXG4gIGNvbW1lbnRzX2NvdW50OiB6LmNvZXJjZS5udW1iZXIoKS5kZWZhdWx0KDApLFxuICBzaXplOiB6LmNvZXJjZS5udW1iZXIoKS5kZWZhdWx0KDApLFxuICByYXRpbmc6IHouY29lcmNlLm51bWJlcigpLmRlZmF1bHQoMCksXG4gIHZvdGVzX2NvdW50OiB6LmNvZXJjZS5udW1iZXIoKS5kZWZhdWx0KDApLFxuICByYXRpbmdfcGVyY2VudDogei5jb2VyY2UubnVtYmVyKCkubnVsbGFibGUoKS5kZWZhdWx0KG51bGwpLFxuICByZXZpc2lvbnNfY291bnQ6IHouY29lcmNlLm51bWJlcigpLmRlZmF1bHQoMCksXG4gIHBhcmVudF9mdWxsbmFtZTogei5zdHJpbmcoKS5udWxsYWJsZSgpLmRlZmF1bHQobnVsbCksXG4gIHRhZ3M6IHouYXJyYXkoei5zdHJpbmcoKSkuZGVmYXVsdChbXSksXG4gIGNyZWF0ZWRfYnk6IHouY3VzdG9tPEFic3RyYWN0VXNlcj4oKS5udWxsYWJsZSgpLmRlZmF1bHQobnVsbCksXG4gIGNyZWF0ZWRfYXQ6IHouZGF0ZSgpLm51bGxhYmxlKCkuZGVmYXVsdChudWxsKSxcbiAgdXBkYXRlZF9ieTogei5jdXN0b208QWJzdHJhY3RVc2VyPigpLm51bGxhYmxlKCkuZGVmYXVsdChudWxsKSxcbiAgdXBkYXRlZF9hdDogei5kYXRlKCkubnVsbGFibGUoKS5kZWZhdWx0KG51bGwpLFxuICBjb21tZW50ZWRfYnk6IHouY3VzdG9tPEFic3RyYWN0VXNlcj4oKS5udWxsYWJsZSgpLmRlZmF1bHQobnVsbCksXG4gIGNvbW1lbnRlZF9hdDogei5kYXRlKCkubnVsbGFibGUoKS5kZWZhdWx0KG51bGwpLFxufSk7XG5cbi8qKlxuICogUGFnZSBkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFnZURhdGEge1xuICBzaXRlOiBTaXRlO1xuICBmdWxsbmFtZTogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGNhdGVnb3J5OiBzdHJpbmc7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGNoaWxkcmVuQ291bnQ6IG51bWJlcjtcbiAgY29tbWVudHNDb3VudDogbnVtYmVyO1xuICBzaXplOiBudW1iZXI7XG4gIHJhdGluZzogbnVtYmVyO1xuICB2b3Rlc0NvdW50OiBudW1iZXI7XG4gIHJhdGluZ1BlcmNlbnQ6IG51bWJlciB8IG51bGw7XG4gIHJldmlzaW9uc0NvdW50OiBudW1iZXI7XG4gIHBhcmVudEZ1bGxuYW1lOiBzdHJpbmcgfCBudWxsO1xuICB0YWdzOiBzdHJpbmdbXTtcbiAgY3JlYXRlZEJ5OiBBYnN0cmFjdFVzZXIgfCBudWxsO1xuICBjcmVhdGVkQXQ6IERhdGU7XG4gIHVwZGF0ZWRCeTogQWJzdHJhY3RVc2VyIHwgbnVsbDtcbiAgdXBkYXRlZEF0OiBEYXRlO1xuICBjb21tZW50ZWRCeTogQWJzdHJhY3RVc2VyIHwgbnVsbDtcbiAgY29tbWVudGVkQXQ6IERhdGUgfCBudWxsO1xufVxuXG4vKipcbiAqIFdpa2lkb3QgcGFnZVxuICovXG5leHBvcnQgY2xhc3MgUGFnZSB7XG4gIHB1YmxpYyByZWFkb25seSBzaXRlOiBTaXRlO1xuICBwdWJsaWMgcmVhZG9ubHkgZnVsbG5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGNhdGVnb3J5OiBzdHJpbmc7XG4gIHB1YmxpYyB0aXRsZTogc3RyaW5nO1xuICBwdWJsaWMgY2hpbGRyZW5Db3VudDogbnVtYmVyO1xuICBwdWJsaWMgY29tbWVudHNDb3VudDogbnVtYmVyO1xuICBwdWJsaWMgc2l6ZTogbnVtYmVyO1xuICBwdWJsaWMgcmF0aW5nOiBudW1iZXI7XG4gIHB1YmxpYyB2b3Rlc0NvdW50OiBudW1iZXI7XG4gIHB1YmxpYyByYXRpbmdQZXJjZW50OiBudW1iZXIgfCBudWxsO1xuICBwdWJsaWMgcmV2aXNpb25zQ291bnQ6IG51bWJlcjtcbiAgcHVibGljIHBhcmVudEZ1bGxuYW1lOiBzdHJpbmcgfCBudWxsO1xuICBwdWJsaWMgdGFnczogc3RyaW5nW107XG4gIHB1YmxpYyByZWFkb25seSBjcmVhdGVkQnk6IEFic3RyYWN0VXNlciB8IG51bGw7XG4gIHB1YmxpYyByZWFkb25seSBjcmVhdGVkQXQ6IERhdGU7XG4gIHB1YmxpYyB1cGRhdGVkQnk6IEFic3RyYWN0VXNlciB8IG51bGw7XG4gIHB1YmxpYyB1cGRhdGVkQXQ6IERhdGU7XG4gIHB1YmxpYyBjb21tZW50ZWRCeTogQWJzdHJhY3RVc2VyIHwgbnVsbDtcbiAgcHVibGljIGNvbW1lbnRlZEF0OiBEYXRlIHwgbnVsbDtcblxuICBwcml2YXRlIF9pZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX3NvdXJjZTogUGFnZVNvdXJjZSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9yZXZpc2lvbnM6IFBhZ2VSZXZpc2lvbkNvbGxlY3Rpb24gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfdm90ZXM6IFBhZ2VWb3RlQ29sbGVjdGlvbiB8IG51bGwgPSBudWxsO1xuICBfZmlsZXM6IFBhZ2VGaWxlQ29sbGVjdGlvbiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IFBhZ2VEYXRhKSB7XG4gICAgdGhpcy5zaXRlID0gZGF0YS5zaXRlO1xuICAgIHRoaXMuZnVsbG5hbWUgPSBkYXRhLmZ1bGxuYW1lO1xuICAgIHRoaXMubmFtZSA9IGRhdGEubmFtZTtcbiAgICB0aGlzLmNhdGVnb3J5ID0gZGF0YS5jYXRlZ29yeTtcbiAgICB0aGlzLnRpdGxlID0gZGF0YS50aXRsZTtcbiAgICB0aGlzLmNoaWxkcmVuQ291bnQgPSBkYXRhLmNoaWxkcmVuQ291bnQ7XG4gICAgdGhpcy5jb21tZW50c0NvdW50ID0gZGF0YS5jb21tZW50c0NvdW50O1xuICAgIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbiAgICB0aGlzLnJhdGluZyA9IGRhdGEucmF0aW5nO1xuICAgIHRoaXMudm90ZXNDb3VudCA9IGRhdGEudm90ZXNDb3VudDtcbiAgICB0aGlzLnJhdGluZ1BlcmNlbnQgPSBkYXRhLnJhdGluZ1BlcmNlbnQ7XG4gICAgdGhpcy5yZXZpc2lvbnNDb3VudCA9IGRhdGEucmV2aXNpb25zQ291bnQ7XG4gICAgdGhpcy5wYXJlbnRGdWxsbmFtZSA9IGRhdGEucGFyZW50RnVsbG5hbWU7XG4gICAgdGhpcy50YWdzID0gZGF0YS50YWdzO1xuICAgIHRoaXMuY3JlYXRlZEJ5ID0gZGF0YS5jcmVhdGVkQnk7XG4gICAgdGhpcy5jcmVhdGVkQXQgPSBkYXRhLmNyZWF0ZWRBdDtcbiAgICB0aGlzLnVwZGF0ZWRCeSA9IGRhdGEudXBkYXRlZEJ5O1xuICAgIHRoaXMudXBkYXRlZEF0ID0gZGF0YS51cGRhdGVkQXQ7XG4gICAgdGhpcy5jb21tZW50ZWRCeSA9IGRhdGEuY29tbWVudGVkQnk7XG4gICAgdGhpcy5jb21tZW50ZWRBdCA9IGRhdGEuY29tbWVudGVkQXQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBhZ2UgVVJMXG4gICAqL1xuICBnZXRVcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5zaXRlLmdldEJhc2VVcmwoKX0vJHt0aGlzLmZ1bGxuYW1lfWA7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBwYWdlIElEIGhhcyBiZWVuIGFjcXVpcmVkXG4gICAqL1xuICBpc0lkQWNxdWlyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lkICE9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBwYWdlIElEXG4gICAqL1xuICBnZXQgaWQoKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2lkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBwYWdlIElEXG4gICAqL1xuICBzZXQgaWQodmFsdWU6IG51bWJlciB8IG51bGwpIHtcbiAgICB0aGlzLl9pZCA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzb3VyY2UgY29kZVxuICAgKi9cbiAgZ2V0IHNvdXJjZSgpOiBQYWdlU291cmNlIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3NvdXJjZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgc291cmNlIGNvZGVcbiAgICovXG4gIHNldCBzb3VyY2UodmFsdWU6IFBhZ2VTb3VyY2UgfCBudWxsKSB7XG4gICAgdGhpcy5fc291cmNlID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHJldmlzaW9uIGhpc3RvcnlcbiAgICovXG4gIGdldCByZXZpc2lvbnMoKTogUGFnZVJldmlzaW9uQ29sbGVjdGlvbiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9yZXZpc2lvbnM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHJldmlzaW9uIGhpc3RvcnlcbiAgICovXG4gIHNldCByZXZpc2lvbnModmFsdWU6IFBhZ2VSZXZpc2lvbkNvbGxlY3Rpb24gfCBudWxsKSB7XG4gICAgdGhpcy5fcmV2aXNpb25zID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHZvdGUgaW5mb3JtYXRpb25cbiAgICovXG4gIGdldCB2b3RlcygpOiBQYWdlVm90ZUNvbGxlY3Rpb24gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fdm90ZXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHZvdGUgaW5mb3JtYXRpb25cbiAgICovXG4gIHNldCB2b3Rlcyh2YWx1ZTogUGFnZVZvdGVDb2xsZWN0aW9uIHwgbnVsbCkge1xuICAgIHRoaXMuX3ZvdGVzID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxhdGVzdCByZXZpc2lvblxuICAgKi9cbiAgZ2V0IGxhdGVzdFJldmlzaW9uKCk6IFBhZ2VSZXZpc2lvbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLl9yZXZpc2lvbnMgfHwgdGhpcy5fcmV2aXNpb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gdGhpcy5fcmV2aXNpb25zLnJlZHVjZSgobWF4LCByZXYpID0+IChyZXYucmV2Tm8gPiBtYXgucmV2Tm8gPyByZXYgOiBtYXgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmUgcGFnZSBJRCBpcyBhdmFpbGFibGUgKGF1dG8tYWNxdWlyZSBpZiBub3QgeWV0IGFjcXVpcmVkKVxuICAgKiBAcGFyYW0gb3BlcmF0aW9uIC0gT3BlcmF0aW9uIG5hbWUgKGZvciBlcnJvciBtZXNzYWdlKVxuICAgKiBAdGhyb3dzIElmIElEIGFjcXVpc2l0aW9uIGZhaWxzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZUlkKG9wZXJhdGlvbjogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBpZiAodGhpcy5faWQgPT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFBhZ2VDb2xsZWN0aW9uLmFjcXVpcmVQYWdlSWRzKHRoaXMuc2l0ZSwgW3RoaXNdKTtcbiAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gYWNxdWlyZSBwYWdlIElEIGZvciAke29wZXJhdGlvbn06ICR7cmVzdWx0LmVycm9yLm1lc3NhZ2V9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5faWQgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoYFBhZ2UgSUQgYWNxdWlzaXRpb24gZmFpbGVkIGZvciAke29wZXJhdGlvbn1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2lkO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBwYWdlXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIGRlc3Ryb3koKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBwYWdlSWQgPSBhd2FpdCB0aGlzLmVuc3VyZUlkKCdkZWxldGlvbicpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uOiAnV2lraVBhZ2VBY3Rpb24nLFxuICAgICAgICAgICAgZXZlbnQ6ICdkZWxldGVQYWdlJyxcbiAgICAgICAgICAgIHBhZ2VfaWQ6IHBhZ2VJZCxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdFbXB0eScsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGRlbGV0ZSBwYWdlOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgdGFnc1xuICAgKi9cbiAgQFJlcXVpcmVMb2dpblxuICBjb21taXRUYWdzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcGFnZUlkID0gYXdhaXQgdGhpcy5lbnN1cmVJZCgnc2F2aW5nIHRhZ3MnKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRhZ3M6IHRoaXMudGFncy5qb2luKCcgJyksXG4gICAgICAgICAgICBhY3Rpb246ICdXaWtpUGFnZUFjdGlvbicsXG4gICAgICAgICAgICBldmVudDogJ3NhdmVUYWdzJyxcbiAgICAgICAgICAgIHBhZ2VJZDogcGFnZUlkLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gc2F2ZSB0YWdzOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBwYXJlbnQgcGFnZVxuICAgKiBAcGFyYW0gcGFyZW50RnVsbG5hbWUgLSBQYXJlbnQgcGFnZSBmdWxsbmFtZSAobnVsbCB0byByZW1vdmUpXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIHNldFBhcmVudChwYXJlbnRGdWxsbmFtZTogc3RyaW5nIHwgbnVsbCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcGFnZUlkID0gYXdhaXQgdGhpcy5lbnN1cmVJZCgnc2V0dGluZyBwYXJlbnQnKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ1dpa2lQYWdlQWN0aW9uJyxcbiAgICAgICAgICAgIGV2ZW50OiAnc2V0UGFyZW50UGFnZScsXG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnRW1wdHknLFxuICAgICAgICAgICAgcGFnZUlkOiBTdHJpbmcocGFnZUlkKSxcbiAgICAgICAgICAgIHBhcmVudE5hbWU6IHBhcmVudEZ1bGxuYW1lID8/ICcnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wYXJlbnRGdWxsbmFtZSA9IHBhcmVudEZ1bGxuYW1lO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIHNldCBwYXJlbnQ6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVm90ZSBvbiBwYWdlXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFZvdGUgdmFsdWVcbiAgICogQHJldHVybnMgTmV3IHJhdGluZ1xuICAgKi9cbiAgQFJlcXVpcmVMb2dpblxuICB2b3RlKHZhbHVlOiBudW1iZXIpOiBXaWtpZG90UmVzdWx0QXN5bmM8bnVtYmVyPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcGFnZUlkID0gYXdhaXQgdGhpcy5lbnN1cmVJZCgndm90aW5nJyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhY3Rpb246ICdSYXRlQWN0aW9uJyxcbiAgICAgICAgICAgIGV2ZW50OiAncmF0ZVBhZ2UnLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgICAgIHBhZ2VJZDogcGFnZUlkLFxuICAgICAgICAgICAgcG9pbnRzOiB2YWx1ZSxcbiAgICAgICAgICAgIGZvcmNlOiAneWVzJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRFcnJvcignRW1wdHkgcmVzcG9uc2UgZnJvbSB2b3RlIHJlcXVlc3QnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdSYXRpbmcgPSBOdW1iZXIucGFyc2VJbnQoU3RyaW5nKHJlc3BvbnNlLnBvaW50cyA/PyB0aGlzLnJhdGluZyksIDEwKTtcbiAgICAgICAgdGhpcy5yYXRpbmcgPSBuZXdSYXRpbmc7XG4gICAgICAgIHJldHVybiBuZXdSYXRpbmc7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gdm90ZTogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWwgdm90ZVxuICAgKiBAcmV0dXJucyBOZXcgcmF0aW5nXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIGNhbmNlbFZvdGUoKTogV2lraWRvdFJlc3VsdEFzeW5jPG51bWJlcj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhZ2VJZCA9IGF3YWl0IHRoaXMuZW5zdXJlSWQoJ2NhbmNlbGluZyB2b3RlJyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhY3Rpb246ICdSYXRlQWN0aW9uJyxcbiAgICAgICAgICAgIGV2ZW50OiAnY2FuY2VsVm90ZScsXG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnRW1wdHknLFxuICAgICAgICAgICAgcGFnZUlkOiBwYWdlSWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoJ0VtcHR5IHJlc3BvbnNlIGZyb20gY2FuY2VsIHZvdGUgcmVxdWVzdCcpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld1JhdGluZyA9IE51bWJlci5wYXJzZUludChTdHJpbmcocmVzcG9uc2UucG9pbnRzID8/IHRoaXMucmF0aW5nKSwgMTApO1xuICAgICAgICB0aGlzLnJhdGluZyA9IG5ld1JhdGluZztcbiAgICAgICAgcmV0dXJuIG5ld1JhdGluZztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBjYW5jZWwgdm90ZTogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFZGl0IHRoZSBwYWdlXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gRWRpdCBvcHRpb25zXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIGVkaXQob3B0aW9uczoge1xuICAgIHRpdGxlPzogc3RyaW5nO1xuICAgIHNvdXJjZT86IHN0cmluZztcbiAgICBjb21tZW50Pzogc3RyaW5nO1xuICAgIGZvcmNlRWRpdD86IGJvb2xlYW47XG4gIH0pOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhZ2VJZCA9IGF3YWl0IHRoaXMuZW5zdXJlSWQoJ2VkaXRpbmcnKTtcblxuICAgICAgICAvLyBHZXQgY3VycmVudCBzb3VyY2UgKGlmIG5vdCBzcGVjaWZpZWQpXG4gICAgICAgIGxldCBjdXJyZW50U291cmNlID0gb3B0aW9ucy5zb3VyY2U7XG4gICAgICAgIGlmIChjdXJyZW50U291cmNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb25zdCBleGlzdGluZ1NvdXJjZSA9IHRoaXMuX3NvdXJjZTtcbiAgICAgICAgICBpZiAoZXhpc3RpbmdTb3VyY2UgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGN1cnJlbnRTb3VyY2UgPSBleGlzdGluZ1NvdXJjZS53aWtpVGV4dDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQWNxdWlyZSBzb3VyY2VcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZVJlc3VsdCA9IGF3YWl0IFBhZ2VDb2xsZWN0aW9uLmFjcXVpcmVQYWdlU291cmNlcyh0aGlzLnNpdGUsIFt0aGlzXSk7XG4gICAgICAgICAgICBpZiAoc291cmNlUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICAgICAgdGhyb3cgc291cmNlUmVzdWx0LmVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQWZ0ZXIgYWNxdWlyZVBhZ2VTb3VyY2VzLCB0aGlzLl9zb3VyY2UgaXMgc2V0XG4gICAgICAgICAgICBjdXJyZW50U291cmNlID0gdGhpcy5fc291cmNlPy53aWtpVGV4dCA/PyAnJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQYWdlQ29sbGVjdGlvbi5jcmVhdGVPckVkaXQodGhpcy5zaXRlLCB0aGlzLmZ1bGxuYW1lLCB7XG4gICAgICAgICAgcGFnZUlkLFxuICAgICAgICAgIHRpdGxlOiBvcHRpb25zLnRpdGxlID8/IHRoaXMudGl0bGUsXG4gICAgICAgICAgc291cmNlOiBjdXJyZW50U291cmNlLFxuICAgICAgICAgIGNvbW1lbnQ6IG9wdGlvbnMuY29tbWVudCA/PyAnJyxcbiAgICAgICAgICBmb3JjZUVkaXQ6IG9wdGlvbnMuZm9yY2VFZGl0ID8/IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIEZvcmJpZGRlbkVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZWRpdCBwYWdlOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5hbWUgdGhlIHBhZ2VcbiAgICogQHBhcmFtIG5ld0Z1bGxuYW1lIC0gTmV3IGZ1bGxuYW1lXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIHJlbmFtZShuZXdGdWxsbmFtZTogc3RyaW5nKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBwYWdlSWQgPSBhd2FpdCB0aGlzLmVuc3VyZUlkKCdyZW5hbWluZycpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uOiAnV2lraVBhZ2VBY3Rpb24nLFxuICAgICAgICAgICAgZXZlbnQ6ICdyZW5hbWVQYWdlJyxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdFbXB0eScsXG4gICAgICAgICAgICBwYWdlX2lkOiBwYWdlSWQsXG4gICAgICAgICAgICBuZXdfbmFtZTogbmV3RnVsbG5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICAvLyBVcGRhdGUgcHJvcGVydGllcyAodXNpbmcgT2JqZWN0LmFzc2lnbiBzaW5jZSByZWFkb25seSlcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCB7XG4gICAgICAgICAgZnVsbG5hbWU6IG5ld0Z1bGxuYW1lLFxuICAgICAgICAgIGNhdGVnb3J5OiBuZXdGdWxsbmFtZS5pbmNsdWRlcygnOicpID8gbmV3RnVsbG5hbWUuc3BsaXQoJzonKVswXSA6ICdfZGVmYXVsdCcsXG4gICAgICAgICAgbmFtZTogbmV3RnVsbG5hbWUuaW5jbHVkZXMoJzonKSA/IG5ld0Z1bGxuYW1lLnNwbGl0KCc6JylbMV0gOiBuZXdGdWxsbmFtZSxcbiAgICAgICAgfSk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gcmVuYW1lIHBhZ2U6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxpc3Qgb2YgZmlsZXMgYXR0YWNoZWQgdG8gdGhlIHBhZ2VcbiAgICovXG4gIGdldEZpbGVzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlRmlsZUNvbGxlY3Rpb24+IHtcbiAgICBpZiAodGhpcy5fZmlsZXMgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiBmcm9tUHJvbWlzZShQcm9taXNlLnJlc29sdmUodGhpcy5fZmlsZXMpLCAoZSkgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihTdHJpbmcoZSkpKTtcbiAgICB9XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbmV3IFBhZ2VDb2xsZWN0aW9uKHRoaXMuc2l0ZSwgW3RoaXNdKS5nZXRQYWdlRmlsZXMoKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIC8vIF9maWxlcyBzaG91bGQgYmUgc2V0IGJ5IGdldFBhZ2VGaWxlcygpXG4gICAgICAgIGlmICh0aGlzLl9maWxlcyA9PT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMuX2ZpbGVzID0gbmV3IFBhZ2VGaWxlQ29sbGVjdGlvbih0aGlzLCBbXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbGVzO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCBmaWxlczogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGRpc2N1c3Npb24gdGhyZWFkIGZvciB0aGUgcGFnZVxuICAgKi9cbiAgZ2V0RGlzY3Vzc2lvbigpOiBXaWtpZG90UmVzdWx0QXN5bmM8aW1wb3J0KCcuLi9mb3J1bScpLkZvcnVtVGhyZWFkIHwgbnVsbD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhZ2VJZCA9IGF3YWl0IHRoaXMuZW5zdXJlSWQoJ2dldHRpbmcgZGlzY3Vzc2lvbicpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnZm9ydW0vRm9ydW1Db21tZW50c0xpc3RNb2R1bGUnLFxuICAgICAgICAgICAgcGFnZUlkLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBodG1sID0gU3RyaW5nKHJlc3BvbnNlLmJvZHkgPz8gJycpO1xuICAgICAgICAvLyBFeHRyYWN0IHRocmVhZCBJRFxuICAgICAgICBjb25zdCBtYXRjaCA9IGh0bWwubWF0Y2goXG4gICAgICAgICAgL1dJS0lET1RcXC5tb2R1bGVzXFwuRm9ydW1WaWV3VGhyZWFkTW9kdWxlXFwudmFyc1xcLnRocmVhZElkXFxzKj1cXHMqKFxcZCspL1xuICAgICAgICApO1xuICAgICAgICBpZiAoIW1hdGNoPy5bMV0pIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRocmVhZElkID0gTnVtYmVyLnBhcnNlSW50KG1hdGNoWzFdLCAxMCk7XG5cbiAgICAgICAgLy8gR2V0IEZvcnVtVGhyZWFkXG4gICAgICAgIGNvbnN0IHsgRm9ydW1UaHJlYWQgfSA9IGF3YWl0IGltcG9ydCgnLi4vZm9ydW0nKTtcbiAgICAgICAgY29uc3QgdGhyZWFkUmVzdWx0ID0gYXdhaXQgRm9ydW1UaHJlYWQuZ2V0RnJvbUlkKHRoaXMuc2l0ZSwgdGhyZWFkSWQpO1xuICAgICAgICBpZiAodGhyZWFkUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyB0aHJlYWRSZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRocmVhZFJlc3VsdC52YWx1ZTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgZGlzY3Vzc2lvbjogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGxpc3Qgb2YgbWV0YSB0YWdzIGZvciB0aGUgcGFnZVxuICAgKiBAcmV0dXJucyBNZXRhIHRhZyBjb2xsZWN0aW9uXG4gICAqL1xuICBnZXRNZXRhcygpOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZU1ldGFDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVJZCgnZ2V0dGluZyBtZXRhcycpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQYWdlTWV0YUNvbGxlY3Rpb24uYWNxdWlyZSh0aGlzKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQudmFsdWU7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IG1ldGFzOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIG1ldGEgdGFnXG4gICAqIEBwYXJhbSBuYW1lIC0gTWV0YSB0YWcgbmFtZVxuICAgKiBAcGFyYW0gY29udGVudCAtIE1ldGEgdGFnIHZhbHVlXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIHNldE1ldGEobmFtZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuZW5zdXJlSWQoJ3NldHRpbmcgbWV0YScpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQYWdlTWV0YUNvbGxlY3Rpb24uc2V0TWV0YSh0aGlzLCBuYW1lLCBjb250ZW50KTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gc2V0IG1ldGE6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGEgbWV0YSB0YWdcbiAgICogQHBhcmFtIG5hbWUgLSBNZXRhIHRhZyBuYW1lXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIGRlbGV0ZU1ldGEobmFtZTogc3RyaW5nKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLmVuc3VyZUlkKCdkZWxldGluZyBtZXRhJyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFBhZ2VNZXRhQ29sbGVjdGlvbi5kZWxldGVNZXRhKHRoaXMsIG5hbWUpO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBkZWxldGUgbWV0YTogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcGFnZSBzb3VyY2UgKGF1dG8tYWNxdWlyZSBpZiBub3QgeWV0IGFjcXVpcmVkKVxuICAgKiBAcmV0dXJucyBQYWdlIHNvdXJjZVxuICAgKi9cbiAgZ2V0U291cmNlKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlU291cmNlPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX3NvdXJjZSA9PT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFBhZ2VDb2xsZWN0aW9uLmFjcXVpcmVQYWdlSWRzKHRoaXMuc2l0ZSwgW3RoaXNdKTtcbiAgICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgc291cmNlUmVzdWx0ID0gYXdhaXQgUGFnZUNvbGxlY3Rpb24uYWNxdWlyZVBhZ2VTb3VyY2VzKHRoaXMuc2l0ZSwgW3RoaXNdKTtcbiAgICAgICAgICBpZiAoc291cmNlUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICAgIHRocm93IHNvdXJjZVJlc3VsdC5lcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3NvdXJjZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbignQ2Fubm90IGZpbmQgcGFnZSBzb3VyY2UnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fc291cmNlO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb3RGb3VuZEV4Y2VwdGlvbikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCBzb3VyY2U6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCByZXZpc2lvbiBoaXN0b3J5IChhdXRvLWFjcXVpcmUgaWYgbm90IHlldCBhY3F1aXJlZClcbiAgICogQHJldHVybnMgUmV2aXNpb24gY29sbGVjdGlvblxuICAgKi9cbiAgZ2V0UmV2aXNpb25zKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlUmV2aXNpb25Db2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX3JldmlzaW9ucyA9PT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFBhZ2VDb2xsZWN0aW9uLmFjcXVpcmVQYWdlSWRzKHRoaXMuc2l0ZSwgW3RoaXNdKTtcbiAgICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcmV2UmVzdWx0ID0gYXdhaXQgUGFnZUNvbGxlY3Rpb24uYWNxdWlyZVBhZ2VSZXZpc2lvbnModGhpcy5zaXRlLCBbdGhpc10pO1xuICAgICAgICAgIGlmIChyZXZSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgICAgdGhyb3cgcmV2UmVzdWx0LmVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fcmV2aXNpb25zID09PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKCdDYW5ub3QgZmluZCBwYWdlIHJldmlzaW9ucycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXZpc2lvbnM7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vdEZvdW5kRXhjZXB0aW9uKSByZXR1cm4gZXJyb3I7XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHJldmlzaW9uczogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHZvdGUgaW5mb3JtYXRpb24gKGF1dG8tYWNxdWlyZSBpZiBub3QgeWV0IGFjcXVpcmVkKVxuICAgKiBAcmV0dXJucyBWb3RlIGNvbGxlY3Rpb25cbiAgICovXG4gIGdldFZvdGVzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlVm90ZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5fdm90ZXMgPT09IG51bGwpIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQYWdlQ29sbGVjdGlvbi5hY3F1aXJlUGFnZUlkcyh0aGlzLnNpdGUsIFt0aGlzXSk7XG4gICAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHZvdGVzUmVzdWx0ID0gYXdhaXQgUGFnZUNvbGxlY3Rpb24uYWNxdWlyZVBhZ2VWb3Rlcyh0aGlzLnNpdGUsIFt0aGlzXSk7XG4gICAgICAgICAgaWYgKHZvdGVzUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICAgIHRocm93IHZvdGVzUmVzdWx0LmVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fdm90ZXMgPT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oJ0Nhbm5vdCBmaW5kIHBhZ2Ugdm90ZXMnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fdm90ZXM7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vdEZvdW5kRXhjZXB0aW9uKSByZXR1cm4gZXJyb3I7XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHZvdGVzOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQYWdlKGZ1bGxuYW1lPSR7dGhpcy5mdWxsbmFtZX0sIHRpdGxlPSR7dGhpcy50aXRsZX0pYDtcbiAgfVxufVxuXG4vKipcbiAqIFBhZ2UgY29sbGVjdGlvblxuICovXG5leHBvcnQgY2xhc3MgUGFnZUNvbGxlY3Rpb24gZXh0ZW5kcyBBcnJheTxQYWdlPiB7XG4gIHB1YmxpYyByZWFkb25seSBzaXRlOiBTaXRlO1xuXG4gIGNvbnN0cnVjdG9yKHNpdGU6IFNpdGUsIHBhZ2VzPzogUGFnZVtdKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnNpdGUgPSBzaXRlO1xuICAgIGlmIChwYWdlcykge1xuICAgICAgdGhpcy5wdXNoKC4uLnBhZ2VzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBieSBmdWxsbmFtZVxuICAgKiBAcGFyYW0gZnVsbG5hbWUgLSBQYWdlIGZ1bGxuYW1lXG4gICAqIEByZXR1cm5zIFBhZ2UgKHVuZGVmaW5lZCBpZiBub3QgZm91bmQpXG4gICAqL1xuICBmaW5kQnlGdWxsbmFtZShmdWxsbmFtZTogc3RyaW5nKTogUGFnZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmluZCgocGFnZSkgPT4gcGFnZS5mdWxsbmFtZSA9PT0gZnVsbG5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjcXVpcmUgcGFnZSBJRHMgaW4gYnVsa1xuICAgKi9cbiAgZ2V0UGFnZUlkcygpOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gUGFnZUNvbGxlY3Rpb24uYWNxdWlyZVBhZ2VJZHModGhpcy5zaXRlLCB0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3F1aXJlIHBhZ2Ugc291cmNlcyBpbiBidWxrXG4gICAqL1xuICBnZXRQYWdlU291cmNlcygpOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gUGFnZUNvbGxlY3Rpb24uYWNxdWlyZVBhZ2VTb3VyY2VzKHRoaXMuc2l0ZSwgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQWNxdWlyZSBwYWdlIHJldmlzaW9ucyBpbiBidWxrXG4gICAqL1xuICBnZXRQYWdlUmV2aXNpb25zKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBQYWdlQ29sbGVjdGlvbi5hY3F1aXJlUGFnZVJldmlzaW9ucyh0aGlzLnNpdGUsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjcXVpcmUgcGFnZSB2b3RlcyBpbiBidWxrXG4gICAqL1xuICBnZXRQYWdlVm90ZXMoKTogV2lraWRvdFJlc3VsdEFzeW5jPFBhZ2VDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIFBhZ2VDb2xsZWN0aW9uLmFjcXVpcmVQYWdlVm90ZXModGhpcy5zaXRlLCB0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3F1aXJlIHBhZ2UgZmlsZXMgaW4gYnVsa1xuICAgKi9cbiAgZ2V0UGFnZUZpbGVzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBQYWdlQ29sbGVjdGlvbi5hY3F1aXJlUGFnZUZpbGVzKHRoaXMuc2l0ZSwgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogSW50ZXJuYWwgbWV0aG9kIHRvIGFjcXVpcmUgcGFnZSBmaWxlcyBpbiBidWxrXG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZVBhZ2VGaWxlcyhzaXRlOiBTaXRlLCBwYWdlczogUGFnZVtdKTogV2lraWRvdFJlc3VsdEFzeW5jPFBhZ2VDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0UGFnZXMgPSBwYWdlcy5maWx0ZXIoKHBhZ2UpID0+IHBhZ2UuaWQgIT09IG51bGwpO1xuXG4gICAgICAgIGlmICh0YXJnZXRQYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFBhZ2VDb2xsZWN0aW9uKHNpdGUsIHBhZ2VzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNpdGUuYW1jUmVxdWVzdChcbiAgICAgICAgICB0YXJnZXRQYWdlcy5tYXAoKHBhZ2UpID0+ICh7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnZmlsZXMvUGFnZUZpbGVzTW9kdWxlJyxcbiAgICAgICAgICAgIHBhZ2VfaWQ6IHBhZ2UuaWQsXG4gICAgICAgICAgfSkpXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXJnZXRQYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHBhZ2UgPSB0YXJnZXRQYWdlc1tpXTtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVtpXTtcbiAgICAgICAgICBpZiAoIXBhZ2UgfHwgIXJlc3BvbnNlKSBjb250aW51ZTtcblxuICAgICAgICAgIGNvbnN0IGh0bWwgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChodG1sKTtcbiAgICAgICAgICBjb25zdCBmaWxlcyA9IFBhZ2VGaWxlQ29sbGVjdGlvbi5fcGFyc2VGcm9tSHRtbChwYWdlLCAkKTtcbiAgICAgICAgICBwYWdlLl9maWxlcyA9IG5ldyBQYWdlRmlsZUNvbGxlY3Rpb24ocGFnZSwgZmlsZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQYWdlQ29sbGVjdGlvbihzaXRlLCBwYWdlcyk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSBwYWdlIGZpbGVzOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVybmFsIG1ldGhvZCB0byBhY3F1aXJlIHBhZ2UgSURzIGluIGJ1bGtcbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlUGFnZUlkcyhzaXRlOiBTaXRlLCBwYWdlczogUGFnZVtdKTogV2lraWRvdFJlc3VsdEFzeW5jPFBhZ2VDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0UGFnZXMgPSBwYWdlcy5maWx0ZXIoKHBhZ2UpID0+ICFwYWdlLmlzSWRBY3F1aXJlZCgpKTtcblxuICAgICAgICBpZiAodGFyZ2V0UGFnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBQYWdlQ29sbGVjdGlvbihzaXRlLCBwYWdlcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMaW1pdCBjb25jdXJyZW50IGNvbm5lY3Rpb25zICh1c2luZyBzYW1lIHNlbWFwaG9yZUxpbWl0IGFzIEFNQ0NsaWVudClcbiAgICAgICAgY29uc3QgbGltaXQgPSBwTGltaXQoc2l0ZS5jbGllbnQuYW1jQ2xpZW50LmNvbmZpZy5zZW1hcGhvcmVMaW1pdCk7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IHNpdGUuY2xpZW50LmFtY0NsaWVudC5jb25maWc7XG5cbiAgICAgICAgLy8gQWNjZXNzIHdpdGggbm9yZW5kZXIsIG5vcmVkaXJlY3QgKHdpdGggcmV0cnkpXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIHRhcmdldFBhZ2VzLm1hcCgocGFnZSkgPT5cbiAgICAgICAgICAgIGxpbWl0KGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgdXJsID0gYCR7cGFnZS5nZXRVcmwoKX0vbm9yZW5kZXIvdHJ1ZS9ub3JlZGlyZWN0L3RydWVgO1xuICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoV2l0aFJldHJ5KHVybCwgY29uZmlnLCB7XG4gICAgICAgICAgICAgICAgaGVhZGVyczogc2l0ZS5jbGllbnQuYW1jQ2xpZW50LmhlYWRlci5nZXRIZWFkZXJzKCksXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICByZXR1cm4geyBwYWdlLCByZXNwb25zZSB9O1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICApXG4gICAgICAgICk7XG5cbiAgICAgICAgZm9yIChjb25zdCB7IHBhZ2UsIHJlc3BvbnNlIH0gb2YgcmVzcG9uc2VzKSB7XG4gICAgICAgICAgY29uc3QgdGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgICBjb25zdCBtYXRjaCA9IHRleHQubWF0Y2goL1dJS0lSRVFVRVNUXFwuaW5mb1xcLnBhZ2VJZFxccyo9XFxzKihcXGQrKTsvKTtcbiAgICAgICAgICBpZiAoIW1hdGNoPy5bMV0pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcihgQ2Fubm90IGZpbmQgcGFnZSBpZDogJHtwYWdlLmZ1bGxuYW1lfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwYWdlLmlkID0gTnVtYmVyLnBhcnNlSW50KG1hdGNoWzFdLCAxMCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IFBhZ2VDb2xsZWN0aW9uKHNpdGUsIHBhZ2VzKTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHJldHVybiBlcnJvcjtcbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBhY3F1aXJlIHBhZ2UgSURzOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gYWNxdWlyZSBwYWdlIHNvdXJjZXMgaW4gYnVsa1xuICAgKi9cbiAgc3RhdGljIGFjcXVpcmVQYWdlU291cmNlcyhzaXRlOiBTaXRlLCBwYWdlczogUGFnZVtdKTogV2lraWRvdFJlc3VsdEFzeW5jPFBhZ2VDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0UGFnZXMgPSBwYWdlcy5maWx0ZXIoKHBhZ2UpID0+IHBhZ2Uuc291cmNlID09PSBudWxsICYmIHBhZ2UuaWQgIT09IG51bGwpO1xuXG4gICAgICAgIGlmICh0YXJnZXRQYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFBhZ2VDb2xsZWN0aW9uKHNpdGUsIHBhZ2VzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNpdGUuYW1jUmVxdWVzdChcbiAgICAgICAgICB0YXJnZXRQYWdlcy5tYXAoKHBhZ2UpID0+ICh7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAndmlld3NvdXJjZS9WaWV3U291cmNlTW9kdWxlJyxcbiAgICAgICAgICAgIHBhZ2VfaWQ6IHBhZ2UuaWQsXG4gICAgICAgICAgfSkpXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXJnZXRQYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHBhZ2UgPSB0YXJnZXRQYWdlc1tpXTtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVtpXTtcbiAgICAgICAgICBpZiAoIXBhZ2UgfHwgIXJlc3BvbnNlKSBjb250aW51ZTtcbiAgICAgICAgICBjb25zdCBib2R5ID0gU3RyaW5nKHJlc3BvbnNlLmJvZHkgPz8gJycpLnJlcGxhY2UoLyZuYnNwOy9nLCAnICcpO1xuICAgICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoYm9keSk7XG4gICAgICAgICAgY29uc3Qgc291cmNlRWxlbWVudCA9ICQoJ2Rpdi5wYWdlLXNvdXJjZScpO1xuICAgICAgICAgIGlmIChzb3VyY2VFbGVtZW50Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKGBDYW5ub3QgZmluZCBzb3VyY2UgZWxlbWVudCBmb3IgcGFnZTogJHtwYWdlLmZ1bGxuYW1lfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB3aWtpVGV4dCA9IHNvdXJjZUVsZW1lbnQudGV4dCgpLnRyaW0oKS5yZXBsYWNlKC9eXFx0LywgJycpO1xuICAgICAgICAgIHBhZ2Uuc291cmNlID0gbmV3IFBhZ2VTb3VyY2UoeyBwYWdlLCB3aWtpVGV4dCB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgUGFnZUNvbGxlY3Rpb24oc2l0ZSwgcGFnZXMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgcGFnZSBzb3VyY2VzOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gYWNxdWlyZSBwYWdlIHJldmlzaW9ucyBpbiBidWxrXG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZVBhZ2VSZXZpc2lvbnMoc2l0ZTogU2l0ZSwgcGFnZXM6IFBhZ2VbXSk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRhcmdldFBhZ2VzID0gcGFnZXMuZmlsdGVyKChwYWdlKSA9PiBwYWdlLnJldmlzaW9ucyA9PT0gbnVsbCAmJiBwYWdlLmlkICE9PSBudWxsKTtcblxuICAgICAgICBpZiAodGFyZ2V0UGFnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBQYWdlQ29sbGVjdGlvbihzaXRlLCBwYWdlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzaXRlLmFtY1JlcXVlc3RXaXRoUmV0cnkoXG4gICAgICAgICAgdGFyZ2V0UGFnZXMubWFwKChwYWdlKSA9PiAoe1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2hpc3RvcnkvUGFnZVJldmlzaW9uTGlzdE1vZHVsZScsXG4gICAgICAgICAgICBwYWdlX2lkOiBwYWdlLmlkLFxuICAgICAgICAgICAgb3B0aW9uczogeyBhbGw6IHRydWUgfSxcbiAgICAgICAgICAgIHBlcnBhZ2U6IDEwMDAwMDAwMCxcbiAgICAgICAgICB9KSlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQYXJzZSByZXZpc2lvbnNcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXJnZXRQYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHBhZ2UgPSB0YXJnZXRQYWdlc1tpXTtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVtpXTtcbiAgICAgICAgICBpZiAoIXBhZ2UgfHwgIXJlc3BvbnNlKSBjb250aW51ZTtcblxuICAgICAgICAgIGNvbnN0IGJvZHkgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChib2R5KTtcbiAgICAgICAgICBjb25zdCByZXZpc2lvbnM6IFBhZ2VSZXZpc2lvbltdID0gW107XG5cbiAgICAgICAgICAkKCd0YWJsZS5wYWdlLWhpc3RvcnkgdHJbaWRePVwicmV2aXNpb24tcm93LVwiXScpLmVhY2goKF9qLCByZXZFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCAkcmV2ID0gJChyZXZFbGVtZW50KTtcbiAgICAgICAgICAgIGNvbnN0IHJldklkQXR0ciA9ICRyZXYuYXR0cignaWQnKTtcbiAgICAgICAgICAgIGlmICghcmV2SWRBdHRyKSByZXR1cm47XG5cbiAgICAgICAgICAgIGNvbnN0IHJldklkID0gTnVtYmVyLnBhcnNlSW50KHJldklkQXR0ci5yZXBsYWNlKCdyZXZpc2lvbi1yb3ctJywgJycpLCAxMCk7XG4gICAgICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKHJldklkKSkgcmV0dXJuO1xuXG4gICAgICAgICAgICBjb25zdCAkdGRzID0gJHJldi5maW5kKCd0ZCcpO1xuICAgICAgICAgICAgaWYgKCR0ZHMubGVuZ3RoIDwgNykgcmV0dXJuO1xuXG4gICAgICAgICAgICBjb25zdCByZXZOb1RleHQgPSAkdGRzLmVxKDApLnRleHQoKS50cmltKCkucmVwbGFjZSgvXFwuJC8sICcnKTtcbiAgICAgICAgICAgIGNvbnN0IHJldk5vID0gTnVtYmVyLnBhcnNlSW50KHJldk5vVGV4dCwgMTApO1xuICAgICAgICAgICAgaWYgKE51bWJlci5pc05hTihyZXZObykpIHJldHVybjtcblxuICAgICAgICAgICAgY29uc3QgJGNyZWF0ZWRCeUVsZW0gPSAkdGRzLmVxKDQpLmZpbmQoJ3NwYW4ucHJpbnR1c2VyJyk7XG4gICAgICAgICAgICBpZiAoJGNyZWF0ZWRCeUVsZW0ubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICAgICAgICBjb25zdCBjcmVhdGVkQnkgPSBwYXJzZVVzZXIoc2l0ZS5jbGllbnQsICRjcmVhdGVkQnlFbGVtIGFzIENoZWVyaW88QW55Tm9kZT4pO1xuXG4gICAgICAgICAgICBjb25zdCAkY3JlYXRlZEF0RWxlbSA9ICR0ZHMuZXEoNSkuZmluZCgnc3Bhbi5vZGF0ZScpO1xuICAgICAgICAgICAgaWYgKCRjcmVhdGVkQXRFbGVtLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgY3JlYXRlZEF0ID0gcGFyc2VPZGF0ZSgkY3JlYXRlZEF0RWxlbSBhcyBDaGVlcmlvPEFueU5vZGU+KSA/PyBuZXcgRGF0ZSgpO1xuXG4gICAgICAgICAgICBjb25zdCBjb21tZW50ID0gJHRkcy5lcSg2KS50ZXh0KCkudHJpbSgpO1xuXG4gICAgICAgICAgICByZXZpc2lvbnMucHVzaChcbiAgICAgICAgICAgICAgbmV3IFBhZ2VSZXZpc2lvbih7XG4gICAgICAgICAgICAgICAgcGFnZSxcbiAgICAgICAgICAgICAgICBpZDogcmV2SWQsXG4gICAgICAgICAgICAgICAgcmV2Tm8sXG4gICAgICAgICAgICAgICAgY3JlYXRlZEJ5LFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRBdCxcbiAgICAgICAgICAgICAgICBjb21tZW50LFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHBhZ2UucmV2aXNpb25zID0gbmV3IFBhZ2VSZXZpc2lvbkNvbGxlY3Rpb24ocGFnZSwgcmV2aXNpb25zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgUGFnZUNvbGxlY3Rpb24oc2l0ZSwgcGFnZXMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgcGFnZSByZXZpc2lvbnM6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSW50ZXJuYWwgbWV0aG9kIHRvIGFjcXVpcmUgcGFnZSB2b3RlcyBpbiBidWxrXG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZVBhZ2VWb3RlcyhzaXRlOiBTaXRlLCBwYWdlczogUGFnZVtdKTogV2lraWRvdFJlc3VsdEFzeW5jPFBhZ2VDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0UGFnZXMgPSBwYWdlcy5maWx0ZXIoKHBhZ2UpID0+IHBhZ2Uudm90ZXMgPT09IG51bGwgJiYgcGFnZS5pZCAhPT0gbnVsbCk7XG5cbiAgICAgICAgaWYgKHRhcmdldFBhZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBuZXcgUGFnZUNvbGxlY3Rpb24oc2l0ZSwgcGFnZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0V2l0aFJldHJ5KFxuICAgICAgICAgIHRhcmdldFBhZ2VzLm1hcCgocGFnZSkgPT4gKHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdwYWdlcmF0ZS9XaG9SYXRlZFBhZ2VNb2R1bGUnLFxuICAgICAgICAgICAgcGFnZUlkOiBwYWdlLmlkLFxuICAgICAgICAgIH0pKVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBhcnNlIHZvdGVzXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFyZ2V0UGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBwYWdlID0gdGFyZ2V0UGFnZXNbaV07XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbaV07XG4gICAgICAgICAgaWYgKCFwYWdlIHx8ICFyZXNwb25zZSkgY29udGludWU7XG5cbiAgICAgICAgICBjb25zdCBib2R5ID0gU3RyaW5nKHJlc3BvbnNlLmJvZHkgPz8gJycpO1xuICAgICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoYm9keSk7XG5cbiAgICAgICAgICBjb25zdCAkdXNlckVsZW1zID0gJCgnc3Bhbi5wcmludHVzZXInKTtcbiAgICAgICAgICBjb25zdCAkdmFsdWVFbGVtcyA9ICQoXCJzcGFuW3N0eWxlXj0nY29sb3InXVwiKTtcblxuICAgICAgICAgIGlmICgkdXNlckVsZW1zLmxlbmd0aCAhPT0gJHZhbHVlRWxlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEVycm9yKCdVc2VyIGFuZCB2YWx1ZSBjb3VudCBtaXNtYXRjaCBpbiB2b3RlcycpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHZvdGVzOiBQYWdlVm90ZVtdID0gW107XG4gICAgICAgICAgJHVzZXJFbGVtcy5lYWNoKChqLCB1c2VyRWxlbSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgJHVzZXIgPSAkKHVzZXJFbGVtKTtcbiAgICAgICAgICAgIGNvbnN0ICR2YWx1ZSA9ICR2YWx1ZUVsZW1zLmVxKGopO1xuXG4gICAgICAgICAgICBjb25zdCB1c2VyID0gcGFyc2VVc2VyKHNpdGUuY2xpZW50LCAkdXNlciBhcyBDaGVlcmlvPEFueU5vZGU+KTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlVGV4dCA9ICR2YWx1ZS50ZXh0KCkudHJpbSgpO1xuXG4gICAgICAgICAgICBsZXQgdmFsdWU6IG51bWJlcjtcbiAgICAgICAgICAgIGlmICh2YWx1ZVRleHQgPT09ICcrJykge1xuICAgICAgICAgICAgICB2YWx1ZSA9IDE7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlVGV4dCA9PT0gJy0nKSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gLTE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB2YWx1ZSA9IE51bWJlci5wYXJzZUludCh2YWx1ZVRleHQsIDEwKSB8fCAwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2b3Rlcy5wdXNoKG5ldyBQYWdlVm90ZSh7IHBhZ2UsIHVzZXIsIHZhbHVlIH0pKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHBhZ2Uudm90ZXMgPSBuZXcgUGFnZVZvdGVDb2xsZWN0aW9uKHBhZ2UsIHZvdGVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgUGFnZUNvbGxlY3Rpb24oc2l0ZSwgcGFnZXMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgcGFnZSB2b3RlczogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBMaXN0UGFnZXNNb2R1bGUgcmVzcG9uc2VcbiAgICovXG4gIHN0YXRpYyBwYXJzZShcbiAgICBzaXRlOiBTaXRlLFxuICAgIGh0bWxCb2R5OiBjaGVlcmlvLkNoZWVyaW9BUEksXG4gICAgX3BhcnNlVXNlcjogKGVsZW1lbnQ6IGNoZWVyaW8uQ2hlZXJpbzxBbnlOb2RlPikgPT4gQWJzdHJhY3RVc2VyXG4gICk6IFBhZ2VDb2xsZWN0aW9uIHtcbiAgICBjb25zdCBwYWdlczogUGFnZVtdID0gW107XG5cbiAgICBodG1sQm9keSgnZGl2LnBhZ2UnKS5lYWNoKChfaSwgcGFnZUVsZW1lbnQpID0+IHtcbiAgICAgIGNvbnN0ICRwYWdlID0gaHRtbEJvZHkocGFnZUVsZW1lbnQpO1xuICAgICAgY29uc3QgcGFnZVBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAgICAgLy8gQ2hlY2sgZm9yIDUtc3RhciByYXRpbmdcbiAgICAgIGNvbnN0IGlzNVN0YXJSYXRpbmcgPSAkcGFnZS5maW5kKCdzcGFuLnJhdGluZyBzcGFuLnBhZ2UtcmF0ZS1saXN0LXBhZ2VzLXN0YXJ0JykubGVuZ3RoID4gMDtcblxuICAgICAgLy8gR2V0IGVhY2ggdmFsdWVcbiAgICAgICRwYWdlLmZpbmQoJ3NwYW4uc2V0JykuZWFjaCgoX2osIHNldEVsZW1lbnQpID0+IHtcbiAgICAgICAgY29uc3QgJHNldCA9IGh0bWxCb2R5KHNldEVsZW1lbnQpO1xuICAgICAgICBjb25zdCBrZXlFbGVtZW50ID0gJHNldC5maW5kKCdzcGFuLm5hbWUnKTtcbiAgICAgICAgaWYgKGtleUVsZW1lbnQubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgbGV0IGtleSA9IGtleUVsZW1lbnQudGV4dCgpLnRyaW0oKTtcbiAgICAgICAgY29uc3QgdmFsdWVFbGVtZW50ID0gJHNldC5maW5kKCdzcGFuLnZhbHVlJyk7XG5cbiAgICAgICAgbGV0IHZhbHVlOiB1bmtub3duID0gbnVsbDtcblxuICAgICAgICBpZiAodmFsdWVFbGVtZW50Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHZhbHVlID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmIChbJ2NyZWF0ZWRfYXQnLCAndXBkYXRlZF9hdCcsICdjb21tZW50ZWRfYXQnXS5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgY29uc3Qgb2RhdGVFbGVtZW50ID0gdmFsdWVFbGVtZW50LmZpbmQoJ3NwYW4ub2RhdGUnKTtcbiAgICAgICAgICBpZiAob2RhdGVFbGVtZW50Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IG9kYXRlRWxlbWVudC5hdHRyKCdjbGFzcycpPy5tYXRjaCgvdGltZV8oXFxkKykvKT8uWzFdO1xuICAgICAgICAgICAgdmFsdWUgPSB0aW1lc3RhbXAgPyBuZXcgRGF0ZShOdW1iZXIucGFyc2VJbnQodGltZXN0YW1wLCAxMCkgKiAxMDAwKSA6IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIFsnY3JlYXRlZF9ieV9saW5rZWQnLCAndXBkYXRlZF9ieV9saW5rZWQnLCAnY29tbWVudGVkX2J5X2xpbmtlZCddLmluY2x1ZGVzKGtleSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgcHJpbnR1c2VyRWxlbWVudCA9IHZhbHVlRWxlbWVudC5maW5kKCdzcGFuLnByaW50dXNlcicpO1xuICAgICAgICAgIGlmIChwcmludHVzZXJFbGVtZW50Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHZhbHVlID0gX3BhcnNlVXNlcihwcmludHVzZXJFbGVtZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoWyd0YWdzJywgJ190YWdzJ10uaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgIHZhbHVlID0gdmFsdWVFbGVtZW50LnRleHQoKS5zcGxpdCgvXFxzKy8pLmZpbHRlcihCb29sZWFuKTtcbiAgICAgICAgfSBlbHNlIGlmIChbJ3JhdGluZ192b3RlcycsICdjb21tZW50cycsICdzaXplJywgJ3JldmlzaW9ucyddLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICB2YWx1ZSA9IE51bWJlci5wYXJzZUludCh2YWx1ZUVsZW1lbnQudGV4dCgpLnRyaW0oKSwgMTApIHx8IDA7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAncmF0aW5nJykge1xuICAgICAgICAgIGNvbnN0IHJhdGluZ1RleHQgPSB2YWx1ZUVsZW1lbnQudGV4dCgpLnRyaW0oKTtcbiAgICAgICAgICB2YWx1ZSA9IGlzNVN0YXJSYXRpbmdcbiAgICAgICAgICAgID8gTnVtYmVyLnBhcnNlRmxvYXQocmF0aW5nVGV4dCkgfHwgMFxuICAgICAgICAgICAgOiBOdW1iZXIucGFyc2VJbnQocmF0aW5nVGV4dCwgMTApIHx8IDA7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAncmF0aW5nX3BlcmNlbnQnKSB7XG4gICAgICAgICAgaWYgKGlzNVN0YXJSYXRpbmcpIHtcbiAgICAgICAgICAgIHZhbHVlID0gKE51bWJlci5wYXJzZUZsb2F0KHZhbHVlRWxlbWVudC50ZXh0KCkudHJpbSgpKSB8fCAwKSAvIDEwMDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWUgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlRWxlbWVudC50ZXh0KCkudHJpbSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gS2V5IGNvbnZlcnNpb25cbiAgICAgICAgaWYgKGtleS5pbmNsdWRlcygnX2xpbmtlZCcpKSB7XG4gICAgICAgICAga2V5ID0ga2V5LnJlcGxhY2UoJ19saW5rZWQnLCAnJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoWydjb21tZW50cycsICdjaGlsZHJlbicsICdyZXZpc2lvbnMnXS5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAga2V5ID0gYCR7a2V5fV9jb3VudGA7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAncmF0aW5nX3ZvdGVzJykge1xuICAgICAgICAgIGtleSA9ICd2b3Rlc19jb3VudCc7XG4gICAgICAgIH1cblxuICAgICAgICBwYWdlUGFyYW1zW2tleV0gPSB2YWx1ZTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBNZXJnZSB0YWdzXG4gICAgICBjb25zdCB0YWdzID0gQXJyYXkuaXNBcnJheShwYWdlUGFyYW1zLnRhZ3MpID8gcGFnZVBhcmFtcy50YWdzIDogW107XG4gICAgICBjb25zdCBoaWRkZW5UYWdzID0gQXJyYXkuaXNBcnJheShwYWdlUGFyYW1zLl90YWdzKSA/IHBhZ2VQYXJhbXMuX3RhZ3MgOiBbXTtcbiAgICAgIHBhZ2VQYXJhbXMudGFncyA9IFsuLi50YWdzLCAuLi5oaWRkZW5UYWdzXTtcblxuICAgICAgLy8gVmFsaWRhdGUgd2l0aCBab2Qgc2NoZW1hIGFuZCBhcHBseSBkZWZhdWx0c1xuICAgICAgY29uc3QgcGFyc2VkID0gcGFnZVBhcmFtc1NjaGVtYS5wYXJzZShwYWdlUGFyYW1zKTtcblxuICAgICAgLy8gQ3JlYXRlIFBhZ2Ugb2JqZWN0XG4gICAgICBwYWdlcy5wdXNoKFxuICAgICAgICBuZXcgUGFnZSh7XG4gICAgICAgICAgc2l0ZSxcbiAgICAgICAgICBmdWxsbmFtZTogcGFyc2VkLmZ1bGxuYW1lLFxuICAgICAgICAgIG5hbWU6IHBhcnNlZC5uYW1lLFxuICAgICAgICAgIGNhdGVnb3J5OiBwYXJzZWQuY2F0ZWdvcnksXG4gICAgICAgICAgdGl0bGU6IHBhcnNlZC50aXRsZSxcbiAgICAgICAgICBjaGlsZHJlbkNvdW50OiBwYXJzZWQuY2hpbGRyZW5fY291bnQsXG4gICAgICAgICAgY29tbWVudHNDb3VudDogcGFyc2VkLmNvbW1lbnRzX2NvdW50LFxuICAgICAgICAgIHNpemU6IHBhcnNlZC5zaXplLFxuICAgICAgICAgIHJhdGluZzogcGFyc2VkLnJhdGluZyxcbiAgICAgICAgICB2b3Rlc0NvdW50OiBwYXJzZWQudm90ZXNfY291bnQsXG4gICAgICAgICAgcmF0aW5nUGVyY2VudDogcGFyc2VkLnJhdGluZ19wZXJjZW50LFxuICAgICAgICAgIHJldmlzaW9uc0NvdW50OiBwYXJzZWQucmV2aXNpb25zX2NvdW50LFxuICAgICAgICAgIHBhcmVudEZ1bGxuYW1lOiBwYXJzZWQucGFyZW50X2Z1bGxuYW1lLFxuICAgICAgICAgIHRhZ3M6IHBhcnNlZC50YWdzLFxuICAgICAgICAgIGNyZWF0ZWRCeTogcGFyc2VkLmNyZWF0ZWRfYnksXG4gICAgICAgICAgY3JlYXRlZEF0OiBwYXJzZWQuY3JlYXRlZF9hdCA/PyBuZXcgRGF0ZSgpLFxuICAgICAgICAgIHVwZGF0ZWRCeTogcGFyc2VkLnVwZGF0ZWRfYnksXG4gICAgICAgICAgdXBkYXRlZEF0OiBwYXJzZWQudXBkYXRlZF9hdCA/PyBuZXcgRGF0ZSgpLFxuICAgICAgICAgIGNvbW1lbnRlZEJ5OiBwYXJzZWQuY29tbWVudGVkX2J5LFxuICAgICAgICAgIGNvbW1lbnRlZEF0OiBwYXJzZWQuY29tbWVudGVkX2F0LFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgUGFnZUNvbGxlY3Rpb24oc2l0ZSwgcGFnZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlYXJjaCBwYWdlc1xuICAgKi9cbiAgc3RhdGljIHNlYXJjaFBhZ2VzKFxuICAgIHNpdGU6IFNpdGUsXG4gICAgcGFyc2VVc2VyOiAoZWxlbWVudDogY2hlZXJpby5DaGVlcmlvPEFueU5vZGU+KSA9PiBBYnN0cmFjdFVzZXIsXG4gICAgcXVlcnk6IFNlYXJjaFBhZ2VzUXVlcnkgfCBudWxsID0gbnVsbFxuICApOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBxID0gcXVlcnkgPz8gbmV3IFNlYXJjaFBhZ2VzUXVlcnkoKTtcbiAgICAgICAgY29uc3QgcXVlcnlEaWN0ID0gcS5hc0RpY3QoKTtcblxuICAgICAgICAvLyBHZW5lcmF0ZSBtb2R1bGUgYm9keVxuICAgICAgICBjb25zdCBtb2R1bGVCb2R5ID0gYFtbZGl2IGNsYXNzPVwicGFnZVwiXV1cXG4ke0RFRkFVTFRfTU9EVUxFX0JPRFkubWFwKFxuICAgICAgICAgIChrZXkpID0+XG4gICAgICAgICAgICBgW1tzcGFuIGNsYXNzPVwic2V0ICR7a2V5fVwiXV1bW3NwYW4gY2xhc3M9XCJuYW1lXCJdXSAke2tleX0gW1svc3Bhbl1dW1tzcGFuIGNsYXNzPVwidmFsdWVcIl1dICUlJHtrZXl9JSUgW1svc3Bhbl1dW1svc3Bhbl1dYFxuICAgICAgICApLmpvaW4oJycpfVxcbltbL2Rpdl1dYDtcblxuICAgICAgICBjb25zdCByZXF1ZXN0Qm9keSA9IHtcbiAgICAgICAgICAuLi5xdWVyeURpY3QsXG4gICAgICAgICAgbW9kdWxlTmFtZTogJ2xpc3QvTGlzdFBhZ2VzTW9kdWxlJyxcbiAgICAgICAgICBtb2R1bGVfYm9keTogbW9kdWxlQm9keSxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzaXRlLmFtY1JlcXVlc3QoW3JlcXVlc3RCb2R5XSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIGlmIChyZXN1bHQuZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnbm90X29rJykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBGb3JiaWRkZW5FcnJvcignRmFpbGVkIHRvIGdldCBwYWdlcywgdGFyZ2V0IHNpdGUgbWF5IGJlIHByaXZhdGUnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlyc3RSZXNwb25zZSA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgY29uc3QgYm9keSA9IFN0cmluZyhmaXJzdFJlc3BvbnNlPy5ib2R5ID8/ICcnKTtcbiAgICAgICAgY29uc3QgJGZpcnN0ID0gY2hlZXJpby5sb2FkKGJvZHkpO1xuXG4gICAgICAgIGxldCB0b3RhbCA9IDE7XG4gICAgICAgIGNvbnN0IGh0bWxCb2RpZXM6IGNoZWVyaW8uQ2hlZXJpb0FQSVtdID0gWyRmaXJzdF07XG5cbiAgICAgICAgLy8gQ2hlY2sgcGFnaW5hdGlvblxuICAgICAgICBjb25zdCBwYWdlckVsZW1lbnQgPSAkZmlyc3QoJ2Rpdi5wYWdlcicpO1xuICAgICAgICBpZiAocGFnZXJFbGVtZW50Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBsYXN0UGFnZXJFbGVtZW50cyA9ICRmaXJzdCgnZGl2LnBhZ2VyIHNwYW4udGFyZ2V0Jyk7XG4gICAgICAgICAgaWYgKGxhc3RQYWdlckVsZW1lbnRzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICBjb25zdCBzZWNvbmRMYXN0UGFnZXIgPSAkZmlyc3QobGFzdFBhZ2VyRWxlbWVudHNbbGFzdFBhZ2VyRWxlbWVudHMubGVuZ3RoIC0gMl0pO1xuICAgICAgICAgICAgY29uc3QgbGFzdFBhZ2VyTGluayA9IHNlY29uZExhc3RQYWdlci5maW5kKCdhJyk7XG4gICAgICAgICAgICBpZiAobGFzdFBhZ2VyTGluay5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHRvdGFsID0gTnVtYmVyLnBhcnNlSW50KGxhc3RQYWdlckxpbmsudGV4dCgpLnRyaW0oKSwgMTApIHx8IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IGFkZGl0aW9uYWwgcGFnZXNcbiAgICAgICAgaWYgKHRvdGFsID4gMSkge1xuICAgICAgICAgIGNvbnN0IGFkZGl0aW9uYWxCb2RpZXM6IEFNQ1JlcXVlc3RCb2R5W10gPSBbXTtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHRvdGFsOyBpKyspIHtcbiAgICAgICAgICAgIGFkZGl0aW9uYWxCb2RpZXMucHVzaCh7XG4gICAgICAgICAgICAgIC4uLnF1ZXJ5RGljdCxcbiAgICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2xpc3QvTGlzdFBhZ2VzTW9kdWxlJyxcbiAgICAgICAgICAgICAgbW9kdWxlX2JvZHk6IG1vZHVsZUJvZHksXG4gICAgICAgICAgICAgIG9mZnNldDogaSAqIChxLnBlclBhZ2UgPz8gREVGQVVMVF9QRVJfUEFHRSksXG4gICAgICAgICAgICB9IGFzIEFNQ1JlcXVlc3RCb2R5KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBhZGRpdGlvbmFsUmVzdWx0cyA9IGF3YWl0IHNpdGUuYW1jUmVxdWVzdChhZGRpdGlvbmFsQm9kaWVzKTtcbiAgICAgICAgICBpZiAoYWRkaXRpb25hbFJlc3VsdHMuaXNFcnIoKSkge1xuICAgICAgICAgICAgdGhyb3cgYWRkaXRpb25hbFJlc3VsdHMuZXJyb3I7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yIChjb25zdCByZXNwb25zZSBvZiBhZGRpdGlvbmFsUmVzdWx0cy52YWx1ZSkge1xuICAgICAgICAgICAgY29uc3QgcmVzcEJvZHkgPSBTdHJpbmcocmVzcG9uc2U/LmJvZHkgPz8gJycpO1xuICAgICAgICAgICAgaHRtbEJvZGllcy5wdXNoKGNoZWVyaW8ubG9hZChyZXNwQm9keSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBhcnNlXG4gICAgICAgIGNvbnN0IHBhZ2VzOiBQYWdlW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCAkaHRtbCBvZiBodG1sQm9kaWVzKSB7XG4gICAgICAgICAgY29uc3QgcGFyc2VkID0gUGFnZUNvbGxlY3Rpb24ucGFyc2Uoc2l0ZSwgJGh0bWwsIHBhcnNlVXNlcik7XG4gICAgICAgICAgcGFnZXMucHVzaCguLi5wYXJzZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQYWdlQ29sbGVjdGlvbihzaXRlLCBwYWdlcyk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEZvcmJpZGRlbkVycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgTm90Rm91bmRFeGNlcHRpb24pIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBzZWFyY2ggcGFnZXM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBvciBlZGl0IGEgcGFnZVxuICAgKi9cbiAgc3RhdGljIGNyZWF0ZU9yRWRpdChcbiAgICBzaXRlOiBTaXRlLFxuICAgIGZ1bGxuYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9uczoge1xuICAgICAgcGFnZUlkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAgIHRpdGxlPzogc3RyaW5nO1xuICAgICAgc291cmNlPzogc3RyaW5nO1xuICAgICAgY29tbWVudD86IHN0cmluZztcbiAgICAgIGZvcmNlRWRpdD86IGJvb2xlYW47XG4gICAgICByYWlzZU9uRXhpc3RzPzogYm9vbGVhbjtcbiAgICB9ID0ge31cbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICBjb25zdCBsb2dpblJlc3VsdCA9IHNpdGUuY2xpZW50LnJlcXVpcmVMb2dpbigpO1xuICAgIGlmIChsb2dpblJlc3VsdC5pc0VycigpKSB7XG4gICAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAgIFByb21pc2UucmVqZWN0KGxvZ2luUmVzdWx0LmVycm9yKSxcbiAgICAgICAgKCkgPT4gbmV3IExvZ2luUmVxdWlyZWRFcnJvcignTG9naW4gcmVxdWlyZWQgdG8gY3JlYXRlL2VkaXQgcGFnZScpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBwYWdlSWQgPSBudWxsLFxuICAgICAgICAgIHRpdGxlID0gJycsXG4gICAgICAgICAgc291cmNlID0gJycsXG4gICAgICAgICAgY29tbWVudCA9ICcnLFxuICAgICAgICAgIGZvcmNlRWRpdCA9IGZhbHNlLFxuICAgICAgICAgIHJhaXNlT25FeGlzdHMgPSBmYWxzZSxcbiAgICAgICAgfSA9IG9wdGlvbnM7XG5cbiAgICAgICAgLy8gQWNxdWlyZSBwYWdlIGxvY2tcbiAgICAgICAgY29uc3QgbG9ja1JlcXVlc3RCb2R5OiBBTUNSZXF1ZXN0Qm9keSA9IHtcbiAgICAgICAgICBtb2RlOiAncGFnZScsXG4gICAgICAgICAgd2lraV9wYWdlOiBmdWxsbmFtZSxcbiAgICAgICAgICBtb2R1bGVOYW1lOiAnZWRpdC9QYWdlRWRpdE1vZHVsZScsXG4gICAgICAgIH07XG4gICAgICAgIGlmIChmb3JjZUVkaXQpIHtcbiAgICAgICAgICBsb2NrUmVxdWVzdEJvZHkuZm9yY2VfbG9jayA9ICd5ZXMnO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbG9ja1Jlc3VsdCA9IGF3YWl0IHNpdGUuYW1jUmVxdWVzdChbbG9ja1JlcXVlc3RCb2R5XSk7XG4gICAgICAgIGlmIChsb2NrUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBsb2NrUmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbG9ja1Jlc3BvbnNlID0gbG9ja1Jlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKGxvY2tSZXNwb25zZT8ubG9ja2VkIHx8IGxvY2tSZXNwb25zZT8ub3RoZXJfbG9ja3MpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEVycm9yKGBQYWdlICR7ZnVsbG5hbWV9IGlzIGxvY2tlZCBvciBvdGhlciBsb2NrcyBleGlzdGApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaXNFeGlzdCA9ICdwYWdlX3JldmlzaW9uX2lkJyBpbiAobG9ja1Jlc3BvbnNlID8/IHt9KTtcblxuICAgICAgICBpZiAocmFpc2VPbkV4aXN0cyAmJiBpc0V4aXN0KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFRhcmdldEV4aXN0c0Vycm9yKGBQYWdlICR7ZnVsbG5hbWV9IGFscmVhZHkgZXhpc3RzYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNFeGlzdCAmJiBwYWdlSWQgPT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEVycm9yKCdwYWdlX2lkIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gZWRpdGluZyBleGlzdGluZyBwYWdlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsb2NrSWQgPSBTdHJpbmcobG9ja1Jlc3BvbnNlPy5sb2NrX2lkID8/ICcnKTtcbiAgICAgICAgY29uc3QgbG9ja1NlY3JldCA9IFN0cmluZyhsb2NrUmVzcG9uc2U/LmxvY2tfc2VjcmV0ID8/ICcnKTtcbiAgICAgICAgY29uc3QgcGFnZVJldmlzaW9uSWQgPSBTdHJpbmcobG9ja1Jlc3BvbnNlPy5wYWdlX3JldmlzaW9uX2lkID8/ICcnKTtcblxuICAgICAgICAvLyBTYXZlIHBhZ2VcbiAgICAgICAgY29uc3QgZWRpdFJlcXVlc3RCb2R5OiBBTUNSZXF1ZXN0Qm9keSA9IHtcbiAgICAgICAgICBhY3Rpb246ICdXaWtpUGFnZUFjdGlvbicsXG4gICAgICAgICAgZXZlbnQ6ICdzYXZlUGFnZScsXG4gICAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgICBtb2RlOiAncGFnZScsXG4gICAgICAgICAgbG9ja19pZDogbG9ja0lkLFxuICAgICAgICAgIGxvY2tfc2VjcmV0OiBsb2NrU2VjcmV0LFxuICAgICAgICAgIHJldmlzaW9uX2lkOiBwYWdlUmV2aXNpb25JZCxcbiAgICAgICAgICB3aWtpX3BhZ2U6IGZ1bGxuYW1lLFxuICAgICAgICAgIHBhZ2VfaWQ6IHBhZ2VJZCA/PyAnJyxcbiAgICAgICAgICB0aXRsZSxcbiAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgY29tbWVudHM6IGNvbW1lbnQsXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgZWRpdFJlc3VsdCA9IGF3YWl0IHNpdGUuYW1jUmVxdWVzdChbZWRpdFJlcXVlc3RCb2R5XSk7XG4gICAgICAgIGlmIChlZGl0UmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBlZGl0UmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFRhcmdldEV4aXN0c0Vycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgTG9naW5SZXF1aXJlZEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gY3JlYXRlL2VkaXQgcGFnZTogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IHsgU2VhcmNoUGFnZXNRdWVyeSB9O1xuIiwKICAgICJpbXBvcnQgKiBhcyBjaGVlcmlvIGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0IHsgVW5leHBlY3RlZEVycm9yIH0gZnJvbSAnLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBQYWdlIH0gZnJvbSAnLi9wYWdlJztcblxuLyoqXG4gKiBQYWdlIGZpbGUgZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VGaWxlRGF0YSB7XG4gIHBhZ2U6IFBhZ2U7XG4gIGlkOiBudW1iZXI7XG4gIG5hbWU6IHN0cmluZztcbiAgdXJsOiBzdHJpbmc7XG4gIG1pbWVUeXBlOiBzdHJpbmc7XG4gIHNpemU6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQYWdlIGF0dGFjaG1lbnQgZmlsZVxuICovXG5leHBvcnQgY2xhc3MgUGFnZUZpbGUge1xuICBwdWJsaWMgcmVhZG9ubHkgcGFnZTogUGFnZTtcbiAgcHVibGljIHJlYWRvbmx5IGlkOiBudW1iZXI7XG4gIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSB1cmw6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IG1pbWVUeXBlOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBzaXplOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoZGF0YTogUGFnZUZpbGVEYXRhKSB7XG4gICAgdGhpcy5wYWdlID0gZGF0YS5wYWdlO1xuICAgIHRoaXMuaWQgPSBkYXRhLmlkO1xuICAgIHRoaXMubmFtZSA9IGRhdGEubmFtZTtcbiAgICB0aGlzLnVybCA9IGRhdGEudXJsO1xuICAgIHRoaXMubWltZVR5cGUgPSBkYXRhLm1pbWVUeXBlO1xuICAgIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQYWdlRmlsZShpZD0ke3RoaXMuaWR9LCBuYW1lPSR7dGhpcy5uYW1lfSwgc2l6ZT0ke3RoaXMuc2l6ZX0pYDtcbiAgfVxufVxuXG4vKipcbiAqIFBhZ2UgZmlsZSBjb2xsZWN0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBQYWdlRmlsZUNvbGxlY3Rpb24gZXh0ZW5kcyBBcnJheTxQYWdlRmlsZT4ge1xuICBwdWJsaWMgcmVhZG9ubHkgcGFnZTogUGFnZTtcblxuICBjb25zdHJ1Y3RvcihwYWdlOiBQYWdlLCBmaWxlcz86IFBhZ2VGaWxlW10pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucGFnZSA9IHBhZ2U7XG4gICAgaWYgKGZpbGVzKSB7XG4gICAgICB0aGlzLnB1c2goLi4uZmlsZXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGJ5IElEXG4gICAqL1xuICBmaW5kQnlJZChpZDogbnVtYmVyKTogUGFnZUZpbGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbmQoKGZpbGUpID0+IGZpbGUuaWQgPT09IGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGJ5IG5hbWVcbiAgICovXG4gIGZpbmRCeU5hbWUobmFtZTogc3RyaW5nKTogUGFnZUZpbGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbmQoKGZpbGUpID0+IGZpbGUubmFtZSA9PT0gbmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBzaXplIHN0cmluZyB0byBieXRlcyAocHVibGljIGZvciBiYXRjaCBvcGVyYXRpb25zKVxuICAgKi9cbiAgc3RhdGljIHBhcnNlU2l6ZShzaXplVGV4dDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCB0ZXh0ID0gc2l6ZVRleHQudHJpbSgpO1xuICAgIGlmICh0ZXh0LmluY2x1ZGVzKCdCeXRlcycpKSB7XG4gICAgICByZXR1cm4gTWF0aC5mbG9vcihOdW1iZXIucGFyc2VGbG9hdCh0ZXh0LnJlcGxhY2UoJ0J5dGVzJywgJycpLnRyaW0oKSkpO1xuICAgIH1cbiAgICBpZiAodGV4dC5pbmNsdWRlcygna0InKSkge1xuICAgICAgcmV0dXJuIE1hdGguZmxvb3IoTnVtYmVyLnBhcnNlRmxvYXQodGV4dC5yZXBsYWNlKCdrQicsICcnKS50cmltKCkpICogMTAwMCk7XG4gICAgfVxuICAgIGlmICh0ZXh0LmluY2x1ZGVzKCdNQicpKSB7XG4gICAgICByZXR1cm4gTWF0aC5mbG9vcihOdW1iZXIucGFyc2VGbG9hdCh0ZXh0LnJlcGxhY2UoJ01CJywgJycpLnRyaW0oKSkgKiAxMDAwMDAwKTtcbiAgICB9XG4gICAgaWYgKHRleHQuaW5jbHVkZXMoJ0dCJykpIHtcbiAgICAgIHJldHVybiBNYXRoLmZsb29yKE51bWJlci5wYXJzZUZsb2F0KHRleHQucmVwbGFjZSgnR0InLCAnJykudHJpbSgpKSAqIDEwMDAwMDAwMDApO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBmaWxlIGluZm9ybWF0aW9uIGZyb20gSFRNTCByZXNwb25zZVxuICAgKiBJbnRlcm5hbCBoZWxwZXIgZm9yIGFjcXVpcmUoKSBhbmQgUGFnZUNvbGxlY3Rpb24uYWNxdWlyZVBhZ2VGaWxlcygpXG4gICAqL1xuICBzdGF0aWMgX3BhcnNlRnJvbUh0bWwocGFnZTogUGFnZSwgJDogY2hlZXJpby5DaGVlcmlvQVBJKTogUGFnZUZpbGVbXSB7XG4gICAgY29uc3QgZmlsZXNUYWJsZSA9ICQoJ3RhYmxlLnBhZ2UtZmlsZXMnKTtcbiAgICBpZiAoZmlsZXNUYWJsZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlczogUGFnZUZpbGVbXSA9IFtdO1xuXG4gICAgZmlsZXNUYWJsZS5maW5kKFwidGJvZHkgdHJbaWRePSdmaWxlLXJvdy0nXVwiKS5lYWNoKChfaSwgcm93KSA9PiB7XG4gICAgICBjb25zdCByb3dJZCA9ICQocm93KS5hdHRyKCdpZCcpO1xuICAgICAgaWYgKCFyb3dJZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBmaWxlSWQgPSBOdW1iZXIucGFyc2VJbnQocm93SWQucmVwbGFjZSgnZmlsZS1yb3ctJywgJycpLCAxMCk7XG4gICAgICBjb25zdCB0ZHMgPSAkKHJvdykuZmluZCgndGQnKTtcbiAgICAgIGlmICh0ZHMubGVuZ3RoIDwgMykgcmV0dXJuO1xuXG4gICAgICBjb25zdCBsaW5rRWxlbSA9ICQodGRzWzBdKS5maW5kKCdhJyk7XG4gICAgICBpZiAobGlua0VsZW0ubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IG5hbWUgPSBsaW5rRWxlbS50ZXh0KCkudHJpbSgpO1xuICAgICAgY29uc3QgaHJlZiA9IGxpbmtFbGVtLmF0dHIoJ2hyZWYnKSA/PyAnJztcbiAgICAgIGNvbnN0IHVybCA9IGAke3BhZ2Uuc2l0ZS5nZXRCYXNlVXJsKCl9JHtocmVmfWA7XG5cbiAgICAgIGNvbnN0IG1pbWVFbGVtID0gJCh0ZHNbMV0pLmZpbmQoJ3NwYW4nKTtcbiAgICAgIGNvbnN0IG1pbWVUeXBlID0gbWltZUVsZW0uYXR0cigndGl0bGUnKSA/PyAnJztcblxuICAgICAgY29uc3Qgc2l6ZVRleHQgPSAkKHRkc1syXSkudGV4dCgpLnRyaW0oKTtcbiAgICAgIGNvbnN0IHNpemUgPSBQYWdlRmlsZUNvbGxlY3Rpb24ucGFyc2VTaXplKHNpemVUZXh0KTtcblxuICAgICAgZmlsZXMucHVzaChcbiAgICAgICAgbmV3IFBhZ2VGaWxlKHtcbiAgICAgICAgICBwYWdlLFxuICAgICAgICAgIGlkOiBmaWxlSWQsXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICB1cmwsXG4gICAgICAgICAgbWltZVR5cGUsXG4gICAgICAgICAgc2l6ZSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZmlsZXM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxpc3Qgb2YgZmlsZXMgYXR0YWNoZWQgdG8gcGFnZVxuICAgKi9cbiAgc3RhdGljIGFjcXVpcmUocGFnZTogUGFnZSk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlRmlsZUNvbGxlY3Rpb24+IHtcbiAgICBpZiAocGFnZS5pZCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgICBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ1BhZ2UgSUQgbm90IGFjcXVpcmVkJykpLFxuICAgICAgICAoKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKCdQYWdlIElEIG11c3QgYmUgYWNxdWlyZWQgYmVmb3JlIGdldHRpbmcgZmlsZXMnKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYWdlSWQgPSBwYWdlLmlkO1xuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGFnZS5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdmaWxlcy9QYWdlRmlsZXNNb2R1bGUnLFxuICAgICAgICAgICAgcGFnZV9pZDogcGFnZUlkLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRFcnJvcignRW1wdHkgcmVzcG9uc2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGh0bWwgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoaHRtbCk7XG4gICAgICAgIGNvbnN0IGZpbGVzID0gUGFnZUZpbGVDb2xsZWN0aW9uLl9wYXJzZUZyb21IdG1sKHBhZ2UsICQpO1xuXG4gICAgICAgIHJldHVybiBuZXcgUGFnZUZpbGVDb2xsZWN0aW9uKHBhZ2UsIGZpbGVzKTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBhY3F1aXJlIGZpbGVzOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG59XG4iLAogICAgImltcG9ydCB7IExvZ2luUmVxdWlyZWRFcnJvciwgTm9FbGVtZW50RXJyb3IsIFVuZXhwZWN0ZWRFcnJvciB9IGZyb20gJy4uLy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgUGFnZVJlZiB9IGZyb20gJy4uL3R5cGVzJztcblxuLyoqXG4gKiBQYWdlIG1ldGEgdGFnIGRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYWdlTWV0YURhdGEge1xuICBwYWdlOiBQYWdlUmVmO1xuICBuYW1lOiBzdHJpbmc7XG4gIGNvbnRlbnQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYWdlIG1ldGEgdGFnXG4gKi9cbmV4cG9ydCBjbGFzcyBQYWdlTWV0YSB7XG4gIHB1YmxpYyByZWFkb25seSBwYWdlOiBQYWdlUmVmO1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICBwdWJsaWMgY29udGVudDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IFBhZ2VNZXRhRGF0YSkge1xuICAgIHRoaXMucGFnZSA9IGRhdGEucGFnZTtcbiAgICB0aGlzLm5hbWUgPSBkYXRhLm5hbWU7XG4gICAgdGhpcy5jb250ZW50ID0gZGF0YS5jb250ZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBtZXRhIHRhZyB2YWx1ZVxuICAgKiBAcGFyYW0gY29udGVudCAtIE5ldyB2YWx1ZVxuICAgKi9cbiAgdXBkYXRlKGNvbnRlbnQ6IHN0cmluZyk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIFBhZ2VNZXRhQ29sbGVjdGlvbi5zZXRNZXRhKHRoaXMucGFnZSwgdGhpcy5uYW1lLCBjb250ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgbWV0YSB0YWdcbiAgICovXG4gIGRlbGV0ZSgpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiBQYWdlTWV0YUNvbGxlY3Rpb24uZGVsZXRlTWV0YSh0aGlzLnBhZ2UsIHRoaXMubmFtZSk7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUGFnZU1ldGEobmFtZT0ke3RoaXMubmFtZX0sIGNvbnRlbnQ9JHt0aGlzLmNvbnRlbnR9KWA7XG4gIH1cbn1cblxuLyoqXG4gKiBQYWdlIG1ldGEgdGFnIGNvbGxlY3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2VNZXRhQ29sbGVjdGlvbiBleHRlbmRzIEFycmF5PFBhZ2VNZXRhPiB7XG4gIHB1YmxpYyByZWFkb25seSBwYWdlOiBQYWdlUmVmO1xuXG4gIGNvbnN0cnVjdG9yKHBhZ2U6IFBhZ2VSZWYsIG1ldGFzPzogUGFnZU1ldGFbXSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5wYWdlID0gcGFnZTtcbiAgICBpZiAobWV0YXMpIHtcbiAgICAgIHRoaXMucHVzaCguLi5tZXRhcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYnkgbmFtZVxuICAgKiBAcGFyYW0gbmFtZSAtIE1ldGEgdGFnIG5hbWVcbiAgICogQHJldHVybnMgTWV0YSB0YWcgKHVuZGVmaW5lZCBpZiBub3QgZm91bmQpXG4gICAqL1xuICBmaW5kQnlOYW1lKG5hbWU6IHN0cmluZyk6IFBhZ2VNZXRhIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5maW5kKChtZXRhKSA9PiBtZXRhLm5hbWUgPT09IG5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBwYWdlIG1ldGEgdGFnc1xuICAgKiBAcGFyYW0gcGFnZSAtIFBhZ2UgcmVmZXJlbmNlXG4gICAqIEByZXR1cm5zIE1ldGEgdGFnIGNvbGxlY3Rpb25cbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlKHBhZ2U6IFBhZ2VSZWYpOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZU1ldGFDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGFnZS5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdlZGl0L0VkaXRNZXRhTW9kdWxlJyxcbiAgICAgICAgICAgIHBhZ2VJZDogcGFnZS5pZCxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcblxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcignRW1wdHkgcmVzcG9uc2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGh0bWwgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgIGNvbnN0IG1ldGFzOiBQYWdlTWV0YVtdID0gW107XG5cbiAgICAgICAgLy8gUGFyc2UgSFRNTC1lbmNvZGVkIG1ldGEgdGFncyB3aXRoIHJlZ2V4XG4gICAgICAgIC8vIEZvcm1hdDogJmx0O21ldGEgbmFtZT1cInh4eFwiIGNvbnRlbnQ9XCJ5eXlcIi8mZ3Q7XG4gICAgICAgIGNvbnN0IG1ldGFSZWdleCA9IC8mbHQ7bWV0YSBuYW1lPVwiKFteXCJdKylcIiBjb250ZW50PVwiKFteXCJdKilcIlxcLz8mZ3Q7L2c7XG4gICAgICAgIGZvciAoY29uc3QgbWF0Y2ggb2YgaHRtbC5tYXRjaEFsbChtZXRhUmVnZXgpKSB7XG4gICAgICAgICAgY29uc3QgbmFtZSA9IG1hdGNoWzFdO1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBtYXRjaFsyXTtcbiAgICAgICAgICBpZiAobmFtZSkge1xuICAgICAgICAgICAgbWV0YXMucHVzaChcbiAgICAgICAgICAgICAgbmV3IFBhZ2VNZXRhKHtcbiAgICAgICAgICAgICAgICBwYWdlLFxuICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgY29udGVudDogY29udGVudCA/PyAnJyxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQYWdlTWV0YUNvbGxlY3Rpb24ocGFnZSwgbWV0YXMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgcGFnZSBtZXRhczogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IG1ldGEgdGFnXG4gICAqIEBwYXJhbSBwYWdlIC0gUGFnZSByZWZlcmVuY2VcbiAgICogQHBhcmFtIG5hbWUgLSBNZXRhIHRhZyBuYW1lXG4gICAqIEBwYXJhbSBjb250ZW50IC0gTWV0YSB0YWcgdmFsdWVcbiAgICovXG4gIHN0YXRpYyBzZXRNZXRhKHBhZ2U6IFBhZ2VSZWYsIG5hbWU6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICBjb25zdCBsb2dpblJlc3VsdCA9IHBhZ2Uuc2l0ZS5jbGllbnQucmVxdWlyZUxvZ2luKCk7XG4gICAgaWYgKGxvZ2luUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgICAgUHJvbWlzZS5yZWplY3QobG9naW5SZXN1bHQuZXJyb3IpLFxuICAgICAgICAoKSA9PiBuZXcgTG9naW5SZXF1aXJlZEVycm9yKCdMb2dpbiByZXF1aXJlZCB0byBzZXQgbWV0YSB0YWcnKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYWdlLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uOiAnV2lraVBhZ2VBY3Rpb24nLFxuICAgICAgICAgICAgZXZlbnQ6ICdzYXZlTWV0YVRhZycsXG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnZWRpdC9FZGl0TWV0YU1vZHVsZScsXG4gICAgICAgICAgICBwYWdlSWQ6IHBhZ2UuaWQsXG4gICAgICAgICAgICBtZXRhTmFtZTogbmFtZSxcbiAgICAgICAgICAgIG1ldGFDb250ZW50OiBjb250ZW50LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBMb2dpblJlcXVpcmVkRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBzZXQgbWV0YSB0YWc6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBtZXRhIHRhZ1xuICAgKiBAcGFyYW0gcGFnZSAtIFBhZ2UgcmVmZXJlbmNlXG4gICAqIEBwYXJhbSBuYW1lIC0gTWV0YSB0YWcgbmFtZVxuICAgKi9cbiAgc3RhdGljIGRlbGV0ZU1ldGEocGFnZTogUGFnZVJlZiwgbmFtZTogc3RyaW5nKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICBjb25zdCBsb2dpblJlc3VsdCA9IHBhZ2Uuc2l0ZS5jbGllbnQucmVxdWlyZUxvZ2luKCk7XG4gICAgaWYgKGxvZ2luUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgICAgUHJvbWlzZS5yZWplY3QobG9naW5SZXN1bHQuZXJyb3IpLFxuICAgICAgICAoKSA9PiBuZXcgTG9naW5SZXF1aXJlZEVycm9yKCdMb2dpbiByZXF1aXJlZCB0byBkZWxldGUgbWV0YSB0YWcnKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYWdlLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uOiAnV2lraVBhZ2VBY3Rpb24nLFxuICAgICAgICAgICAgZXZlbnQ6ICdkZWxldGVNZXRhVGFnJyxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdlZGl0L0VkaXRNZXRhTW9kdWxlJyxcbiAgICAgICAgICAgIHBhZ2VJZDogcGFnZS5pZCxcbiAgICAgICAgICAgIG1ldGFOYW1lOiBuYW1lLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBMb2dpblJlcXVpcmVkRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBkZWxldGUgbWV0YSB0YWc6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG59XG4iLAogICAgImltcG9ydCAqIGFzIGNoZWVyaW8gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQgeyBOb0VsZW1lbnRFcnJvciwgVW5leHBlY3RlZEVycm9yIH0gZnJvbSAnLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdFVzZXIgfSBmcm9tICcuLi91c2VyJztcbmltcG9ydCB0eXBlIHsgUGFnZSB9IGZyb20gJy4vcGFnZSc7XG5pbXBvcnQgdHlwZSB7IFBhZ2VTb3VyY2UgfSBmcm9tICcuL3BhZ2Utc291cmNlJztcblxuLyoqXG4gKiBQYWdlIHJldmlzaW9uIGRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYWdlUmV2aXNpb25EYXRhIHtcbiAgcGFnZTogUGFnZTtcbiAgaWQ6IG51bWJlcjtcbiAgcmV2Tm86IG51bWJlcjtcbiAgY3JlYXRlZEJ5OiBBYnN0cmFjdFVzZXI7XG4gIGNyZWF0ZWRBdDogRGF0ZTtcbiAgY29tbWVudDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhZ2UgcmV2aXNpb24gKHZlcnNpb24gaW4gZWRpdCBoaXN0b3J5KVxuICovXG5leHBvcnQgY2xhc3MgUGFnZVJldmlzaW9uIHtcbiAgLyoqIFBhZ2UgdGhpcyByZXZpc2lvbiBiZWxvbmdzIHRvICovXG4gIHB1YmxpYyByZWFkb25seSBwYWdlOiBQYWdlO1xuXG4gIC8qKiBSZXZpc2lvbiBJRCAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaWQ6IG51bWJlcjtcblxuICAvKiogUmV2aXNpb24gbnVtYmVyICovXG4gIHB1YmxpYyByZWFkb25seSByZXZObzogbnVtYmVyO1xuXG4gIC8qKiBSZXZpc2lvbiBjcmVhdG9yICovXG4gIHB1YmxpYyByZWFkb25seSBjcmVhdGVkQnk6IEFic3RyYWN0VXNlcjtcblxuICAvKiogUmV2aXNpb24gY3JlYXRpb24gZGF0ZSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY3JlYXRlZEF0OiBEYXRlO1xuXG4gIC8qKiBFZGl0IGNvbW1lbnQgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNvbW1lbnQ6IHN0cmluZztcblxuICAvKiogU291cmNlIGNvZGUgKGludGVybmFsIGNhY2hlKSAqL1xuICBwcml2YXRlIF9zb3VyY2U6IFBhZ2VTb3VyY2UgfCBudWxsID0gbnVsbDtcblxuICAvKiogSFRNTCBkaXNwbGF5IChpbnRlcm5hbCBjYWNoZSkgKi9cbiAgcHJpdmF0ZSBfaHRtbDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoZGF0YTogUGFnZVJldmlzaW9uRGF0YSkge1xuICAgIHRoaXMucGFnZSA9IGRhdGEucGFnZTtcbiAgICB0aGlzLmlkID0gZGF0YS5pZDtcbiAgICB0aGlzLnJldk5vID0gZGF0YS5yZXZObztcbiAgICB0aGlzLmNyZWF0ZWRCeSA9IGRhdGEuY3JlYXRlZEJ5O1xuICAgIHRoaXMuY3JlYXRlZEF0ID0gZGF0YS5jcmVhdGVkQXQ7XG4gICAgdGhpcy5jb21tZW50ID0gZGF0YS5jb21tZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgc291cmNlIGNvZGUgaGFzIGJlZW4gYWNxdWlyZWRcbiAgICovXG4gIGlzU291cmNlQWNxdWlyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NvdXJjZSAhPT0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIEhUTUwgZGlzcGxheSBoYXMgYmVlbiBhY3F1aXJlZFxuICAgKi9cbiAgaXNIdG1sQWNxdWlyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2h0bWwgIT09IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNvdXJjZSBjb2RlIChjYWNoZWQpXG4gICAqL1xuICBnZXQgc291cmNlKCk6IFBhZ2VTb3VyY2UgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fc291cmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBzb3VyY2UgY29kZVxuICAgKi9cbiAgc2V0IHNvdXJjZSh2YWx1ZTogUGFnZVNvdXJjZSB8IG51bGwpIHtcbiAgICB0aGlzLl9zb3VyY2UgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgSFRNTCBkaXNwbGF5IChjYWNoZWQpXG4gICAqL1xuICBnZXQgaHRtbCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5faHRtbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgSFRNTCBkaXNwbGF5XG4gICAqL1xuICBzZXQgaHRtbCh2YWx1ZTogc3RyaW5nIHwgbnVsbCkge1xuICAgIHRoaXMuX2h0bWwgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcmV2aXNpb24gc291cmNlIChSRVYtMDAxKVxuICAgKiBAcmV0dXJucyBTb3VyY2Ugc3RyaW5nXG4gICAqL1xuICBnZXRTb3VyY2UoKTogV2lraWRvdFJlc3VsdEFzeW5jPHN0cmluZz4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIFJldHVybiBjYWNoZSBpZiBhdmFpbGFibGVcbiAgICAgICAgaWYgKHRoaXMuX3NvdXJjZSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9zb3VyY2Uud2lraVRleHQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnBhZ2Uuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnaGlzdG9yeS9QYWdlU291cmNlTW9kdWxlJyxcbiAgICAgICAgICAgIHJldmlzaW9uX2lkOiB0aGlzLmlkLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdFbXB0eSByZXNwb25zZSBmcm9tIFBhZ2VTb3VyY2VNb2R1bGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGh0bWwgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoaHRtbCk7XG5cbiAgICAgICAgLy8gU291cmNlIGNvZGUgaXMgaW5zaWRlIDxkaXYgY2xhc3M9XCJwYWdlLXNvdXJjZVwiPlxuICAgICAgICBjb25zdCBzb3VyY2VFbGVtID0gJCgnZGl2LnBhZ2Utc291cmNlJyk7XG4gICAgICAgIGlmIChzb3VyY2VFbGVtLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcignU291cmNlIGVsZW1lbnQgbm90IGZvdW5kJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzb3VyY2VUZXh0ID0gc291cmNlRWxlbS50ZXh0KCk7XG4gICAgICAgIHJldHVybiBzb3VyY2VUZXh0O1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCByZXZpc2lvbiBzb3VyY2U6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCByZXZpc2lvbiBIVE1MIChSRVYtMDAyKVxuICAgKiBAcmV0dXJucyBIVE1MIHN0cmluZ1xuICAgKi9cbiAgZ2V0SHRtbCgpOiBXaWtpZG90UmVzdWx0QXN5bmM8c3RyaW5nPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gUmV0dXJuIGNhY2hlIGlmIGF2YWlsYWJsZVxuICAgICAgICBpZiAodGhpcy5faHRtbCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9odG1sO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5wYWdlLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2hpc3RvcnkvUGFnZVZlcnNpb25Nb2R1bGUnLFxuICAgICAgICAgICAgcmV2aXNpb25faWQ6IHRoaXMuaWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ0VtcHR5IHJlc3BvbnNlIGZyb20gUGFnZVZlcnNpb25Nb2R1bGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGh0bWwgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoaHRtbCk7XG5cbiAgICAgICAgLy8gSFRNTCBjb250ZW50IGlzIGluc2lkZSA8ZGl2IGlkPVwicGFnZS1jb250ZW50XCI+XG4gICAgICAgIGNvbnN0IGNvbnRlbnRFbGVtID0gJCgnI3BhZ2UtY29udGVudCcpO1xuICAgICAgICBpZiAoY29udGVudEVsZW0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgLy8gUmV0dXJuIGVudGlyZSBib2R5IGlmIHBhZ2UtY29udGVudCBkb2Vzbid0IGV4aXN0XG4gICAgICAgICAgdGhpcy5faHRtbCA9IGh0bWw7XG4gICAgICAgICAgcmV0dXJuIGh0bWw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb250ZW50SHRtbCA9IGNvbnRlbnRFbGVtLmh0bWwoKSA/PyAnJztcbiAgICAgICAgdGhpcy5faHRtbCA9IGNvbnRlbnRIdG1sO1xuICAgICAgICByZXR1cm4gY29udGVudEh0bWw7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHJldmlzaW9uIEhUTUw6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBhZ2VSZXZpc2lvbihpZD0ke3RoaXMuaWR9LCByZXZObz0ke3RoaXMucmV2Tm99KWA7XG4gIH1cbn1cblxuLyoqXG4gKiBQYWdlIHJldmlzaW9uIGNvbGxlY3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2VSZXZpc2lvbkNvbGxlY3Rpb24gZXh0ZW5kcyBBcnJheTxQYWdlUmV2aXNpb24+IHtcbiAgcHVibGljIHJlYWRvbmx5IHBhZ2U6IFBhZ2UgfCBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKHBhZ2U6IFBhZ2UgfCBudWxsLCByZXZpc2lvbnM/OiBQYWdlUmV2aXNpb25bXSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5wYWdlID0gcGFnZTtcbiAgICBpZiAocmV2aXNpb25zKSB7XG4gICAgICB0aGlzLnB1c2goLi4ucmV2aXNpb25zKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBieSBJRFxuICAgKiBAcGFyYW0gaWQgLSBSZXZpc2lvbiBJRFxuICAgKiBAcmV0dXJucyBSZXZpc2lvbiAodW5kZWZpbmVkIGlmIG5vdCBmb3VuZClcbiAgICovXG4gIGZpbmRCeUlkKGlkOiBudW1iZXIpOiBQYWdlUmV2aXNpb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbmQoKHJldmlzaW9uKSA9PiByZXZpc2lvbi5pZCA9PT0gaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzb3VyY2VzIGZvciBhbGwgcmV2aXNpb25zXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIHNvdXJjZSBzdHJpbmdzXG4gICAqL1xuICBnZXRTb3VyY2VzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxzdHJpbmdbXT4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICB0aGlzLm1hcChhc3luYyAocmV2aXNpb24pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJldmlzaW9uLmdldFNvdXJjZSgpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQudmFsdWU7XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHNvdXJjZXM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBIVE1MIGZvciBhbGwgcmV2aXNpb25zXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIEhUTUwgc3RyaW5nc1xuICAgKi9cbiAgZ2V0SHRtbHMoKTogV2lraWRvdFJlc3VsdEFzeW5jPHN0cmluZ1tdPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIHRoaXMubWFwKGFzeW5jIChyZXZpc2lvbikgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmV2aXNpb24uZ2V0SHRtbCgpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQudmFsdWU7XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IEhUTUxzOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFBhZ2UgfSBmcm9tICcuL3BhZ2UnO1xuXG4vKipcbiAqIFBhZ2Ugc291cmNlIGRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYWdlU291cmNlRGF0YSB7XG4gIHBhZ2U6IFBhZ2U7XG4gIHdpa2lUZXh0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFnZSBzb3VyY2UgY29kZSAoV2lraWRvdCBzeW50YXgpXG4gKi9cbmV4cG9ydCBjbGFzcyBQYWdlU291cmNlIHtcbiAgLyoqIFBhZ2UgdGhpcyBzb3VyY2UgYmVsb25ncyB0byAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGFnZTogUGFnZTtcblxuICAvKiogU291cmNlIGNvZGUgKFdpa2lkb3Qgc3ludGF4KSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgd2lraVRleHQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBQYWdlU291cmNlRGF0YSkge1xuICAgIHRoaXMucGFnZSA9IGRhdGEucGFnZTtcbiAgICB0aGlzLndpa2lUZXh0ID0gZGF0YS53aWtpVGV4dDtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQYWdlU291cmNlKHBhZ2U9JHt0aGlzLnBhZ2UuZnVsbG5hbWV9LCBsZW5ndGg9JHt0aGlzLndpa2lUZXh0Lmxlbmd0aH0pYDtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IEFic3RyYWN0VXNlciB9IGZyb20gJy4uL3VzZXInO1xuaW1wb3J0IHR5cGUgeyBQYWdlIH0gZnJvbSAnLi9wYWdlJztcblxuLyoqXG4gKiBQYWdlIHZvdGUgZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VWb3RlRGF0YSB7XG4gIHBhZ2U6IFBhZ2U7XG4gIHVzZXI6IEFic3RyYWN0VXNlcjtcbiAgdmFsdWU6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQYWdlIHZvdGUgKHJhdGluZylcbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2VWb3RlIHtcbiAgLyoqIFBhZ2UgdGhpcyB2b3RlIGJlbG9uZ3MgdG8gKi9cbiAgcHVibGljIHJlYWRvbmx5IHBhZ2U6IFBhZ2U7XG5cbiAgLyoqIFVzZXIgd2hvIHZvdGVkICovXG4gIHB1YmxpYyByZWFkb25seSB1c2VyOiBBYnN0cmFjdFVzZXI7XG5cbiAgLyoqIFZvdGUgdmFsdWUgKCsxLy0xIG9yIG51bWVyaWMpICovXG4gIHB1YmxpYyByZWFkb25seSB2YWx1ZTogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IFBhZ2VWb3RlRGF0YSkge1xuICAgIHRoaXMucGFnZSA9IGRhdGEucGFnZTtcbiAgICB0aGlzLnVzZXIgPSBkYXRhLnVzZXI7XG4gICAgdGhpcy52YWx1ZSA9IGRhdGEudmFsdWU7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUGFnZVZvdGUodXNlcj0ke3RoaXMudXNlci5uYW1lfSwgdmFsdWU9JHt0aGlzLnZhbHVlfSlgO1xuICB9XG59XG5cbi8qKlxuICogUGFnZSB2b3RlIGNvbGxlY3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2VWb3RlQ29sbGVjdGlvbiBleHRlbmRzIEFycmF5PFBhZ2VWb3RlPiB7XG4gIHB1YmxpYyByZWFkb25seSBwYWdlOiBQYWdlO1xuXG4gIGNvbnN0cnVjdG9yKHBhZ2U6IFBhZ2UsIHZvdGVzPzogUGFnZVZvdGVbXSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5wYWdlID0gcGFnZTtcbiAgICBpZiAodm90ZXMpIHtcbiAgICAgIHRoaXMucHVzaCguLi52b3Rlcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYnkgdXNlclxuICAgKiBAcGFyYW0gdXNlciAtIFVzZXIgdG8gc2VhcmNoIGZvclxuICAgKiBAcmV0dXJucyBWb3RlICh1bmRlZmluZWQgaWYgbm90IGZvdW5kKVxuICAgKi9cbiAgZmluZEJ5VXNlcih1c2VyOiBBYnN0cmFjdFVzZXIpOiBQYWdlVm90ZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmluZCgodm90ZSkgPT4gdm90ZS51c2VyLmlkID09PSB1c2VyLmlkKTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IEFic3RyYWN0VXNlciB9IGZyb20gJy4uL3VzZXInO1xuXG4vKipcbiAqIFBhZ2Ugc2VhcmNoIHF1ZXJ5IHBhcmFtZXRlcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hQYWdlc1F1ZXJ5UGFyYW1zIHtcbiAgLyoqIFBhZ2UgdHlwZSAoZS5nLiwgJ25vcm1hbCcsICdhZG1pbicpICovXG4gIHBhZ2V0eXBlPzogc3RyaW5nO1xuICAvKiogQ2F0ZWdvcnkgbmFtZSAqL1xuICBjYXRlZ29yeT86IHN0cmluZztcbiAgLyoqIFRhZ3MgdG8gc2VhcmNoIChBTkQgY29uZGl0aW9uKSAqL1xuICB0YWdzPzogc3RyaW5nIHwgc3RyaW5nW107XG4gIC8qKiBQYXJlbnQgcGFnZSBuYW1lICovXG4gIHBhcmVudD86IHN0cmluZztcbiAgLyoqIExpbmtlZCBwYWdlIG5hbWUgKi9cbiAgbGlua1RvPzogc3RyaW5nO1xuICAvKiogQ3JlYXRlZCBkYXRlIGNvbmRpdGlvbiAqL1xuICBjcmVhdGVkQXQ/OiBzdHJpbmc7XG4gIC8qKiBVcGRhdGVkIGRhdGUgY29uZGl0aW9uICovXG4gIHVwZGF0ZWRBdD86IHN0cmluZztcbiAgLyoqIENyZWF0b3IgKi9cbiAgY3JlYXRlZEJ5PzogQWJzdHJhY3RVc2VyIHwgc3RyaW5nO1xuICAvKiogUmF0aW5nIGNvbmRpdGlvbiAqL1xuICByYXRpbmc/OiBzdHJpbmc7XG4gIC8qKiBWb3RlIGNvdW50IGNvbmRpdGlvbiAqL1xuICB2b3Rlcz86IHN0cmluZztcbiAgLyoqIFBhZ2UgbmFtZSBjb25kaXRpb24gKi9cbiAgbmFtZT86IHN0cmluZztcbiAgLyoqIEZ1bGxuYW1lIChleGFjdCBtYXRjaCkgKi9cbiAgZnVsbG5hbWU/OiBzdHJpbmc7XG4gIC8qKiBSYW5nZSBzcGVjaWZpY2F0aW9uICovXG4gIHJhbmdlPzogc3RyaW5nO1xuICAvKiogU29ydCBvcmRlciAoZS5nLiwgJ2NyZWF0ZWRfYXQgZGVzYycpICovXG4gIG9yZGVyPzogc3RyaW5nO1xuICAvKiogU3RhcnQgb2Zmc2V0ICovXG4gIG9mZnNldD86IG51bWJlcjtcbiAgLyoqIFJlc3VsdCBsaW1pdCAqL1xuICBsaW1pdD86IG51bWJlcjtcbiAgLyoqIEl0ZW1zIHBlciBwYWdlICovXG4gIHBlclBhZ2U/OiBudW1iZXI7XG4gIC8qKiBTZXBhcmF0ZSBkaXNwbGF5ICovXG4gIHNlcGFyYXRlPzogc3RyaW5nO1xuICAvKiogV3JhcHBlciBkaXNwbGF5ICovXG4gIHdyYXBwZXI/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogRGVmYXVsdCBpdGVtcyBwZXIgcGFnZVxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9QRVJfUEFHRSA9IDI1MDtcblxuLyoqXG4gKiBEZWZhdWx0IG1vZHVsZSBib2R5IGZpZWxkc1xuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9NT0RVTEVfQk9EWSA9IFtcbiAgJ2Z1bGxuYW1lJyxcbiAgJ2NhdGVnb3J5JyxcbiAgJ25hbWUnLFxuICAndGl0bGUnLFxuICAnY3JlYXRlZF9hdCcsXG4gICdjcmVhdGVkX2J5X2xpbmtlZCcsXG4gICd1cGRhdGVkX2F0JyxcbiAgJ3VwZGF0ZWRfYnlfbGlua2VkJyxcbiAgJ2NvbW1lbnRlZF9hdCcsXG4gICdjb21tZW50ZWRfYnlfbGlua2VkJyxcbiAgJ3BhcmVudF9mdWxsbmFtZScsXG4gICdjb21tZW50cycsXG4gICdzaXplJyxcbiAgJ2NoaWxkcmVuJyxcbiAgJ3JhdGluZ192b3RlcycsXG4gICdyYXRpbmcnLFxuICAncmF0aW5nX3BlcmNlbnQnLFxuICAncmV2aXNpb25zJyxcbiAgJ3RhZ3MnLFxuICAnX3RhZ3MnLFxuXSBhcyBjb25zdDtcblxuLyoqXG4gKiBQYWdlIHNlYXJjaCBxdWVyeVxuICovXG5leHBvcnQgY2xhc3MgU2VhcmNoUGFnZXNRdWVyeSB7XG4gIC8qKiBQYWdlIHR5cGUgKi9cbiAgcGFnZXR5cGU6IHN0cmluZztcbiAgLyoqIENhdGVnb3J5ICovXG4gIGNhdGVnb3J5OiBzdHJpbmc7XG4gIC8qKiBUYWdzICovXG4gIHRhZ3M6IHN0cmluZyB8IHN0cmluZ1tdIHwgbnVsbDtcbiAgLyoqIFBhcmVudCBwYWdlICovXG4gIHBhcmVudDogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIExpbmsgdGFyZ2V0ICovXG4gIGxpbmtUbzogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIENyZWF0ZWQgZGF0ZSBjb25kaXRpb24gKi9cbiAgY3JlYXRlZEF0OiBzdHJpbmcgfCBudWxsO1xuICAvKiogVXBkYXRlZCBkYXRlIGNvbmRpdGlvbiAqL1xuICB1cGRhdGVkQXQ6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBDcmVhdG9yICovXG4gIGNyZWF0ZWRCeTogQWJzdHJhY3RVc2VyIHwgc3RyaW5nIHwgbnVsbDtcbiAgLyoqIFJhdGluZyBjb25kaXRpb24gKi9cbiAgcmF0aW5nOiBzdHJpbmcgfCBudWxsO1xuICAvKiogVm90ZSBjb3VudCBjb25kaXRpb24gKi9cbiAgdm90ZXM6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBQYWdlIG5hbWUgY29uZGl0aW9uICovXG4gIG5hbWU6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBGdWxsbmFtZSBjb25kaXRpb24gKi9cbiAgZnVsbG5hbWU6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBSYW5nZSAqL1xuICByYW5nZTogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIFNvcnQgb3JkZXIgKi9cbiAgb3JkZXI6IHN0cmluZztcbiAgLyoqIE9mZnNldCAqL1xuICBvZmZzZXQ6IG51bWJlcjtcbiAgLyoqIFJlc3VsdCBsaW1pdCAqL1xuICBsaW1pdDogbnVtYmVyIHwgbnVsbDtcbiAgLyoqIEl0ZW1zIHBlciBwYWdlICovXG4gIHBlclBhZ2U6IG51bWJlcjtcbiAgLyoqIFNlcGFyYXRlIGRpc3BsYXkgKi9cbiAgc2VwYXJhdGU6IHN0cmluZztcbiAgLyoqIFdyYXBwZXIgZGlzcGxheSAqL1xuICB3cmFwcGVyOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IocGFyYW1zOiBTZWFyY2hQYWdlc1F1ZXJ5UGFyYW1zID0ge30pIHtcbiAgICB0aGlzLnBhZ2V0eXBlID0gcGFyYW1zLnBhZ2V0eXBlID8/ICcqJztcbiAgICB0aGlzLmNhdGVnb3J5ID0gcGFyYW1zLmNhdGVnb3J5ID8/ICcqJztcbiAgICB0aGlzLnRhZ3MgPSBwYXJhbXMudGFncyA/PyBudWxsO1xuICAgIHRoaXMucGFyZW50ID0gcGFyYW1zLnBhcmVudCA/PyBudWxsO1xuICAgIHRoaXMubGlua1RvID0gcGFyYW1zLmxpbmtUbyA/PyBudWxsO1xuICAgIHRoaXMuY3JlYXRlZEF0ID0gcGFyYW1zLmNyZWF0ZWRBdCA/PyBudWxsO1xuICAgIHRoaXMudXBkYXRlZEF0ID0gcGFyYW1zLnVwZGF0ZWRBdCA/PyBudWxsO1xuICAgIHRoaXMuY3JlYXRlZEJ5ID0gcGFyYW1zLmNyZWF0ZWRCeSA/PyBudWxsO1xuICAgIHRoaXMucmF0aW5nID0gcGFyYW1zLnJhdGluZyA/PyBudWxsO1xuICAgIHRoaXMudm90ZXMgPSBwYXJhbXMudm90ZXMgPz8gbnVsbDtcbiAgICB0aGlzLm5hbWUgPSBwYXJhbXMubmFtZSA/PyBudWxsO1xuICAgIHRoaXMuZnVsbG5hbWUgPSBwYXJhbXMuZnVsbG5hbWUgPz8gbnVsbDtcbiAgICB0aGlzLnJhbmdlID0gcGFyYW1zLnJhbmdlID8/IG51bGw7XG4gICAgdGhpcy5vcmRlciA9IHBhcmFtcy5vcmRlciA/PyAnY3JlYXRlZF9hdCBkZXNjJztcbiAgICB0aGlzLm9mZnNldCA9IHBhcmFtcy5vZmZzZXQgPz8gMDtcbiAgICB0aGlzLmxpbWl0ID0gcGFyYW1zLmxpbWl0ID8/IG51bGw7XG4gICAgdGhpcy5wZXJQYWdlID0gcGFyYW1zLnBlclBhZ2UgPz8gREVGQVVMVF9QRVJfUEFHRTtcbiAgICB0aGlzLnNlcGFyYXRlID0gcGFyYW1zLnNlcGFyYXRlID8/ICdubyc7XG4gICAgdGhpcy53cmFwcGVyID0gcGFyYW1zLndyYXBwZXIgPz8gJ25vJztcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IHRvIGRpY3Rpb25hcnkgZm9ybWF0XG4gICAqL1xuICBhc0RpY3QoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAgIC8vIHBhZ2V0eXBlIGFuZCBjYXRlZ29yeSBtdXN0IGFsd2F5cyBiZSBpbmNsdWRlZFxuICAgIC8vIFdpa2lkb3QgZGVmYXVsdHM6IHBhZ2V0eXBlPVwibm9ybWFsXCIsIGNhdGVnb3J5PVwiLlwiIChjdXJyZW50IGNhdGVnb3J5KVxuICAgIC8vIFRvIGdldCBhbGwgcGFnZXMsIHdlIG5lZWQgdG8gZXhwbGljaXRseSBzZW5kIFwiKlwiXG4gICAgcmVzdWx0LnBhZ2V0eXBlID0gdGhpcy5wYWdldHlwZTtcbiAgICByZXN1bHQuY2F0ZWdvcnkgPSB0aGlzLmNhdGVnb3J5O1xuICAgIGlmICh0aGlzLnRhZ3MgIT09IG51bGwpIHtcbiAgICAgIHJlc3VsdC50YWdzID0gQXJyYXkuaXNBcnJheSh0aGlzLnRhZ3MpID8gdGhpcy50YWdzLmpvaW4oJyAnKSA6IHRoaXMudGFncztcbiAgICB9XG4gICAgaWYgKHRoaXMucGFyZW50ICE9PSBudWxsKSByZXN1bHQucGFyZW50ID0gdGhpcy5wYXJlbnQ7XG4gICAgaWYgKHRoaXMubGlua1RvICE9PSBudWxsKSByZXN1bHQubGlua190byA9IHRoaXMubGlua1RvO1xuICAgIGlmICh0aGlzLmNyZWF0ZWRBdCAhPT0gbnVsbCkgcmVzdWx0LmNyZWF0ZWRfYXQgPSB0aGlzLmNyZWF0ZWRBdDtcbiAgICBpZiAodGhpcy51cGRhdGVkQXQgIT09IG51bGwpIHJlc3VsdC51cGRhdGVkX2F0ID0gdGhpcy51cGRhdGVkQXQ7XG4gICAgaWYgKHRoaXMuY3JlYXRlZEJ5ICE9PSBudWxsKSB7XG4gICAgICByZXN1bHQuY3JlYXRlZF9ieSA9IHR5cGVvZiB0aGlzLmNyZWF0ZWRCeSA9PT0gJ3N0cmluZycgPyB0aGlzLmNyZWF0ZWRCeSA6IHRoaXMuY3JlYXRlZEJ5Lm5hbWU7XG4gICAgfVxuICAgIGlmICh0aGlzLnJhdGluZyAhPT0gbnVsbCkgcmVzdWx0LnJhdGluZyA9IHRoaXMucmF0aW5nO1xuICAgIGlmICh0aGlzLnZvdGVzICE9PSBudWxsKSByZXN1bHQudm90ZXMgPSB0aGlzLnZvdGVzO1xuICAgIGlmICh0aGlzLm5hbWUgIT09IG51bGwpIHJlc3VsdC5uYW1lID0gdGhpcy5uYW1lO1xuICAgIGlmICh0aGlzLmZ1bGxuYW1lICE9PSBudWxsKSByZXN1bHQuZnVsbG5hbWUgPSB0aGlzLmZ1bGxuYW1lO1xuICAgIGlmICh0aGlzLnJhbmdlICE9PSBudWxsKSByZXN1bHQucmFuZ2UgPSB0aGlzLnJhbmdlO1xuXG4gICAgcmVzdWx0Lm9yZGVyID0gdGhpcy5vcmRlcjtcbiAgICByZXN1bHQub2Zmc2V0ID0gdGhpcy5vZmZzZXQ7XG4gICAgaWYgKHRoaXMubGltaXQgIT09IG51bGwpIHJlc3VsdC5saW1pdCA9IHRoaXMubGltaXQ7XG4gICAgcmVzdWx0LnBlclBhZ2UgPSB0aGlzLnBlclBhZ2U7XG4gICAgcmVzdWx0LnNlcGFyYXRlID0gdGhpcy5zZXBhcmF0ZTtcbiAgICByZXN1bHQud3JhcHBlciA9IHRoaXMud3JhcHBlcjtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0ICogYXMgY2hlZXJpbyBmcm9tICdjaGVlcmlvJztcbmltcG9ydCB7IE5vRWxlbWVudEVycm9yLCBVbmV4cGVjdGVkRXJyb3IgfSBmcm9tICcuLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyBwYXJzZU9kYXRlLCBwYXJzZVVzZXIgfSBmcm9tICcuLi8uLi91dGlsL3BhcnNlcic7XG5pbXBvcnQgdHlwZSB7IFNpdGUgfSBmcm9tICcuLi9zaXRlJztcbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RVc2VyIH0gZnJvbSAnLi4vdXNlcic7XG5cbi8qKlxuICogU2l0ZSBjaGFuZ2UgaGlzdG9yeSBkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2l0ZUNoYW5nZURhdGEge1xuICBzaXRlOiBTaXRlO1xuICBwYWdlRnVsbG5hbWU6IHN0cmluZztcbiAgcGFnZVRpdGxlOiBzdHJpbmc7XG4gIHJldmlzaW9uTm86IG51bWJlcjtcbiAgY2hhbmdlZEJ5OiBBYnN0cmFjdFVzZXIgfCBudWxsO1xuICBjaGFuZ2VkQXQ6IERhdGUgfCBudWxsO1xuICBmbGFnczogc3RyaW5nW107XG4gIGNvbW1lbnQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBTaXRlIGNoYW5nZSBoaXN0b3J5XG4gKi9cbmV4cG9ydCBjbGFzcyBTaXRlQ2hhbmdlIHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG4gIHB1YmxpYyByZWFkb25seSBwYWdlRnVsbG5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHBhZ2VUaXRsZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgcmV2aXNpb25ObzogbnVtYmVyO1xuICBwdWJsaWMgcmVhZG9ubHkgY2hhbmdlZEJ5OiBBYnN0cmFjdFVzZXIgfCBudWxsO1xuICBwdWJsaWMgcmVhZG9ubHkgY2hhbmdlZEF0OiBEYXRlIHwgbnVsbDtcbiAgcHVibGljIHJlYWRvbmx5IGZsYWdzOiBzdHJpbmdbXTtcbiAgcHVibGljIHJlYWRvbmx5IGNvbW1lbnQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBTaXRlQ2hhbmdlRGF0YSkge1xuICAgIHRoaXMuc2l0ZSA9IGRhdGEuc2l0ZTtcbiAgICB0aGlzLnBhZ2VGdWxsbmFtZSA9IGRhdGEucGFnZUZ1bGxuYW1lO1xuICAgIHRoaXMucGFnZVRpdGxlID0gZGF0YS5wYWdlVGl0bGU7XG4gICAgdGhpcy5yZXZpc2lvbk5vID0gZGF0YS5yZXZpc2lvbk5vO1xuICAgIHRoaXMuY2hhbmdlZEJ5ID0gZGF0YS5jaGFuZ2VkQnk7XG4gICAgdGhpcy5jaGFuZ2VkQXQgPSBkYXRhLmNoYW5nZWRBdDtcbiAgICB0aGlzLmZsYWdzID0gZGF0YS5mbGFncztcbiAgICB0aGlzLmNvbW1lbnQgPSBkYXRhLmNvbW1lbnQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBhZ2UgVVJMXG4gICAqL1xuICBnZXRQYWdlVXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuc2l0ZS5nZXRCYXNlVXJsKCl9LyR7dGhpcy5wYWdlRnVsbG5hbWV9YDtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBTaXRlQ2hhbmdlKHBhZ2U9JHt0aGlzLnBhZ2VGdWxsbmFtZX0sIHJldj0ke3RoaXMucmV2aXNpb25Ob30sIGJ5PSR7dGhpcy5jaGFuZ2VkQnl9KWA7XG4gIH1cbn1cblxuLyoqXG4gKiBTaXRlIGNoYW5nZSBoaXN0b3J5IGNvbGxlY3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFNpdGVDaGFuZ2VDb2xsZWN0aW9uIGV4dGVuZHMgQXJyYXk8U2l0ZUNoYW5nZT4ge1xuICBwdWJsaWMgcmVhZG9ubHkgc2l0ZTogU2l0ZTtcblxuICBjb25zdHJ1Y3RvcihzaXRlOiBTaXRlLCBjaGFuZ2VzPzogU2l0ZUNoYW5nZVtdKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnNpdGUgPSBzaXRlO1xuICAgIGlmIChjaGFuZ2VzKSB7XG4gICAgICB0aGlzLnB1c2goLi4uY2hhbmdlcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCByZWNlbnQgY2hhbmdlIGhpc3RvcnlcbiAgICogQHBhcmFtIHNpdGUgLSBTaXRlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uc1xuICAgKiBAcmV0dXJucyBDaGFuZ2UgaGlzdG9yeSBjb2xsZWN0aW9uXG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZShcbiAgICBzaXRlOiBTaXRlLFxuICAgIG9wdGlvbnM/OiB7IHBlclBhZ2U/OiBudW1iZXI7IHBhZ2U/OiBudW1iZXI7IGxpbWl0PzogbnVtYmVyIH1cbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPFNpdGVDaGFuZ2VDb2xsZWN0aW9uPiB7XG4gICAgY29uc3QgcGVyUGFnZSA9IG9wdGlvbnM/LnBlclBhZ2UgPz8gMjA7XG4gICAgY29uc3QgcGFnZSA9IG9wdGlvbnM/LnBhZ2UgPz8gMTtcbiAgICBjb25zdCBsaW1pdCA9IG9wdGlvbnM/LmxpbWl0O1xuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnY2hhbmdlcy9TaXRlQ2hhbmdlc0xpc3RNb2R1bGUnLFxuICAgICAgICAgICAgcGVycGFnZTogcGVyUGFnZSxcbiAgICAgICAgICAgIHBhZ2U6IHBhZ2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ0VtcHR5IHJlc3BvbnNlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBodG1sID0gU3RyaW5nKHJlc3BvbnNlLmJvZHkgPz8gJycpO1xuICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGh0bWwpO1xuICAgICAgICBjb25zdCBjaGFuZ2VzOiBTaXRlQ2hhbmdlW10gPSBbXTtcblxuICAgICAgICAvLyBQYXJzZSB0YWJsZSByb3dzXG4gICAgICAgICQoJ3RhYmxlLndpa2ktY29udGVudC10YWJsZSB0cicpLmVhY2goKF9pLCBlbGVtKSA9PiB7XG4gICAgICAgICAgY29uc3QgJHJvdyA9ICQoZWxlbSk7XG4gICAgICAgICAgY29uc3QgJGNlbGxzID0gJHJvdy5maW5kKCd0ZCcpO1xuICAgICAgICAgIGlmICgkY2VsbHMubGVuZ3RoIDwgNCkgcmV0dXJuO1xuXG4gICAgICAgICAgLy8gUGFnZSBsaW5rXG4gICAgICAgICAgY29uc3QgcGFnZUxpbmsgPSAkKCRjZWxsc1swXSkuZmluZCgnYScpO1xuICAgICAgICAgIGNvbnN0IGhyZWYgPSBwYWdlTGluay5hdHRyKCdocmVmJykgPz8gJyc7XG4gICAgICAgICAgY29uc3QgcGFnZUZ1bGxuYW1lID0gaHJlZi5yZXBsYWNlKC9eXFwvLywgJycpLnNwbGl0KCcvJylbMF0gPz8gJyc7XG4gICAgICAgICAgY29uc3QgcGFnZVRpdGxlID0gcGFnZUxpbmsudGV4dCgpLnRyaW0oKTtcblxuICAgICAgICAgIC8vIFJldmlzaW9uIG51bWJlclxuICAgICAgICAgIGNvbnN0IHJldlRleHQgPSAkKCRjZWxsc1sxXSkudGV4dCgpLnRyaW0oKTtcbiAgICAgICAgICBjb25zdCByZXZNYXRjaCA9IHJldlRleHQubWF0Y2goLyhcXGQrKS8pO1xuICAgICAgICAgIGNvbnN0IHJldmlzaW9uTm8gPSByZXZNYXRjaD8uWzFdID8gTnVtYmVyLnBhcnNlSW50KHJldk1hdGNoWzFdLCAxMCkgOiAwO1xuXG4gICAgICAgICAgLy8gRmxhZ3NcbiAgICAgICAgICBjb25zdCBmbGFnc0NlbGwgPSAkKCRjZWxsc1syXSk7XG4gICAgICAgICAgY29uc3QgZmxhZ3M6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgZmxhZ3NDZWxsLmZpbmQoJ3NwYW4nKS5lYWNoKChfaiwgZmxhZ0VsZW0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZsYWdDbGFzcyA9ICQoZmxhZ0VsZW0pLmF0dHIoJ2NsYXNzJykgPz8gJyc7XG4gICAgICAgICAgICBpZiAoZmxhZ0NsYXNzLmluY2x1ZGVzKCdzcGFudGlwJykpIHtcbiAgICAgICAgICAgICAgY29uc3QgdGl0bGUgPSAkKGZsYWdFbGVtKS5hdHRyKCd0aXRsZScpID8/ICcnO1xuICAgICAgICAgICAgICBpZiAodGl0bGUpIGZsYWdzLnB1c2godGl0bGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gVXNlciBhbmQgdGltZXN0YW1wXG4gICAgICAgICAgY29uc3QgaW5mb0NlbGwgPSAkKCRjZWxsc1szXSk7XG4gICAgICAgICAgY29uc3QgdXNlckVsZW0gPSBpbmZvQ2VsbC5maW5kKCdzcGFuLnByaW50dXNlcicpO1xuICAgICAgICAgIGNvbnN0IGNoYW5nZWRCeSA9IHVzZXJFbGVtLmxlbmd0aCA+IDAgPyBwYXJzZVVzZXIoc2l0ZS5jbGllbnQsIHVzZXJFbGVtKSA6IG51bGw7XG5cbiAgICAgICAgICBjb25zdCBvZGF0ZUVsZW0gPSBpbmZvQ2VsbC5maW5kKCdzcGFuLm9kYXRlJyk7XG4gICAgICAgICAgY29uc3QgY2hhbmdlZEF0ID0gb2RhdGVFbGVtLmxlbmd0aCA+IDAgPyBwYXJzZU9kYXRlKG9kYXRlRWxlbSkgOiBudWxsO1xuXG4gICAgICAgICAgLy8gQ29tbWVudFxuICAgICAgICAgIGNvbnN0IGNvbW1lbnRFbGVtID0gaW5mb0NlbGwuZmluZCgnc3Bhbi5jb21tZW50cycpO1xuICAgICAgICAgIGNvbnN0IGNvbW1lbnQgPSBjb21tZW50RWxlbVxuICAgICAgICAgICAgLnRleHQoKVxuICAgICAgICAgICAgLnRyaW0oKVxuICAgICAgICAgICAgLnJlcGxhY2UoL15bXCJcIl18W1wiXCJdJC9nLCAnJyk7XG5cbiAgICAgICAgICBjaGFuZ2VzLnB1c2goXG4gICAgICAgICAgICBuZXcgU2l0ZUNoYW5nZSh7XG4gICAgICAgICAgICAgIHNpdGUsXG4gICAgICAgICAgICAgIHBhZ2VGdWxsbmFtZSxcbiAgICAgICAgICAgICAgcGFnZVRpdGxlLFxuICAgICAgICAgICAgICByZXZpc2lvbk5vLFxuICAgICAgICAgICAgICBjaGFuZ2VkQnksXG4gICAgICAgICAgICAgIGNoYW5nZWRBdCxcbiAgICAgICAgICAgICAgZmxhZ3MsXG4gICAgICAgICAgICAgIGNvbW1lbnQsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIExpbWl0IHJlc3VsdHMgaWYgbGltaXQgaXMgc3BlY2lmaWVkXG4gICAgICAgIGNvbnN0IGxpbWl0ZWRDaGFuZ2VzID0gbGltaXQgIT09IHVuZGVmaW5lZCA/IGNoYW5nZXMuc2xpY2UoMCwgbGltaXQpIDogY2hhbmdlcztcbiAgICAgICAgcmV0dXJuIG5ldyBTaXRlQ2hhbmdlQ29sbGVjdGlvbihzaXRlLCBsaW1pdGVkQ2hhbmdlcyk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSBzaXRlIGNoYW5nZXM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG59XG4iLAogICAgImltcG9ydCB7IFVuZXhwZWN0ZWRFcnJvciB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB7IHBhcnNlVXNlciB9IGZyb20gJy4uLy4uLy4uL3V0aWwvcGFyc2VyJztcbmltcG9ydCB7XG4gIFBhZ2UsXG4gIFBhZ2VDb2xsZWN0aW9uLFxuICBTZWFyY2hQYWdlc1F1ZXJ5LFxuICB0eXBlIFNlYXJjaFBhZ2VzUXVlcnlQYXJhbXMsXG4gIFNpdGVDaGFuZ2VDb2xsZWN0aW9uLFxufSBmcm9tICcuLi8uLi9wYWdlJztcbmltcG9ydCB0eXBlIHsgU2l0ZSB9IGZyb20gJy4uL3NpdGUnO1xuXG4vKipcbiAqIFBhZ2UgbGlzdCBvcGVyYXRpb25zIGFjY2Vzc29yXG4gKi9cbmV4cG9ydCBjbGFzcyBQYWdlc0FjY2Vzc29yIHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG5cbiAgY29uc3RydWN0b3Ioc2l0ZTogU2l0ZSkge1xuICAgIHRoaXMuc2l0ZSA9IHNpdGU7XG4gIH1cblxuICAvKipcbiAgICogU2VhcmNoIHBhZ2VzIG1hdGNoaW5nIGNvbmRpdGlvbnNcbiAgICogQHBhcmFtIHBhcmFtcyAtIFNlYXJjaCBjb25kaXRpb25zXG4gICAqIEByZXR1cm5zIFBhZ2UgY29sbGVjdGlvblxuICAgKi9cbiAgc2VhcmNoKHBhcmFtcz86IFNlYXJjaFBhZ2VzUXVlcnlQYXJhbXMpOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBxdWVyeSA9IG5ldyBTZWFyY2hQYWdlc1F1ZXJ5KHBhcmFtcyk7XG4gICAgICAgIGNvbnN0IHVzZXJQYXJzZXIgPSBwYXJzZVVzZXIuYmluZChudWxsLCB0aGlzLnNpdGUuY2xpZW50KTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQYWdlQ29sbGVjdGlvbi5zZWFyY2hQYWdlcyh0aGlzLnNpdGUsIHVzZXJQYXJzZXIsIHF1ZXJ5KTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBzZWFyY2ggcGFnZXM6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBwYWdlc1xuICAgKiBAcmV0dXJucyBQYWdlIGNvbGxlY3Rpb25cbiAgICovXG4gIGFsbCgpOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gdGhpcy5zZWFyY2goe30pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCByZWNlbnQgY2hhbmdlc1xuICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnNcbiAgICogQHBhcmFtIG9wdGlvbnMucGVyUGFnZSAtIEl0ZW1zIHBlciBwYWdlIChkZWZhdWx0OiAyMClcbiAgICogQHBhcmFtIG9wdGlvbnMucGFnZSAtIFBhZ2UgbnVtYmVyIChkZWZhdWx0OiAxKVxuICAgKiBAcmV0dXJucyBDaGFuZ2UgaGlzdG9yeSBjb2xsZWN0aW9uXG4gICAqL1xuICBnZXRSZWNlbnRDaGFuZ2VzKG9wdGlvbnM/OiB7XG4gICAgcGVyUGFnZT86IG51bWJlcjtcbiAgICBwYWdlPzogbnVtYmVyO1xuICB9KTogV2lraWRvdFJlc3VsdEFzeW5jPFNpdGVDaGFuZ2VDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIFNpdGVDaGFuZ2VDb2xsZWN0aW9uLmFjcXVpcmUodGhpcy5zaXRlLCBvcHRpb25zKTtcbiAgfVxufVxuXG5leHBvcnQge1xuICBQYWdlLFxuICBQYWdlQ29sbGVjdGlvbixcbiAgU2VhcmNoUGFnZXNRdWVyeSxcbiAgdHlwZSBTZWFyY2hQYWdlc1F1ZXJ5UGFyYW1zLFxuICBTaXRlQ2hhbmdlQ29sbGVjdGlvbixcbn07XG4iLAogICAgImltcG9ydCAqIGFzIGNoZWVyaW8gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQge1xuICBOb0VsZW1lbnRFcnJvcixcbiAgTm90Rm91bmRFeGNlcHRpb24sXG4gIFVuZXhwZWN0ZWRFcnJvcixcbiAgV2lraWRvdEVycm9yLFxufSBmcm9tICcuLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL2NvbW1vbi9sb2dnZXInO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgQU1DUmVxdWVzdEJvZHksIEFNQ1Jlc3BvbnNlIH0gZnJvbSAnLi4vLi4vY29ubmVjdG9yJztcbmltcG9ydCB7IGZldGNoV2l0aFJldHJ5IH0gZnJvbSAnLi4vLi4vdXRpbC9odHRwJztcbmltcG9ydCB0eXBlIHsgQ2xpZW50IH0gZnJvbSAnLi4vY2xpZW50L2NsaWVudCc7XG5pbXBvcnQgeyBGb3J1bUFjY2Vzc29yIH0gZnJvbSAnLi9hY2Nlc3NvcnMvZm9ydW0tYWNjZXNzb3InO1xuaW1wb3J0IHsgTWVtYmVyQWNjZXNzb3IgfSBmcm9tICcuL2FjY2Vzc29ycy9tZW1iZXItYWNjZXNzb3InO1xuaW1wb3J0IHsgUGFnZUFjY2Vzc29yIH0gZnJvbSAnLi9hY2Nlc3NvcnMvcGFnZS1hY2Nlc3Nvcic7XG5pbXBvcnQgeyBQYWdlc0FjY2Vzc29yIH0gZnJvbSAnLi9hY2Nlc3NvcnMvcGFnZXMtYWNjZXNzb3InO1xuXG4vKipcbiAqIFNpdGUgZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpdGVEYXRhIHtcbiAgaWQ6IG51bWJlcjtcbiAgdGl0bGU6IHN0cmluZztcbiAgdW5peE5hbWU6IHN0cmluZztcbiAgZG9tYWluOiBzdHJpbmc7XG4gIHNzbFN1cHBvcnRlZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBTaXRlIGNsYXNzXG4gKi9cbmV4cG9ydCBjbGFzcyBTaXRlIHtcbiAgcHVibGljIHJlYWRvbmx5IGNsaWVudDogQ2xpZW50O1xuXG4gIC8qKiBTaXRlIElEICovXG4gIHB1YmxpYyByZWFkb25seSBpZDogbnVtYmVyO1xuXG4gIC8qKiBTaXRlIHRpdGxlICovXG4gIHB1YmxpYyByZWFkb25seSB0aXRsZTogc3RyaW5nO1xuXG4gIC8qKiBVTklYIG5hbWUgKGUuZy4sIHNjcC1qcCkgKi9cbiAgcHVibGljIHJlYWRvbmx5IHVuaXhOYW1lOiBzdHJpbmc7XG5cbiAgLyoqIERvbWFpbiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZG9tYWluOiBzdHJpbmc7XG5cbiAgLyoqIFNTTCBzdXBwb3J0IGZsYWcgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNzbFN1cHBvcnRlZDogYm9vbGVhbjtcblxuICAvKiogUGFnZSBhY2Nlc3NvciAqL1xuICBwcml2YXRlIF9wYWdlOiBQYWdlQWNjZXNzb3IgfCBudWxsID0gbnVsbDtcblxuICAvKiogUGFnZXMgYWNjZXNzb3IgKi9cbiAgcHJpdmF0ZSBfcGFnZXM6IFBhZ2VzQWNjZXNzb3IgfCBudWxsID0gbnVsbDtcblxuICAvKiogRm9ydW0gYWNjZXNzb3IgKi9cbiAgcHJpdmF0ZSBfZm9ydW06IEZvcnVtQWNjZXNzb3IgfCBudWxsID0gbnVsbDtcblxuICAvKiogTWVtYmVyIGFjY2Vzc29yICovXG4gIHByaXZhdGUgX21lbWJlcjogTWVtYmVyQWNjZXNzb3IgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihjbGllbnQ6IENsaWVudCwgZGF0YTogU2l0ZURhdGEpIHtcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICB0aGlzLmlkID0gZGF0YS5pZDtcbiAgICB0aGlzLnRpdGxlID0gZGF0YS50aXRsZTtcbiAgICB0aGlzLnVuaXhOYW1lID0gZGF0YS51bml4TmFtZTtcbiAgICB0aGlzLmRvbWFpbiA9IGRhdGEuZG9tYWluO1xuICAgIHRoaXMuc3NsU3VwcG9ydGVkID0gZGF0YS5zc2xTdXBwb3J0ZWQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBhZ2UgYWNjZXNzb3JcbiAgICovXG4gIGdldCBwYWdlKCk6IFBhZ2VBY2Nlc3NvciB7XG4gICAgaWYgKCF0aGlzLl9wYWdlKSB7XG4gICAgICB0aGlzLl9wYWdlID0gbmV3IFBhZ2VBY2Nlc3Nvcih0aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBhZ2VzIGFjY2Vzc29yXG4gICAqL1xuICBnZXQgcGFnZXMoKTogUGFnZXNBY2Nlc3NvciB7XG4gICAgaWYgKCF0aGlzLl9wYWdlcykge1xuICAgICAgdGhpcy5fcGFnZXMgPSBuZXcgUGFnZXNBY2Nlc3Nvcih0aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2VzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBmb3J1bSBhY2Nlc3NvclxuICAgKi9cbiAgZ2V0IGZvcnVtKCk6IEZvcnVtQWNjZXNzb3Ige1xuICAgIGlmICghdGhpcy5fZm9ydW0pIHtcbiAgICAgIHRoaXMuX2ZvcnVtID0gbmV3IEZvcnVtQWNjZXNzb3IodGhpcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9mb3J1bTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbWVtYmVyIGFjY2Vzc29yXG4gICAqL1xuICBnZXQgbWVtYmVyKCk6IE1lbWJlckFjY2Vzc29yIHtcbiAgICBpZiAoIXRoaXMuX21lbWJlcikge1xuICAgICAgdGhpcy5fbWVtYmVyID0gbmV3IE1lbWJlckFjY2Vzc29yKHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fbWVtYmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBiYXNlIFVSTCBvZiB0aGUgc2l0ZVxuICAgKi9cbiAgZ2V0QmFzZVVybCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHByb3RvY29sID0gdGhpcy5zc2xTdXBwb3J0ZWQgPyAnaHR0cHMnIDogJ2h0dHAnO1xuICAgIHJldHVybiBgJHtwcm90b2NvbH06Ly8ke3RoaXMuZG9tYWlufWA7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBBTUMgcmVxdWVzdCB0byB0aGlzIHNpdGVcbiAgICogQHBhcmFtIGJvZGllcyAtIFJlcXVlc3QgYm9keSBhcnJheVxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFJlcXVlc3Qgb3B0aW9uc1xuICAgKiBAcmV0dXJucyBBTUMgcmVzcG9uc2UgYXJyYXlcbiAgICovXG4gIGFtY1JlcXVlc3QoYm9kaWVzOiBBTUNSZXF1ZXN0Qm9keVtdKTogV2lraWRvdFJlc3VsdEFzeW5jPEFNQ1Jlc3BvbnNlW10+O1xuICBhbWNSZXF1ZXN0KFxuICAgIGJvZGllczogQU1DUmVxdWVzdEJvZHlbXSxcbiAgICBvcHRpb25zOiB7IHJldHVybkV4Y2VwdGlvbnM6IHRydWUgfVxuICApOiBXaWtpZG90UmVzdWx0QXN5bmM8KEFNQ1Jlc3BvbnNlIHwgV2lraWRvdEVycm9yKVtdPjtcbiAgYW1jUmVxdWVzdChcbiAgICBib2RpZXM6IEFNQ1JlcXVlc3RCb2R5W10sXG4gICAgb3B0aW9ucz86IHsgcmV0dXJuRXhjZXB0aW9ucz86IGJvb2xlYW4gfVxuICApOiBXaWtpZG90UmVzdWx0QXN5bmM8QU1DUmVzcG9uc2VbXT4gfCBXaWtpZG90UmVzdWx0QXN5bmM8KEFNQ1Jlc3BvbnNlIHwgV2lraWRvdEVycm9yKVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmFtY0NsaWVudC5yZXF1ZXN0V2l0aE9wdGlvbnMoYm9kaWVzLCB7XG4gICAgICBzaXRlTmFtZTogdGhpcy51bml4TmFtZSxcbiAgICAgIHNzbFN1cHBvcnRlZDogdGhpcy5zc2xTdXBwb3J0ZWQsXG4gICAgICByZXR1cm5FeGNlcHRpb25zOiBvcHRpb25zPy5yZXR1cm5FeGNlcHRpb25zID8/IGZhbHNlLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgQU1DIHJlcXVlc3Qgd2l0aCBwYXJ0aWFsIGZhaWx1cmUgdG9sZXJhbmNlLlxuICAgKiBSZXF1ZXN0cyBhcmUgc3BsaXQgaW50byBiYXRjaGVzIGFuZCBmYWlsZWQgcmVxdWVzdHMgYXJlIHJldHJpZWQuXG4gICAqIEBwYXJhbSBib2RpZXMgLSBSZXF1ZXN0IGJvZHkgYXJyYXlcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBiYXRjaCBzaXplIGFuZCBtYXggcmV0cmllc1xuICAgKiBAcmV0dXJucyBBTUMgcmVzcG9uc2UgYXJyYXkgKG51bGwgZm9yIHBlcm1hbmVudGx5IGZhaWxlZCByZXF1ZXN0cylcbiAgICovXG4gIGFtY1JlcXVlc3RXaXRoUmV0cnkoXG4gICAgYm9kaWVzOiBBTUNSZXF1ZXN0Qm9keVtdLFxuICAgIG9wdGlvbnM/OiB7IGJhdGNoU2l6ZT86IG51bWJlcjsgbWF4UmV0cmllcz86IG51bWJlciB9XG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzwoQU1DUmVzcG9uc2UgfCBudWxsKVtdPiB7XG4gICAgY29uc3QgYmF0Y2hTaXplID0gb3B0aW9ucz8uYmF0Y2hTaXplID8/IHRoaXMuY2xpZW50LmFtY0NsaWVudC5jb25maWcucmV0cnlCYXRjaFNpemU7XG4gICAgY29uc3QgbWF4UmV0cmllcyA9IG9wdGlvbnM/Lm1heFJldHJpZXMgPz8gdGhpcy5jbGllbnQuYW1jQ2xpZW50LmNvbmZpZy5yZXRyeU1heFJldHJpZXM7XG5cbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoYmF0Y2hTaXplKSB8fCBiYXRjaFNpemUgPD0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBiYXRjaFNpemU6ICR7YmF0Y2hTaXplfS4gTXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIuYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKG1heFJldHJpZXMpIHx8IG1heFJldHJpZXMgPCAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG1heFJldHJpZXM6ICR7bWF4UmV0cmllc30uIE11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlci5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFsbFJlc3VsdHM6IChBTUNSZXNwb25zZSB8IG51bGwpW10gPSBbXTtcblxuICAgICAgICBmb3IgKGxldCBiYXRjaFN0YXJ0ID0gMDsgYmF0Y2hTdGFydCA8IGJvZGllcy5sZW5ndGg7IGJhdGNoU3RhcnQgKz0gYmF0Y2hTaXplKSB7XG4gICAgICAgICAgY29uc3QgYmF0Y2ggPSBib2RpZXMuc2xpY2UoYmF0Y2hTdGFydCwgYmF0Y2hTdGFydCArIGJhdGNoU2l6ZSk7XG5cbiAgICAgICAgICBjb25zdCBpbml0aWFsUmVzdWx0ID0gYXdhaXQgdGhpcy5hbWNSZXF1ZXN0KGJhdGNoLCB7IHJldHVybkV4Y2VwdGlvbnM6IHRydWUgfSk7XG4gICAgICAgICAgaWYgKGluaXRpYWxSZXN1bHQuaXNFcnIoKSkgdGhyb3cgaW5pdGlhbFJlc3VsdC5lcnJvcjtcblxuICAgICAgICAgIGNvbnN0IGJhdGNoUmVzdWx0czogKEFNQ1Jlc3BvbnNlIHwgbnVsbClbXSA9IFtdO1xuICAgICAgICAgIGxldCBmYWlsZWRJbmRpY2VzOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgICAgICAgZm9yIChjb25zdCBbaSwgcmVzcE9yRXJyXSBvZiBpbml0aWFsUmVzdWx0LnZhbHVlLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgaWYgKHJlc3BPckVyciBpbnN0YW5jZW9mIFdpa2lkb3RFcnJvcikge1xuICAgICAgICAgICAgICBiYXRjaFJlc3VsdHMucHVzaChudWxsKTtcbiAgICAgICAgICAgICAgZmFpbGVkSW5kaWNlcy5wdXNoKGkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgYmF0Y2hSZXN1bHRzLnB1c2gocmVzcE9yRXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgYXR0ZW1wdCA8IG1heFJldHJpZXMgJiYgZmFpbGVkSW5kaWNlcy5sZW5ndGggPiAwOyBhdHRlbXB0KyspIHtcbiAgICAgICAgICAgIGNvbnN0IHJldHJ5Qm9kaWVzID0gZmFpbGVkSW5kaWNlcy5tYXAoKGkpID0+IGJhdGNoW2ldISk7XG4gICAgICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICAgICAgYGFtY1JlcXVlc3RXaXRoUmV0cnk6ICR7ZmFpbGVkSW5kaWNlcy5sZW5ndGh9LyR7YmF0Y2gubGVuZ3RofSByZXF1ZXN0cyBmYWlsZWQsIHJldHJ5aW5nIChhdHRlbXB0ICR7YXR0ZW1wdCArIDF9LyR7bWF4UmV0cmllc30pYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHJldHJ5UmVzdWx0ID0gYXdhaXQgdGhpcy5hbWNSZXF1ZXN0KHJldHJ5Qm9kaWVzLCB7IHJldHVybkV4Y2VwdGlvbnM6IHRydWUgfSk7XG4gICAgICAgICAgICBpZiAocmV0cnlSZXN1bHQuaXNFcnIoKSkgYnJlYWs7XG5cbiAgICAgICAgICAgIGNvbnN0IHN0aWxsRmFpbGVkSW5kaWNlczogbnVtYmVyW10gPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZmFpbGVkSW5kaWNlcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICBjb25zdCByZXRyeVJlc3AgPSByZXRyeVJlc3VsdC52YWx1ZVtqXTtcbiAgICAgICAgICAgICAgaWYgKHJldHJ5UmVzcCAmJiAhKHJldHJ5UmVzcCBpbnN0YW5jZW9mIFdpa2lkb3RFcnJvcikpIHtcbiAgICAgICAgICAgICAgICBiYXRjaFJlc3VsdHNbZmFpbGVkSW5kaWNlc1tqXSFdID0gcmV0cnlSZXNwO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHN0aWxsRmFpbGVkSW5kaWNlcy5wdXNoKGZhaWxlZEluZGljZXNbal0hKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmFpbGVkSW5kaWNlcyA9IHN0aWxsRmFpbGVkSW5kaWNlcztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhbGxSZXN1bHRzLnB1c2goLi4uYmF0Y2hSZXN1bHRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZhaWxlZENvdW50ID0gYWxsUmVzdWx0cy5maWx0ZXIoKHIpID0+IHIgPT09IG51bGwpLmxlbmd0aDtcbiAgICAgICAgaWYgKGZhaWxlZENvdW50ID4gMCkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgICAgYGFtY1JlcXVlc3RXaXRoUmV0cnk6ICR7YWxsUmVzdWx0cy5sZW5ndGggLSBmYWlsZWRDb3VudH0vJHthbGxSZXN1bHRzLmxlbmd0aH0gc3VjY2VlZGVkICgke2ZhaWxlZENvdW50fSBmYWlsZWQpYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYWxsUmVzdWx0cztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgV2lraWRvdEVycm9yKSByZXR1cm4gZXJyb3I7XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBBTUMgcmVxdWVzdCB3aXRoIHJldHJ5IGZhaWxlZDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBhIHNpbmdsZSBBTUMgcmVxdWVzdFxuICAgKiBAcGFyYW0gYm9keSAtIFJlcXVlc3QgYm9keVxuICAgKiBAcmV0dXJucyBBTUMgcmVzcG9uc2VcbiAgICovXG4gIGFtY1JlcXVlc3RTaW5nbGUoYm9keTogQU1DUmVxdWVzdEJvZHkpOiBXaWtpZG90UmVzdWx0QXN5bmM8QU1DUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmFtY1JlcXVlc3QoW2JvZHldKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRFcnJvcignQU1DIHJlcXVlc3QgcmV0dXJuZWQgZW1wdHkgcmVzcG9uc2UnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFVuZXhwZWN0ZWRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgQU1DIHJlcXVlc3QgZmFpbGVkOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc2l0ZSBmcm9tIFVOSVggbmFtZVxuICAgKiBAcGFyYW0gY2xpZW50IC0gQ2xpZW50XG4gICAqIEBwYXJhbSB1bml4TmFtZSAtIFNpdGUgVU5JWCBuYW1lIChlLmcuLCAnc2NwLWpwJylcbiAgICogQHJldHVybnMgU2l0ZVxuICAgKi9cbiAgc3RhdGljIGZyb21Vbml4TmFtZShjbGllbnQ6IENsaWVudCwgdW5peE5hbWU6IHN0cmluZyk6IFdpa2lkb3RSZXN1bHRBc3luYzxTaXRlPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gRmV0Y2ggc2l0ZSBwYWdlIChIVFRQIHJlcXVlc3QsIGZvbGxvd2luZyByZWRpcmVjdHMsIHdpdGggcmV0cnkpXG4gICAgICAgIGNvbnN0IHVybCA9IGBodHRwOi8vJHt1bml4TmFtZX0ud2lraWRvdC5jb21gO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoV2l0aFJldHJ5KHVybCwgY2xpZW50LmFtY0NsaWVudC5jb25maWcsIHtcbiAgICAgICAgICBoZWFkZXJzOiBjbGllbnQuYW1jQ2xpZW50LmhlYWRlci5nZXRIZWFkZXJzKCksXG4gICAgICAgICAgY2hlY2tPazogZmFsc2UsIC8vIEhhbmRsZSBIVFRQIGVycm9ycyBtYW51YWxseSBmb3IgYmV0dGVyIGVycm9yIG1lc3NhZ2VzXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihgU2l0ZSBub3QgZm91bmQ6ICR7dW5peE5hbWV9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBmZXRjaCBzaXRlOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGh0bWwgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoaHRtbCk7XG5cbiAgICAgICAgLy8gUGFyc2UgV0lLSVJFUVVFU1QuaW5mb1xuICAgICAgICBjb25zdCBzY3JpcHRzID0gJCgnc2NyaXB0JykudG9BcnJheSgpO1xuICAgICAgICBsZXQgc2l0ZUlkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICAgICAgbGV0IHNpdGVVbml4TmFtZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgICAgIGxldCBkb21haW46IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgICAgICBsZXQgdGl0bGU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgIGZvciAoY29uc3Qgc2NyaXB0IG9mIHNjcmlwdHMpIHtcbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gJChzY3JpcHQpLmh0bWwoKTtcbiAgICAgICAgICBpZiAoIWNvbnRlbnQ/LmluY2x1ZGVzKCdXSUtJUkVRVUVTVCcpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBzaXRlSWRcbiAgICAgICAgICBjb25zdCBzaXRlSWRNYXRjaCA9IGNvbnRlbnQubWF0Y2goL1dJS0lSRVFVRVNUXFwuaW5mb1xcLnNpdGVJZFxccyo9XFxzKihcXGQrKS8pO1xuICAgICAgICAgIGlmIChzaXRlSWRNYXRjaD8uWzFdKSB7XG4gICAgICAgICAgICBzaXRlSWQgPSBOdW1iZXIucGFyc2VJbnQoc2l0ZUlkTWF0Y2hbMV0sIDEwKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBzaXRlVW5peE5hbWVcbiAgICAgICAgICBjb25zdCBzaXRlVW5peE5hbWVNYXRjaCA9IGNvbnRlbnQubWF0Y2goXG4gICAgICAgICAgICAvV0lLSVJFUVVFU1RcXC5pbmZvXFwuc2l0ZVVuaXhOYW1lXFxzKj1cXHMqW1wiJ10oW15cIiddKylbXCInXS9cbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChzaXRlVW5peE5hbWVNYXRjaD8uWzFdKSB7XG4gICAgICAgICAgICBzaXRlVW5peE5hbWUgPSBzaXRlVW5peE5hbWVNYXRjaFsxXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBkb21haW5cbiAgICAgICAgICBjb25zdCBkb21haW5NYXRjaCA9IGNvbnRlbnQubWF0Y2goL1dJS0lSRVFVRVNUXFwuaW5mb1xcLmRvbWFpblxccyo9XFxzKltcIiddKFteXCInXSspW1wiJ10vKTtcbiAgICAgICAgICBpZiAoZG9tYWluTWF0Y2g/LlsxXSkge1xuICAgICAgICAgICAgZG9tYWluID0gZG9tYWluTWF0Y2hbMV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdGl0bGUgZnJvbSA8dGl0bGU+IHRhZ1xuICAgICAgICB0aXRsZSA9ICQoJ3RpdGxlJykudGV4dCgpLnRyaW0oKSB8fCBudWxsO1xuICAgICAgICAvLyBSZW1vdmUgXCIgLSBXaWtpZG90XCIgc3VmZml4IGlmIHByZXNlbnRcbiAgICAgICAgaWYgKHRpdGxlPy5lbmRzV2l0aCgnIC0gV2lraWRvdCcpKSB7XG4gICAgICAgICAgdGl0bGUgPSB0aXRsZS5zbGljZSgwLCAtMTApLnRyaW0oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzaXRlSWQgPT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ1NpdGUgSUQgbm90IGZvdW5kIGluIFdJS0lSRVFVRVNUJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNpdGVVbml4TmFtZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHNpdGVVbml4TmFtZSA9IHVuaXhOYW1lOyAvLyBGYWxsYmFja1xuICAgICAgICB9XG4gICAgICAgIGlmIChkb21haW4gPT09IG51bGwpIHtcbiAgICAgICAgICBkb21haW4gPSBgJHt1bml4TmFtZX0ud2lraWRvdC5jb21gOyAvLyBGYWxsYmFja1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aXRsZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHRpdGxlID0gdW5peE5hbWU7IC8vIEZhbGxiYWNrXG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBTU0wgc3VwcG9ydCAoYmFzZWQgb24gd2hldGhlciB0aGUgcmVkaXJlY3QgVVJMIHN0YXJ0cyB3aXRoIGh0dHBzKVxuICAgICAgICBjb25zdCBzc2xTdXBwb3J0ZWQgPSByZXNwb25zZS51cmwuc3RhcnRzV2l0aCgnaHR0cHMnKTtcblxuICAgICAgICByZXR1cm4gbmV3IFNpdGUoY2xpZW50LCB7XG4gICAgICAgICAgaWQ6IHNpdGVJZCxcbiAgICAgICAgICB0aXRsZSxcbiAgICAgICAgICB1bml4TmFtZTogc2l0ZVVuaXhOYW1lLFxuICAgICAgICAgIGRvbWFpbixcbiAgICAgICAgICBzc2xTdXBwb3J0ZWQsXG4gICAgICAgIH0pO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb3RGb3VuZEV4Y2VwdGlvbiB8fCBlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHNpdGU6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFNpdGUoaWQ9JHt0aGlzLmlkfSwgdW5peE5hbWU9JHt0aGlzLnVuaXhOYW1lfSwgdGl0bGU9JHt0aGlzLnRpdGxlfSlgO1xuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB7IFNpdGUgfSBmcm9tICcuLi8uLi9zaXRlJztcbmltcG9ydCB0eXBlIHsgQ2xpZW50IH0gZnJvbSAnLi4vY2xpZW50JztcblxuLyoqXG4gKiBTaXRlIG9wZXJhdGlvbnMgYWNjZXNzb3JcbiAqL1xuZXhwb3J0IGNsYXNzIFNpdGVBY2Nlc3NvciB7XG4gIHB1YmxpYyByZWFkb25seSBjbGllbnQ6IENsaWVudDtcblxuICBjb25zdHJ1Y3RvcihjbGllbnQ6IENsaWVudCkge1xuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzaXRlIGJ5IFVOSVggbmFtZVxuICAgKlxuICAgKiBAcGFyYW0gdW5peE5hbWUgLSBTaXRlIFVOSVggbmFtZSAoZS5nLiwgJ3NjcC1qcCcpXG4gICAqIEByZXR1cm5zIFNpdGUgb2JqZWN0IHdyYXBwZWQgaW4gUmVzdWx0IHR5cGVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBzaXRlUmVzdWx0ID0gYXdhaXQgY2xpZW50LnNpdGUuZ2V0KCdzY3AtanAnKTtcbiAgICogaWYgKCFzaXRlUmVzdWx0LmlzT2soKSkge1xuICAgKiAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGdldCBzaXRlJyk7XG4gICAqIH1cbiAgICogY29uc3Qgc2l0ZSA9IHNpdGVSZXN1bHQudmFsdWU7XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0KHVuaXhOYW1lOiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8U2l0ZT4ge1xuICAgIHJldHVybiBTaXRlLmZyb21Vbml4TmFtZSh0aGlzLmNsaWVudCwgdW5peE5hbWUpO1xuICB9XG59XG5cbmV4cG9ydCB7IFNpdGUgfTtcbiIsCiAgICAiaW1wb3J0IHsgTm90Rm91bmRFeGNlcHRpb24gfSBmcm9tICcuLi8uLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jLCB3ZEVyckFzeW5jLCB3ZE9rQXN5bmMgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgVXNlciwgdHlwZSBVc2VyQ29sbGVjdGlvbiB9IGZyb20gJy4uLy4uL3VzZXInO1xuaW1wb3J0IHR5cGUgeyBDbGllbnQgfSBmcm9tICcuLi9jbGllbnQnO1xuXG4vKipcbiAqIFVzZXIgcmV0cmlldmFsIG9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRVc2VyT3B0aW9ucyB7XG4gIC8qKiBUaHJvdyBlcnJvciBpZiB1c2VyIG5vdCBmb3VuZCAoZGVmYXVsdDogZmFsc2UpICovXG4gIHJhaXNlV2hlbk5vdEZvdW5kPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBVc2VyIG9wZXJhdGlvbnMgYWNjZXNzb3JcbiAqL1xuZXhwb3J0IGNsYXNzIFVzZXJBY2Nlc3NvciB7XG4gIHB1YmxpYyByZWFkb25seSBjbGllbnQ6IENsaWVudDtcblxuICBjb25zdHJ1Y3RvcihjbGllbnQ6IENsaWVudCkge1xuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB1c2VyIGJ5IHVzZXJuYW1lXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gVXNlcm5hbWVcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBSZXRyaWV2YWwgb3B0aW9uc1xuICAgKiBAcmV0dXJucyBVc2VyIHdyYXBwZWQgaW4gUmVzdWx0IHR5cGUgKG51bGwgaWYgbm90IGZvdW5kLCBlcnJvciBpZiByYWlzZVdoZW5Ob3RGb3VuZCBpcyB0cnVlKVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHVzZXJSZXN1bHQgPSBhd2FpdCBjbGllbnQudXNlci5nZXQoJ3VzZXJuYW1lJyk7XG4gICAqIGlmICghdXNlclJlc3VsdC5pc09rKCkpIHtcbiAgICogICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBnZXQgdXNlcicpO1xuICAgKiB9XG4gICAqIGNvbnN0IHVzZXIgPSB1c2VyUmVzdWx0LnZhbHVlO1xuICAgKiBgYGBcbiAgICovXG4gIGdldChuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IEdldFVzZXJPcHRpb25zID0ge30pOiBXaWtpZG90UmVzdWx0QXN5bmM8VXNlciB8IG51bGw+IHtcbiAgICBjb25zdCB7IHJhaXNlV2hlbk5vdEZvdW5kID0gZmFsc2UgfSA9IG9wdGlvbnM7XG5cbiAgICByZXR1cm4gVXNlci5mcm9tTmFtZSh0aGlzLmNsaWVudCwgbmFtZSkuYW5kVGhlbigodXNlcikgPT4ge1xuICAgICAgaWYgKHVzZXIgPT09IG51bGwgJiYgcmFpc2VXaGVuTm90Rm91bmQpIHtcbiAgICAgICAgcmV0dXJuIHdkRXJyQXN5bmMobmV3IE5vdEZvdW5kRXhjZXB0aW9uKGBVc2VyIG5vdCBmb3VuZDogJHtuYW1lfWApKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB3ZE9rQXN5bmModXNlcik7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHVzZXJzIGZyb20gbXVsdGlwbGUgdXNlcm5hbWVzXG4gICAqIEBwYXJhbSBuYW1lcyAtIEFycmF5IG9mIHVzZXJuYW1lc1xuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFJldHJpZXZhbCBvcHRpb25zXG4gICAqIEByZXR1cm5zIFVzZXIgY29sbGVjdGlvbiAobnVsbCBmb3Igbm9uLWV4aXN0ZW50IHVzZXJzLCBlcnJvciBpZiByYWlzZVdoZW5Ob3RGb3VuZCBpcyB0cnVlKVxuICAgKi9cbiAgZ2V0TWFueShuYW1lczogc3RyaW5nW10sIG9wdGlvbnM6IEdldFVzZXJPcHRpb25zID0ge30pOiBXaWtpZG90UmVzdWx0QXN5bmM8VXNlckNvbGxlY3Rpb24+IHtcbiAgICBjb25zdCB7IHJhaXNlV2hlbk5vdEZvdW5kID0gZmFsc2UgfSA9IG9wdGlvbnM7XG5cbiAgICByZXR1cm4gVXNlci5mcm9tTmFtZXModGhpcy5jbGllbnQsIG5hbWVzKS5hbmRUaGVuKChjb2xsZWN0aW9uKSA9PiB7XG4gICAgICBpZiAocmFpc2VXaGVuTm90Rm91bmQpIHtcbiAgICAgICAgY29uc3Qgbm90Rm91bmROYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IG5hbWUgPSBuYW1lc1tpXTtcbiAgICAgICAgICBpZiAoY29sbGVjdGlvbltpXSA9PT0gbnVsbCAmJiBuYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG5vdEZvdW5kTmFtZXMucHVzaChuYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vdEZvdW5kTmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJldHVybiB3ZEVyckFzeW5jKG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihgVXNlcnMgbm90IGZvdW5kOiAke25vdEZvdW5kTmFtZXMuam9pbignLCAnKX1gKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB3ZE9rQXN5bmMoY29sbGVjdGlvbik7XG4gICAgfSk7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgTG9naW5SZXF1aXJlZEVycm9yIH0gZnJvbSAnLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQge1xuICBmcm9tUHJvbWlzZSxcbiAgdHlwZSBXaWtpZG90UmVzdWx0LFxuICB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyxcbiAgd2RFcnIsXG4gIHdkT2ssXG4gIHdkT2tBc3luYyxcbn0gZnJvbSAnLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB7IEFNQ0NsaWVudCwgdHlwZSBBTUNDb25maWcsIGxvZ2luLCBsb2dvdXQgfSBmcm9tICcuLi8uLi9jb25uZWN0b3InO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gJy4uL3VzZXIvdXNlcic7XG5pbXBvcnQgeyBQcml2YXRlTWVzc2FnZUFjY2Vzc29yIH0gZnJvbSAnLi9hY2Nlc3NvcnMvcG0tYWNjZXNzb3InO1xuaW1wb3J0IHsgU2l0ZUFjY2Vzc29yIH0gZnJvbSAnLi9hY2Nlc3NvcnMvc2l0ZS1hY2Nlc3Nvcic7XG5pbXBvcnQgeyBVc2VyQWNjZXNzb3IgfSBmcm9tICcuL2FjY2Vzc29ycy91c2VyLWFjY2Vzc29yJztcblxuLyoqXG4gKiBDbGllbnQgY3JlYXRpb24gb3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENsaWVudE9wdGlvbnMge1xuICAvKiogV2lraWRvdCB1c2VybmFtZSAqL1xuICB1c2VybmFtZT86IHN0cmluZztcblxuICAvKiogV2lraWRvdCBwYXNzd29yZCAqL1xuICBwYXNzd29yZD86IHN0cmluZztcblxuICAvKiogQmFzZSBkb21haW4gKGRlZmF1bHQ6IHdpa2lkb3QuY29tKSAqL1xuICBkb21haW4/OiBzdHJpbmc7XG5cbiAgLyoqIEFNQyBjb25maWd1cmF0aW9uIG92ZXJyaWRlICovXG4gIGFtY0NvbmZpZz86IFBhcnRpYWw8QU1DQ29uZmlnPjtcbn1cblxuLyoqXG4gKiBXaWtpZG90IGNsaWVudFxuICogTWFpbiBlbnRyeSBwb2ludCBvZiB0aGUgbGlicmFyeVxuICovXG5leHBvcnQgY2xhc3MgQ2xpZW50IHtcbiAgLyoqIEFNQyBjbGllbnQgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFtY0NsaWVudDogQU1DQ2xpZW50O1xuXG4gIC8qKiBCYXNlIGRvbWFpbiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZG9tYWluOiBzdHJpbmc7XG5cbiAgLyoqIFVzZXIgb3BlcmF0aW9ucyBhY2Nlc3NvciAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdXNlcjogVXNlckFjY2Vzc29yO1xuXG4gIC8qKiBTaXRlIG9wZXJhdGlvbnMgYWNjZXNzb3IgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGVBY2Nlc3NvcjtcblxuICAvKiogUHJpdmF0ZSBtZXNzYWdlIG9wZXJhdGlvbnMgYWNjZXNzb3IgKi9cbiAgcHVibGljIHJlYWRvbmx5IHByaXZhdGVNZXNzYWdlOiBQcml2YXRlTWVzc2FnZUFjY2Vzc29yO1xuXG4gIC8qKiBVc2VybmFtZSBvZiB0aGUgbG9nZ2VkLWluIHVzZXIgKi9cbiAgcHJpdmF0ZSBfdXNlcm5hbWU6IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqIExvZ2dlZC1pbiB1c2VyICovXG4gIHByaXZhdGUgX21lOiBVc2VyIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIFByaXZhdGUgY29uc3RydWN0b3JcbiAgICogVXNlIHRoZSBjcmVhdGUgbWV0aG9kIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZVxuICAgKi9cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihhbWNDbGllbnQ6IEFNQ0NsaWVudCwgZG9tYWluOiBzdHJpbmcsIHVzZXJuYW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbCkge1xuICAgIHRoaXMuYW1jQ2xpZW50ID0gYW1jQ2xpZW50O1xuICAgIHRoaXMuZG9tYWluID0gZG9tYWluO1xuICAgIHRoaXMuX3VzZXJuYW1lID0gdXNlcm5hbWU7XG5cbiAgICAvLyBJbml0aWFsaXplIGFjY2Vzc29yc1xuICAgIHRoaXMudXNlciA9IG5ldyBVc2VyQWNjZXNzb3IodGhpcyk7XG4gICAgdGhpcy5zaXRlID0gbmV3IFNpdGVBY2Nlc3Nvcih0aGlzKTtcbiAgICB0aGlzLnByaXZhdGVNZXNzYWdlID0gbmV3IFByaXZhdGVNZXNzYWdlQWNjZXNzb3IodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB1c2VybmFtZSBvZiB0aGUgbG9nZ2VkLWluIHVzZXJcbiAgICovXG4gIGdldCB1c2VybmFtZSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fdXNlcm5hbWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBsb2dnZWQtaW4gdXNlclxuICAgKiBSZXR1cm5zIG51bGwgaWYgbm90IGxvZ2dlZCBpblxuICAgKi9cbiAgZ2V0IG1lKCk6IFVzZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fbWU7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgY2xpZW50XG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gQ2xpZW50IG9wdGlvbnNcbiAgICogQHJldHVybnMgQ2xpZW50IGluc3RhbmNlIHdyYXBwZWQgaW4gUmVzdWx0IHR5cGVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBpbXBvcnQgeyBDbGllbnQgfSBmcm9tICdAdWt3aGF0bi93aWtpZG90JztcbiAgICpcbiAgICogLy8gQ3JlYXRlIGEgY2xpZW50XG4gICAqIGNvbnN0IGNsaWVudFJlc3VsdCA9IGF3YWl0IENsaWVudC5jcmVhdGUoe1xuICAgKiAgIHVzZXJuYW1lOiAneW91cl91c2VybmFtZScsXG4gICAqICAgcGFzc3dvcmQ6ICd5b3VyX3Bhc3N3b3JkJyxcbiAgICogfSk7XG4gICAqXG4gICAqIC8vIFJlc3VsdCB0eXBlIHJlcXVpcmVzIGlzT2soKSBjaGVjayBiZWZvcmUgYWNjZXNzaW5nIC52YWx1ZVxuICAgKiBpZiAoIWNsaWVudFJlc3VsdC5pc09rKCkpIHtcbiAgICogICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBjcmVhdGUgY2xpZW50Jyk7XG4gICAqIH1cbiAgICogY29uc3QgY2xpZW50ID0gY2xpZW50UmVzdWx0LnZhbHVlO1xuICAgKlxuICAgKiAvLyBOb3cgeW91IGNhbiBhY2Nlc3MgY2xpZW50LnNpdGUsIGV0Yy5cbiAgICogY29uc3Qgc2l0ZVJlc3VsdCA9IGF3YWl0IGNsaWVudC5zaXRlLmdldCgnc2NwLWpwJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgc3RhdGljIGNyZWF0ZShvcHRpb25zOiBDbGllbnRPcHRpb25zID0ge30pOiBXaWtpZG90UmVzdWx0QXN5bmM8Q2xpZW50PiB7XG4gICAgY29uc3QgeyB1c2VybmFtZSwgcGFzc3dvcmQsIGRvbWFpbiA9ICd3aWtpZG90LmNvbScsIGFtY0NvbmZpZyA9IHt9IH0gPSBvcHRpb25zO1xuXG4gICAgLy8gQ3JlYXRlIEFNQyBjbGllbnRcbiAgICBjb25zdCBhbWNDbGllbnQgPSBuZXcgQU1DQ2xpZW50KGFtY0NvbmZpZywgZG9tYWluKTtcblxuICAgIC8vIExvZ2luIGlmIGNyZWRlbnRpYWxzIGFyZSBwcm92aWRlZFxuICAgIGlmICh1c2VybmFtZSAmJiBwYXNzd29yZCkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNsaWVudCA9IG5ldyBDbGllbnQoYW1jQ2xpZW50LCBkb21haW4sIHVzZXJuYW1lKTtcbiAgICAgICAgICBjb25zdCBsb2dpblJlc3VsdCA9IGF3YWl0IGxvZ2luKGNsaWVudCwgdXNlcm5hbWUsIHBhc3N3b3JkKTtcbiAgICAgICAgICBpZiAobG9naW5SZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgICAgdGhyb3cgbG9naW5SZXN1bHQuZXJyb3I7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gR2V0IGxvZ2dlZC1pbiB1c2VyIGluZm9ybWF0aW9uXG4gICAgICAgICAgY29uc3QgdXNlclJlc3VsdCA9IGF3YWl0IFVzZXIuZnJvbU5hbWUoY2xpZW50LCB1c2VybmFtZSk7XG4gICAgICAgICAgaWYgKHVzZXJSZXN1bHQuaXNPaygpICYmIHVzZXJSZXN1bHQudmFsdWUpIHtcbiAgICAgICAgICAgIGNsaWVudC5fbWUgPSB1c2VyUmVzdWx0LnZhbHVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjbGllbnQ7XG4gICAgICAgIH0pKCksXG4gICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IExvZ2luUmVxdWlyZWRFcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBjbGllbnQ6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdW5hdXRoZW50aWNhdGVkIGNsaWVudFxuICAgIHJldHVybiB3ZE9rQXN5bmMobmV3IENsaWVudChhbWNDbGllbnQsIGRvbWFpbikpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiB1bmF1dGhlbnRpY2F0ZWQgY2xpZW50XG4gICAqIEBwYXJhbSBvcHRpb25zIC0gQ2xpZW50IG9wdGlvbnMgKGV4Y2x1ZGluZyBjcmVkZW50aWFscylcbiAgICogQHJldHVybnMgQ2xpZW50IGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgY3JlYXRlQW5vbnltb3VzKG9wdGlvbnM6IE9taXQ8Q2xpZW50T3B0aW9ucywgJ3VzZXJuYW1lJyB8ICdwYXNzd29yZCc+ID0ge30pOiBDbGllbnQge1xuICAgIGNvbnN0IHsgZG9tYWluID0gJ3dpa2lkb3QuY29tJywgYW1jQ29uZmlnID0ge30gfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgYW1jQ2xpZW50ID0gbmV3IEFNQ0NsaWVudChhbWNDb25maWcsIGRvbWFpbik7XG4gICAgcmV0dXJuIG5ldyBDbGllbnQoYW1jQ2xpZW50LCBkb21haW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGxvZ2luIHN0YXR1c1xuICAgKiBAcmV0dXJucyB0cnVlIGlmIGxvZ2dlZCBpblxuICAgKi9cbiAgaXNMb2dnZWRJbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdXNlcm5hbWUgIT09IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmVxdWlyZSBsb2dpblxuICAgKiBSZXR1cm5zIExvZ2luUmVxdWlyZWRFcnJvciBpZiBub3QgbG9nZ2VkIGluXG4gICAqIEByZXR1cm5zIHZvaWQgb24gc3VjY2Vzc1xuICAgKi9cbiAgcmVxdWlyZUxvZ2luKCk6IFdpa2lkb3RSZXN1bHQ8dm9pZD4ge1xuICAgIGlmICghdGhpcy5pc0xvZ2dlZEluKCkpIHtcbiAgICAgIHJldHVybiB3ZEVycihuZXcgTG9naW5SZXF1aXJlZEVycm9yKCkpO1xuICAgIH1cbiAgICByZXR1cm4gd2RPayh1bmRlZmluZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIHRoZSBjbGllbnRcbiAgICogQXR0ZW1wdHMgdG8gbG9nb3V0IGlmIGEgc2Vzc2lvbiBleGlzdHNcbiAgICovXG4gIGNsb3NlKCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaXNMb2dnZWRJbigpKSB7XG4gICAgICByZXR1cm4gbG9nb3V0KHRoaXMpLm1hcCgoKSA9PiB7XG4gICAgICAgIHRoaXMuX3VzZXJuYW1lID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gd2RPa0FzeW5jKHVuZGVmaW5lZCk7XG4gIH1cbn1cbiIsCiAgICAiZXhwb3J0ICogZnJvbSAnLi9jbGllbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9mb3J1bSc7XG5leHBvcnQgKiBmcm9tICcuL3BhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9wcml2YXRlLW1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9zaXRlJztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi91c2VyJztcbiIsCiAgICAiZXhwb3J0ICogZnJvbSAnLi9wYXJzZXInO1xuZXhwb3J0ICogZnJvbSAnLi9xdWljay1tb2R1bGUnO1xuIgogIF0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFJc0IsY0FrQlQ7QUFBQTtBQUFBLEVBbEJTLGVBQWYsTUFBZSxxQkFBcUIsTUFBTTtBQUFBLElBRXRCO0FBQUEsSUFLekIsV0FBVyxD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QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7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TUFBTSxDQUFDO0FBQUE7QUFBQSxTQVF6QyxlQUFlLENBQUMsVUFBd0QsQ0FBQyxHQUFXO0FBQUEsSUFDekYsUUFBUSxTQUFTLGVBQWUsWUFBWSxDQUFDLE1BQU07QUFBQSxJQUNuRCxNQUFNLFlBQVksSUFBSSxVQUFVLFdBQVcsTUFBTTtBQUFBLElBQ2pELE9BQU8sSUFBSSxPQUFPLFdBQVcsTUFBTTtBQUFBO0FBQUEsRUFPckMsVUFBVSxHQUFZO0FBQUEsSUFDcEIsT0FBTyxLQUFLLGNBQWM7QUFBQTtBQUFBLEVBUTVCLFlBQVksR0FBd0I7QUFBQSxJQUNsQyxJQUFJLENBQUMsS0FBSyxXQUFXLEdBQUc7QUFBQSxNQUN0QixPQUFPLE1BQU0sSUFBSSxrQkFBb0I7QUFBQSxJQUN2QztBQUFBLElBQ0EsT0FBTyxLQUFLLFNBQVM7QUFBQTtBQUFBLEVBT3ZCLEtBQUssR0FBNkI7QUFBQSxJQUNoQyxJQUFJLEtBQUssV0FBVyxHQUFHO0FBQUEsTUFDckIsT0FBTyxPQUFPLElBQUksRUFBRSxJQUFJLE1BQU07QUFBQSxRQUM1QixLQUFLLFlBQVk7QUFBQSxRQUNqQjtBQUFBLE9BQ0Q7QUFBQSxJQUNIO0FBQUEsSUFDQSxPQUFPLFVBQVUsU0FBUztBQUFBO0FBRTlCOztBQ2xNQTtBQUtBOztBQ05BOyIsCiAgImRlYnVnSWQiOiAiNkVDNzM4ODNFQzBGNkIwRTY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=