@wizishop/wizi-block 4.2.30-beta → 4.2.33-beta
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/bundles/wizishop-wizi-block.umd.js +141 -121
- package/bundles/wizishop-wizi-block.umd.js.map +1 -1
- package/bundles/wizishop-wizi-block.umd.min.js +1 -1
- package/bundles/wizishop-wizi-block.umd.min.js.map +1 -1
- package/esm2015/lib/shared/components/editorjs/editorjs.component.js +21 -12
- package/esm2015/lib/shared/components/editorjs/tools/inline/bold-tool.component.js +1 -1
- package/esm2015/lib/shared/components/editorjs/tools/inline/capitalize-tool.component.js +1 -1
- package/esm2015/lib/shared/components/editorjs/tools/inline/italic-tool.component.js +1 -1
- package/esm2015/lib/shared/components/editorjs/tools/inline/link-tool.component.js +1 -1
- package/esm2015/lib/shared/components/editorjs/tools/inline/strike-tool.component.js +1 -1
- package/esm2015/lib/shared/components/editorjs/tools/inline/subscript-tool.component.js +1 -1
- package/esm2015/lib/shared/components/editorjs/tools/inline/superscript-tool.component.js +1 -1
- package/esm2015/lib/shared/components/editorjs/tools/inline/tool-type/inline-style-tool.component.js +107 -64
- package/esm2015/lib/shared/components/editorjs/tools/inline/tool-type/text-tool.component.js +1 -18
- package/esm2015/lib/shared/components/editorjs/tools/inline/underline-tool.component.js +1 -1
- package/esm2015/lib/shared/components/editorjs/tools/paragraph/ordered-list-tool.component.js +2 -2
- package/esm2015/lib/shared/components/editorjs/tools/paragraph/quote-tool.component.js +2 -2
- package/esm2015/lib/shared/components/editorjs/tools/paragraph/text-align-tool.component.js +2 -2
- package/esm2015/lib/shared/components/editorjs/tools/paragraph/text-type-tool.component.js +2 -2
- package/esm2015/lib/shared/components/editorjs/tools/paragraph/tool-type/paragraph-style-tool.component.js +2 -18
- package/esm2015/lib/shared/components/editorjs/tools/paragraph/tool-type/text-edition.component.js +15 -16
- package/esm2015/lib/shared/components/editorjs/tools/paragraph/unordered-list-tool.component.js +2 -2
- package/esm2015/lib/shared/components/editorjs/tools/utils/editorjs-tool.component.js +8 -1
- package/fesm2015/wizishop-wizi-block.js +153 -127
- package/fesm2015/wizishop-wizi-block.js.map +1 -1
- package/lib/shared/components/editorjs/editorjs.component.d.ts +1 -0
- package/lib/shared/components/editorjs/tools/inline/bold-tool.component.d.ts +1 -1
- package/lib/shared/components/editorjs/tools/inline/capitalize-tool.component.d.ts +1 -1
- package/lib/shared/components/editorjs/tools/inline/italic-tool.component.d.ts +1 -1
- package/lib/shared/components/editorjs/tools/inline/link-tool.component.d.ts +1 -1
- package/lib/shared/components/editorjs/tools/inline/strike-tool.component.d.ts +1 -1
- package/lib/shared/components/editorjs/tools/inline/subscript-tool.component.d.ts +1 -1
- package/lib/shared/components/editorjs/tools/inline/superscript-tool.component.d.ts +1 -1
- package/lib/shared/components/editorjs/tools/inline/tool-type/inline-style-tool.component.d.ts +2 -0
- package/lib/shared/components/editorjs/tools/inline/tool-type/text-tool.component.d.ts +0 -1
- package/lib/shared/components/editorjs/tools/inline/underline-tool.component.d.ts +1 -1
- package/lib/shared/components/editorjs/tools/paragraph/tool-type/paragraph-style-tool.component.d.ts +0 -1
- package/lib/shared/components/editorjs/tools/utils/editorjs-tool.component.d.ts +2 -0
- package/package.json +5 -1
- package/wizi-block.scss +215 -215
- package/wizishop-wizi-block.metadata.json +1 -1
package/esm2015/lib/shared/components/editorjs/tools/inline/tool-type/inline-style-tool.component.js
CHANGED
|
@@ -36,29 +36,28 @@ export class InlineStyleTool extends EditorJSTool {
|
|
|
36
36
|
: anchorNode.parentElement;
|
|
37
37
|
const sameSelection = container && container.innerText === selection.toString();
|
|
38
38
|
yield this.saveInlineSelection(container, true);
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
39
|
+
console.log('=== inline tool execCommandStyle method ===');
|
|
40
|
+
console.log(this.hasStyle(container));
|
|
41
|
+
// Link delete exception
|
|
42
|
+
if (this.linkDeletion) {
|
|
43
|
+
yield this.replaceLink(selection, this.hasStyle(container));
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
if (sameSelection &&
|
|
47
|
+
!this.isContainer(this.textContainers, container) &&
|
|
48
|
+
this.hasStyle(container) &&
|
|
49
|
+
selection.toString() === this.hasStyle(container).innerText) {
|
|
50
|
+
console.log('-> update selection');
|
|
51
|
+
yield this.updateSelection(selection, this.hasStyle(container), action, this.textContainers);
|
|
43
52
|
}
|
|
44
53
|
else {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
this.hasStyle(container) &&
|
|
48
|
-
selection.toString() === this.hasStyle(container).innerText) {
|
|
49
|
-
yield this.updateSelection(selection, this.hasStyle(container), action, this.textContainers);
|
|
50
|
-
}
|
|
51
|
-
else {
|
|
52
|
-
yield this.replaceSelection(this.getMostDescendantChild(container), action, selection, this.textContainers);
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
yield this.cleanupContainer(selection, container, true);
|
|
56
|
-
if (this.modifiedContent) {
|
|
57
|
-
yield this.resetInlineSelection(container, true);
|
|
54
|
+
console.log('-> replace selection');
|
|
55
|
+
yield this.replaceSelection(this.getMostDescendantChild(container), action, selection, this.textContainers);
|
|
58
56
|
}
|
|
59
57
|
}
|
|
60
|
-
|
|
61
|
-
|
|
58
|
+
yield this.cleanupContainer(selection, container, true);
|
|
59
|
+
if (this.modifiedContent) {
|
|
60
|
+
yield this.resetInlineSelection(container, true);
|
|
62
61
|
}
|
|
63
62
|
});
|
|
64
63
|
}
|
|
@@ -102,16 +101,17 @@ export class InlineStyleTool extends EditorJSTool {
|
|
|
102
101
|
replaceSelection(container, action, selection, containers) {
|
|
103
102
|
var _a;
|
|
104
103
|
return __awaiter(this, void 0, void 0, function* () {
|
|
105
|
-
let parentContainer = this.hasStyle(container);
|
|
106
104
|
const focusNode = selection.focusNode;
|
|
107
105
|
let offsetContainer = focusNode.nodeType !== Node.TEXT_NODE && focusNode.nodeType !== Node.COMMENT_NODE
|
|
108
106
|
? focusNode
|
|
109
107
|
: focusNode.parentElement;
|
|
108
|
+
let parentContainer = this.hasStyle(container);
|
|
110
109
|
let offsetParentContainer = this.hasStyle(offsetContainer);
|
|
111
110
|
if (parentContainer &&
|
|
112
111
|
parentContainer === offsetParentContainer &&
|
|
113
112
|
((parentContainer.children.length > 0 && parentContainer.innerText !== parentContainer.children[0].textContent) ||
|
|
114
113
|
parentContainer.innerText !== selection.toString())) {
|
|
114
|
+
console.log('if');
|
|
115
115
|
const range = this.getRangeObject(selection);
|
|
116
116
|
const currentFragment = range.extractContents();
|
|
117
117
|
const currentElement = document.createElement('span');
|
|
@@ -153,14 +153,19 @@ export class InlineStyleTool extends EditorJSTool {
|
|
|
153
153
|
newElement.appendChild(preFragment);
|
|
154
154
|
parentContainer.parentElement.insertBefore(currentElementToAppend, parentContainer);
|
|
155
155
|
parentContainer.parentElement.insertBefore(newElement, currentElementToAppend);
|
|
156
|
+
if (!parentContainer.textContent || parentContainer.textContent.length === 0) {
|
|
157
|
+
parentContainer.parentElement.removeChild(parentContainer);
|
|
158
|
+
}
|
|
156
159
|
selection.selectAllChildren(currentElementToAppend);
|
|
157
160
|
}
|
|
158
161
|
else {
|
|
162
|
+
console.log('else');
|
|
159
163
|
const range = this.getRangeObject(selection);
|
|
160
164
|
const fragment = range.extractContents();
|
|
161
165
|
let fragmentElement = document.createElement('div');
|
|
162
166
|
let newElement = yield this.createElement(container, action, containers);
|
|
163
167
|
let elementToAppend = newElement;
|
|
168
|
+
console.log(newElement);
|
|
164
169
|
fragmentElement.append(fragment);
|
|
165
170
|
if (((_a = fragmentElement.children) === null || _a === void 0 ? void 0 : _a.length) === 1 &&
|
|
166
171
|
this.textContainers.split(',').indexOf(fragmentElement.children[0].tagName.toLowerCase()) > -1) {
|
|
@@ -332,8 +337,28 @@ export class InlineStyleTool extends EditorJSTool {
|
|
|
332
337
|
}
|
|
333
338
|
});
|
|
334
339
|
}
|
|
340
|
+
parentHasStyle(currentElement, referenceElement) {
|
|
341
|
+
// Link exception
|
|
342
|
+
if (!currentElement || referenceElement.tagName.toLowerCase() === 'a' || referenceElement.tagName.toLowerCase() === 'div') {
|
|
343
|
+
return false;
|
|
344
|
+
}
|
|
345
|
+
if (referenceElement.tagName.toLowerCase() !== 'span' &&
|
|
346
|
+
referenceElement.tagName.toLowerCase() === currentElement.tagName.toLowerCase()) {
|
|
347
|
+
return true;
|
|
348
|
+
}
|
|
349
|
+
if (Object.keys(this.getInlineStyle(currentElement)).length > 0 && this.identicalInlineStyle(currentElement, referenceElement)) {
|
|
350
|
+
return true;
|
|
351
|
+
}
|
|
352
|
+
if (currentElement.classList.length > 0 && this.identicalClassList(currentElement, referenceElement)) {
|
|
353
|
+
return true;
|
|
354
|
+
}
|
|
355
|
+
if (currentElement.parentElement && currentElement.parentElement.tagName.toLowerCase() !== 'div') {
|
|
356
|
+
return this.parentHasStyle(currentElement.parentElement, referenceElement);
|
|
357
|
+
}
|
|
358
|
+
return false;
|
|
359
|
+
}
|
|
335
360
|
cleanupContainer(selection, container, firstTimeCall) {
|
|
336
|
-
var _a
|
|
361
|
+
var _a;
|
|
337
362
|
return __awaiter(this, void 0, void 0, function* () {
|
|
338
363
|
let parentContainer;
|
|
339
364
|
let parentFound = false;
|
|
@@ -358,51 +383,57 @@ export class InlineStyleTool extends EditorJSTool {
|
|
|
358
383
|
const children = Array.from(parentContainer.childNodes);
|
|
359
384
|
if ((children === null || children === void 0 ? void 0 : children.length) > 0) {
|
|
360
385
|
for (var currentNode = children[0]; currentNode; currentNode = currentNode.nextSibling) {
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
console.log(currentNode.textContent);
|
|
364
|
-
console.log((_b = currentNode.textContent) === null || _b === void 0 ? void 0 : _b.length);
|
|
365
|
-
if (!currentNode.textContent || currentNode.textContent.length === 0) {
|
|
386
|
+
if ((!currentNode.textContent || currentNode.textContent.length === 0) || (currentNode.nodeType === Node.ELEMENT_NODE && currentNode.innerText.length === 0)) {
|
|
387
|
+
let previousSibling = currentNode.previousSibling;
|
|
366
388
|
parentContainer.removeChild(currentNode);
|
|
389
|
+
currentNode = previousSibling;
|
|
367
390
|
}
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
currentNode.nodeType === Node.ELEMENT_NODE &&
|
|
376
|
-
currentNode.nextSibling.nodeType === Node.ELEMENT_NODE) {
|
|
377
|
-
let currentElement = currentNode;
|
|
378
|
-
let nextElement = currentNode.nextSibling;
|
|
379
|
-
if (this.identicalInlineStyle(currentElement, nextElement) &&
|
|
380
|
-
currentElement.tagName.toLowerCase() === nextElement.tagName.toLowerCase() &&
|
|
381
|
-
this.identicalClassList(currentElement, nextElement) &&
|
|
382
|
-
!currentElement.hasAttributes() &&
|
|
383
|
-
!nextElement.hasAttributes()) {
|
|
384
|
-
currentElement.innerHTML += nextElement.innerHTML;
|
|
385
|
-
nextElement.remove();
|
|
386
|
-
this.modifiedContent = true;
|
|
387
|
-
}
|
|
388
|
-
else {
|
|
389
|
-
identicalElements = false;
|
|
390
|
-
}
|
|
391
|
+
if (currentNode.nodeType === Node.ELEMENT_NODE &&
|
|
392
|
+
this.parentHasStyle(currentNode.parentElement, currentNode)) {
|
|
393
|
+
let currentNodeFirstChild = currentNode;
|
|
394
|
+
let nextCurrentElement = currentNode.firstChild;
|
|
395
|
+
while (currentNode.firstChild) {
|
|
396
|
+
parentContainer.insertBefore(currentNode.firstChild, currentNodeFirstChild.nextSibling);
|
|
397
|
+
currentNodeFirstChild = currentNodeFirstChild.nextSibling;
|
|
391
398
|
}
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
399
|
+
parentContainer.removeChild(currentNode);
|
|
400
|
+
currentNode = nextCurrentElement;
|
|
401
|
+
}
|
|
402
|
+
let identicalElements = true;
|
|
403
|
+
while (identicalElements &&
|
|
404
|
+
currentNode.nextSibling &&
|
|
405
|
+
currentNode.nodeType === Node.ELEMENT_NODE &&
|
|
406
|
+
currentNode.nextSibling.nodeType === Node.ELEMENT_NODE) {
|
|
407
|
+
let currentElement = currentNode;
|
|
408
|
+
let nextElement = currentNode.nextSibling;
|
|
409
|
+
if (this.identicalInlineStyle(currentElement, nextElement) &&
|
|
410
|
+
currentElement.tagName.toLowerCase() === nextElement.tagName.toLowerCase() &&
|
|
411
|
+
this.identicalClassList(currentElement, nextElement) &&
|
|
412
|
+
this.identicalAttributes(currentElement, nextElement)) {
|
|
413
|
+
currentElement.innerHTML += nextElement.innerHTML;
|
|
414
|
+
nextElement.remove();
|
|
403
415
|
this.modifiedContent = true;
|
|
404
416
|
}
|
|
405
|
-
|
|
417
|
+
else {
|
|
418
|
+
identicalElements = false;
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
if (currentNode.nodeType === Node.ELEMENT_NODE &&
|
|
422
|
+
currentNode.tagName.toLowerCase() === 'span' &&
|
|
423
|
+
Object.keys(this.getInlineStyle(currentNode)).length === 0 &&
|
|
424
|
+
(!currentNode.classList || currentNode.classList.length === 0) &&
|
|
425
|
+
this.hasNoAttributes(currentNode)) {
|
|
426
|
+
let currentNodeFirstChild = currentNode;
|
|
427
|
+
while (currentNode.firstChild) {
|
|
428
|
+
currentNodeFirstChild.parentElement.insertBefore(currentNode.firstChild, currentNodeFirstChild.nextSibling);
|
|
429
|
+
currentNodeFirstChild = currentNodeFirstChild.nextSibling;
|
|
430
|
+
}
|
|
431
|
+
currentNode.remove();
|
|
432
|
+
this.modifiedContent = true;
|
|
433
|
+
}
|
|
434
|
+
currentNode.normalize();
|
|
435
|
+
if (currentNode.childNodes.length > 0) {
|
|
436
|
+
yield this.cleanupContainer(selection, currentNode, false);
|
|
406
437
|
}
|
|
407
438
|
}
|
|
408
439
|
}
|
|
@@ -422,6 +453,17 @@ export class InlineStyleTool extends EditorJSTool {
|
|
|
422
453
|
return ([...currentElement.classList].every((classList) => nextElement.classList.contains(classList)) &&
|
|
423
454
|
[...nextElement.classList].every((classList) => currentElement.classList.contains(classList)));
|
|
424
455
|
}
|
|
456
|
+
identicalAttributes(currentElement, nextElement) {
|
|
457
|
+
let currentElementAttributes = currentElement.getAttributeNames();
|
|
458
|
+
currentElementAttributes.forEach(attribute => {
|
|
459
|
+
if (attribute !== 'style') {
|
|
460
|
+
if (!nextElement.getAttribute(attribute) || nextElement.getAttribute(attribute) !== currentElement.getAttribute(attribute)) {
|
|
461
|
+
return false;
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
});
|
|
465
|
+
return true;
|
|
466
|
+
}
|
|
425
467
|
identicalInlineStyle(currentElement, nextElement) {
|
|
426
468
|
const currentElementInlineStyle = this.getInlineStyle(currentElement);
|
|
427
469
|
const nextElementInlineStyle = this.getInlineStyle(nextElement);
|
|
@@ -475,9 +517,10 @@ export class InlineStyleTool extends EditorJSTool {
|
|
|
475
517
|
let nextNode = container.firstChild;
|
|
476
518
|
while (nextNode && (!this.foundAnchorNode || !this.foundFocusNode)) {
|
|
477
519
|
if (nextNode === this.selectedAnchorNode) {
|
|
478
|
-
this.foundAnchorNode = true;
|
|
479
|
-
this.foundAnchorOffset += this.anchorOffset;
|
|
480
520
|
let selection = this.getSelection();
|
|
521
|
+
const isLTR = this.isAnchorBeforeFocus(selection.anchorNode, selection.anchorOffset, selection.focusNode, selection.focusOffset);
|
|
522
|
+
this.foundAnchorNode = true;
|
|
523
|
+
this.foundAnchorOffset += isLTR ? this.anchorOffset : this.focusOffset;
|
|
481
524
|
let range = this.getRangeObject(selection);
|
|
482
525
|
const currentFragment = range.cloneContents();
|
|
483
526
|
const currentElement = document.createElement('span');
|
|
@@ -554,4 +597,4 @@ export class InlineStyleTool extends EditorJSTool {
|
|
|
554
597
|
return element;
|
|
555
598
|
}
|
|
556
599
|
}
|
|
557
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5saW5lLXN0eWxlLXRvb2wuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Ii9ob21lL3BhdWxpbmUvRG9jdW1lbnRzL3dvcmtzcGFjZS93aXppLWJsb2NrL3Byb2plY3RzL3dpemktYmxvY2svc3JjLyIsInNvdXJjZXMiOlsibGliL3NoYXJlZC9jb21wb25lbnRzL2VkaXRvcmpzL3Rvb2xzL2lubGluZS90b29sLXR5cGUvaW5saW5lLXN0eWxlLXRvb2wuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQW1CLFlBQVksRUFBZSxNQUFNLHFDQUFxQyxDQUFDO0FBRWpHLE1BQU0sT0FBZ0IsZUFBZ0IsU0FBUSxZQUFZO0lBQTFEOztRQUdJLGNBQVMsR0FBRyxXQUFXLENBQUM7UUFJeEIsc0JBQWlCLEdBQVcsQ0FBQyxDQUFDO1FBRTlCLHFCQUFnQixHQUFXLENBQUMsQ0FBQztRQUU3QixvQkFBZSxHQUFZLEtBQUssQ0FBQztRQUVqQyxtQkFBYyxHQUFZLEtBQUssQ0FBQztRQUVoQyxjQUFTLEdBQVcsQ0FBQyxDQUFDO1FBTXRCLG9CQUFlLEdBQVksS0FBSyxDQUFDO1FBTWpDLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBRTlCLGFBQVEsR0FBRztZQUNQLEdBQUcsRUFBRSxLQUFLO1lBQ1YsS0FBSyxFQUFFLEtBQUs7WUFDWixLQUFLLEVBQUUsS0FBSztZQUNaLFNBQVMsRUFBRSxLQUFLO1NBQ25CLENBQUM7SUFva0JOLENBQUM7SUFsa0JTLGdCQUFnQixDQUFDLE1BQWM7O1lBQ2pDLE1BQU0sU0FBUyxHQUFxQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3hHLElBQUksQ0FBQyxTQUFTLEVBQUU7Z0JBQ1osT0FBTzthQUNWO1lBQ0QsSUFBSSxVQUFVLEdBQVMsU0FBUyxDQUFDLFVBQVUsQ0FBQztZQUM1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VyxDQUFDLE1BQU0sQ0FBQztpQkFDeEQ7Z0JBQ0QsSUFBSSxRQUFRLENBQUMsVUFBVSxFQUFFO29CQUNyQixNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBYyxRQUFRLENBQUMsQ0FBQztpQkFDMUQ7Z0JBQ0QsUUFBUSxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUM7YUFDbkM7WUFDRCxJQUFJLGFBQWEsRUFBRTtnQkFDZixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzthQUM3QjtRQUNMLENBQUM7S0FBQTtJQUVPLHNCQUFzQixDQUFDLE9BQW9COztRQUMvQyxPQUFPLE9BQU8sQ0FBQyxRQUFRLElBQUksT0FBTyxDQUFDLFNBQVMsWUFBbUIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUUsMENBQUUsU0FBUyxDQUFBLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQzdILE9BQU8sR0FBZ0IsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUM5QztRQUNELE9BQU8sT0FBTyxDQUFDO0lBQ25CLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEF0dHJpYnV0ZU9iamVjdCwgRWRpdG9ySlNUb29sLCBTdHlsZU9iamVjdCB9IGZyb20gJy4uLy4uL3V0aWxzL2VkaXRvcmpzLXRvb2wuY29tcG9uZW50JztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIElubGluZVN0eWxlVG9vbCBleHRlbmRzIEVkaXRvckpTVG9vbCB7XG4gICAgdGFnOiBzdHJpbmc7XG5cbiAgICBtb2RpZmllcnMgPSAnc3Ryb25nLGVtJztcblxuICAgIHN0eWxlPzogU3R5bGVPYmplY3Q7XG5cbiAgICBmb3VuZEFuY2hvck9mZnNldDogbnVtYmVyID0gMDtcblxuICAgIGZvdW5kRm9jdXNPZmZzZXQ6IG51bWJlciA9IDA7XG5cbiAgICBmb3VuZEFuY2hvck5vZGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIGZvdW5kRm9jdXNOb2RlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICB0bXBPZmZzZXQ6IG51bWJlciA9IDA7XG5cbiAgICBjbGFzc1RvQXBwbHk/OiBzdHJpbmc7XG5cbiAgICBjbGFzc2VzPzogc3RyaW5nO1xuXG4gICAgbW9kaWZpZWRDb250ZW50OiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBhdHRyaWJ1dGVOYW1lPzogc3RyaW5nO1xuXG4gICAgYXR0cmlidXRlc1RvQXBwbHk/OiBBcnJheTxBdHRyaWJ1dGVPYmplY3Q+O1xuXG4gICAgbGlua0RlbGV0aW9uOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBtb2RpZmllcyA9IHtcbiAgICAgICAgdGFnOiBmYWxzZSxcbiAgICAgICAgc3R5bGU6IGZhbHNlLFxuICAgICAgICBjbGFzczogZmFsc2UsXG4gICAgICAgIGF0dHJpYnV0ZTogZmFsc2UsXG4gICAgfTtcblxuICAgIGFzeW5jIGV4ZWNDb21tYW5kU3R5bGUoYWN0aW9uOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uOiBTZWxlY3Rpb24gfCBudWxsID0gdGhpcy5jdXJyZW50U2VsZWN0aW9uID8gdGhpcy5jdXJyZW50U2VsZWN0aW9uIDogdGhpcy5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYW5jaG9yTm9kZTogTm9kZSA9IHNlbGVjdGlvbi5hbmNob3JOb2RlO1xuICAgICAgICBpZiAoIXRoaXMucGFyZW50RWRpdG9yKSB7XG4gICAgICAgICAgICB0aGlzLnBhcmVudEVkaXRvciA9IHRoaXMuZmluZFBhcmVudEVkaXRvcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFhbmNob3JOb2RlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNvbnRhaW5lcjogSFRNTEVsZW1lbnQgPVxuICAgICAgICAgICAgYW5jaG9yTm9kZS5ub2RlVHlwZSAhPT0gTm9kZS5URVhUX05PREUgJiYgYW5jaG9yTm9kZS5ub2RlVHlwZSAhPT0gTm9kZS5DT01NRU5UX05PREVcbiAgICAgICAgICAgICAgICA/IChhbmNob3JOb2RlIGFzIEhUTUxFbGVtZW50KVxuICAgICAgICAgICAgICAgIDogYW5jaG9yTm9kZS5wYXJlbnRFbGVtZW50O1xuICAgICAgICBjb25zdCBzYW1lU2VsZWN0aW9uOiBib29sZWFuID0gY29udGFpbmVyICYmIGNvbnRhaW5lci5pbm5lclRleHQgPT09IHNlbGVjdGlvbi50b1N0cmluZygpO1xuICAgICAgICBhd2FpdCB0aGlzLnNhdmVJbmxpbmVTZWxlY3Rpb24oY29udGFpbmVyLCB0cnVlKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIExpbmsgZGVsZXRlIGV4Y2VwdGlvblxuICAgICAgICAgICAgaWYgKHRoaXMubGlua0RlbGV0aW9uKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXBsYWNlTGluayhzZWxlY3Rpb24sIHRoaXMuaGFzU3R5bGUoY29udGFpbmVyKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgc2FtZVNlbGVjdGlvbiAmJlxuICAgICAgICAgICAgICAgICAgICAhdGhpcy5pc0NvbnRhaW5lcih0aGlzLnRleHRDb250YWluZXJzLCBjb250YWluZXIpICYmXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFzU3R5bGUoY29udGFpbmVyKSAmJlxuICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb24udG9TdHJpbmcoKSA9PT0gdGhpcy5oYXNTdHlsZShjb250YWluZXIpLmlubmVyVGV4dFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZVNlbGVjdGlvbihzZWxlY3Rpb24sIHRoaXMuaGFzU3R5bGUoY29udGFpbmVyKSwgYWN0aW9uLCB0aGlzLnRleHRDb250YWluZXJzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlcGxhY2VTZWxlY3Rpb24odGhpcy5nZXRNb3N0RGVzY2VuZGFudENoaWxkKGNvbnRhaW5lciksIGFjdGlvbiwgc2VsZWN0aW9uLCB0aGlzLnRleHRDb250YWluZXJzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNsZWFudXBDb250YWluZXIoc2VsZWN0aW9uLCBjb250YWluZXIsIHRydWUpO1xuICAgICAgICAgICAgaWYgKHRoaXMubW9kaWZpZWRDb250ZW50KSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXNldElubGluZVNlbGVjdGlvbihjb250YWluZXIsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdJbmxpbmUgVG9vbCBFcnJvciA6ICcgKyBlcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHVwZGF0ZVNlbGVjdGlvbihzZWxlY3Rpb246IFNlbGVjdGlvbiwgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgYWN0aW9uOiBzdHJpbmcsIGNvbnRhaW5lcnM6IHN0cmluZykge1xuICAgICAgICBpZiAodGhpcy5tb2RpZmllcy5zdHlsZSkge1xuICAgICAgICAgICAgY29uc3QgY3NzID0gdGhpcy5zdHlsZS5wcm9wZXJ0eTtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IGF3YWl0IHRoaXMuZ2V0U3R5bGVWYWx1ZShjb250YWluZXIsIGFjdGlvbiwgY29udGFpbmVycyk7XG4gICAgICAgICAgICBpZiAodmFsdWUgIT09IHRoaXMuc3R5bGUuZGVmYXVsdCkge1xuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZVtjc3NdID0gdmFsdWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0aGlzLnN0eWxlLnByb3BlcnR5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlOiBSYW5nZSA9IHRoaXMuZ2V0UmFuZ2VPYmplY3Qoc2VsZWN0aW9uKTtcbiAgICAgICAgICAgIGxldCBuZXdFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0aGlzLmhhc1N0eWxlKGNvbnRhaW5lcikgPyAnc3BhbicgOiB0aGlzLnRhZyk7XG4gICAgICAgICAgICBpZiAodGhpcy5tb2RpZmllcy5jbGFzcykge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVtb3ZlQ2hpbGRyZW5DbGFzc2VzKG5ld0VsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNsYXNzVG9BcHBseSAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudC5jbGFzc0xpc3QuYWRkKHRoaXMuY2xhc3NUb0FwcGx5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5tb2RpZmllcy5hdHRyaWJ1dGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXNUb0FwcGx5LmZvckVhY2goKGF0dHJpYnV0ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUubmFtZSwgYXR0cmlidXRlLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5ld0VsZW1lbnQgPSB0aGlzLnNldElubGluZVN0eWxlKGNvbnRhaW5lciwgbmV3RWxlbWVudCk7XG5cbiAgICAgICAgICAgIHdoaWxlIChjb250YWluZXIuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50Q2xvbmUgPSBjb250YWluZXIuZmlyc3RDaGlsZC5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgbmV3RWxlbWVudC5hcHBlbmRDaGlsZChlbGVtZW50Q2xvbmUpO1xuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5maXJzdENoaWxkLnJlbW92ZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb250YWluZXIucGFyZW50RWxlbWVudC5yZXBsYWNlQ2hpbGQobmV3RWxlbWVudCwgY29udGFpbmVyKTtcblxuICAgICAgICAgICAgcmFuZ2UuaW5zZXJ0Tm9kZShuZXdFbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcmVwbGFjZVNlbGVjdGlvbihjb250YWluZXI6IEhUTUxFbGVtZW50LCBhY3Rpb246IHN0cmluZywgc2VsZWN0aW9uOiBTZWxlY3Rpb24sIGNvbnRhaW5lcnM6IHN0cmluZykge1xuICAgICAgICBsZXQgcGFyZW50Q29udGFpbmVyID0gdGhpcy5oYXNTdHlsZShjb250YWluZXIpO1xuXG4gICAgICAgIGNvbnN0IGZvY3VzTm9kZTogTm9kZSA9IHNlbGVjdGlvbi5mb2N1c05vZGU7XG4gICAgICAgIGxldCBvZmZzZXRDb250YWluZXI6IEhUTUxFbGVtZW50ID1cbiAgICAgICAgICAgIGZvY3VzTm9kZS5ub2RlVHlwZSAhPT0gTm9kZS5URVhUX05PREUgJiYgZm9jdXNOb2RlLm5vZGVUeXBlICE9PSBOb2RlLkNPTU1FTlRfTk9ERVxuICAgICAgICAgICAgICAgID8gKGZvY3VzTm9kZSBhcyBIVE1MRWxlbWVudClcbiAgICAgICAgICAgICAgICA6IGZvY3VzTm9kZS5wYXJlbnRFbGVtZW50O1xuICAgICAgICBsZXQgb2Zmc2V0UGFyZW50Q29udGFpbmVyID0gdGhpcy5oYXNTdHlsZShvZmZzZXRDb250YWluZXIpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBwYXJlbnRDb250YWluZXIgJiZcbiAgICAgICAgICAgIHBhcmVudENvbnRhaW5lciA9PT0gb2Zmc2V0UGFyZW50Q29udGFpbmVyICYmXG4gICAgICAgICAgICAoKHBhcmVudENvbnRhaW5lci5jaGlsZHJlbi5sZW5ndGggPiAwICYmIHBhcmVudENvbnRhaW5lci5pbm5lclRleHQgIT09IHBhcmVudENvbnRhaW5lci5jaGlsZHJlblswXS50ZXh0Q29udGVudCkgfHxcbiAgICAgICAgICAgICAgICBwYXJlbnRDb250YWluZXIuaW5uZXJUZXh0ICE9PSBzZWxlY3Rpb24udG9TdHJpbmcoKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCByYW5nZTogUmFuZ2UgPSB0aGlzLmdldFJhbmdlT2JqZWN0KHNlbGVjdGlvbik7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50RnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQgPSByYW5nZS5leHRyYWN0Q29udGVudHMoKTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRFbGVtZW50OiBIVE1MU3BhbkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgICAgICBjdXJyZW50RWxlbWVudC5hcHBlbmRDaGlsZChjdXJyZW50RnJhZ21lbnQpO1xuICAgICAgICAgICAgaWYgKHRoaXMubW9kaWZpZXMuc3R5bGUgJiYgdGhpcy5zdHlsZS52YWx1ZS5pbmRleE9mKCckMScpID4gLTEpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudC5zdHlsZVt0aGlzLnN0eWxlLnByb3BlcnR5XSA9IHRoaXMuc3R5bGUudmFsdWUucmVwbGFjZSgnJDEnLCB0aGlzLnN0eWxlLmlucHV0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLm1vZGlmaWVzLmNsYXNzKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZW1vdmVDaGlsZHJlbkNsYXNzZXMoY3VycmVudEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNsYXNzVG9BcHBseSAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCh0aGlzLmNsYXNzVG9BcHBseSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMubW9kaWZpZXMuYXR0cmlidXRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hdHRyaWJ1dGVzVG9BcHBseS5mb3JFYWNoKChhdHRyaWJ1dGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZS5uYW1lLCBhdHRyaWJ1dGUudmFsdWUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGN1cnJlbnRFbGVtZW50VG9BcHBlbmQgPSBjdXJyZW50RWxlbWVudDtcbiAgICAgICAgICAgIGxldCBjdXJyZW50UGFyZW50RWxlbWVudCA9IGNvbnRhaW5lcjtcbiAgICAgICAgICAgIGlmIChwYXJlbnRDb250YWluZXIuY29udGFpbnMoY3VycmVudFBhcmVudEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnRQYXJlbnRFbGVtZW50ICE9PSBwYXJlbnRDb250YWluZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRtcEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGN1cnJlbnRQYXJlbnRFbGVtZW50LnRhZ05hbWUpO1xuICAgICAgICAgICAgICAgICAgICB0bXBFbGVtZW50ID0gdGhpcy5zZXRJbmxpbmVTdHlsZShjdXJyZW50UGFyZW50RWxlbWVudCwgdG1wRWxlbWVudCk7XG5cbiAgICAgICAgICAgICAgICAgICAgdG1wRWxlbWVudC5hcHBlbmRDaGlsZChjdXJyZW50RWxlbWVudFRvQXBwZW5kKTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnRUb0FwcGVuZCA9IHRtcEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQYXJlbnRFbGVtZW50ID0gY3VycmVudFBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGlzTFRSID0gdGhpcy5pc0FuY2hvckJlZm9yZUZvY3VzKFxuICAgICAgICAgICAgICAgIHNlbGVjdGlvbi5hbmNob3JOb2RlLFxuICAgICAgICAgICAgICAgIHNlbGVjdGlvbi5hbmNob3JPZmZzZXQsXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uLmZvY3VzTm9kZSxcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb24uZm9jdXNPZmZzZXRcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGxldCBzZWxlY3Rpb25Gb2N1c09mZnNldCA9IGlzTFRSID8gc2VsZWN0aW9uLmFuY2hvck9mZnNldCA6IHNlbGVjdGlvbi5mb2N1c09mZnNldDtcbiAgICAgICAgICAgIGxldCBzZWxlY3Rpb25Gb2N1c05vZGUgPSBpc0xUUiA/IHNlbGVjdGlvbi5hbmNob3JOb2RlIDogc2VsZWN0aW9uLmZvY3VzTm9kZTtcblxuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCkuc2V0QmFzZUFuZEV4dGVudChwYXJlbnRDb250YWluZXIsIDAsIHNlbGVjdGlvbkZvY3VzTm9kZSwgc2VsZWN0aW9uRm9jdXNPZmZzZXQpO1xuICAgICAgICAgICAgY29uc3QgbmV3U2VsZWN0aW9uID0gdGhpcy5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgIGxldCBwcmVSYW5nZTogUmFuZ2UgPSB0aGlzLmdldFJhbmdlT2JqZWN0KG5ld1NlbGVjdGlvbik7XG5cbiAgICAgICAgICAgIGNvbnN0IHByZUZyYWdtZW50OiBEb2N1bWVudEZyYWdtZW50ID0gcHJlUmFuZ2UuZXh0cmFjdENvbnRlbnRzKCk7XG5cbiAgICAgICAgICAgIGxldCBuZXdFbGVtZW50OiBIVE1MRWxlbWVudCA9IDxIVE1MRWxlbWVudD5wYXJlbnRDb250YWluZXIuY2xvbmVOb2RlKCk7XG4gICAgICAgICAgICBuZXdFbGVtZW50LmlubmVySFRNTCA9ICcnO1xuICAgICAgICAgICAgbmV3RWxlbWVudC5hcHBlbmRDaGlsZChwcmVGcmFnbWVudCk7XG5cbiAgICAgICAgICAgIHBhcmVudENvbnRhaW5lci5wYXJlbnRFbGVtZW50Lmluc2VydEJlZm9yZShjdXJyZW50RWxlbWVudFRvQXBwZW5kLCBwYXJlbnRDb250YWluZXIpO1xuICAgICAgICAgICAgcGFyZW50Q29udGFpbmVyLnBhcmVudEVsZW1lbnQuaW5zZXJ0QmVmb3JlKG5ld0VsZW1lbnQsIGN1cnJlbnRFbGVtZW50VG9BcHBlbmQpO1xuICAgICAgICAgICAgc2VsZWN0aW9uLnNlbGVjdEFsbENoaWxkcmVuKGN1cnJlbnRFbGVtZW50VG9BcHBlbmQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcmFuZ2U6IFJhbmdlID0gdGhpcy5nZXRSYW5nZU9iamVjdChzZWxlY3Rpb24pO1xuICAgICAgICAgICAgY29uc3QgZnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQgPSByYW5nZS5leHRyYWN0Q29udGVudHMoKTtcbiAgICAgICAgICAgIGxldCBmcmFnbWVudEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgICAgICAgbGV0IG5ld0VsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IGF3YWl0IHRoaXMuY3JlYXRlRWxlbWVudChjb250YWluZXIsIGFjdGlvbiwgY29udGFpbmVycyk7XG4gICAgICAgICAgICBsZXQgZWxlbWVudFRvQXBwZW5kID0gbmV3RWxlbWVudDtcblxuICAgICAgICAgICAgZnJhZ21lbnRFbGVtZW50LmFwcGVuZChmcmFnbWVudCk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgZnJhZ21lbnRFbGVtZW50LmNoaWxkcmVuPy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgICAgICAgICB0aGlzLnRleHRDb250YWluZXJzLnNwbGl0KCcsJykuaW5kZXhPZihmcmFnbWVudEVsZW1lbnQuY2hpbGRyZW5bMF0udGFnTmFtZS50b0xvd2VyQ2FzZSgpKSA+IC0xXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50VG9BcHBlbmQgPSA8SFRNTEVsZW1lbnQ+ZnJhZ21lbnRFbGVtZW50LmNoaWxkcmVuWzBdO1xuICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuaW5uZXJIVE1MID0gKDxIVE1MRWxlbWVudD5mcmFnbWVudEVsZW1lbnQuY2hpbGRyZW5bMF0pLmlubmVySFRNTDtcbiAgICAgICAgICAgICAgICBlbGVtZW50VG9BcHBlbmQuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgICAgICAgICAgZWxlbWVudFRvQXBwZW5kLmFwcGVuZChuZXdFbGVtZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbmV3RWxlbWVudC5pbm5lckhUTUwgPSBmcmFnbWVudEVsZW1lbnQuaW5uZXJIVE1MO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMubW9kaWZpZXMuY2xhc3MpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlbW92ZUNoaWxkcmVuQ2xhc3NlcyhuZXdFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jbGFzc1RvQXBwbHkgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuY2xhc3NMaXN0LmFkZCh0aGlzLmNsYXNzVG9BcHBseSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMubW9kaWZpZXMuYXR0cmlidXRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hdHRyaWJ1dGVzVG9BcHBseS5mb3JFYWNoKChhdHRyaWJ1dGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlLm5hbWUsIGF0dHJpYnV0ZS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJhbmdlLmluc2VydE5vZGUoZWxlbWVudFRvQXBwZW5kKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5zZWxlY3RBbGxDaGlsZHJlbihlbGVtZW50VG9BcHBlbmQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyByZXBsYWNlTGluayhzZWxlY3Rpb246IFNlbGVjdGlvbiwgY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgICAgICBsZXQgbmV3RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgbmV3RWxlbWVudC5pbm5lckhUTUwgPSBjb250YWluZXIuaW5uZXJIVE1MO1xuXG4gICAgICAgIGNvbnRhaW5lci5wYXJlbnRFbGVtZW50LnJlcGxhY2VDaGlsZChuZXdFbGVtZW50LCBjb250YWluZXIpO1xuICAgICAgICBzZWxlY3Rpb24uc2VsZWN0QWxsQ2hpbGRyZW4obmV3RWxlbWVudCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0FuY2hvckJlZm9yZUZvY3VzKGFuY2hvck5vZGU6IE5vZGUsIGFuY2hvck9mZnNldDogbnVtYmVyLCBmb2N1c05vZGU6IE5vZGUsIGZvY3VzT2Zmc2V0OiBudW1iZXIpIHtcbiAgICAgICAgbGV0IGFuY2hvclJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICAgICAgbGV0IGZvY3VzUmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgICAgICBhbmNob3JSYW5nZS5zZXRTdGFydChhbmNob3JOb2RlLCBhbmNob3JPZmZzZXQpO1xuICAgICAgICBhbmNob3JSYW5nZS5zZXRFbmQoYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0KTtcbiAgICAgICAgZm9jdXNSYW5nZS5zZXRTdGFydChmb2N1c05vZGUsIGZvY3VzT2Zmc2V0KTtcbiAgICAgICAgZm9jdXNSYW5nZS5zZXRFbmQoZm9jdXNOb2RlLCBmb2N1c09mZnNldCk7XG4gICAgICAgIGlmIChhbmNob3JSYW5nZS5jb21wYXJlQm91bmRhcnlQb2ludHMoUmFuZ2UuU1RBUlRfVE9fU1RBUlQsIGZvY3VzUmFuZ2UpID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGhhc1N0eWxlKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBmaXJzdFRpbWVDYWxsOiBib29sZWFuID0gdHJ1ZSk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgICAgIGlmIChmaXJzdFRpbWVDYWxsICYmIGVsZW1lbnQuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGVsZW1lbnQgPSB0aGlzLmdldE1vc3REZXNjZW5kYW50Q2hpbGQoPEhUTUxFbGVtZW50PmVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZm91bmRFbGVtZW50IHdhcyBhZGRlZCBiZWNhdXNlIG9mIGEgcmV0dXJuIGlzc3VlIHdoZW4gYSBjbGFzcyBpcyBhcHBsaWVkXG4gICAgICAgIGxldCBmb3VuZEVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgICAgICAgaWYgKCFlbGVtZW50IHx8IGVsZW1lbnQuY2xhc3NMaXN0Py5jb250YWlucygnY2UtcGFyYWdyYXBoJykpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm1vZGlmaWVzLnN0eWxlKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgZWxlbWVudC5zdHlsZSAmJlxuICAgICAgICAgICAgICAgIGVsZW1lbnQuc3R5bGVbdGhpcy5zdHlsZS5wcm9wZXJ0eV0gJiZcbiAgICAgICAgICAgICAgICAodGhpcy5zdHlsZS52YWx1ZS5pbmRleE9mKCckMScpID4gLTEgPyB0cnVlIDogZWxlbWVudC5zdHlsZVt0aGlzLnN0eWxlLnByb3BlcnR5XSA9PT0gdGhpcy5zdHlsZS52YWx1ZSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGZvdW5kRWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5tb2RpZmllcy5jbGFzcykge1xuICAgICAgICAgICAgdGhpcy5jbGFzc2VzLnNwbGl0KCcsJykuZm9yRWFjaCgoY2xhc3NOYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0Py5jb250YWlucyhjbGFzc05hbWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvdW5kRWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubW9kaWZpZXMudGFnKSB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudC50YWdOYW1lPy50b0xvd2VyQ2FzZSgpID09PSB0aGlzLnRhZy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5tb2RpZmllcy5hdHRyaWJ1dGUpIHtcbiAgICAgICAgICAgIGxldCBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVOYW1lLnNwbGl0KCcsJyk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGF0dHJpYnV0ZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGVsZW1lbnQuZ2V0QXR0cmlidXRlID09PSAnZnVuY3Rpb24nICYmIGVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZXNbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvdW5kRWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZm91bmRFbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gZm91bmRFbGVtZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmICghZm91bmRFbGVtZW50ICYmIGVsZW1lbnQucGFyZW50RWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFzU3R5bGUoZWxlbWVudC5wYXJlbnRFbGVtZW50LCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBnZXRTdHlsZVZhbHVlKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIGFjdGlvbjogc3RyaW5nLCBjb250YWluZXJzOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICAgICAgaWYgKCFjb250YWluZXIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnN0eWxlLnZhbHVlLmluZGV4T2YoJyQxJykgPiAtMSA/IHRoaXMuc3R5bGUudmFsdWUucmVwbGFjZSgnJDEnLCB0aGlzLnN0eWxlLmlucHV0KSA6IHRoaXMuc3R5bGUudmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5oYXNTdHlsZShjb250YWluZXIpICYmIHRoaXMuc3R5bGUudmFsdWUuaW5kZXhPZignJDEnKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnN0eWxlLmRlZmF1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdHlsZTogTm9kZSB8IG51bGwgPSBhd2FpdCB0aGlzLmZpbmRTdHlsZU5vZGUoY29udGFpbmVyLCBhY3Rpb24sIGNvbnRhaW5lcnMpO1xuICAgICAgICBpZiAoc3R5bGUgJiYgdGhpcy5oYXNTdHlsZShzdHlsZSBhcyBIVE1MRWxlbWVudCkgJiYgdGhpcy5zdHlsZS52YWx1ZS5pbmRleE9mKCckMScpID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUuZGVmYXVsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLnZhbHVlLmluZGV4T2YoJyQxJykgPiAtMSA/IHRoaXMuc3R5bGUudmFsdWUucmVwbGFjZSgnJDEnLCB0aGlzLnN0eWxlLmlucHV0KSA6IHRoaXMuc3R5bGUudmFsdWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBmaW5kU3R5bGVOb2RlKG5vZGU6IE5vZGUsIHN0eWxlOiBzdHJpbmcsIGNvbnRhaW5lcnM6IHN0cmluZyk6IFByb21pc2U8Tm9kZSB8IG51bGw+IHtcbiAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gJ0hUTUwnIHx8IG5vZGUubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gJ0JPRFknKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzQ29udGFpbmVyKGNvbnRhaW5lcnMsIG5vZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhc1N0eWxlOiBib29sZWFuID1cbiAgICAgICAgICAgIChub2RlIGFzIEhUTUxFbGVtZW50KS5zdHlsZVtzdHlsZV0gIT09IG51bGwgJiZcbiAgICAgICAgICAgIChub2RlIGFzIEhUTUxFbGVtZW50KS5zdHlsZVtzdHlsZV0gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgKG5vZGUgYXMgSFRNTEVsZW1lbnQpLnN0eWxlW3N0eWxlXSAhPT0gJyc7XG5cbiAgICAgICAgaWYgKGhhc1N0eWxlKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmZpbmRTdHlsZU5vZGUobm9kZS5wYXJlbnROb2RlLCBzdHlsZSwgY29udGFpbmVycyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBjcmVhdGVFbGVtZW50KGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIGFjdGlvbjogc3RyaW5nLCBjb250YWluZXJzOiBzdHJpbmcpOiBQcm9taXNlPEhUTUxFbGVtZW50PiB7XG4gICAgICAgIGxldCBuZXdFbGVtZW50OiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGhpcy50YWcpO1xuICAgICAgICBpZiAodGhpcy5tb2RpZmllcy5zdHlsZSkge1xuICAgICAgICAgICAgY29uc3QgcHJvcGVydHkgPSB0aGlzLnN0eWxlLnByb3BlcnR5O1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gYXdhaXQgdGhpcy5nZXRTdHlsZVZhbHVlKGNvbnRhaW5lciwgYWN0aW9uLCBjb250YWluZXJzKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdGhpcy5zdHlsZS5kZWZhdWx0KSB7XG4gICAgICAgICAgICAgICAgbmV3RWxlbWVudC5zdHlsZVtwcm9wZXJ0eV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbmV3RWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eShwcm9wZXJ0eSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3RWxlbWVudDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJlbW92ZUNoaWxkcmVuQ2xhc3NlcyhlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgICAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNoaWxkcmVuOiBIVE1MQ29sbGVjdGlvbiA9IGVsZW1lbnQuY2hpbGRyZW47XG4gICAgICAgIGZvciAodmFyIGN1cnJlbnRFbGVtZW50ID0gY2hpbGRyZW5bMF07IGN1cnJlbnRFbGVtZW50OyBjdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50Lm5leHRFbGVtZW50U2libGluZykge1xuICAgICAgICAgICAgdGhpcy5jbGFzc2VzLnNwbGl0KCcsJykuZm9yRWFjaCgoY2xhc3NOYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50LmNsYXNzTGlzdD8uY29udGFpbnMoY2xhc3NOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEVsZW1lbnQuY2xhc3NMaXN0Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdjbGFzcycpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShjbGFzc05hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoY3VycmVudEVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVtb3ZlQ2hpbGRyZW5DbGFzc2VzKDxIVE1MRWxlbWVudD5jdXJyZW50RWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGNsZWFudXBDb250YWluZXIoc2VsZWN0aW9uOiBTZWxlY3Rpb24sIGNvbnRhaW5lciwgZmlyc3RUaW1lQ2FsbDogQm9vbGVhbikge1xuICAgICAgICBsZXQgcGFyZW50Q29udGFpbmVyOiBIVE1MRWxlbWVudDtcbiAgICAgICAgbGV0IHBhcmVudEZvdW5kOiBCb29sZWFuID0gZmFsc2U7XG4gICAgICAgIGlmIChmaXJzdFRpbWVDYWxsKSB7XG4gICAgICAgICAgICBwYXJlbnRDb250YWluZXIgPSA8SFRNTEVsZW1lbnQ+c2VsZWN0aW9uLmFuY2hvck5vZGU7XG4gICAgICAgICAgICB3aGlsZSAocGFyZW50Q29udGFpbmVyICYmICFwYXJlbnRGb3VuZCkge1xuICAgICAgICAgICAgICAgIGlmIChwYXJlbnRDb250YWluZXIubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFICYmIHBhcmVudENvbnRhaW5lci5jbGFzc0xpc3Q/LmNvbnRhaW5zKCdjZS1wYXJhZ3JhcGgnKSkge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRGb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50Q29udGFpbmVyID0gcGFyZW50Q29udGFpbmVyLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFyZW50Q29udGFpbmVyID0gY29udGFpbmVyO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcGFyZW50Q29udGFpbmVyIHx8ICFwYXJlbnRDb250YWluZXIuaGFzQ2hpbGROb2RlcygpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBwYXJlbnRDb250YWluZXIubm9ybWFsaXplKCk7XG5cbiAgICAgICAgY29uc3QgY2hpbGRyZW46IE5vZGVbXSA9IEFycmF5LmZyb20ocGFyZW50Q29udGFpbmVyLmNoaWxkTm9kZXMpO1xuICAgICAgICBpZiAoY2hpbGRyZW4/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAodmFyIGN1cnJlbnROb2RlID0gY2hpbGRyZW5bMF07IGN1cnJlbnROb2RlOyBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLm5leHRTaWJsaW5nKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2N1cnJlbnROb2RlJyk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coY3VycmVudE5vZGUpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGN1cnJlbnROb2RlLnRleHRDb250ZW50KTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjdXJyZW50Tm9kZS50ZXh0Q29udGVudD8ubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWN1cnJlbnROb2RlLnRleHRDb250ZW50IHx8IGN1cnJlbnROb2RlLnRleHRDb250ZW50Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRDb250YWluZXIucmVtb3ZlQ2hpbGQoY3VycmVudE5vZGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZS5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY2xlYW51cENvbnRhaW5lcihzZWxlY3Rpb24sIGN1cnJlbnROb2RlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IGlkZW50aWNhbEVsZW1lbnRzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKFxuICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpY2FsRWxlbWVudHMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLm5leHRTaWJsaW5nICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLm5leHRTaWJsaW5nLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjdXJyZW50RWxlbWVudCA9IDxFbGVtZW50PmN1cnJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5leHRFbGVtZW50ID0gPEVsZW1lbnQ+Y3VycmVudE5vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pZGVudGljYWxJbmxpbmVTdHlsZShjdXJyZW50RWxlbWVudCwgbmV4dEVsZW1lbnQpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBuZXh0RWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlkZW50aWNhbENsYXNzTGlzdChjdXJyZW50RWxlbWVudCwgbmV4dEVsZW1lbnQpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgISg8RWxlbWVudD5jdXJyZW50RWxlbWVudCkuaGFzQXR0cmlidXRlcygpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgISg8RWxlbWVudD5uZXh0RWxlbWVudCkuaGFzQXR0cmlidXRlcygpXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudC5pbm5lckhUTUwgKz0gbmV4dEVsZW1lbnQuaW5uZXJIVE1MO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRFbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW9kaWZpZWRDb250ZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpY2FsRWxlbWVudHMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICg8RWxlbWVudD5jdXJyZW50Tm9kZSkudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnc3BhbicgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHRoaXMuZ2V0SW5saW5lU3R5bGUoPEVsZW1lbnQ+Y3VycmVudE5vZGUpKS5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICghKDxFbGVtZW50PmN1cnJlbnROb2RlKS5jbGFzc0xpc3QgfHwgKDxFbGVtZW50PmN1cnJlbnROb2RlKS5jbGFzc0xpc3QubGVuZ3RoID09PSAwKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYXNOb0F0dHJpYnV0ZXMoPEVsZW1lbnQ+Y3VycmVudE5vZGUpXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGN1cnJlbnROb2RlRmlyc3RDaGlsZCA9IGN1cnJlbnROb2RlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY3VycmVudE5vZGUuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICg8RWxlbWVudD5jdXJyZW50Tm9kZUZpcnN0Q2hpbGQucGFyZW50RWxlbWVudCkuaW5zZXJ0QmVmb3JlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5maXJzdENoaWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZUZpcnN0Q2hpbGQubmV4dFNpYmxpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlRmlyc3RDaGlsZCA9IGN1cnJlbnROb2RlRmlyc3RDaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICg8RWxlbWVudD5jdXJyZW50Tm9kZSkucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGlmaWVkQ29udGVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUubm9ybWFsaXplKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYXNOb0F0dHJpYnV0ZXMobm9kZTogRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgbm9kZVN0eWxlID0gT2JqZWN0LmtleXModGhpcy5nZXRJbmxpbmVTdHlsZShub2RlKSk7XG4gICAgICAgIGxldCBub2RlQXR0cmlidXRlcyA9IE9iamVjdC5rZXlzKFxuICAgICAgICAgICAgbm9kZS5nZXRBdHRyaWJ1dGVOYW1lcygpLnJlZHVjZSgoYWNjLCBuYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgLi4uYWNjLCBbbmFtZV06IG5vZGUuZ2V0QXR0cmlidXRlKG5hbWUpIH07XG4gICAgICAgICAgICB9LCB7fSlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAobm9kZUF0dHJpYnV0ZXMubGVuZ3RoID09PSAwIHx8IChub2RlQXR0cmlidXRlcy5sZW5ndGggPT09IDEgJiYgbm9kZVN0eWxlLmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlkZW50aWNhbENsYXNzTGlzdChjdXJyZW50RWxlbWVudCwgbmV4dEVsZW1lbnQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIFsuLi5jdXJyZW50RWxlbWVudC5jbGFzc0xpc3RdLmV2ZXJ5KChjbGFzc0xpc3QpID0+IG5leHRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhjbGFzc0xpc3QpKSAmJlxuICAgICAgICAgICAgWy4uLm5leHRFbGVtZW50LmNsYXNzTGlzdF0uZXZlcnkoKGNsYXNzTGlzdCkgPT4gY3VycmVudEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTGlzdCkpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpZGVudGljYWxJbmxpbmVTdHlsZShjdXJyZW50RWxlbWVudCwgbmV4dEVsZW1lbnQpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgY3VycmVudEVsZW1lbnRJbmxpbmVTdHlsZSA9IHRoaXMuZ2V0SW5saW5lU3R5bGUoY3VycmVudEVsZW1lbnQpO1xuICAgICAgICBjb25zdCBuZXh0RWxlbWVudElubGluZVN0eWxlID0gdGhpcy5nZXRJbmxpbmVTdHlsZShuZXh0RWxlbWVudCk7XG4gICAgICAgIGxldCBjdXJyZW50RWxlbWVudElubGluZVN0eWxlU29ydGVkID0gdGhpcy5zb3J0SW5saW5lU3R5bGUoY3VycmVudEVsZW1lbnRJbmxpbmVTdHlsZSk7XG4gICAgICAgIGxldCBuZXh0RWxlbWVudElubGluZVN0eWxlU29ydGVkID0gdGhpcy5zb3J0SW5saW5lU3R5bGUobmV4dEVsZW1lbnRJbmxpbmVTdHlsZSk7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShjdXJyZW50RWxlbWVudElubGluZVN0eWxlU29ydGVkKSA9PT0gSlNPTi5zdHJpbmdpZnkobmV4dEVsZW1lbnRJbmxpbmVTdHlsZVNvcnRlZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzb3J0SW5saW5lU3R5bGUoY3VycmVudEVsZW1lbnQpOiBPYmplY3Qge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMoY3VycmVudEVsZW1lbnQpXG4gICAgICAgICAgICAuc29ydCgoWywgYV06IGFueSwgWywgYl06IGFueSkgPT4gYSAtIGIpXG4gICAgICAgICAgICAucmVkdWNlKChyLCBbaywgdl0pID0+ICh7IC4uLnIsIFtrXTogdiB9KSwge30pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0SW5saW5lU3R5bGUoY3VycmVudEVsZW1lbnQpOiBPYmplY3Qge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShjdXJyZW50RWxlbWVudC5zdHlsZSkucmVkdWNlKChzdHlsZTogc3RyaW5nLCBuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIHN0eWxlW25hbWVdID0gY3VycmVudEVsZW1lbnQuc3R5bGVbbmFtZV07XG4gICAgICAgICAgICByZXR1cm4gc3R5bGU7XG4gICAgICAgIH0sIHt9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldElubGluZVN0eWxlKGN1cnJlbnRFbGVtZW50LCBuZXh0RWxlbWVudCk6IEhUTUxFbGVtZW50IHtcbiAgICAgICAgY29uc3QgY3VycmVudEVsZW1lbnRJbmxpbmVTdHlsZTogT2JqZWN0ID0gQXJyYXkuZnJvbShjdXJyZW50RWxlbWVudC5zdHlsZSkucmVkdWNlKChzdHlsZTogc3RyaW5nLCBuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIHN0eWxlW25hbWVdID0gY3VycmVudEVsZW1lbnQuc3R5bGVbbmFtZV07XG4gICAgICAgICAgICByZXR1cm4gc3R5bGU7XG4gICAgICAgIH0sIHt9KTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBjdXJyZW50RWxlbWVudElubGluZVN0eWxlKSB7XG4gICAgICAgICAgICBuZXh0RWxlbWVudC5zdHlsZVtwcm9wZXJ0eV0gPSBjdXJyZW50RWxlbWVudElubGluZVN0eWxlW3Byb3BlcnR5XTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV4dEVsZW1lbnQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0NvbnRhaW5lcihjb250YWluZXJzOiBzdHJpbmcsIG5vZGU6IE5vZGUpOiBCb29sZWFuIHtcbiAgICAgICAgaWYgKGNvbnRhaW5lcnMuc3BsaXQoJywnKS5pbmRleE9mKG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkgPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBzYXZlSW5saW5lU2VsZWN0aW9uKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIGZpcnN0VGltZUNhbGw6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICBpZiAoZmlyc3RUaW1lQ2FsbCkge1xuICAgICAgICAgICAgY29udGFpbmVyID0gPEhUTUxFbGVtZW50PnRoaXMucGFyZW50RWRpdG9yLnF1ZXJ5U2VsZWN0b3IoJy5jZS1wYXJhZ3JhcGgnKS5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICAgICAgICAgIHRoaXMuZm91bmRBbmNob3JOb2RlID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmZvdW5kRm9jdXNOb2RlID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmZvdW5kQW5jaG9yT2Zmc2V0ID0gMDtcbiAgICAgICAgICAgIHRoaXMuZm91bmRGb2N1c09mZnNldCA9IDA7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmdldFNlbGVjdGlvbigpLnRvU3RyaW5nKCkgPT09ICg8SFRNTEVsZW1lbnQ+dGhpcy5wYXJlbnRFZGl0b3IucXVlcnlTZWxlY3RvcignLmNlLXBhcmFncmFwaCcpKS50ZXh0Q29udGVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZm91bmRBbmNob3JPZmZzZXQgPSAwO1xuICAgICAgICAgICAgICAgIHRoaXMuZm91bmRBbmNob3JOb2RlID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIHRoaXMuZm91bmRGb2N1c09mZnNldCA9IHRoaXMuZ2V0U2VsZWN0aW9uKCkudG9TdHJpbmcoKS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3VuZEZvY3VzTm9kZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBuZXh0Tm9kZSA9IGNvbnRhaW5lci5maXJzdENoaWxkO1xuICAgICAgICB3aGlsZSAobmV4dE5vZGUgJiYgKCF0aGlzLmZvdW5kQW5jaG9yTm9kZSB8fCAhdGhpcy5mb3VuZEZvY3VzTm9kZSkpIHtcbiAgICAgICAgICAgIGlmIChuZXh0Tm9kZSA9PT0gdGhpcy5zZWxlY3RlZEFuY2hvck5vZGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvdW5kQW5jaG9yTm9kZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3VuZEFuY2hvck9mZnNldCArPSB0aGlzLmFuY2hvck9mZnNldDtcbiAgICAgICAgICAgICAgICBsZXQgc2VsZWN0aW9uID0gdGhpcy5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgICAgICBsZXQgcmFuZ2UgPSB0aGlzLmdldFJhbmdlT2JqZWN0KHNlbGVjdGlvbik7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudEZyYWdtZW50OiBEb2N1bWVudEZyYWdtZW50ID0gcmFuZ2UuY2xvbmVDb250ZW50cygpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRFbGVtZW50OiBIVE1MU3BhbkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoY3VycmVudEZyYWdtZW50KTtcblxuICAgICAgICAgICAgICAgIHRoaXMuZm91bmRGb2N1c09mZnNldCA9IHRoaXMuZm91bmRBbmNob3JPZmZzZXQgKyBjdXJyZW50RWxlbWVudC5pbm5lclRleHQubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHRoaXMuZm91bmRGb2N1c05vZGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuZXh0Tm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZm91bmRBbmNob3JOb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm91bmRBbmNob3JPZmZzZXQgKz0gbmV4dE5vZGUudGV4dENvbnRlbnQubGVuZ3RoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZm91bmRGb2N1c05vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3VuZEZvY3VzT2Zmc2V0ICs9IG5leHROb2RlLnRleHRDb250ZW50Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobmV4dE5vZGUuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2F2ZUlubGluZVNlbGVjdGlvbig8SFRNTEVsZW1lbnQ+bmV4dE5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmV4dE5vZGUgPSBuZXh0Tm9kZS5uZXh0U2libGluZztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcmVzZXRJbmxpbmVTZWxlY3Rpb24oY29udGFpbmVyOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsLCBmaXJzdFRpbWVDYWxsOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKGZpcnN0VGltZUNhbGwpIHtcbiAgICAgICAgICAgIGNvbnRhaW5lciA9IDxIVE1MRWxlbWVudD50aGlzLnBhcmVudEVkaXRvci5xdWVyeVNlbGVjdG9yKCcuY2UtcGFyYWdyYXBoJykuZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgICAgICAgICB0aGlzLmZvdW5kQW5jaG9yTm9kZSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5mb3VuZEZvY3VzTm9kZSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy50bXBPZmZzZXQgPSAwO1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5mb3VuZEFuY2hvck9mZnNldCA9PT0gMCAmJlxuICAgICAgICAgICAgICAgICg8SFRNTEVsZW1lbnQ+dGhpcy5wYXJlbnRFZGl0b3IucXVlcnlTZWxlY3RvcignLmNlLXBhcmFncmFwaCcpKS50ZXh0Q29udGVudC5sZW5ndGggPT09IHRoaXMuZm91bmRGb2N1c09mZnNldFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEFuY2hvck5vZGUgPSAoPEhUTUxFbGVtZW50PnRoaXMucGFyZW50RWRpdG9yLnF1ZXJ5U2VsZWN0b3IoJy5jZS1wYXJhZ3JhcGgnKSkuZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgICAgICAgICAgICAgdGhpcy5hbmNob3JPZmZzZXQgPSAwO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGb2N1c05vZGUgPSAoPEhUTUxFbGVtZW50PnRoaXMucGFyZW50RWRpdG9yLnF1ZXJ5U2VsZWN0b3IoJy5jZS1wYXJhZ3JhcGgnKSkuZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1c09mZnNldCA9IDE7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNldFVzZXJTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG5leHROb2RlID0gY29udGFpbmVyLmZpcnN0Q2hpbGQ7XG4gICAgICAgIHdoaWxlIChuZXh0Tm9kZSAmJiAoIXRoaXMuZm91bmRBbmNob3JOb2RlIHx8ICF0aGlzLmZvdW5kRm9jdXNOb2RlKSkge1xuICAgICAgICAgICAgaWYgKG5leHROb2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5mb3VuZEFuY2hvck5vZGUgJiYgdGhpcy5mb3VuZEFuY2hvck9mZnNldCAtIG5leHROb2RlLnRleHRDb250ZW50Lmxlbmd0aCA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3VuZEFuY2hvck5vZGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFuY2hvck9mZnNldCA9IHRoaXMuZm91bmRBbmNob3JPZmZzZXQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRBbmNob3JOb2RlID0gbmV4dE5vZGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5mb3VuZEZvY3VzTm9kZSAmJiB0aGlzLmZvdW5kRm9jdXNPZmZzZXQgLSBuZXh0Tm9kZS50ZXh0Q29udGVudC5sZW5ndGggPD0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvdW5kRm9jdXNOb2RlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb2N1c09mZnNldCA9IHRoaXMuZm91bmRGb2N1c09mZnNldDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEZvY3VzTm9kZSA9IG5leHROb2RlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnRtcE9mZnNldCArPSBuZXh0Tm9kZS50ZXh0Q29udGVudC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3VuZEFuY2hvck9mZnNldCAtPSBuZXh0Tm9kZS50ZXh0Q29udGVudC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3VuZEZvY3VzT2Zmc2V0IC09IG5leHROb2RlLnRleHRDb250ZW50Lmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuZXh0Tm9kZS5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXNldElubGluZVNlbGVjdGlvbig8SFRNTEVsZW1lbnQ+bmV4dE5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmV4dE5vZGUgPSBuZXh0Tm9kZS5uZXh0U2libGluZztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlyc3RUaW1lQ2FsbCkge1xuICAgICAgICAgICAgdGhpcy5yZXNldFVzZXJTZWxlY3Rpb24oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0TW9zdERlc2NlbmRhbnRDaGlsZChlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgICAgICB3aGlsZSAoZWxlbWVudC5jaGlsZHJlbiAmJiBlbGVtZW50LmlubmVyVGV4dCA9PT0gKDxIVE1MRWxlbWVudD5lbGVtZW50LmNoaWxkcmVuWzBdKT8uaW5uZXJUZXh0ICYmIGVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBlbGVtZW50ID0gPEhUTUxFbGVtZW50PmVsZW1lbnQuY2hpbGRyZW5bMF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxufVxuIl19
|
|
600
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5saW5lLXN0eWxlLXRvb2wuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Ii9ob21lL3BhdWxpbmUvRG9jdW1lbnRzL3dvcmtzcGFjZS93aXppLWJsb2NrL3Byb2plY3RzL3dpemktYmxvY2svc3JjLyIsInNvdXJjZXMiOlsibGliL3NoYXJlZC9jb21wb25lbnRzL2VkaXRvcmpzL3Rvb2xzL2lubGluZS90b29sLXR5cGUvaW5saW5lLXN0eWxlLXRvb2wuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQW1CLFlBQVksRUFBZSxNQUFNLHFDQUFxQyxDQUFDO0FBRWpHLE1BQU0sT0FBZ0IsZUFBZ0IsU0FBUSxZQUFZO0lBQTFEOztRQUdJLGNBQVMsR0FBRyxXQUFXLENBQUM7UUFJeEIsc0JBQWlCLEdBQVcsQ0FBQyxDQUFDO1FBRTlCLHFCQUFnQixHQUFXLENBQUMsQ0FBQztRQUU3QixvQkFBZSxHQUFZLEtBQUssQ0FBQztRQUVqQyxtQkFBYyxHQUFZLEtBQUssQ0FBQztRQUVoQyxjQUFTLEdBQVcsQ0FBQyxDQUFDO1FBTXRCLG9CQUFlLEdBQVksS0FBSyxDQUFDO1FBTWpDLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBRTlCLGFBQVEsR0FBRztZQUNQLEdBQUcsRUFBRSxLQUFLO1lBQ1YsS0FBSyxFQUFFLEtBQUs7WUFDWixLQUFLLEVBQUUsS0FBSztZQUNaLFNBQVMsRUFBRSxLQUFLO1NBQ25CLENBQUM7SUErbkJOLENBQUM7SUE3bkJTLGdCQUFnQixDQUFDLE1BQWM7O1lBQ2pDLE1BQU0sU0FBUyxHQUFxQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3hHLElBQUksQ0FBQyxTQUFTLEVBQUU7Z0JBQ1osT0FBTzthQUNWO1lBQ0QsSUFBSSxVQUFVLEdBQVMsU0FBUyxDQUFDLFVBQVUsQ0FBQztZQUM1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QUFFO3dCQUNsRixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQzt3QkFDM0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7d0JBQ3pDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxRQUFRLENBQUM7cUJBQ3JDO29CQUNELElBQUksQ0FBQyxTQUFTLElBQUksUUFBUSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUM7b0JBQzlDLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxRQUFRLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQztvQkFDdEQsSUFBSSxDQUFDLGdCQUFnQixJQUFJLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDO2lCQUN4RDtnQkFDRCxJQUFJLFFBQVEsQ0FBQyxVQUFVLEVBQUU7b0JBQ3JCLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFjLFFBQVEsQ0FBQyxDQUFDO2lCQUMxRDtnQkFDRCxRQUFRLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQzthQUNuQztZQUNELElBQUksYUFBYSxFQUFFO2dCQUNmLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2FBQzdCO1FBQ0wsQ0FBQztLQUFBO0lBRU8sc0JBQXNCLENBQUMsT0FBb0I7O1FBQy9DLE9BQU8sT0FBTyxDQUFDLFFBQVEsSUFBSSxPQUFPLENBQUMsU0FBUyxZQUFtQixPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBRSwwQ0FBRSxTQUFTLENBQUEsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDN0gsT0FBTyxHQUFnQixPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzlDO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDbkIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXR0cmlidXRlT2JqZWN0LCBFZGl0b3JKU1Rvb2wsIFN0eWxlT2JqZWN0IH0gZnJvbSAnLi4vLi4vdXRpbHMvZWRpdG9yanMtdG9vbC5jb21wb25lbnQnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSW5saW5lU3R5bGVUb29sIGV4dGVuZHMgRWRpdG9ySlNUb29sIHtcbiAgICB0YWc6IHN0cmluZztcblxuICAgIG1vZGlmaWVycyA9ICdzdHJvbmcsZW0nO1xuXG4gICAgc3R5bGU/OiBTdHlsZU9iamVjdDtcblxuICAgIGZvdW5kQW5jaG9yT2Zmc2V0OiBudW1iZXIgPSAwO1xuXG4gICAgZm91bmRGb2N1c09mZnNldDogbnVtYmVyID0gMDtcblxuICAgIGZvdW5kQW5jaG9yTm9kZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgZm91bmRGb2N1c05vZGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHRtcE9mZnNldDogbnVtYmVyID0gMDtcblxuICAgIGNsYXNzVG9BcHBseT86IHN0cmluZztcblxuICAgIGNsYXNzZXM/OiBzdHJpbmc7XG5cbiAgICBtb2RpZmllZENvbnRlbnQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIGF0dHJpYnV0ZU5hbWU/OiBzdHJpbmc7XG5cbiAgICBhdHRyaWJ1dGVzVG9BcHBseT86IEFycmF5PEF0dHJpYnV0ZU9iamVjdD47XG5cbiAgICBsaW5rRGVsZXRpb246IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIG1vZGlmaWVzID0ge1xuICAgICAgICB0YWc6IGZhbHNlLFxuICAgICAgICBzdHlsZTogZmFsc2UsXG4gICAgICAgIGNsYXNzOiBmYWxzZSxcbiAgICAgICAgYXR0cmlidXRlOiBmYWxzZSxcbiAgICB9O1xuXG4gICAgYXN5bmMgZXhlY0NvbW1hbmRTdHlsZShhY3Rpb246IHN0cmluZykge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb246IFNlbGVjdGlvbiB8IG51bGwgPSB0aGlzLmN1cnJlbnRTZWxlY3Rpb24gPyB0aGlzLmN1cnJlbnRTZWxlY3Rpb24gOiB0aGlzLmdldFNlbGVjdGlvbigpO1xuICAgICAgICBpZiAoIXNlbGVjdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhbmNob3JOb2RlOiBOb2RlID0gc2VsZWN0aW9uLmFuY2hvck5vZGU7XG4gICAgICAgIGlmICghdGhpcy5wYXJlbnRFZGl0b3IpIHtcbiAgICAgICAgICAgIHRoaXMucGFyZW50RWRpdG9yID0gdGhpcy5maW5kUGFyZW50RWRpdG9yKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWFuY2hvck5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY29udGFpbmVyOiBIVE1MRWxlbWVudCA9XG4gICAgICAgICAgICBhbmNob3JOb2RlLm5vZGVUeXBlICE9PSBOb2RlLlRFWFRfTk9ERSAmJiBhbmNob3JOb2RlLm5vZGVUeXBlICE9PSBOb2RlLkNPTU1FTlRfTk9ERVxuICAgICAgICAgICAgICAgID8gKGFuY2hvck5vZGUgYXMgSFRNTEVsZW1lbnQpXG4gICAgICAgICAgICAgICAgOiBhbmNob3JOb2RlLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHNhbWVTZWxlY3Rpb246IGJvb2xlYW4gPSBjb250YWluZXIgJiYgY29udGFpbmVyLmlubmVyVGV4dCA9PT0gc2VsZWN0aW9uLnRvU3RyaW5nKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuc2F2ZUlubGluZVNlbGVjdGlvbihjb250YWluZXIsIHRydWUpO1xuICAgICAgICBjb25zb2xlLmxvZygnPT09IGlubGluZSB0b29sIGV4ZWNDb21tYW5kU3R5bGUgbWV0aG9kID09PScpO1xuICAgICAgICBjb25zb2xlLmxvZyh0aGlzLmhhc1N0eWxlKGNvbnRhaW5lcikpO1xuXG4gICAgICAgIC8vIExpbmsgZGVsZXRlIGV4Y2VwdGlvblxuICAgICAgICBpZiAodGhpcy5saW5rRGVsZXRpb24pIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucmVwbGFjZUxpbmsoc2VsZWN0aW9uLCB0aGlzLmhhc1N0eWxlKGNvbnRhaW5lcikpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHNhbWVTZWxlY3Rpb24gJiZcbiAgICAgICAgICAgICAgICAhdGhpcy5pc0NvbnRhaW5lcih0aGlzLnRleHRDb250YWluZXJzLCBjb250YWluZXIpICYmXG4gICAgICAgICAgICAgICAgdGhpcy5oYXNTdHlsZShjb250YWluZXIpICYmXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uLnRvU3RyaW5nKCkgPT09IHRoaXMuaGFzU3R5bGUoY29udGFpbmVyKS5pbm5lclRleHRcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCctPiB1cGRhdGUgc2VsZWN0aW9uJyk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVTZWxlY3Rpb24oc2VsZWN0aW9uLCB0aGlzLmhhc1N0eWxlKGNvbnRhaW5lciksIGFjdGlvbiwgdGhpcy50ZXh0Q29udGFpbmVycyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCctPiByZXBsYWNlIHNlbGVjdGlvbicpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVwbGFjZVNlbGVjdGlvbih0aGlzLmdldE1vc3REZXNjZW5kYW50Q2hpbGQoY29udGFpbmVyKSwgYWN0aW9uLCBzZWxlY3Rpb24sIHRoaXMudGV4dENvbnRhaW5lcnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuY2xlYW51cENvbnRhaW5lcihzZWxlY3Rpb24sIGNvbnRhaW5lciwgdHJ1ZSk7XG4gICAgICAgIGlmICh0aGlzLm1vZGlmaWVkQ29udGVudCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXNldElubGluZVNlbGVjdGlvbihjb250YWluZXIsIHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyB1cGRhdGVTZWxlY3Rpb24oc2VsZWN0aW9uOiBTZWxlY3Rpb24sIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIGFjdGlvbjogc3RyaW5nLCBjb250YWluZXJzOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHRoaXMubW9kaWZpZXMuc3R5bGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGNzcyA9IHRoaXMuc3R5bGUucHJvcGVydHk7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBhd2FpdCB0aGlzLmdldFN0eWxlVmFsdWUoY29udGFpbmVyLCBhY3Rpb24sIGNvbnRhaW5lcnMpO1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB0aGlzLnN0eWxlLmRlZmF1bHQpIHtcbiAgICAgICAgICAgICAgICBjb250YWluZXIuc3R5bGVbY3NzXSA9IHZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb250YWluZXIuc3R5bGUucmVtb3ZlUHJvcGVydHkodGhpcy5zdHlsZS5wcm9wZXJ0eSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCByYW5nZTogUmFuZ2UgPSB0aGlzLmdldFJhbmdlT2JqZWN0KHNlbGVjdGlvbik7XG4gICAgICAgICAgICBsZXQgbmV3RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGhpcy5oYXNTdHlsZShjb250YWluZXIpID8gJ3NwYW4nIDogdGhpcy50YWcpO1xuICAgICAgICAgICAgaWYgKHRoaXMubW9kaWZpZXMuY2xhc3MpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlbW92ZUNoaWxkcmVuQ2xhc3NlcyhuZXdFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jbGFzc1RvQXBwbHkgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuY2xhc3NMaXN0LmFkZCh0aGlzLmNsYXNzVG9BcHBseSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMubW9kaWZpZXMuYXR0cmlidXRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hdHRyaWJ1dGVzVG9BcHBseS5mb3JFYWNoKChhdHRyaWJ1dGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlLm5hbWUsIGF0dHJpYnV0ZS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXdFbGVtZW50ID0gdGhpcy5zZXRJbmxpbmVTdHlsZShjb250YWluZXIsIG5ld0VsZW1lbnQpO1xuXG4gICAgICAgICAgICB3aGlsZSAoY29udGFpbmVyLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgICAgICBsZXQgZWxlbWVudENsb25lID0gY29udGFpbmVyLmZpcnN0Q2hpbGQuY2xvbmVOb2RlKHRydWUpO1xuICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudENsb25lKTtcbiAgICAgICAgICAgICAgICBjb250YWluZXIuZmlyc3RDaGlsZC5yZW1vdmUoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29udGFpbmVyLnBhcmVudEVsZW1lbnQucmVwbGFjZUNoaWxkKG5ld0VsZW1lbnQsIGNvbnRhaW5lcik7XG5cbiAgICAgICAgICAgIHJhbmdlLmluc2VydE5vZGUobmV3RWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJlcGxhY2VTZWxlY3Rpb24oY29udGFpbmVyOiBIVE1MRWxlbWVudCwgYWN0aW9uOiBzdHJpbmcsIHNlbGVjdGlvbjogU2VsZWN0aW9uLCBjb250YWluZXJzOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgZm9jdXNOb2RlOiBOb2RlID0gc2VsZWN0aW9uLmZvY3VzTm9kZTtcbiAgICAgICAgbGV0IG9mZnNldENvbnRhaW5lcjogSFRNTEVsZW1lbnQgPVxuICAgICAgICAgICAgZm9jdXNOb2RlLm5vZGVUeXBlICE9PSBOb2RlLlRFWFRfTk9ERSAmJiBmb2N1c05vZGUubm9kZVR5cGUgIT09IE5vZGUuQ09NTUVOVF9OT0RFXG4gICAgICAgICAgICAgICAgPyAoZm9jdXNOb2RlIGFzIEhUTUxFbGVtZW50KVxuICAgICAgICAgICAgICAgIDogZm9jdXNOb2RlLnBhcmVudEVsZW1lbnQ7XG5cbiAgICAgICAgbGV0IHBhcmVudENvbnRhaW5lciA9IHRoaXMuaGFzU3R5bGUoY29udGFpbmVyKTtcbiAgICAgICAgbGV0IG9mZnNldFBhcmVudENvbnRhaW5lciA9IHRoaXMuaGFzU3R5bGUob2Zmc2V0Q29udGFpbmVyKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgcGFyZW50Q29udGFpbmVyICYmXG4gICAgICAgICAgICBwYXJlbnRDb250YWluZXIgPT09IG9mZnNldFBhcmVudENvbnRhaW5lciAmJlxuICAgICAgICAgICAgKChwYXJlbnRDb250YWluZXIuY2hpbGRyZW4ubGVuZ3RoID4gMCAmJiBwYXJlbnRDb250YWluZXIuaW5uZXJUZXh0ICE9PSBwYXJlbnRDb250YWluZXIuY2hpbGRyZW5bMF0udGV4dENvbnRlbnQpIHx8XG4gICAgICAgICAgICAgICAgcGFyZW50Q29udGFpbmVyLmlubmVyVGV4dCAhPT0gc2VsZWN0aW9uLnRvU3RyaW5nKCkpXG4gICAgICAgICkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ2lmJyk7XG4gICAgICAgICAgICBjb25zdCByYW5nZTogUmFuZ2UgPSB0aGlzLmdldFJhbmdlT2JqZWN0KHNlbGVjdGlvbik7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50RnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQgPSByYW5nZS5leHRyYWN0Q29udGVudHMoKTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRFbGVtZW50OiBIVE1MU3BhbkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgICAgICBjdXJyZW50RWxlbWVudC5hcHBlbmRDaGlsZChjdXJyZW50RnJhZ21lbnQpO1xuICAgICAgICAgICAgaWYgKHRoaXMubW9kaWZpZXMuc3R5bGUgJiYgdGhpcy5zdHlsZS52YWx1ZS5pbmRleE9mKCckMScpID4gLTEpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudC5zdHlsZVt0aGlzLnN0eWxlLnByb3BlcnR5XSA9IHRoaXMuc3R5bGUudmFsdWUucmVwbGFjZSgnJDEnLCB0aGlzLnN0eWxlLmlucHV0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLm1vZGlmaWVzLmNsYXNzKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZW1vdmVDaGlsZHJlbkNsYXNzZXMoY3VycmVudEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNsYXNzVG9BcHBseSAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCh0aGlzLmNsYXNzVG9BcHBseSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMubW9kaWZpZXMuYXR0cmlidXRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hdHRyaWJ1dGVzVG9BcHBseS5mb3JFYWNoKChhdHRyaWJ1dGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZS5uYW1lLCBhdHRyaWJ1dGUudmFsdWUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGN1cnJlbnRFbGVtZW50VG9BcHBlbmQgPSBjdXJyZW50RWxlbWVudDtcbiAgICAgICAgICAgIGxldCBjdXJyZW50UGFyZW50RWxlbWVudCA9IGNvbnRhaW5lcjtcbiAgICAgICAgICAgIGlmIChwYXJlbnRDb250YWluZXIuY29udGFpbnMoY3VycmVudFBhcmVudEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnRQYXJlbnRFbGVtZW50ICE9PSBwYXJlbnRDb250YWluZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRtcEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGN1cnJlbnRQYXJlbnRFbGVtZW50LnRhZ05hbWUpO1xuICAgICAgICAgICAgICAgICAgICB0bXBFbGVtZW50ID0gdGhpcy5zZXRJbmxpbmVTdHlsZShjdXJyZW50UGFyZW50RWxlbWVudCwgdG1wRWxlbWVudCk7XG5cbiAgICAgICAgICAgICAgICAgICAgdG1wRWxlbWVudC5hcHBlbmRDaGlsZChjdXJyZW50RWxlbWVudFRvQXBwZW5kKTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnRUb0FwcGVuZCA9IHRtcEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQYXJlbnRFbGVtZW50ID0gY3VycmVudFBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGlzTFRSID0gdGhpcy5pc0FuY2hvckJlZm9yZUZvY3VzKFxuICAgICAgICAgICAgICAgIHNlbGVjdGlvbi5hbmNob3JOb2RlLFxuICAgICAgICAgICAgICAgIHNlbGVjdGlvbi5hbmNob3JPZmZzZXQsXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uLmZvY3VzTm9kZSxcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb24uZm9jdXNPZmZzZXRcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGxldCBzZWxlY3Rpb25Gb2N1c09mZnNldCA9IGlzTFRSID8gc2VsZWN0aW9uLmFuY2hvck9mZnNldCA6IHNlbGVjdGlvbi5mb2N1c09mZnNldDtcbiAgICAgICAgICAgIGxldCBzZWxlY3Rpb25Gb2N1c05vZGUgPSBpc0xUUiA/IHNlbGVjdGlvbi5hbmNob3JOb2RlIDogc2VsZWN0aW9uLmZvY3VzTm9kZTtcblxuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCkuc2V0QmFzZUFuZEV4dGVudChwYXJlbnRDb250YWluZXIsIDAsIHNlbGVjdGlvbkZvY3VzTm9kZSwgc2VsZWN0aW9uRm9jdXNPZmZzZXQpO1xuICAgICAgICAgICAgY29uc3QgbmV3U2VsZWN0aW9uID0gdGhpcy5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgIGxldCBwcmVSYW5nZTogUmFuZ2UgPSB0aGlzLmdldFJhbmdlT2JqZWN0KG5ld1NlbGVjdGlvbik7XG5cbiAgICAgICAgICAgIGNvbnN0IHByZUZyYWdtZW50OiBEb2N1bWVudEZyYWdtZW50ID0gcHJlUmFuZ2UuZXh0cmFjdENvbnRlbnRzKCk7XG5cbiAgICAgICAgICAgIGxldCBuZXdFbGVtZW50OiBIVE1MRWxlbWVudCA9IDxIVE1MRWxlbWVudD5wYXJlbnRDb250YWluZXIuY2xvbmVOb2RlKCk7XG4gICAgICAgICAgICBuZXdFbGVtZW50LmlubmVySFRNTCA9ICcnO1xuICAgICAgICAgICAgbmV3RWxlbWVudC5hcHBlbmRDaGlsZChwcmVGcmFnbWVudCk7XG5cbiAgICAgICAgICAgIHBhcmVudENvbnRhaW5lci5wYXJlbnRFbGVtZW50Lmluc2VydEJlZm9yZShjdXJyZW50RWxlbWVudFRvQXBwZW5kLCBwYXJlbnRDb250YWluZXIpO1xuICAgICAgICAgICAgcGFyZW50Q29udGFpbmVyLnBhcmVudEVsZW1lbnQuaW5zZXJ0QmVmb3JlKG5ld0VsZW1lbnQsIGN1cnJlbnRFbGVtZW50VG9BcHBlbmQpO1xuICAgICAgICAgICAgaWYgKCFwYXJlbnRDb250YWluZXIudGV4dENvbnRlbnQgfHwgcGFyZW50Q29udGFpbmVyLnRleHRDb250ZW50Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHBhcmVudENvbnRhaW5lci5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKHBhcmVudENvbnRhaW5lcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZWxlY3Rpb24uc2VsZWN0QWxsQ2hpbGRyZW4oY3VycmVudEVsZW1lbnRUb0FwcGVuZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnZWxzZScpO1xuICAgICAgICAgICAgY29uc3QgcmFuZ2U6IFJhbmdlID0gdGhpcy5nZXRSYW5nZU9iamVjdChzZWxlY3Rpb24pO1xuICAgICAgICAgICAgY29uc3QgZnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQgPSByYW5nZS5leHRyYWN0Q29udGVudHMoKTtcbiAgICAgICAgICAgIGxldCBmcmFnbWVudEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgICAgICAgbGV0IG5ld0VsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IGF3YWl0IHRoaXMuY3JlYXRlRWxlbWVudChjb250YWluZXIsIGFjdGlvbiwgY29udGFpbmVycyk7XG4gICAgICAgICAgICBsZXQgZWxlbWVudFRvQXBwZW5kID0gbmV3RWxlbWVudDtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKG5ld0VsZW1lbnQpO1xuXG4gICAgICAgICAgICBmcmFnbWVudEVsZW1lbnQuYXBwZW5kKGZyYWdtZW50KTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBmcmFnbWVudEVsZW1lbnQuY2hpbGRyZW4/Lmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAgICAgICAgIHRoaXMudGV4dENvbnRhaW5lcnMuc3BsaXQoJywnKS5pbmRleE9mKGZyYWdtZW50RWxlbWVudC5jaGlsZHJlblswXS50YWdOYW1lLnRvTG93ZXJDYXNlKCkpID4gLTFcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnRUb0FwcGVuZCA9IDxIVE1MRWxlbWVudD5mcmFnbWVudEVsZW1lbnQuY2hpbGRyZW5bMF07XG4gICAgICAgICAgICAgICAgbmV3RWxlbWVudC5pbm5lckhUTUwgPSAoPEhUTUxFbGVtZW50PmZyYWdtZW50RWxlbWVudC5jaGlsZHJlblswXSkuaW5uZXJIVE1MO1xuICAgICAgICAgICAgICAgIGVsZW1lbnRUb0FwcGVuZC5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgICAgICAgICBlbGVtZW50VG9BcHBlbmQuYXBwZW5kKG5ld0VsZW1lbnQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBuZXdFbGVtZW50LmlubmVySFRNTCA9IGZyYWdtZW50RWxlbWVudC5pbm5lckhUTUw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5tb2RpZmllcy5jbGFzcykge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVtb3ZlQ2hpbGRyZW5DbGFzc2VzKG5ld0VsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNsYXNzVG9BcHBseSAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudC5jbGFzc0xpc3QuYWRkKHRoaXMuY2xhc3NUb0FwcGx5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5tb2RpZmllcy5hdHRyaWJ1dGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXNUb0FwcGx5LmZvckVhY2goKGF0dHJpYnV0ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUubmFtZSwgYXR0cmlidXRlLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmFuZ2UuaW5zZXJ0Tm9kZShlbGVtZW50VG9BcHBlbmQpO1xuICAgICAgICAgICAgc2VsZWN0aW9uLnNlbGVjdEFsbENoaWxkcmVuKGVsZW1lbnRUb0FwcGVuZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJlcGxhY2VMaW5rKHNlbGVjdGlvbjogU2VsZWN0aW9uLCBjb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgICAgIGxldCBuZXdFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICBuZXdFbGVtZW50LmlubmVySFRNTCA9IGNvbnRhaW5lci5pbm5lckhUTUw7XG5cbiAgICAgICAgY29udGFpbmVyLnBhcmVudEVsZW1lbnQucmVwbGFjZUNoaWxkKG5ld0VsZW1lbnQsIGNvbnRhaW5lcik7XG4gICAgICAgIHNlbGVjdGlvbi5zZWxlY3RBbGxDaGlsZHJlbihuZXdFbGVtZW50KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzQW5jaG9yQmVmb3JlRm9jdXMoYW5jaG9yTm9kZTogTm9kZSwgYW5jaG9yT2Zmc2V0OiBudW1iZXIsIGZvY3VzTm9kZTogTm9kZSwgZm9jdXNPZmZzZXQ6IG51bWJlcikge1xuICAgICAgICBsZXQgYW5jaG9yUmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgICAgICBsZXQgZm9jdXNSYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgICAgIGFuY2hvclJhbmdlLnNldFN0YXJ0KGFuY2hvck5vZGUsIGFuY2hvck9mZnNldCk7XG4gICAgICAgIGFuY2hvclJhbmdlLnNldEVuZChhbmNob3JOb2RlLCBhbmNob3JPZmZzZXQpO1xuICAgICAgICBmb2N1c1JhbmdlLnNldFN0YXJ0KGZvY3VzTm9kZSwgZm9jdXNPZmZzZXQpO1xuICAgICAgICBmb2N1c1JhbmdlLnNldEVuZChmb2N1c05vZGUsIGZvY3VzT2Zmc2V0KTtcbiAgICAgICAgaWYgKGFuY2hvclJhbmdlLmNvbXBhcmVCb3VuZGFyeVBvaW50cyhSYW5nZS5TVEFSVF9UT19TVEFSVCwgZm9jdXNSYW5nZSkgPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaGFzU3R5bGUoZWxlbWVudDogSFRNTEVsZW1lbnQsIGZpcnN0VGltZUNhbGw6IGJvb2xlYW4gPSB0cnVlKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICAgICAgaWYgKGZpcnN0VGltZUNhbGwgJiYgZWxlbWVudC5jaGlsZHJlbikge1xuICAgICAgICAgICAgZWxlbWVudCA9IHRoaXMuZ2V0TW9zdERlc2NlbmRhbnRDaGlsZCg8SFRNTEVsZW1lbnQ+ZWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBmb3VuZEVsZW1lbnQgd2FzIGFkZGVkIGJlY2F1c2Ugb2YgYSByZXR1cm4gaXNzdWUgd2hlbiBhIGNsYXNzIGlzIGFwcGxpZWRcbiAgICAgICAgbGV0IGZvdW5kRWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICAgICAgICBpZiAoIWVsZW1lbnQgfHwgZWxlbWVudC5jbGFzc0xpc3Q/LmNvbnRhaW5zKCdjZS1wYXJhZ3JhcGgnKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubW9kaWZpZXMuc3R5bGUpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBlbGVtZW50LnN0eWxlICYmXG4gICAgICAgICAgICAgICAgZWxlbWVudC5zdHlsZVt0aGlzLnN0eWxlLnByb3BlcnR5XSAmJlxuICAgICAgICAgICAgICAgICh0aGlzLnN0eWxlLnZhbHVlLmluZGV4T2YoJyQxJykgPiAtMSA/IHRydWUgOiBlbGVtZW50LnN0eWxlW3RoaXMuc3R5bGUucHJvcGVydHldID09PSB0aGlzLnN0eWxlLnZhbHVlKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgZm91bmRFbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm1vZGlmaWVzLmNsYXNzKSB7XG4gICAgICAgICAgICB0aGlzLmNsYXNzZXMuc3BsaXQoJywnKS5mb3JFYWNoKChjbGFzc05hbWUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5jbGFzc0xpc3Q/LmNvbnRhaW5zKGNsYXNzTmFtZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgZm91bmRFbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5tb2RpZmllcy50YWcpIHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50LnRhZ05hbWU/LnRvTG93ZXJDYXNlKCkgPT09IHRoaXMudGFnLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm1vZGlmaWVzLmF0dHJpYnV0ZSkge1xuICAgICAgICAgICAgbGV0IGF0dHJpYnV0ZXMgPSB0aGlzLmF0dHJpYnV0ZU5hbWUuc3BsaXQoJywnKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXR0cmlidXRlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZWxlbWVudC5nZXRBdHRyaWJ1dGUgPT09ICdmdW5jdGlvbicgJiYgZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlc1tpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZm91bmRFbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChmb3VuZEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBmb3VuZEVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFmb3VuZEVsZW1lbnQgJiYgZWxlbWVudC5wYXJlbnRFbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5oYXNTdHlsZShlbGVtZW50LnBhcmVudEVsZW1lbnQsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGdldFN0eWxlVmFsdWUoY29udGFpbmVyOiBIVE1MRWxlbWVudCwgYWN0aW9uOiBzdHJpbmcsIGNvbnRhaW5lcnM6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgICAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUudmFsdWUuaW5kZXhPZignJDEnKSA+IC0xID8gdGhpcy5zdHlsZS52YWx1ZS5yZXBsYWNlKCckMScsIHRoaXMuc3R5bGUuaW5wdXQpIDogdGhpcy5zdHlsZS52YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhhc1N0eWxlKGNvbnRhaW5lcikgJiYgdGhpcy5zdHlsZS52YWx1ZS5pbmRleE9mKCckMScpID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUuZGVmYXVsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0eWxlOiBOb2RlIHwgbnVsbCA9IGF3YWl0IHRoaXMuZmluZFN0eWxlTm9kZShjb250YWluZXIsIGFjdGlvbiwgY29udGFpbmVycyk7XG4gICAgICAgIGlmIChzdHlsZSAmJiB0aGlzLmhhc1N0eWxlKHN0eWxlIGFzIEhUTUxFbGVtZW50KSAmJiB0aGlzLnN0eWxlLnZhbHVlLmluZGV4T2YoJyQxJykgPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zdHlsZS5kZWZhdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUudmFsdWUuaW5kZXhPZignJDEnKSA+IC0xID8gdGhpcy5zdHlsZS52YWx1ZS5yZXBsYWNlKCckMScsIHRoaXMuc3R5bGUuaW5wdXQpIDogdGhpcy5zdHlsZS52YWx1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGZpbmRTdHlsZU5vZGUobm9kZTogTm9kZSwgc3R5bGU6IHN0cmluZywgY29udGFpbmVyczogc3RyaW5nKTogUHJvbWlzZTxOb2RlIHwgbnVsbD4ge1xuICAgICAgICBpZiAobm9kZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSAnSFRNTCcgfHwgbm9kZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSAnQk9EWScpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFub2RlLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaXNDb250YWluZXIoY29udGFpbmVycywgbm9kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGFzU3R5bGU6IGJvb2xlYW4gPVxuICAgICAgICAgICAgKG5vZGUgYXMgSFRNTEVsZW1lbnQpLnN0eWxlW3N0eWxlXSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgKG5vZGUgYXMgSFRNTEVsZW1lbnQpLnN0eWxlW3N0eWxlXSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAobm9kZSBhcyBIVE1MRWxlbWVudCkuc3R5bGVbc3R5bGVdICE9PSAnJztcblxuICAgICAgICBpZiAoaGFzU3R5bGUpIHtcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmluZFN0eWxlTm9kZShub2RlLnBhcmVudE5vZGUsIHN0eWxlLCBjb250YWluZXJzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGNyZWF0ZUVsZW1lbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCwgYWN0aW9uOiBzdHJpbmcsIGNvbnRhaW5lcnM6IHN0cmluZyk6IFByb21pc2U8SFRNTEVsZW1lbnQ+IHtcbiAgICAgICAgbGV0IG5ld0VsZW1lbnQ6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0aGlzLnRhZyk7XG4gICAgICAgIGlmICh0aGlzLm1vZGlmaWVzLnN0eWxlKSB7XG4gICAgICAgICAgICBjb25zdCBwcm9wZXJ0eSA9IHRoaXMuc3R5bGUucHJvcGVydHk7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBhd2FpdCB0aGlzLmdldFN0eWxlVmFsdWUoY29udGFpbmVyLCBhY3Rpb24sIGNvbnRhaW5lcnMpO1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB0aGlzLnN0eWxlLmRlZmF1bHQpIHtcbiAgICAgICAgICAgICAgICBuZXdFbGVtZW50LnN0eWxlW3Byb3BlcnR5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBuZXdFbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KHByb3BlcnR5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXdFbGVtZW50O1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcmVtb3ZlQ2hpbGRyZW5DbGFzc2VzKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gICAgICAgIGlmICghZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2hpbGRyZW46IEhUTUxDb2xsZWN0aW9uID0gZWxlbWVudC5jaGlsZHJlbjtcbiAgICAgICAgZm9yICh2YXIgY3VycmVudEVsZW1lbnQgPSBjaGlsZHJlblswXTsgY3VycmVudEVsZW1lbnQ7IGN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmNsYXNzZXMuc3BsaXQoJywnKS5mb3JFYWNoKChjbGFzc05hbWUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudEVsZW1lbnQuY2xhc3NMaXN0Py5jb250YWlucyhjbGFzc05hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50RWxlbWVudC5jbGFzc0xpc3QubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2NsYXNzJyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChjdXJyZW50RWxlbWVudC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZW1vdmVDaGlsZHJlbkNsYXNzZXMoPEhUTUxFbGVtZW50PmN1cnJlbnRFbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHBhcmVudEhhc1N0eWxlKGN1cnJlbnRFbGVtZW50OiBIVE1MRWxlbWVudCwgcmVmZXJlbmNlRWxlbWVudDogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcbiAgICAgICAgLy8gTGluayBleGNlcHRpb25cbiAgICAgICAgaWYgKCFjdXJyZW50RWxlbWVudCB8fCByZWZlcmVuY2VFbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2EnIHx8IHJlZmVyZW5jZUVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnZGl2Jykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgcmVmZXJlbmNlRWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgIT09ICdzcGFuJyAmJlxuICAgICAgICAgICAgcmVmZXJlbmNlRWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09IGN1cnJlbnRFbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLmdldElubGluZVN0eWxlKGN1cnJlbnRFbGVtZW50KSkubGVuZ3RoID4gMCAmJiB0aGlzLmlkZW50aWNhbElubGluZVN0eWxlKGN1cnJlbnRFbGVtZW50LCByZWZlcmVuY2VFbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50LmNsYXNzTGlzdC5sZW5ndGggPiAwICYmIHRoaXMuaWRlbnRpY2FsQ2xhc3NMaXN0KGN1cnJlbnRFbGVtZW50LCByZWZlcmVuY2VFbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQgJiYgY3VycmVudEVsZW1lbnQucGFyZW50RWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgIT09ICdkaXYnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnRIYXNTdHlsZShjdXJyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LCByZWZlcmVuY2VFbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBjbGVhbnVwQ29udGFpbmVyKHNlbGVjdGlvbjogU2VsZWN0aW9uLCBjb250YWluZXIsIGZpcnN0VGltZUNhbGw6IEJvb2xlYW4pIHtcbiAgICAgICAgbGV0IHBhcmVudENvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXJlbnRGb3VuZDogQm9vbGVhbiA9IGZhbHNlO1xuICAgICAgICBpZiAoZmlyc3RUaW1lQ2FsbCkge1xuICAgICAgICAgICAgcGFyZW50Q29udGFpbmVyID0gPEhUTUxFbGVtZW50PnNlbGVjdGlvbi5hbmNob3JOb2RlO1xuICAgICAgICAgICAgd2hpbGUgKHBhcmVudENvbnRhaW5lciAmJiAhcGFyZW50Rm91bmQpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50Q29udGFpbmVyLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSAmJiBwYXJlbnRDb250YWluZXIuY2xhc3NMaXN0Py5jb250YWlucygnY2UtcGFyYWdyYXBoJykpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50Rm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudENvbnRhaW5lciA9IHBhcmVudENvbnRhaW5lci5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhcmVudENvbnRhaW5lciA9IGNvbnRhaW5lcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXBhcmVudENvbnRhaW5lciB8fCAhcGFyZW50Q29udGFpbmVyLmhhc0NoaWxkTm9kZXMoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcGFyZW50Q29udGFpbmVyLm5vcm1hbGl6ZSgpO1xuXG4gICAgICAgIGNvbnN0IGNoaWxkcmVuOiBOb2RlW10gPSBBcnJheS5mcm9tKHBhcmVudENvbnRhaW5lci5jaGlsZE5vZGVzKTtcbiAgICAgICAgaWYgKGNoaWxkcmVuPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBjdXJyZW50Tm9kZSA9IGNoaWxkcmVuWzBdOyBjdXJyZW50Tm9kZTsgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5uZXh0U2libGluZykge1xuICAgICAgICAgICAgICAgIGlmICgoIWN1cnJlbnROb2RlLnRleHRDb250ZW50IHx8IGN1cnJlbnROb2RlLnRleHRDb250ZW50Lmxlbmd0aCA9PT0gMCkgfHwgKGN1cnJlbnROb2RlLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSAmJiAoPEhUTUxFbGVtZW50PmN1cnJlbnROb2RlKS5pbm5lclRleHQubGVuZ3RoID09PSAwKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcHJldmlvdXNTaWJsaW5nID0gY3VycmVudE5vZGUucHJldmlvdXNTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRDb250YWluZXIucmVtb3ZlQ2hpbGQoY3VycmVudE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZSA9IHByZXZpb3VzU2libGluZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRIYXNTdHlsZShjdXJyZW50Tm9kZS5wYXJlbnRFbGVtZW50LCA8SFRNTEVsZW1lbnQ+Y3VycmVudE5vZGUpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjdXJyZW50Tm9kZUZpcnN0Q2hpbGQgPSBjdXJyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5leHRDdXJyZW50RWxlbWVudCA9IGN1cnJlbnROb2RlLmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChjdXJyZW50Tm9kZS5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRDb250YWluZXIuaW5zZXJ0QmVmb3JlKGN1cnJlbnROb2RlLmZpcnN0Q2hpbGQsIGN1cnJlbnROb2RlRmlyc3RDaGlsZC5uZXh0U2libGluZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZUZpcnN0Q2hpbGQgPSBjdXJyZW50Tm9kZUZpcnN0Q2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcGFyZW50Q29udGFpbmVyLnJlbW92ZUNoaWxkKGN1cnJlbnROb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUgPSBuZXh0Q3VycmVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBpZGVudGljYWxFbGVtZW50cyA9IHRydWU7XG4gICAgICAgICAgICAgICAgd2hpbGUgKFxuICAgICAgICAgICAgICAgICAgICBpZGVudGljYWxFbGVtZW50cyAmJlxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5uZXh0U2libGluZyAmJlxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUgJiZcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUubmV4dFNpYmxpbmcubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjdXJyZW50RWxlbWVudCA9IDxFbGVtZW50PmN1cnJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dEVsZW1lbnQgPSA8RWxlbWVudD5jdXJyZW50Tm9kZS5uZXh0U2libGluZztcblxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlkZW50aWNhbElubGluZVN0eWxlKGN1cnJlbnRFbGVtZW50LCBuZXh0RWxlbWVudCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmV4dEVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlkZW50aWNhbENsYXNzTGlzdChjdXJyZW50RWxlbWVudCwgbmV4dEVsZW1lbnQpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlkZW50aWNhbEF0dHJpYnV0ZXMoY3VycmVudEVsZW1lbnQsIG5leHRFbGVtZW50KVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50LmlubmVySFRNTCArPSBuZXh0RWxlbWVudC5pbm5lckhUTUw7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0RWxlbWVudC5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW9kaWZpZWRDb250ZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWNhbEVsZW1lbnRzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUgJiZcbiAgICAgICAgICAgICAgICAgICAgKDxFbGVtZW50PmN1cnJlbnROb2RlKS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdzcGFuJyAmJlxuICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmdldElubGluZVN0eWxlKDxFbGVtZW50PmN1cnJlbnROb2RlKSkubGVuZ3RoID09PSAwICYmXG4gICAgICAgICAgICAgICAgICAgICghKDxFbGVtZW50PmN1cnJlbnROb2RlKS5jbGFzc0xpc3QgfHwgKDxFbGVtZW50PmN1cnJlbnROb2RlKS5jbGFzc0xpc3QubGVuZ3RoID09PSAwKSAmJlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhc05vQXR0cmlidXRlcyg8RWxlbWVudD5jdXJyZW50Tm9kZSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGN1cnJlbnROb2RlRmlyc3RDaGlsZCA9IGN1cnJlbnROb2RlO1xuXG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChjdXJyZW50Tm9kZS5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAoPEVsZW1lbnQ+Y3VycmVudE5vZGVGaXJzdENoaWxkLnBhcmVudEVsZW1lbnQpLmluc2VydEJlZm9yZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5maXJzdENoaWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlRmlyc3RDaGlsZC5uZXh0U2libGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlRmlyc3RDaGlsZCA9IGN1cnJlbnROb2RlRmlyc3RDaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAoPEVsZW1lbnQ+Y3VycmVudE5vZGUpLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGlmaWVkQ29udGVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLm5vcm1hbGl6ZSgpO1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZS5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jbGVhbnVwQ29udGFpbmVyKHNlbGVjdGlvbiwgY3VycmVudE5vZGUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGhhc05vQXR0cmlidXRlcyhub2RlOiBFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgICAgIGxldCBub2RlU3R5bGUgPSBPYmplY3Qua2V5cyh0aGlzLmdldElubGluZVN0eWxlKG5vZGUpKTtcbiAgICAgICAgbGV0IG5vZGVBdHRyaWJ1dGVzID0gT2JqZWN0LmtleXMoXG4gICAgICAgICAgICBub2RlLmdldEF0dHJpYnV0ZU5hbWVzKCkucmVkdWNlKChhY2MsIG5hbWUpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyAuLi5hY2MsIFtuYW1lXTogbm9kZS5nZXRBdHRyaWJ1dGUobmFtZSkgfTtcbiAgICAgICAgICAgIH0sIHt9KVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChub2RlQXR0cmlidXRlcy5sZW5ndGggPT09IDAgfHwgKG5vZGVBdHRyaWJ1dGVzLmxlbmd0aCA9PT0gMSAmJiBub2RlU3R5bGUubGVuZ3RoID09PSAwKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgaWRlbnRpY2FsQ2xhc3NMaXN0KGN1cnJlbnRFbGVtZW50LCBuZXh0RWxlbWVudCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgWy4uLmN1cnJlbnRFbGVtZW50LmNsYXNzTGlzdF0uZXZlcnkoKGNsYXNzTGlzdCkgPT4gbmV4dEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTGlzdCkpICYmXG4gICAgICAgICAgICBbLi4ubmV4dEVsZW1lbnQuY2xhc3NMaXN0XS5ldmVyeSgoY2xhc3NMaXN0KSA9PiBjdXJyZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NMaXN0KSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlkZW50aWNhbEF0dHJpYnV0ZXMoY3VycmVudEVsZW1lbnQsIG5leHRFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgICAgIGxldCBjdXJyZW50RWxlbWVudEF0dHJpYnV0ZXMgPSBjdXJyZW50RWxlbWVudC5nZXRBdHRyaWJ1dGVOYW1lcygpO1xuICAgICAgICBjdXJyZW50RWxlbWVudEF0dHJpYnV0ZXMuZm9yRWFjaChhdHRyaWJ1dGUgPT4ge1xuICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZSAhPT0gJ3N0eWxlJykge1xuICAgICAgICAgICAgICAgIGlmICghbmV4dEVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZSkgfHwgbmV4dEVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZSkgIT09IGN1cnJlbnRFbGVtZW50LmdldEF0dHJpYnV0ZShhdHRyaWJ1dGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlkZW50aWNhbElubGluZVN0eWxlKGN1cnJlbnRFbGVtZW50LCBuZXh0RWxlbWVudCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBjdXJyZW50RWxlbWVudElubGluZVN0eWxlID0gdGhpcy5nZXRJbmxpbmVTdHlsZShjdXJyZW50RWxlbWVudCk7XG4gICAgICAgIGNvbnN0IG5leHRFbGVtZW50SW5saW5lU3R5bGUgPSB0aGlzLmdldElubGluZVN0eWxlKG5leHRFbGVtZW50KTtcbiAgICAgICAgbGV0IGN1cnJlbnRFbGVtZW50SW5saW5lU3R5bGVTb3J0ZWQgPSB0aGlzLnNvcnRJbmxpbmVTdHlsZShjdXJyZW50RWxlbWVudElubGluZVN0eWxlKTtcbiAgICAgICAgbGV0IG5leHRFbGVtZW50SW5saW5lU3R5bGVTb3J0ZWQgPSB0aGlzLnNvcnRJbmxpbmVTdHlsZShuZXh0RWxlbWVudElubGluZVN0eWxlKTtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGN1cnJlbnRFbGVtZW50SW5saW5lU3R5bGVTb3J0ZWQpID09PSBKU09OLnN0cmluZ2lmeShuZXh0RWxlbWVudElubGluZVN0eWxlU29ydGVkKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNvcnRJbmxpbmVTdHlsZShjdXJyZW50RWxlbWVudCk6IE9iamVjdCB7XG4gICAgICAgIHJldHVybiBPYmplY3QuZW50cmllcyhjdXJyZW50RWxlbWVudClcbiAgICAgICAgICAgIC5zb3J0KChbLCBhXTogYW55LCBbLCBiXTogYW55KSA9PiBhIC0gYilcbiAgICAgICAgICAgIC5yZWR1Y2UoKHIsIFtrLCB2XSkgPT4gKHsgLi4uciwgW2tdOiB2IH0pLCB7fSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRJbmxpbmVTdHlsZShjdXJyZW50RWxlbWVudCk6IE9iamVjdCB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKGN1cnJlbnRFbGVtZW50LnN0eWxlKS5yZWR1Y2UoKHN0eWxlOiBzdHJpbmcsIG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgc3R5bGVbbmFtZV0gPSBjdXJyZW50RWxlbWVudC5zdHlsZVtuYW1lXTtcbiAgICAgICAgICAgIHJldHVybiBzdHlsZTtcbiAgICAgICAgfSwge30pO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0SW5saW5lU3R5bGUoY3VycmVudEVsZW1lbnQsIG5leHRFbGVtZW50KTogSFRNTEVsZW1lbnQge1xuICAgICAgICBjb25zdCBjdXJyZW50RWxlbWVudElubGluZVN0eWxlOiBPYmplY3QgPSBBcnJheS5mcm9tKGN1cnJlbnRFbGVtZW50LnN0eWxlKS5yZWR1Y2UoKHN0eWxlOiBzdHJpbmcsIG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgc3R5bGVbbmFtZV0gPSBjdXJyZW50RWxlbWVudC5zdHlsZVtuYW1lXTtcbiAgICAgICAgICAgIHJldHVybiBzdHlsZTtcbiAgICAgICAgfSwge30pO1xuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIGN1cnJlbnRFbGVtZW50SW5saW5lU3R5bGUpIHtcbiAgICAgICAgICAgIG5leHRFbGVtZW50LnN0eWxlW3Byb3BlcnR5XSA9IGN1cnJlbnRFbGVtZW50SW5saW5lU3R5bGVbcHJvcGVydHldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXh0RWxlbWVudDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzQ29udGFpbmVyKGNvbnRhaW5lcnM6IHN0cmluZywgbm9kZTogTm9kZSk6IEJvb2xlYW4ge1xuICAgICAgICBpZiAoY29udGFpbmVycy5zcGxpdCgnLCcpLmluZGV4T2Yobm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHNhdmVJbmxpbmVTZWxlY3Rpb24oY29udGFpbmVyOiBIVE1MRWxlbWVudCwgZmlyc3RUaW1lQ2FsbDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIGlmIChmaXJzdFRpbWVDYWxsKSB7XG4gICAgICAgICAgICBjb250YWluZXIgPSA8SFRNTEVsZW1lbnQ+dGhpcy5wYXJlbnRFZGl0b3IucXVlcnlTZWxlY3RvcignLmNlLXBhcmFncmFwaCcpLmZpcnN0RWxlbWVudENoaWxkO1xuICAgICAgICAgICAgdGhpcy5mb3VuZEFuY2hvck5vZGUgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuZm91bmRGb2N1c05vZGUgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuZm91bmRBbmNob3JPZmZzZXQgPSAwO1xuICAgICAgICAgICAgdGhpcy5mb3VuZEZvY3VzT2Zmc2V0ID0gMDtcblxuICAgICAgICAgICAgaWYgKHRoaXMuZ2V0U2VsZWN0aW9uKCkudG9TdHJpbmcoKSA9PT0gKDxIVE1MRWxlbWVudD50aGlzLnBhcmVudEVkaXRvci5xdWVyeVNlbGVjdG9yKCcuY2UtcGFyYWdyYXBoJykpLnRleHRDb250ZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3VuZEFuY2hvck9mZnNldCA9IDA7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3VuZEFuY2hvck5vZGUgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5mb3VuZEZvY3VzT2Zmc2V0ID0gdGhpcy5nZXRTZWxlY3Rpb24oKS50b1N0cmluZygpLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB0aGlzLmZvdW5kRm9jdXNOb2RlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG5leHROb2RlID0gY29udGFpbmVyLmZpcnN0Q2hpbGQ7XG4gICAgICAgIHdoaWxlIChuZXh0Tm9kZSAmJiAoIXRoaXMuZm91bmRBbmNob3JOb2RlIHx8ICF0aGlzLmZvdW5kRm9jdXNOb2RlKSkge1xuICAgICAgICAgICAgaWYgKG5leHROb2RlID09PSB0aGlzLnNlbGVjdGVkQW5jaG9yTm9kZSkge1xuICAgICAgICAgICAgICAgIGxldCBzZWxlY3Rpb24gPSB0aGlzLmdldFNlbGVjdGlvbigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzTFRSID0gdGhpcy5pc0FuY2hvckJlZm9yZUZvY3VzKFxuICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb24uYW5jaG9yTm9kZSxcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uLmFuY2hvck9mZnNldCxcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uLmZvY3VzTm9kZSxcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uLmZvY3VzT2Zmc2V0XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZvdW5kQW5jaG9yTm9kZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3VuZEFuY2hvck9mZnNldCArPSBpc0xUUiA/IHRoaXMuYW5jaG9yT2Zmc2V0IDogdGhpcy5mb2N1c09mZnNldDtcbiAgICAgICAgICAgICAgICBsZXQgcmFuZ2UgPSB0aGlzLmdldFJhbmdlT2JqZWN0KHNlbGVjdGlvbik7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudEZyYWdtZW50OiBEb2N1bWVudEZyYWdtZW50ID0gcmFuZ2UuY2xvbmVDb250ZW50cygpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRFbGVtZW50OiBIVE1MU3BhbkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoY3VycmVudEZyYWdtZW50KTtcblxuICAgICAgICAgICAgICAgIHRoaXMuZm91bmRGb2N1c09mZnNldCA9IHRoaXMuZm91bmRBbmNob3JPZmZzZXQgKyBjdXJyZW50RWxlbWVudC5pbm5lclRleHQubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHRoaXMuZm91bmRGb2N1c05vZGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuZXh0Tm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZm91bmRBbmNob3JOb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm91bmRBbmNob3JPZmZzZXQgKz0gbmV4dE5vZGUudGV4dENvbnRlbnQubGVuZ3RoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZm91bmRGb2N1c05vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3VuZEZvY3VzT2Zmc2V0ICs9IG5leHROb2RlLnRleHRDb250ZW50Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobmV4dE5vZGUuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2F2ZUlubGluZVNlbGVjdGlvbig8SFRNTEVsZW1lbnQ+bmV4dE5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmV4dE5vZGUgPSBuZXh0Tm9kZS5uZXh0U2libGluZztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcmVzZXRJbmxpbmVTZWxlY3Rpb24oY29udGFpbmVyOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsLCBmaXJzdFRpbWVDYWxsOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKGZpcnN0VGltZUNhbGwpIHtcbiAgICAgICAgICAgIGNvbnRhaW5lciA9IDxIVE1MRWxlbWVudD50aGlzLnBhcmVudEVkaXRvci5xdWVyeVNlbGVjdG9yKCcuY2UtcGFyYWdyYXBoJykuZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgICAgICAgICB0aGlzLmZvdW5kQW5jaG9yTm9kZSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5mb3VuZEZvY3VzTm9kZSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy50bXBPZmZzZXQgPSAwO1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5mb3VuZEFuY2hvck9mZnNldCA9PT0gMCAmJlxuICAgICAgICAgICAgICAgICg8SFRNTEVsZW1lbnQ+dGhpcy5wYXJlbnRFZGl0b3IucXVlcnlTZWxlY3RvcignLmNlLXBhcmFncmFwaCcpKS50ZXh0Q29udGVudC5sZW5ndGggPT09IHRoaXMuZm91bmRGb2N1c09mZnNldFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEFuY2hvck5vZGUgPSAoPEhUTUxFbGVtZW50PnRoaXMucGFyZW50RWRpdG9yLnF1ZXJ5U2VsZWN0b3IoJy5jZS1wYXJhZ3JhcGgnKSkuZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgICAgICAgICAgICAgdGhpcy5hbmNob3JPZmZzZXQgPSAwO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGb2N1c05vZGUgPSAoPEhUTUxFbGVtZW50PnRoaXMucGFyZW50RWRpdG9yLnF1ZXJ5U2VsZWN0b3IoJy5jZS1wYXJhZ3JhcGgnKSkuZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1c09mZnNldCA9IDE7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNldFVzZXJTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG5leHROb2RlID0gY29udGFpbmVyLmZpcnN0Q2hpbGQ7XG4gICAgICAgIHdoaWxlIChuZXh0Tm9kZSAmJiAoIXRoaXMuZm91bmRBbmNob3JOb2RlIHx8ICF0aGlzLmZvdW5kRm9jdXNOb2RlKSkge1xuICAgICAgICAgICAgaWYgKG5leHROb2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5mb3VuZEFuY2hvck5vZGUgJiYgdGhpcy5mb3VuZEFuY2hvck9mZnNldCAtIG5leHROb2RlLnRleHRDb250ZW50Lmxlbmd0aCA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3VuZEFuY2hvck5vZGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFuY2hvck9mZnNldCA9IHRoaXMuZm91bmRBbmNob3JPZmZzZXQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRBbmNob3JOb2RlID0gbmV4dE5vZGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5mb3VuZEZvY3VzTm9kZSAmJiB0aGlzLmZvdW5kRm9jdXNPZmZzZXQgLSBuZXh0Tm9kZS50ZXh0Q29udGVudC5sZW5ndGggPD0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvdW5kRm9jdXNOb2RlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb2N1c09mZnNldCA9IHRoaXMuZm91bmRGb2N1c09mZnNldDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEZvY3VzTm9kZSA9IG5leHROb2RlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnRtcE9mZnNldCArPSBuZXh0Tm9kZS50ZXh0Q29udGVudC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3VuZEFuY2hvck9mZnNldCAtPSBuZXh0Tm9kZS50ZXh0Q29udGVudC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3VuZEZvY3VzT2Zmc2V0IC09IG5leHROb2RlLnRleHRDb250ZW50Lmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuZXh0Tm9kZS5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXNldElubGluZVNlbGVjdGlvbig8SFRNTEVsZW1lbnQ+bmV4dE5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmV4dE5vZGUgPSBuZXh0Tm9kZS5uZXh0U2libGluZztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlyc3RUaW1lQ2FsbCkge1xuICAgICAgICAgICAgdGhpcy5yZXNldFVzZXJTZWxlY3Rpb24oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0TW9zdERlc2NlbmRhbnRDaGlsZChlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgICAgICB3aGlsZSAoZWxlbWVudC5jaGlsZHJlbiAmJiBlbGVtZW50LmlubmVyVGV4dCA9PT0gKDxIVE1MRWxlbWVudD5lbGVtZW50LmNoaWxkcmVuWzBdKT8uaW5uZXJUZXh0ICYmIGVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBlbGVtZW50ID0gPEhUTUxFbGVtZW50PmVsZW1lbnQuY2hpbGRyZW5bMF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxufVxuIl19
|