@libs-ui/services-diagram-draw 0.2.356-37 → 0.2.356-41
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/canvas.service.d.ts +1 -1
- package/diagram-draw.service.d.ts +15 -7
- package/direction.service.d.ts +2 -2
- package/esm2022/canvas.service.mjs +1 -1
- package/esm2022/diagram-draw.service.mjs +14 -5
- package/esm2022/direction.service.mjs +15 -15
- package/esm2022/index.mjs +2 -1
- package/esm2022/interfaces/diagram.interface.mjs +1 -1
- package/esm2022/interfaces/navigation.interface.mjs +2 -0
- package/esm2022/utils/calculator-branch.util.mjs +9 -9
- package/esm2022/utils/calculator-element.util.mjs +15 -15
- package/esm2022/utils/canvas.util.mjs +18 -18
- package/esm2022/utils/diagram.util.mjs +4 -4
- package/esm2022/utils/direction.util.mjs +2 -2
- package/esm2022/utils/horizontal/calculator-branch.util.mjs +10 -11
- package/esm2022/utils/horizontal/calculator-coordinates.util.mjs +16 -17
- package/esm2022/utils/navigation/build-navigation-data.util.mjs +119 -0
- package/esm2022/utils/navigation/navigation-style.define.mjs +14 -0
- package/fesm2022/libs-ui-services-diagram-draw.mjs +224 -85
- package/fesm2022/libs-ui-services-diagram-draw.mjs.map +1 -1
- package/index.d.ts +1 -0
- package/interfaces/diagram.interface.d.ts +1 -1
- package/interfaces/navigation.interface.d.ts +16 -0
- package/package.json +3 -2
- package/utils/navigation/build-navigation-data.util.d.ts +25 -0
- package/utils/navigation/navigation-style.define.d.ts +4 -0
|
@@ -16,7 +16,7 @@ import { MoLibDiagramHorizontalCalculatorBranchUtil } from './calculator-branch.
|
|
|
16
16
|
*/
|
|
17
17
|
export class MoLibDiagramHorizontalCalculatorCoordinatesUtil {
|
|
18
18
|
static setXYElements(elements, config, positionY) {
|
|
19
|
-
if (!elements
|
|
19
|
+
if (!elements?.length) {
|
|
20
20
|
return;
|
|
21
21
|
}
|
|
22
22
|
elements.forEach((currentElement, index) => {
|
|
@@ -32,9 +32,8 @@ export class MoLibDiagramHorizontalCalculatorCoordinatesUtil {
|
|
|
32
32
|
}
|
|
33
33
|
checkMaxTop(config, currentElement.specific_y, currentElement.branches?.[0]?.positionMaxTop);
|
|
34
34
|
const top = currentElement.specific_y ?? 0;
|
|
35
|
-
const left = (currentElement.specific_x ?? 0) + (currentElement.specific_width ?? 0) / 2; // điểm giữa theo X (điểm vẽ SVG)
|
|
36
35
|
let lineBetweenElements = (currentElement.specific_width ?? 0) + this.checkElementGetMargin(currentElement.nodeOtherConfig);
|
|
37
|
-
if (currentElement.branches
|
|
36
|
+
if (currentElement.branches?.length) {
|
|
38
37
|
lineBetweenElements = (currentElement.specific_width ?? 0) + canvasConfigReadonly().ELEMENT_MARGIN_DEFAULT_BRANCH;
|
|
39
38
|
}
|
|
40
39
|
const maxY = (currentElement.specific_y ?? 0) + (currentElement.specific_height ?? 0) + 200;
|
|
@@ -42,7 +41,7 @@ export class MoLibDiagramHorizontalCalculatorCoordinatesUtil {
|
|
|
42
41
|
const configSvg = config.widthHeightSvgCanvas;
|
|
43
42
|
configSvg.heightSvg = maxY > configSvg.heightSvg ? maxY : configSvg.heightSvg;
|
|
44
43
|
configSvg.widthSvg = maxXRight > configSvg.widthSvg ? maxXRight : configSvg.widthSvg;
|
|
45
|
-
if (!currentElement.branches
|
|
44
|
+
if (!currentElement.branches?.length) {
|
|
46
45
|
// Element không có nhánh: vẽ đường thẳng ngang
|
|
47
46
|
const drawFormToWidthExit = (currentElement.subCodeOfElement || currentElement.code) === canvasConfigReadonly().TYPE_ELEMENT_EXIT ? (currentElement.specific_width ?? 0) / 2 : lineBetweenElements;
|
|
48
47
|
currentElement.attributeSvgD = `M ${currentElement.specific_x ?? 0} ${top + (currentElement.specific_height ?? 0) / 2} l ${drawFormToWidthExit} 0`;
|
|
@@ -98,12 +97,12 @@ export class MoLibDiagramHorizontalCalculatorCoordinatesUtil {
|
|
|
98
97
|
MoLibDiagramHorizontalCalculatorBranchUtil.drawStraightLine(topMid, lineFormElementToBranching, currentElement.specific_x ?? 0, brachMiddle, maxWidthBranch.width, config);
|
|
99
98
|
}
|
|
100
99
|
let hasNextSameParentElementNext = false;
|
|
101
|
-
|
|
102
|
-
|
|
100
|
+
aboveHalf.reverse();
|
|
101
|
+
aboveHalf.forEach((branch, indexBranch) => {
|
|
103
102
|
if (!hasNextSameParentElementNext) {
|
|
104
103
|
const flatElementOnBranch = [];
|
|
105
104
|
buildFlatElement(branch.elements, flatElementOnBranch);
|
|
106
|
-
hasNextSameParentElementNext = !flatElementOnBranch
|
|
105
|
+
hasNextSameParentElementNext = !flatElementOnBranch?.length ? true : !!flatElementOnBranch.find((item) => item.next_id === currentElement.next_id);
|
|
107
106
|
}
|
|
108
107
|
branch.onTheSide = 'above';
|
|
109
108
|
const maxWidthB = { width: 0, aboveWidth: 0, underWidth: 0 };
|
|
@@ -113,7 +112,7 @@ export class MoLibDiagramHorizontalCalculatorCoordinatesUtil {
|
|
|
113
112
|
above: maxWidthB.aboveWidth,
|
|
114
113
|
under: maxWidthB.underWidth,
|
|
115
114
|
};
|
|
116
|
-
const branchPre =
|
|
115
|
+
const branchPre = aboveHalf[indexBranch - 1];
|
|
117
116
|
let lineBetweenBranch = maxWidthB.underWidth + canvasConfigReadonly().ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT / 2;
|
|
118
117
|
if (branchPre) {
|
|
119
118
|
lineBetweenBranch += (branchPre.widthBranch?.width ?? 0) + canvasConfigReadonly().ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT;
|
|
@@ -127,7 +126,7 @@ export class MoLibDiagramHorizontalCalculatorCoordinatesUtil {
|
|
|
127
126
|
if (!hasNextSameParentElementNext) {
|
|
128
127
|
const flatElementOnBranch = [];
|
|
129
128
|
buildFlatElement(branch.elements, flatElementOnBranch);
|
|
130
|
-
hasNextSameParentElementNext = !flatElementOnBranch
|
|
129
|
+
hasNextSameParentElementNext = !flatElementOnBranch?.length ? true : !!flatElementOnBranch.find((item) => item.next_id === currentElement.next_id);
|
|
131
130
|
}
|
|
132
131
|
branch.onTheSide = 'under';
|
|
133
132
|
const maxWidthB = { width: 0, aboveWidth: 0, underWidth: 0 };
|
|
@@ -178,11 +177,11 @@ export class MoLibDiagramHorizontalCalculatorCoordinatesUtil {
|
|
|
178
177
|
}
|
|
179
178
|
/** Tính chiều rộng tối đa của nhánh (trong horizontal = chiều cao thực của nhánh không có element) */
|
|
180
179
|
static calculatorMaxBranchWidth(element, maxWidthBranch) {
|
|
181
|
-
if (!element.branches
|
|
180
|
+
if (!element.branches?.length) {
|
|
182
181
|
return;
|
|
183
182
|
}
|
|
184
183
|
element.branches.forEach((branch) => {
|
|
185
|
-
if (!branch.elements
|
|
184
|
+
if (!branch.elements?.length) {
|
|
186
185
|
const lineBranchNoHasElement = canvasConfigReadonly().ELEMENT_WIDTH_DEFAULT_BRANCH_WHEN_NOT_ELEMENT;
|
|
187
186
|
maxWidthBranch.width = lineBranchNoHasElement > maxWidthBranch.width ? lineBranchNoHasElement : maxWidthBranch.width;
|
|
188
187
|
return;
|
|
@@ -195,9 +194,9 @@ export class MoLibDiagramHorizontalCalculatorCoordinatesUtil {
|
|
|
195
194
|
/** Tính tổng chiều rộng các elements trong nhánh (dọc theo trục X) */
|
|
196
195
|
static plusWidthElementInBranch(elements, total) {
|
|
197
196
|
elements.forEach((element) => {
|
|
198
|
-
const margin = !element.branches
|
|
197
|
+
const margin = !element.branches?.length ? this.checkElementGetMargin(element.nodeOtherConfig) : canvasConfigReadonly().ELEMENT_MARGIN_DEFAULT_BRANCH;
|
|
199
198
|
total.height += (element.specific_width ?? 0) + margin;
|
|
200
|
-
if (!element.branches
|
|
199
|
+
if (!element.branches?.length) {
|
|
201
200
|
return;
|
|
202
201
|
}
|
|
203
202
|
total.height += 64;
|
|
@@ -205,7 +204,7 @@ export class MoLibDiagramHorizontalCalculatorCoordinatesUtil {
|
|
|
205
204
|
element.branches.forEach((branch) => {
|
|
206
205
|
const widthInBranch = { height: 0 };
|
|
207
206
|
widthInBranch.height += canvasConfigReadonly().ELEMENT_MARGIN_DEFAULT_BRANCH_TO_ELEMENT_FIRST + 20;
|
|
208
|
-
if (!branch.elements
|
|
207
|
+
if (!branch.elements?.length) {
|
|
209
208
|
widthInBranch.height += canvasConfigReadonly().ELEMENT_WIDTH_DEFAULT_BRANCH_WHEN_NOT_ELEMENT;
|
|
210
209
|
if (theMostElementsInBranch.height < widthInBranch.height) {
|
|
211
210
|
theMostElementsInBranch.height = widthInBranch.height;
|
|
@@ -225,7 +224,7 @@ export class MoLibDiagramHorizontalCalculatorCoordinatesUtil {
|
|
|
225
224
|
* Trong horizontal context: mỗi nhánh trải dài theo Y (lên/xuống).
|
|
226
225
|
*/
|
|
227
226
|
static calculatorHeightBranch(elements, maxWidth) {
|
|
228
|
-
if (!elements
|
|
227
|
+
if (!elements?.length) {
|
|
229
228
|
const w = canvasConfigReadonly().DEFAULT_BRANCH_WHEN_NO_ELEMENT;
|
|
230
229
|
maxWidth.width = w;
|
|
231
230
|
maxWidth.aboveWidth = w / 2;
|
|
@@ -234,7 +233,7 @@ export class MoLibDiagramHorizontalCalculatorCoordinatesUtil {
|
|
|
234
233
|
}
|
|
235
234
|
const maxWidthInElements = { width: 0, aboveWidth: 0, underWidth: 0 };
|
|
236
235
|
elements.forEach((element) => {
|
|
237
|
-
if (!element.branches
|
|
236
|
+
if (!element.branches?.length) {
|
|
238
237
|
// element không nhánh: dùng specific_height làm Y span
|
|
239
238
|
if ((element.specific_height ?? 0) < maxWidthInElements.width) {
|
|
240
239
|
return;
|
|
@@ -312,4 +311,4 @@ export class MoLibDiagramHorizontalCalculatorCoordinatesUtil {
|
|
|
312
311
|
return canvasConfigReadonly().ELEMENT_WAIT_DEFAULT + canvasConfigReadonly().DISTANCE_WAIT_TO_NEXT_LINE;
|
|
313
312
|
}
|
|
314
313
|
}
|
|
315
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsY3VsYXRvci1jb29yZGluYXRlcy51dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9zZXJ2aWNlcy9kaWFncmFtLWRyYXcvc3JjL3V0aWxzL2hvcml6b250YWwvY2FsY3VsYXRvci1jb29yZGluYXRlcy51dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRWxFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUV6RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsMENBQTBDLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUV0Rjs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sT0FBTywrQ0FBK0M7SUFDMUQsTUFBTSxDQUFDLGFBQWEsQ0FBQyxRQUFnQyxFQUFFLE1BQTZCLEVBQUUsU0FBa0I7UUFDdEcsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNsQyxPQUFPO1FBQ1QsQ0FBQztRQUVELFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxjQUFjLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDekMsY0FBYyxDQUFDLFVBQVUsR0FBRyxDQUFDLGNBQWMsQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDaEYsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztZQUV2QyxJQUFJLFVBQVUsRUFBRSxDQUFDO2dCQUNmLDZFQUE2RTtnQkFDN0UsY0FBYyxDQUFDLFVBQVUsR0FBRyxDQUFDLFVBQVUsQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsZUFBZSxJQUFJLENB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QVUsSUFBSSxrQkFBa0IsQ0FBQyxVQUFVLENBQUM7SUFDdkQsQ0FBQztJQUVELHlFQUF5RTtJQUNqRSxNQUFNLENBQUMscUJBQXFCLENBQUMsYUFBK0I7UUFDbEUsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNsQixPQUFPLG9CQUFvQixFQUFFLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxHQUFHLG9CQUFvQixFQUFFLENBQUMsZUFBZSxDQUFDO1FBQ25JLENBQUM7UUFDRCxPQUFPLG9CQUFvQixFQUFFLENBQUMsc0JBQXNCLENBQUM7SUFDdkQsQ0FBQztJQUVELDJDQUEyQztJQUNuQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsYUFBK0I7UUFDL0QsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNsQixPQUFPLENBQUMsYUFBYSxDQUFDLGNBQWMsSUFBSSxvQkFBb0IsRUFBRSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsb0JBQW9CLEVBQUUsQ0FBQywwQkFBMEIsQ0FBQztRQUMzSSxDQUFDO1FBQ0QsT0FBTyxvQkFBb0IsRUFBRSxDQUFDLG9CQUFvQixHQUFHLG9CQUFvQixFQUFFLENBQUMsMEJBQTBCLENBQUM7SUFDekcsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY2FudmFzQ29uZmlnUmVhZG9ubHkgfSBmcm9tICcuLi8uLi9kaWFncmFtLWRyYXcuc2VydmljZSc7XG5pbXBvcnQgeyBJRGF0YURpYWdyYW1Db25maWdTdmcgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2Nvb3JkaW5hdGVzLmludGVyZmFjZSc7XG5pbXBvcnQgeyBjaGVja01heFRvcCB9IGZyb20gJy4uL2NhbGN1bGF0b3ItZWxlbWVudC51dGlsJztcbmltcG9ydCB7IElEaWFncmFtRWxlbWVudCwgSURpYWdyYW1FbGVtZW50QnJhbmNoIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9kaWFncmFtLmludGVyZmFjZSc7XG5pbXBvcnQgeyBidWlsZEZsYXRFbGVtZW50IH0gZnJvbSAnLi4vZGlhZ3JhbS51dGlsJztcbmltcG9ydCB7IE1vTGliRGlhZ3JhbUhvcml6b250YWxDYWxjdWxhdG9yQnJhbmNoVXRpbCB9IGZyb20gJy4vY2FsY3VsYXRvci1icmFuY2gudXRpbCc7XG5cbi8qKlxuICogSG9yaXpvbnRhbCBsYXlvdXQgY2FsY3VsYXRvci5cbiAqIE1pcnJvcnMgTW9MaWJEaWFncmFtQ2FsY3VsYXRvckNvb3JkaW5hdGVzVXRpbCAodmVydGljYWwpIGJ1dCByb3RhdGVkIDkwwrA6XG4gKiAgLSBFbGVtZW50cyBncm93IExFRlQg4oaSIFJJR0hUICAoc3BlY2lmaWNfeCBhZHZhbmNlcyBhbG9uZyBtYWluIGF4aXMpXG4gKiAgLSBCcmFuY2hlcyBzcGxpdCBVUCAvIERPV04gICAgKHNwZWNpZmljX3kgZm9yIGJyYW5jaCBvZmZzZXQpXG4gKiAgLSBcImFib3ZlXCIgYnJhbmNoID0gdXBwZXIgc2lkZSAoeSBkZWNyZWFzZXMpXG4gKiAgLSBcInVuZGVyXCIgYnJhbmNoID0gbG93ZXIgc2lkZSAoeSBpbmNyZWFzZXMpXG4gKlxuICogS2V5IGF4aXMgbWFwcGluZyB2cy4gdmVydGljYWw6XG4gKiAgIHZlcnRpY2FsOiBzcGVjaWZpY195IOKGlSAgc3BlY2lmaWNfeCBjZW50ZXJlZFxuICogICBob3Jpem9udGFsOiBzcGVjaWZpY194IOKGkiBzcGVjaWZpY195IGNlbnRlcmVkXG4gKi9cbmV4cG9ydCBjbGFzcyBNb0xpYkRpYWdyYW1Ib3Jpem9udGFsQ2FsY3VsYXRvckNvb3JkaW5hdGVzVXRpbCB7XG4gIHN0YXRpYyBzZXRYWUVsZW1lbnRzKGVsZW1lbnRzOiBBcnJheTxJRGlhZ3JhbUVsZW1lbnQ+LCBjb25maWc6IElEYXRhRGlhZ3JhbUNvbmZpZ1N2ZywgcG9zaXRpb25ZPzogbnVtYmVyKSB7XG4gICAgaWYgKCFlbGVtZW50cyB8fCAhZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZWxlbWVudHMuZm9yRWFjaCgoY3VycmVudEVsZW1lbnQsIGluZGV4KSA9PiB7XG4gICAgICBjdXJyZW50RWxlbWVudC5zcGVjaWZpY195ID0gKGN1cnJlbnRFbGVtZW50LnNwZWNpZmljX3kgPz8gMCkgKyAocG9zaXRpb25ZID8/IDApO1xuICAgICAgY29uc3QgcHJlRWxlbWVudCA9IGVsZW1lbnRzW2luZGV4IC0gMV07XG5cbiAgICAgIGlmIChwcmVFbGVtZW50KSB7XG4gICAgICAgIC8vIFRyb25nIGhvcml6b250YWw6IHkgKGNoaeG7gXUgY2FvKSBjxINuIGdp4buvYSB0aGVvIHByZUVsZW1lbnQsIHggdGnhur9uIHNhbmcgcGjhuqNpXG4gICAgICAgIGN1cnJlbnRFbGVtZW50LnNwZWNpZmljX3kgPSAocHJlRWxlbWVudC5zcGVjaWZpY195ID8/IDApICsgKHByZUVsZW1lbnQuc3BlY2lmaWNfaGVpZ2h0ID8/IDApIC8gMiAtIChjdXJyZW50RWxlbWVudC5zcGVjaWZpY19oZWlnaHQgPz8gMCkgLyAyO1xuICAgICAgICBjdXJyZW50RWxlbWVudC5zcGVjaWZpY194ID0gKHByZUVsZW1lbnQuc3BlY2lmaWNfeCA/PyAwKSArIChwcmVFbGVtZW50LnNwZWNpZmljX3dpZHRoID8/IDApICsgdGhpcy5jaGVja0VsZW1lbnRHZXRNYXJnaW4ocHJlRWxlbWVudC5ub2RlT3RoZXJDb25maWcpO1xuXG4gICAgICAgIGlmIChwcmVFbGVtZW50LnBvc2l0aW9uX2VuZF9icmFuY2gpIHtcbiAgICAgICAgICBjdXJyZW50RWxlbWVudC5zcGVjaWZpY194ID0gcHJlRWxlbWVudC5wb3NpdGlvbl9lbmRfYnJhbmNoO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNoZWNrTWF4VG9wKGNvbmZpZywgY3VycmVudEVsZW1lbnQuc3BlY2lmaWNfeSwgY3VycmVudEVsZW1lbnQuYnJhbmNoZXM/LlswXT8ucG9zaXRpb25NYXhUb3ApO1xuXG4gICAgICBjb25zdCB0b3AgPSBjdXJyZW50RWxlbWVudC5zcGVjaWZpY195ID8/IDA7XG4gICAgICBjb25zdCBsZWZ0ID0gKGN1cnJlbnRFbGVtZW50LnNwZWNpZmljX3ggPz8gMCkgKyAoY3VycmVudEVsZW1lbnQuc3BlY2lmaWNfd2lkdGggPz8gMCkgLyAyOyAvLyDEkWnhu4NtIGdp4buvYSB0aGVvIFggKMSRaeG7g20gduG6vSBTVkcpXG4gICAgICBsZXQgbGluZUJldHdlZW5FbGVtZW50cyA9IChjdXJyZW50RWxlbWVudC5zcGVjaWZpY193aWR0aCA/PyAwKSArIHRoaXMuY2hlY2tFbGVtZW50R2V0TWFyZ2luKGN1cnJlbnRFbGVtZW50Lm5vZGVPdGhlckNvbmZpZyk7XG5cbiAgICAgIGlmIChjdXJyZW50RWxlbWVudC5icmFuY2hlcyAmJiBjdXJyZW50RWxlbWVudC5icmFuY2hlcy5sZW5ndGgpIHtcbiAgICAgICAgbGluZUJldHdlZW5FbGVtZW50cyA9IChjdXJyZW50RWxlbWVudC5zcGVjaWZpY193aWR0aCA/PyAwKSArIGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuRUxFTUVOVF9NQVJHSU5fREVGQVVMVF9CUkFOQ0g7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1heFkgPSAoY3VycmVudEVsZW1lbnQuc3BlY2lmaWNfeSA/PyAwKSArIChjdXJyZW50RWxlbWVudC5zcGVjaWZpY19oZWlnaHQgPz8gMCkgKyAyMDA7XG4gICAgICBjb25zdCBtYXhYUmlnaHQgPSAoY3VycmVudEVsZW1lbnQuc3BlY2lmaWNfeCA/PyAwKSArIChjdXJyZW50RWxlbWVudC5zcGVjaWZpY193aWR0aCA/PyAwKSArIDIwMDtcbiAgICAgIGNvbnN0IGNvbmZpZ1N2ZyA9IGNvbmZpZy53aWR0aEhlaWdodFN2Z0NhbnZhcztcblxuICAgICAgY29uZmlnU3ZnLmhlaWdodFN2ZyA9IG1heFkgPiBjb25maWdTdmcuaGVpZ2h0U3ZnID8gbWF4WSA6IGNvbmZpZ1N2Zy5oZWlnaHRTdmc7XG4gICAgICBjb25maWdTdmcud2lkdGhTdmcgPSBtYXhYUmlnaHQgPiBjb25maWdTdmcud2lkdGhTdmcgPyBtYXhYUmlnaHQgOiBjb25maWdTdmcud2lkdGhTdmc7XG5cbiAgICAgIGlmICghY3VycmVudEVsZW1lbnQuYnJhbmNoZXMgfHwgIWN1cnJlbnRFbGVtZW50LmJyYW5jaGVzLmxlbmd0aCkge1xuICAgICAgICAvLyBFbGVtZW50IGtow7RuZyBjw7MgbmjDoW5oOiB24bq9IMSRxrDhu51uZyB0aOG6s25nIG5nYW5nXG4gICAgICAgIGNvbnN0IGRyYXdGb3JtVG9XaWR0aEV4aXQgPSAoY3VycmVudEVsZW1lbnQuc3ViQ29kZU9mRWxlbWVudCB8fCBjdXJyZW50RWxlbWVudC5jb2RlKSA9PT0gY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5UWVBFX0VMRU1FTlRfRVhJVCA/IChjdXJyZW50RWxlbWVudC5zcGVjaWZpY193aWR0aCA/PyAwKSAvIDIgOiBsaW5lQmV0d2VlbkVsZW1lbnRzO1xuXG4gICAgICAgIGN1cnJlbnRFbGVtZW50LmF0dHJpYnV0ZVN2Z0QgPSBgTSAke2N1cnJlbnRFbGVtZW50LnNwZWNpZmljX3ggPz8gMH0gJHt0b3AgKyAoY3VycmVudEVsZW1lbnQuc3BlY2lmaWNfaGVpZ2h0ID8/IDApIC8gMn0gbCAke2RyYXdGb3JtVG9XaWR0aEV4aXR9IDBgO1xuICAgICAgICBjdXJyZW50RWxlbWVudC5wb3NpdGlvbl9lbmQgPSAoY3VycmVudEVsZW1lbnQuc3BlY2lmaWNfeCA/PyAwKSArIGxpbmVCZXR3ZWVuRWxlbWVudHM7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50Lm5vZGVPdGhlckNvbmZpZykge1xuICAgICAgICAgIGNvbnN0IHdhaXRXaWR0aCA9IHRoaXMuZ2V0V2lkdGhXYWl0Q29uZmlnKGN1cnJlbnRFbGVtZW50Lm5vZGVPdGhlckNvbmZpZyk7XG4gICAgICAgICAgY29uc3QgZGlzdGFuY2VFbGVtZW50VG9XYWl0ID0gKGN1cnJlbnRFbGVtZW50LnNwZWNpZmljX3dpZHRoID8/IDApICsgY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5ESVNUQU5DRV9UT19XQUlUO1xuICAgICAgICAgIGNvbnN0IGxlZnRTdGFydExpbmUyID0gKGN1cnJlbnRFbGVtZW50LnNwZWNpZmljX3ggPz8gMCkgKyBkaXN0YW5jZUVsZW1lbnRUb1dhaXQgKyB3YWl0V2lkdGg7XG5cbiAgICAgICAgICBjdXJyZW50RWxlbWVudC5hdHRyaWJ1dGVTdmdEID0gYE0gJHtjdXJyZW50RWxlbWVudC5zcGVjaWZpY194ID8/IDB9ICR7dG9wICsgKGN1cnJlbnRFbGVtZW50LnNwZWNpZmljX2hlaWdodCA/PyAwKSAvIDJ9IGwgJHtkaXN0YW5jZUVsZW1lbnRUb1dhaXR9IDBgO1xuICAgICAgICAgIGN1cnJlbnRFbGVtZW50LnBvc2l0aW9uX2VuZCA9IGxlZnRTdGFydExpbmUyICsgbGluZUJldHdlZW5FbGVtZW50cztcblxuICAgICAgICAgIGN1cnJlbnRFbGVtZW50Lm5vZGVPdGhlckNvbmZpZy5zcGVjaWZpY194ID0gKGN1cnJlbnRFbGVtZW50LnNwZWNpZmljX3ggPz8gMCkgKyBkaXN0YW5jZUVsZW1lbnRUb1dhaXQ7XG4gICAgICAgICAgLy8gc3BlY2lmaWNfeSA9IHTDom0gWSBj4bunYSDEkcaw4budbmcgbGluZSDigJQgc2V0VHJhbnNsYXRlUG9zaXRpb25zIHPhur0gdHLhu6sgaGVpZ2h0LzIgxJHhu4MgY8SDbiBnaeG7r2EgZOG7jWNcbiAgICAgICAgICBjdXJyZW50RWxlbWVudC5ub2RlT3RoZXJDb25maWcuc3BlY2lmaWNfeSA9IHRvcCArIChjdXJyZW50RWxlbWVudC5zcGVjaWZpY19oZWlnaHQgPz8gMCkgLyAyO1xuICAgICAgICAgIC8vIMSQ4bqjbSBi4bqjbyBjw7Mga8OtY2ggdGjGsOG7m2MgxJHhu4Mgc2V0VHJhbnNsYXRlUG9zaXRpb25zIHTDrW5oIG9mZnNldCDEkcO6bmdcbiAgICAgICAgICBpZiAoIWN1cnJlbnRFbGVtZW50Lm5vZGVPdGhlckNvbmZpZy5zcGVjaWZpY19oZWlnaHQpIHtcbiAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50Lm5vZGVPdGhlckNvbmZpZy5zcGVjaWZpY19oZWlnaHQgPSBjYW52YXNDb25maWdSZWFkb25seSgpLkVMRU1FTlRfV0FJVF9ERUZBVUxUO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWN1cnJlbnRFbGVtZW50Lm5vZGVPdGhlckNvbmZpZy5zcGVjaWZpY193aWR0aCkge1xuICAgICAgICAgICAgY3VycmVudEVsZW1lbnQubm9kZU90aGVyQ29uZmlnLnNwZWNpZmljX3dpZHRoID0gY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5FTEVNRU5UX1dBSVRfREVGQVVMVDtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVsZXRlIGN1cnJlbnRFbGVtZW50Lm5vZGVPdGhlckNvbmZpZy5hdHRyaWJ1dGVTdmdEO1xuXG4gICAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50LnN1YkNvZGVPZkVsZW1lbnQgIT09IGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuVFlQRV9FTEVNRU5UX0VYSVQpIHtcbiAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50Lm5vZGVPdGhlckNvbmZpZy5hdHRyaWJ1dGVTdmdEID0gYE0gJHtsZWZ0U3RhcnRMaW5lMn0gJHt0b3AgKyAoY3VycmVudEVsZW1lbnQuc3BlY2lmaWNfaGVpZ2h0ID8/IDApIC8gMn0gbCAke2NhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuV0FJVF9UT19FTEVNRU5UfSAwYDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEVsZW1lbnRzIGPDsyBuaMOhbmhcbiAgICAgIGNvbnN0IGhhbGYgPSBNYXRoLmNlaWwoY3VycmVudEVsZW1lbnQuYnJhbmNoZXMubGVuZ3RoIC8gMik7XG4gICAgICBjb25zdCBhYm92ZUhhbGYgPSBjdXJyZW50RWxlbWVudC5icmFuY2hlcy5zbGljZSgwLCBoYWxmKTtcbiAgICAgIGNvbnN0IHVuZGVySGFsZiA9IGN1cnJlbnRFbGVtZW50LmJyYW5jaGVzLnNsaWNlKGhhbGYpO1xuICAgICAgbGV0IGJyYWNoTWlkZGxlOiBJRGlhZ3JhbUVsZW1lbnRCcmFuY2ggfCB1bmRlZmluZWQ7XG5cbiAgICAgIGlmIChhYm92ZUhhbGYubGVuZ3RoICE9PSB1bmRlckhhbGYubGVuZ3RoKSB7XG4gICAgICAgIGJyYWNoTWlkZGxlID0gYWJvdmVIYWxmLnBvcCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBUw41OSCBDSEnhu4BVIENBTyBU4buQSSDEkEEgQ+G7pkEgTkjDgU5IICjEkcOieSBsw6AgY2hp4buBdSBy4buZbmcgdHJvbmcgaG9yaXpvbnRhbCBjb250ZXh0IG5oxrBuZ1xuICAgICAgLy8gZMO5bmcgY2h1bmcgbWF4SGVpZ2h0QnJhbmNoIMSR4buDIMSRxqFuIGdp4bqjbiwgw70gbmdoxKlhIGzDoCBcImtob+G6o25nIHRy4buRbmcgdOG7kWkgdGhp4buDdSBkw6BuaCBjaG8gbmjDoW5oIGtow7RuZyBjw7MgZWxlbWVudFwiKVxuICAgICAgY29uc3QgbWF4V2lkdGhCcmFuY2ggPSB7IHdpZHRoOiAwIH07XG5cbiAgICAgIHRoaXMuY2FsY3VsYXRvck1heEJyYW5jaFdpZHRoKGN1cnJlbnRFbGVtZW50LCBtYXhXaWR0aEJyYW5jaCk7XG4gICAgICBjdXJyZW50RWxlbWVudC5tYXhIZWlnaHRCcmFuY2ggPSBtYXhXaWR0aEJyYW5jaC53aWR0aDtcblxuICAgICAgY29uc3QgbWF4V2lkdGhCcmFjaE1pZGRsZSA9IHsgd2lkdGg6IDAsIGFib3ZlV2lkdGg6IDAsIHVuZGVyV2lkdGg6IDAgfTtcbiAgICAgIGNvbnN0IGxpbmVGb3JtRWxlbWVudFRvQnJhbmNoaW5nID0gKGN1cnJlbnRFbGVtZW50LnNwZWNpZmljX3dpZHRoID8/IDApICsgY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5FTEVNRU5UX01BUkdJTl9ERUZBVUxUX0JSQU5DSDtcblxuICAgICAgLy8gdG9wID0geSArIGhlaWdodC8yOiDEkWnhu4NtIGdp4buvYSB0aGVvIGNoaeG7gXUgWSDihpIgZMO5bmcgbMOgbSB04buNYSDEkeG7mSBZIGPhu6dhIMSRxrDhu51uZyBuZ2FuZyBjaMOtbmhcbiAgICAgIGNvbnN0IHRvcE1pZCA9IHRvcCArIChjdXJyZW50RWxlbWVudC5zcGVjaWZpY19oZWlnaHQgPz8gMCkgLyAyO1xuXG4gICAgICBpZiAoYnJhY2hNaWRkbGUpIHtcbiAgICAgICAgYnJhY2hNaWRkbGUub25UaGVTaWRlID0gJ2NlbnRlcic7XG4gICAgICAgIHRoaXMuY2FsY3VsYXRvckhlaWdodEJyYW5jaChicmFjaE1pZGRsZS5lbGVtZW50cywgbWF4V2lkdGhCcmFjaE1pZGRsZSk7XG4gICAgICAgIGJyYWNoTWlkZGxlLndpZHRoQnJhbmNoID0ge1xuICAgICAgICAgIHdpZHRoOiBtYXhXaWR0aEJyYWNoTWlkZGxlLndpZHRoLFxuICAgICAgICAgIGFib3ZlOiBtYXhXaWR0aEJyYWNoTWlkZGxlLmFib3ZlV2lkdGgsXG4gICAgICAgICAgdW5kZXI6IG1heFdpZHRoQnJhY2hNaWRkbGUudW5kZXJXaWR0aCxcbiAgICAgICAgfTtcbiAgICAgICAgTW9MaWJEaWFncmFtSG9yaXpvbnRhbENhbGN1bGF0b3JCcmFuY2hVdGlsLmRyYXdTdHJhaWdodExpbmUodG9wTWlkLCBsaW5lRm9ybUVsZW1lbnRUb0JyYW5jaGluZywgY3VycmVudEVsZW1lbnQuc3BlY2lmaWNfeCA/PyAwLCBicmFjaE1pZGRsZSwgbWF4V2lkdGhCcmFuY2gud2lkdGgsIGNvbmZpZyk7XG4gICAgICB9XG5cbiAgICAgIGxldCBoYXNOZXh0U2FtZVBhcmVudEVsZW1lbnROZXh0ID0gZmFsc2U7XG4gICAgICBjb25zdCBhYm92ZUhhbGZSZXZlcnNlID0gYWJvdmVIYWxmLnJldmVyc2UoKTtcblxuICAgICAgYWJvdmVIYWxmUmV2ZXJzZS5mb3JFYWNoKChicmFuY2gsIGluZGV4QnJhbmNoKSA9PiB7XG4gICAgICAgIGlmICghaGFzTmV4dFNhbWVQYXJlbnRFbGVtZW50TmV4dCkge1xuICAgICAgICAgIGNvbnN0IGZsYXRFbGVtZW50T25CcmFuY2g6IElEaWFncmFtRWxlbWVudFtdID0gW107XG5cbiAgICAgICAgICBidWlsZEZsYXRFbGVtZW50KGJyYW5jaC5lbGVtZW50cywgZmxhdEVsZW1lbnRPbkJyYW5jaCk7XG4gICAgICAgICAgaGFzTmV4dFNhbWVQYXJlbnRFbGVtZW50TmV4dCA9ICFmbGF0RWxlbWVudE9uQnJhbmNoIHx8ICFmbGF0RWxlbWVudE9uQnJhbmNoLmxlbmd0aCA/IHRydWUgOiBmbGF0RWxlbWVudE9uQnJhbmNoLmZpbmQoKGl0ZW0pID0+IGl0ZW0ubmV4dF9pZCA9PT0gY3VycmVudEVsZW1lbnQubmV4dF9pZCkgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBicmFuY2gub25UaGVTaWRlID0gJ2Fib3ZlJztcbiAgICAgICAgY29uc3QgbWF4V2lkdGhCID0geyB3aWR0aDogMCwgYWJvdmVXaWR0aDogMCwgdW5kZXJXaWR0aDogMCB9O1xuXG4gICAgICAgIHRoaXMuY2FsY3VsYXRvckhlaWdodEJyYW5jaChicmFuY2guZWxlbWVudHMsIG1heFdpZHRoQik7XG4gICAgICAgIGJyYW5jaC53aWR0aEJyYW5jaCA9IHtcbiAgICAgICAgICB3aWR0aDogbWF4V2lkdGhCLndpZHRoLFxuICAgICAgICAgIGFib3ZlOiBtYXhXaWR0aEIuYWJvdmVXaWR0aCxcbiAgICAgICAgICB1bmRlcjogbWF4V2lkdGhCLnVuZGVyV2lkdGgsXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgYnJhbmNoUHJlID0gYWJvdmVIYWxmUmV2ZXJzZVtpbmRleEJyYW5jaCAtIDFdO1xuICAgICAgICBsZXQgbGluZUJldHdlZW5CcmFuY2ggPSBtYXhXaWR0aEIudW5kZXJXaWR0aCArIGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuRUxFTUVOVF9NQVJHSU5fQkVUV0VFTl9CUkFOQ0hfREVGQVVMVCAvIDI7XG5cbiAgICAgICAgaWYgKGJyYW5jaFByZSkge1xuICAgICAgICAgIGxpbmVCZXR3ZWVuQnJhbmNoICs9IChicmFuY2hQcmUud2lkdGhCcmFuY2g/LndpZHRoID8/IDApICsgY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5FTEVNRU5UX01BUkdJTl9CRVRXRUVOX0JSQU5DSF9ERUZBVUxUO1xuICAgICAgICB9XG4gICAgICAgIGlmIChicmFjaE1pZGRsZSkge1xuICAgICAgICAgIGxpbmVCZXR3ZWVuQnJhbmNoICs9IChicmFjaE1pZGRsZS53aWR0aEJyYW5jaD8uYWJvdmUgPz8gMCkgKyBjYW52YXNDb25maWdSZWFkb25seSgpLkVMRU1FTlRfTUFSR0lOX0JFVFdFRU5fQlJBTkNIX0RFRkFVTFQgLyAyO1xuICAgICAgICB9XG5cbiAgICAgICAgTW9MaWJEaWFncmFtSG9yaXpvbnRhbENhbGN1bGF0b3JCcmFuY2hVdGlsLmFib3ZlTGluZSh0b3BNaWQsIGxpbmVGb3JtRWxlbWVudFRvQnJhbmNoaW5nLCBjdXJyZW50RWxlbWVudC5zcGVjaWZpY194ID8/IDAsIGxpbmVCZXR3ZWVuQnJhbmNoLCBicmFuY2gsIG1heFdpZHRoQnJhbmNoLndpZHRoLCBjdXJyZW50RWxlbWVudCwgY29uZmlnKTtcbiAgICAgIH0pO1xuXG4gICAgICB1bmRlckhhbGYuZm9yRWFjaCgoYnJhbmNoLCBpbmRleEJyYW5jaCkgPT4ge1xuICAgICAgICBpZiAoIWhhc05leHRTYW1lUGFyZW50RWxlbWVudE5leHQpIHtcbiAgICAgICAgICBjb25zdCBmbGF0RWxlbWVudE9uQnJhbmNoOiBJRGlhZ3JhbUVsZW1lbnRbXSA9IFtdO1xuXG4gICAgICAgICAgYnVpbGRGbGF0RWxlbWVudChicmFuY2guZWxlbWVudHMsIGZsYXRFbGVtZW50T25CcmFuY2gpO1xuICAgICAgICAgIGhhc05leHRTYW1lUGFyZW50RWxlbWVudE5leHQgPSAhZmxhdEVsZW1lbnRPbkJyYW5jaCB8fCAhZmxhdEVsZW1lbnRPbkJyYW5jaC5sZW5ndGggPyB0cnVlIDogZmxhdEVsZW1lbnRPbkJyYW5jaC5maW5kKChpdGVtKSA9PiBpdGVtLm5leHRfaWQgPT09IGN1cnJlbnRFbGVtZW50Lm5leHRfaWQpID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGJyYW5jaC5vblRoZVNpZGUgPSAndW5kZXInO1xuICAgICAgICBjb25zdCBtYXhXaWR0aEIgPSB7IHdpZHRoOiAwLCBhYm92ZVdpZHRoOiAwLCB1bmRlcldpZHRoOiAwIH07XG5cbiAgICAgICAgdGhpcy5jYWxjdWxhdG9ySGVpZ2h0QnJhbmNoKGJyYW5jaC5lbGVtZW50cywgbWF4V2lkdGhCKTtcbiAgICAgICAgYnJhbmNoLndpZHRoQnJhbmNoID0ge1xuICAgICAgICAgIHdpZHRoOiBtYXhXaWR0aEIud2lkdGgsXG4gICAgICAgICAgYWJvdmU6IG1heFdpZHRoQi5hYm92ZVdpZHRoLFxuICAgICAgICAgIHVuZGVyOiBtYXhXaWR0aEIudW5kZXJXaWR0aCxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBicmFuY2hQcmUgPSB1bmRlckhhbGZbaW5kZXhCcmFuY2ggLSAxXTtcbiAgICAgICAgbGV0IGxpbmVCZXR3ZWVuQnJhbmNoID0gbWF4V2lkdGhCLmFib3ZlV2lkdGggKyBjYW52YXNDb25maWdSZWFkb25seSgpLkVMRU1FTlRfTUFSR0lOX0JFVFdFRU5fQlJBTkNIX0RFRkFVTFQgLyAyO1xuXG4gICAgICAgIGlmIChicmFuY2hQcmUpIHtcbiAgICAgICAgICBsaW5lQmV0d2VlbkJyYW5jaCArPSAoYnJhbmNoUHJlLndpZHRoQnJhbmNoPy53aWR0aCA/PyAwKSArIGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuRUxFTUVOVF9NQVJHSU5fQkVUV0VFTl9CUkFOQ0hfREVGQVVMVDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYnJhY2hNaWRkbGUpIHtcbiAgICAgICAgICBsaW5lQmV0d2VlbkJyYW5jaCArPSAoYnJhY2hNaWRkbGUud2lkdGhCcmFuY2g/LnVuZGVyID8/IDApICsgY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5FTEVNRU5UX01BUkdJTl9CRVRXRUVOX0JSQU5DSF9ERUZBVUxUIC8gMjtcbiAgICAgICAgfVxuXG4gICAgICAgIE1vTGliRGlhZ3JhbUhvcml6b250YWxDYWxjdWxhdG9yQnJhbmNoVXRpbC51bmRlckxpbmUodG9wTWlkLCBsaW5lRm9ybUVsZW1lbnRUb0JyYW5jaGluZywgY3VycmVudEVsZW1lbnQuc3BlY2lmaWNfeCA/PyAwLCBsaW5lQmV0d2VlbkJyYW5jaCwgYnJhbmNoLCBtYXhXaWR0aEJyYW5jaC53aWR0aCwgY3VycmVudEVsZW1lbnQsIGNvbmZpZyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRoaXMuc2V0VHJhbnNsYXRlUG9zaXRpb25zKGVsZW1lbnRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdHJhbnNsYXRlWC9ZIGNobyB04bqldCBj4bqjIGVsZW1lbnRzIChiYW8gZ+G7k20gYnJhbmNoZXMgdsOgIG5vZGVPdGhlckNvbmZpZylcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHNldFRyYW5zbGF0ZVBvc2l0aW9ucyhlbGVtZW50czogQXJyYXk8SURpYWdyYW1FbGVtZW50Pikge1xuICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgIGVsZW1lbnQudHJhbnNsYXRlWCA9IGVsZW1lbnQuc3BlY2lmaWNfeDtcbiAgICAgIGVsZW1lbnQudHJhbnNsYXRlWSA9IGVsZW1lbnQuc3BlY2lmaWNfeTtcblxuICAgICAgaWYgKGVsZW1lbnQubm9kZU90aGVyQ29uZmlnKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldFkgPSAoZWxlbWVudC5ub2RlT3RoZXJDb25maWcuc3BlY2lmaWNfaGVpZ2h0ID8/IDApIC8gMjtcblxuICAgICAgICBlbGVtZW50Lm5vZGVPdGhlckNvbmZpZy50cmFuc2xhdGVYID0gZWxlbWVudC5ub2RlT3RoZXJDb25maWcuc3BlY2lmaWNfeDtcbiAgICAgICAgZWxlbWVudC5ub2RlT3RoZXJDb25maWcudHJhbnNsYXRlWSA9IChlbGVtZW50Lm5vZGVPdGhlckNvbmZpZy5zcGVjaWZpY195ID8/IDApIC0gb2Zmc2V0WTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVsZW1lbnQuYnJhbmNoZXMgJiYgZWxlbWVudC5icmFuY2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGVsZW1lbnQuYnJhbmNoZXMuZm9yRWFjaCgoYnJhbmNoKSA9PiB7XG4gICAgICAgICAgaWYgKGJyYW5jaC5ub2RlT3RoZXJDb25maWcpIHtcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldFkgPSAoYnJhbmNoLm5vZGVPdGhlckNvbmZpZy5zcGVjaWZpY19oZWlnaHQgPz8gMCkgLyAyO1xuXG4gICAgICAgICAgICBicmFuY2gubm9kZU90aGVyQ29uZmlnLnRyYW5zbGF0ZVggPSBicmFuY2gubm9kZU90aGVyQ29uZmlnLnNwZWNpZmljX3g7XG4gICAgICAgICAgICBicmFuY2gubm9kZU90aGVyQ29uZmlnLnRyYW5zbGF0ZVkgPSAoYnJhbmNoLm5vZGVPdGhlckNvbmZpZy5zcGVjaWZpY195ID8/IDApIC0gb2Zmc2V0WTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoYnJhbmNoLmVsZW1lbnRzICYmIGJyYW5jaC5lbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnNldFRyYW5zbGF0ZVBvc2l0aW9ucyhicmFuY2guZWxlbWVudHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKiogVMOtbmggY2hp4buBdSBy4buZbmcgdOG7kWkgxJFhIGPhu6dhIG5ow6FuaCAodHJvbmcgaG9yaXpvbnRhbCA9IGNoaeG7gXUgY2FvIHRo4buxYyBj4bunYSBuaMOhbmgga2jDtG5nIGPDsyBlbGVtZW50KSAqL1xuICBzdGF0aWMgY2FsY3VsYXRvck1heEJyYW5jaFdpZHRoKGVsZW1lbnQ6IElEaWFncmFtRWxlbWVudCwgbWF4V2lkdGhCcmFuY2g6IHsgd2lkdGg6IG51bWJlciB9KSB7XG4gICAgaWYgKCFlbGVtZW50LmJyYW5jaGVzIHx8ICFlbGVtZW50LmJyYW5jaGVzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGVsZW1lbnQuYnJhbmNoZXMuZm9yRWFjaCgoYnJhbmNoKSA9PiB7XG4gICAgICBpZiAoIWJyYW5jaC5lbGVtZW50cyB8fCAhYnJhbmNoLmVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBsaW5lQnJhbmNoTm9IYXNFbGVtZW50ID0gY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5FTEVNRU5UX1dJRFRIX0RFRkFVTFRfQlJBTkNIX1dIRU5fTk9UX0VMRU1FTlQ7XG5cbiAgICAgICAgbWF4V2lkdGhCcmFuY2gud2lkdGggPSBsaW5lQnJhbmNoTm9IYXNFbGVtZW50ID4gbWF4V2lkdGhCcmFuY2gud2lkdGggPyBsaW5lQnJhbmNoTm9IYXNFbGVtZW50IDogbWF4V2lkdGhCcmFuY2gud2lkdGg7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0b3RhbCA9IHsgaGVpZ2h0OiAwIH07XG5cbiAgICAgIHRoaXMucGx1c1dpZHRoRWxlbWVudEluQnJhbmNoKGJyYW5jaC5lbGVtZW50cywgdG90YWwpO1xuICAgICAgbWF4V2lkdGhCcmFuY2gud2lkdGggPSB0b3RhbC5oZWlnaHQgPiBtYXhXaWR0aEJyYW5jaC53aWR0aCA/IHRvdGFsLmhlaWdodCA6IG1heFdpZHRoQnJhbmNoLndpZHRoO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIFTDrW5oIHThu5VuZyBjaGnhu4F1IHLhu5luZyBjw6FjIGVsZW1lbnRzIHRyb25nIG5ow6FuaCAoZOG7jWMgdGhlbyB0cuG7pWMgWCkgKi9cbiAgc3RhdGljIHBsdXNXaWR0aEVsZW1lbnRJbkJyYW5jaChlbGVtZW50czogSURpYWdyYW1FbGVtZW50W10sIHRvdGFsOiB7IGhlaWdodDogbnVtYmVyIH0pIHtcbiAgICBlbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICBjb25zdCBtYXJnaW4gPSAhZWxlbWVudC5icmFuY2hlcyB8fCAhZWxlbWVudC5icmFuY2hlcy5sZW5ndGggPyB0aGlzLmNoZWNrRWxlbWVudEdldE1hcmdpbihlbGVtZW50Lm5vZGVPdGhlckNvbmZpZykgOiBjYW52YXNDb25maWdSZWFkb25seSgpLkVMRU1FTlRfTUFSR0lOX0RFRkFVTFRfQlJBTkNIO1xuXG4gICAgICB0b3RhbC5oZWlnaHQgKz0gKGVsZW1lbnQuc3BlY2lmaWNfd2lkdGggPz8gMCkgKyBtYXJnaW47XG4gICAgICBpZiAoIWVsZW1lbnQuYnJhbmNoZXMgfHwgIWVsZW1lbnQuYnJhbmNoZXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRvdGFsLmhlaWdodCArPSA2NDtcbiAgICAgIGNvbnN0IHRoZU1vc3RFbGVtZW50c0luQnJhbmNoID0geyBoZWlnaHQ6IDAgfTtcblxuICAgICAgZWxlbWVudC5icmFuY2hlcy5mb3JFYWNoKChicmFuY2gpID0+IHtcbiAgICAgICAgY29uc3Qgd2lkdGhJbkJyYW5jaCA9IHsgaGVpZ2h0OiAwIH07XG5cbiAgICAgICAgd2lkdGhJbkJyYW5jaC5oZWlnaHQgKz0gY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5FTEVNRU5UX01BUkdJTl9ERUZBVUxUX0JSQU5DSF9UT19FTEVNRU5UX0ZJUlNUICsgMjA7XG4gICAgICAgIGlmICghYnJhbmNoLmVsZW1lbnRzIHx8ICFicmFuY2guZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgd2lkdGhJbkJyYW5jaC5oZWlnaHQgKz0gY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5FTEVNRU5UX1dJRFRIX0RFRkFVTFRfQlJBTkNIX1dIRU5fTk9UX0VMRU1FTlQ7XG4gICAgICAgICAgaWYgKHRoZU1vc3RFbGVtZW50c0luQnJhbmNoLmhlaWdodCA8IHdpZHRoSW5CcmFuY2guaGVpZ2h0KSB7XG4gICAgICAgICAgICB0aGVNb3N0RWxlbWVudHNJbkJyYW5jaC5oZWlnaHQgPSB3aWR0aEluQnJhbmNoLmhlaWdodDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucGx1c1dpZHRoRWxlbWVudEluQnJhbmNoKGJyYW5jaC5lbGVtZW50cywgd2lkdGhJbkJyYW5jaCk7XG4gICAgICAgIGlmICh0aGVNb3N0RWxlbWVudHNJbkJyYW5jaC5oZWlnaHQgPCB3aWR0aEluQnJhbmNoLmhlaWdodCkge1xuICAgICAgICAgIHRoZU1vc3RFbGVtZW50c0luQnJhbmNoLmhlaWdodCA9IHdpZHRoSW5CcmFuY2guaGVpZ2h0O1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdG90YWwuaGVpZ2h0ICs9IHRoZU1vc3RFbGVtZW50c0luQnJhbmNoLmhlaWdodDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUw61uaCBjaGnhu4F1IGNhbyAoWSBzcGFuKSBj4bunYSBt4buZdCBuaMOhbmgg4oCUIGTDuW5nIMSR4buDIG9mZnNldCBjw6FjIG5ow6FuaCB0csOqbi9kxrDhu5tpLlxuICAgKiBUcm9uZyBob3Jpem9udGFsIGNvbnRleHQ6IG3hu5dpIG5ow6FuaCB0cuG6o2kgZMOgaSB0aGVvIFkgKGzDqm4veHXhu5FuZykuXG4gICAqL1xuICBzdGF0aWMgY2FsY3VsYXRvckhlaWdodEJyYW5jaChlbGVtZW50czogSURpYWdyYW1FbGVtZW50W10gfCB1bmRlZmluZWQsIG1heFdpZHRoOiB7IHdpZHRoOiBudW1iZXI7IGFib3ZlV2lkdGg6IG51bWJlcjsgdW5kZXJXaWR0aDogbnVtYmVyIH0pIHtcbiAgICBpZiAoIWVsZW1lbnRzIHx8ICFlbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHcgPSBjYW52YXNDb25maWdSZWFkb25seSgpLkRFRkFVTFRfQlJBTkNIX1dIRU5fTk9fRUxFTUVOVDtcblxuICAgICAgbWF4V2lkdGgud2lkdGggPSB3O1xuICAgICAgbWF4V2lkdGguYWJvdmVXaWR0aCA9IHcgLyAyO1xuICAgICAgbWF4V2lkdGgudW5kZXJXaWR0aCA9IHcgLyAyO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbWF4V2lkdGhJbkVsZW1lbnRzID0geyB3aWR0aDogMCwgYWJvdmVXaWR0aDogMCwgdW5kZXJXaWR0aDogMCB9O1xuXG4gICAgZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgaWYgKCFlbGVtZW50LmJyYW5jaGVzIHx8ICFlbGVtZW50LmJyYW5jaGVzLmxlbmd0aCkge1xuICAgICAgICAvLyBlbGVtZW50IGtow7RuZyBuaMOhbmg6IGTDuW5nIHNwZWNpZmljX2hlaWdodCBsw6BtIFkgc3BhblxuICAgICAgICBpZiAoKGVsZW1lbnQuc3BlY2lmaWNfaGVpZ2h0ID8/IDApIDwgbWF4V2lkdGhJbkVsZW1lbnRzLndpZHRoKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGggPSBlbGVtZW50LnNwZWNpZmljX2hlaWdodCA/PyAwO1xuXG4gICAgICAgIG1heFdpZHRoSW5FbGVtZW50cy53aWR0aCA9IGg7XG4gICAgICAgIG1heFdpZHRoSW5FbGVtZW50cy5hYm92ZVdpZHRoID0gaCAvIDI7XG4gICAgICAgIG1heFdpZHRoSW5FbGVtZW50cy51bmRlcldpZHRoID0gaCAvIDI7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB3aWR0aEVsZW1lbnRJbmNsdWRlQnJhbmNoID0geyB3aWR0aDogMCwgYWJvdmVXaWR0aDogMCwgdW5kZXJXaWR0aDogMCB9O1xuICAgICAgY29uc3QgaCA9IGVsZW1lbnQuc3BlY2lmaWNfaGVpZ2h0ID8/IDA7XG5cbiAgICAgIGlmIChoID4gd2lkdGhFbGVtZW50SW5jbHVkZUJyYW5jaC53aWR0aCkge1xuICAgICAgICB3aWR0aEVsZW1lbnRJbmNsdWRlQnJhbmNoLndpZHRoID0gaDtcbiAgICAgICAgd2lkdGhFbGVtZW50SW5jbHVkZUJyYW5jaC5hYm92ZVdpZHRoID0gaCAvIDI7XG4gICAgICAgIHdpZHRoRWxlbWVudEluY2x1ZGVCcmFuY2gudW5kZXJXaWR0aCA9IGggLyAyO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBoYWxmID0gTWF0aC5jZWlsKGVsZW1lbnQuYnJhbmNoZXMubGVuZ3RoIC8gMik7XG4gICAgICBjb25zdCBhYm92ZUhhbGYgPSBlbGVtZW50LmJyYW5jaGVzLnNsaWNlKDAsIGhhbGYpO1xuICAgICAgY29uc3QgdW5kZXJIYWxmID0gZWxlbWVudC5icmFuY2hlcy5zbGljZShoYWxmKTtcbiAgICAgIGxldCBicmFjaE1pZGRsZTogSURpYWdyYW1FbGVtZW50QnJhbmNoIHwgdW5kZWZpbmVkO1xuXG4gICAgICBpZiAoYWJvdmVIYWxmLmxlbmd0aCAhPT0gdW5kZXJIYWxmLmxlbmd0aCkge1xuICAgICAgICBicmFjaE1pZGRsZSA9IGFib3ZlSGFsZi5wb3AoKTtcbiAgICAgIH1cbiAgICAgIGlmIChicmFjaE1pZGRsZSkgYnJhY2hNaWRkbGUub25UaGVTaWRlID0gJ2NlbnRlcic7XG4gICAgICBhYm92ZUhhbGYuZm9yRWFjaCgoYnJhbmNoKSA9PiAoYnJhbmNoLm9uVGhlU2lkZSA9ICdhYm92ZScpKTtcbiAgICAgIHVuZGVySGFsZi5mb3JFYWNoKChicmFuY2gpID0+IChicmFuY2gub25UaGVTaWRlID0gJ3VuZGVyJykpO1xuXG4gICAgICBjb25zdCB3aWR0aEJyYW5jaCA9IHsgd2lkdGg6IDAsIGFib3ZlV2lkdGg6IDAsIHVuZGVyV2lkdGg6IDAgfTtcblxuICAgICAgZWxlbWVudC5icmFuY2hlcy5mb3JFYWNoKChicmFuY2gpID0+IHtcbiAgICAgICAgY29uc3QgdyA9IHsgd2lkdGg6IDAsIGFib3ZlV2lkdGg6IDAsIHVuZGVyV2lkdGg6IDAgfTtcblxuICAgICAgICB0aGlzLmNhbGN1bGF0b3JIZWlnaHRCcmFuY2goYnJhbmNoLmVsZW1lbnRzLCB3KTtcbiAgICAgICAgc3dpdGNoIChicmFuY2gub25UaGVTaWRlKSB7XG4gICAgICAgICAgY2FzZSAnYWJvdmUnOlxuICAgICAgICAgICAgd2lkdGhCcmFuY2guYWJvdmVXaWR0aCArPSB3LndpZHRoO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAndW5kZXInOlxuICAgICAgICAgICAgd2lkdGhCcmFuY2gudW5kZXJXaWR0aCArPSB3LndpZHRoO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnY2VudGVyJzpcbiAgICAgICAgICAgIHdpZHRoQnJhbmNoLmFib3ZlV2lkdGggKz0gdy5hYm92ZVdpZHRoO1xuICAgICAgICAgICAgd2lkdGhCcmFuY2gudW5kZXJXaWR0aCArPSB3LnVuZGVyV2lkdGg7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG1hcmdpbkJldHdlZW5CcmFuY2ggPSAoZWxlbWVudC5icmFuY2hlcy5sZW5ndGggLSAxKSAqIGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuRUxFTUVOVF9NQVJHSU5fQkVUV0VFTl9CUkFOQ0hfREVGQVVMVDtcblxuICAgICAgd2lkdGhCcmFuY2guYWJvdmVXaWR0aCArPSBtYXJnaW5CZXR3ZWVuQnJhbmNoIC8gMjtcbiAgICAgIHdpZHRoQnJhbmNoLnVuZGVyV2lkdGggKz0gbWFyZ2luQmV0d2VlbkJyYW5jaCAvIDI7XG4gICAgICBjb25zdCBtYXhBYm92ZVdpZHRoID0gTWF0aC5tYXgod2lkdGhFbGVtZW50SW5jbHVkZUJyYW5jaC5hYm92ZVdpZHRoLCB3aWR0aEJyYW5jaC5hYm92ZVdpZHRoKTtcbiAgICAgIGNvbnN0IG1heFVuZGVyV2lkdGggPSBNYXRoLm1heCh3aWR0aEVsZW1lbnRJbmNsdWRlQnJhbmNoLnVuZGVyV2lkdGgsIHdpZHRoQnJhbmNoLnVuZGVyV2lkdGgpO1xuXG4gICAgICBpZiAobWF4V2lkdGhJbkVsZW1lbnRzLmFib3ZlV2lkdGggPCBtYXhBYm92ZVdpZHRoKSB7XG4gICAgICAgIG1heFdpZHRoSW5FbGVtZW50cy5hYm92ZVdpZHRoID0gbWF4QWJvdmVXaWR0aDtcbiAgICAgIH1cbiAgICAgIGlmIChtYXhXaWR0aEluRWxlbWVudHMudW5kZXJXaWR0aCA8IG1heFVuZGVyV2lkdGgpIHtcbiAgICAgICAgbWF4V2lkdGhJbkVsZW1lbnRzLnVuZGVyV2lkdGggPSBtYXhVbmRlcldpZHRoO1xuICAgICAgfVxuXG4gICAgICBtYXhXaWR0aEluRWxlbWVudHMud2lkdGggPSBtYXhXaWR0aEluRWxlbWVudHMuYWJvdmVXaWR0aCArIG1heFdpZHRoSW5FbGVtZW50cy51bmRlcldpZHRoO1xuICAgIH0pO1xuXG4gICAgbWF4V2lkdGgud2lkdGggKz0gbWF4V2lkdGhJbkVsZW1lbnRzLmFib3ZlV2lkdGggKyBtYXhXaWR0aEluRWxlbWVudHMudW5kZXJXaWR0aDtcbiAgICBtYXhXaWR0aC5hYm92ZVdpZHRoICs9IG1heFdpZHRoSW5FbGVtZW50cy5hYm92ZVdpZHRoO1xuICAgIG1heFdpZHRoLnVuZGVyV2lkdGggKz0gbWF4V2lkdGhJbkVsZW1lbnRzLnVuZGVyV2lkdGg7XG4gIH1cblxuICAvKiogVMOtbmgga2hv4bqjbmcgY8OhY2ggdGjDqm0gdsOgbyBzYXUgZWxlbWVudCAoYmFvIGfhu5NtIHdhaXQgY29uZmlnIG7hur91IGPDsykgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgY2hlY2tFbGVtZW50R2V0TWFyZ2luKGhhc1dhaXRDb25maWc/OiBJRGlhZ3JhbUVsZW1lbnQpOiBudW1iZXIge1xuICAgIGlmIChoYXNXYWl0Q29uZmlnKSB7XG4gICAgICByZXR1cm4gY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5ESVNUQU5DRV9UT19XQUlUICsgdGhpcy5nZXRXaWR0aFdhaXRDb25maWcoaGFzV2FpdENvbmZpZykgKyBjYW52YXNDb25maWdSZWFkb25seSgpLldBSVRfVE9fRUxFTUVOVDtcbiAgICB9XG4gICAgcmV0dXJuIGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuRUxFTUVOVF9NQVJHSU5fREVGQVVMVDtcbiAgfVxuXG4gIC8qKiBUw61uaCBjaGnhu4F1IHLhu5luZyBj4bunYSB3YWl0IGNvbmZpZyBub2RlICovXG4gIHByaXZhdGUgc3RhdGljIGdldFdpZHRoV2FpdENvbmZpZyhoYXNXYWl0Q29uZmlnPzogSURpYWdyYW1FbGVtZW50KTogbnVtYmVyIHtcbiAgICBpZiAoaGFzV2FpdENvbmZpZykge1xuICAgICAgcmV0dXJuIChoYXNXYWl0Q29uZmlnLnNwZWNpZmljX3dpZHRoID8/IGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuRUxFTUVOVF9XQUlUX0RFRkFVTFQpICsgY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5ESVNUQU5DRV9XQUlUX1RPX05FWFRfTElORTtcbiAgICB9XG4gICAgcmV0dXJuIGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuRUxFTUVOVF9XQUlUX0RFRkFVTFQgKyBjYW52YXNDb25maWdSZWFkb25seSgpLkRJU1RBTkNFX1dBSVRfVE9fTkVYVF9MSU5FO1xuICB9XG59XG4iXX0=
|
|
314
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsY3VsYXRvci1jb29yZGluYXRlcy51dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9zZXJ2aWNlcy9kaWFncmFtLWRyYXcvc3JjL3V0aWxzL2hvcml6b250YWwvY2FsY3VsYXRvci1jb29yZGluYXRlcy51dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRWxFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUV6RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsMENBQTBDLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUV0Rjs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sT0FBTywrQ0FBK0M7SUFDMUQsTUFBTSxDQUFDLGFBQWEsQ0FBQyxRQUFnQyxFQUFFLE1BQTZCLEVBQUUsU0FBa0I7UUFDdEcsSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUN0QixPQUFPO1FBQ1QsQ0FBQztRQUVELFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxjQUFjLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDekMsY0FBYyxDQUFDLFVBQVUsR0FBRyxDQUFDLGNBQWMsQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDaEYsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztZQUV2QyxJQUFJLFVBQVUsRUFBRSxDQUFDO2dCQUNmLDZFQUE2RTtnQkFDN0UsY0FBYyxDQUFDLFVBQVUsR0FBRyxDQUFDLFVBQVUsQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsZUFBZSxJQUFJLENBQUMsQ0FBQyxHQUFHLENB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RCxPQUFPLG9CQUFvQixFQUFFLENBQUMsb0JBQW9CLEdBQUcsb0JBQW9CLEVBQUUsQ0FBQywwQkFBMEIsQ0FBQztJQUN6RyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjYW52YXNDb25maWdSZWFkb25seSB9IGZyb20gJy4uLy4uL2RpYWdyYW0tZHJhdy5zZXJ2aWNlJztcbmltcG9ydCB7IElEYXRhRGlhZ3JhbUNvbmZpZ1N2ZyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvY29vcmRpbmF0ZXMuaW50ZXJmYWNlJztcbmltcG9ydCB7IGNoZWNrTWF4VG9wIH0gZnJvbSAnLi4vY2FsY3VsYXRvci1lbGVtZW50LnV0aWwnO1xuaW1wb3J0IHsgSURpYWdyYW1FbGVtZW50LCBJRGlhZ3JhbUVsZW1lbnRCcmFuY2ggfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2RpYWdyYW0uaW50ZXJmYWNlJztcbmltcG9ydCB7IGJ1aWxkRmxhdEVsZW1lbnQgfSBmcm9tICcuLi9kaWFncmFtLnV0aWwnO1xuaW1wb3J0IHsgTW9MaWJEaWFncmFtSG9yaXpvbnRhbENhbGN1bGF0b3JCcmFuY2hVdGlsIH0gZnJvbSAnLi9jYWxjdWxhdG9yLWJyYW5jaC51dGlsJztcblxuLyoqXG4gKiBIb3Jpem9udGFsIGxheW91dCBjYWxjdWxhdG9yLlxuICogTWlycm9ycyBNb0xpYkRpYWdyYW1DYWxjdWxhdG9yQ29vcmRpbmF0ZXNVdGlsICh2ZXJ0aWNhbCkgYnV0IHJvdGF0ZWQgOTDCsDpcbiAqICAtIEVsZW1lbnRzIGdyb3cgTEVGVCDihpIgUklHSFQgIChzcGVjaWZpY194IGFkdmFuY2VzIGFsb25nIG1haW4gYXhpcylcbiAqICAtIEJyYW5jaGVzIHNwbGl0IFVQIC8gRE9XTiAgICAoc3BlY2lmaWNfeSBmb3IgYnJhbmNoIG9mZnNldClcbiAqICAtIFwiYWJvdmVcIiBicmFuY2ggPSB1cHBlciBzaWRlICh5IGRlY3JlYXNlcylcbiAqICAtIFwidW5kZXJcIiBicmFuY2ggPSBsb3dlciBzaWRlICh5IGluY3JlYXNlcylcbiAqXG4gKiBLZXkgYXhpcyBtYXBwaW5nIHZzLiB2ZXJ0aWNhbDpcbiAqICAgdmVydGljYWw6IHNwZWNpZmljX3kg4oaVICBzcGVjaWZpY194IGNlbnRlcmVkXG4gKiAgIGhvcml6b250YWw6IHNwZWNpZmljX3gg4oaSIHNwZWNpZmljX3kgY2VudGVyZWRcbiAqL1xuZXhwb3J0IGNsYXNzIE1vTGliRGlhZ3JhbUhvcml6b250YWxDYWxjdWxhdG9yQ29vcmRpbmF0ZXNVdGlsIHtcbiAgc3RhdGljIHNldFhZRWxlbWVudHMoZWxlbWVudHM6IEFycmF5PElEaWFncmFtRWxlbWVudD4sIGNvbmZpZzogSURhdGFEaWFncmFtQ29uZmlnU3ZnLCBwb3NpdGlvblk/OiBudW1iZXIpIHtcbiAgICBpZiAoIWVsZW1lbnRzPy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBlbGVtZW50cy5mb3JFYWNoKChjdXJyZW50RWxlbWVudCwgaW5kZXgpID0+IHtcbiAgICAgIGN1cnJlbnRFbGVtZW50LnNwZWNpZmljX3kgPSAoY3VycmVudEVsZW1lbnQuc3BlY2lmaWNfeSA/PyAwKSArIChwb3NpdGlvblkgPz8gMCk7XG4gICAgICBjb25zdCBwcmVFbGVtZW50ID0gZWxlbWVudHNbaW5kZXggLSAxXTtcblxuICAgICAgaWYgKHByZUVsZW1lbnQpIHtcbiAgICAgICAgLy8gVHJvbmcgaG9yaXpvbnRhbDogeSAoY2hp4buBdSBjYW8pIGPEg24gZ2nhu69hIHRoZW8gcHJlRWxlbWVudCwgeCB0aeG6v24gc2FuZyBwaOG6o2lcbiAgICAgICAgY3VycmVudEVsZW1lbnQuc3BlY2lmaWNfeSA9IChwcmVFbGVtZW50LnNwZWNpZmljX3kgPz8gMCkgKyAocHJlRWxlbWVudC5zcGVjaWZpY19oZWlnaHQgPz8gMCkgLyAyIC0gKGN1cnJlbnRFbGVtZW50LnNwZWNpZmljX2hlaWdodCA/PyAwKSAvIDI7XG4gICAgICAgIGN1cnJlbnRFbGVtZW50LnNwZWNpZmljX3ggPSAocHJlRWxlbWVudC5zcGVjaWZpY194ID8/IDApICsgKHByZUVsZW1lbnQuc3BlY2lmaWNfd2lkdGggPz8gMCkgKyB0aGlzLmNoZWNrRWxlbWVudEdldE1hcmdpbihwcmVFbGVtZW50Lm5vZGVPdGhlckNvbmZpZyk7XG5cbiAgICAgICAgaWYgKHByZUVsZW1lbnQucG9zaXRpb25fZW5kX2JyYW5jaCkge1xuICAgICAgICAgIGN1cnJlbnRFbGVtZW50LnNwZWNpZmljX3ggPSBwcmVFbGVtZW50LnBvc2l0aW9uX2VuZF9icmFuY2g7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY2hlY2tNYXhUb3AoY29uZmlnLCBjdXJyZW50RWxlbWVudC5zcGVjaWZpY195LCBjdXJyZW50RWxlbWVudC5icmFuY2hlcz8uWzBdPy5wb3NpdGlvbk1heFRvcCk7XG5cbiAgICAgIGNvbnN0IHRvcCA9IGN1cnJlbnRFbGVtZW50LnNwZWNpZmljX3kgPz8gMDtcbiAgICAgIGxldCBsaW5lQmV0d2VlbkVsZW1lbnRzID0gKGN1cnJlbnRFbGVtZW50LnNwZWNpZmljX3dpZHRoID8/IDApICsgdGhpcy5jaGVja0VsZW1lbnRHZXRNYXJnaW4oY3VycmVudEVsZW1lbnQubm9kZU90aGVyQ29uZmlnKTtcblxuICAgICAgaWYgKGN1cnJlbnRFbGVtZW50LmJyYW5jaGVzPy5sZW5ndGgpIHtcbiAgICAgICAgbGluZUJldHdlZW5FbGVtZW50cyA9IChjdXJyZW50RWxlbWVudC5zcGVjaWZpY193aWR0aCA/PyAwKSArIGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuRUxFTUVOVF9NQVJHSU5fREVGQVVMVF9CUkFOQ0g7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1heFkgPSAoY3VycmVudEVsZW1lbnQuc3BlY2lmaWNfeSA/PyAwKSArIChjdXJyZW50RWxlbWVudC5zcGVjaWZpY19oZWlnaHQgPz8gMCkgKyAyMDA7XG4gICAgICBjb25zdCBtYXhYUmlnaHQgPSAoY3VycmVudEVsZW1lbnQuc3BlY2lmaWNfeCA/PyAwKSArIChjdXJyZW50RWxlbWVudC5zcGVjaWZpY193aWR0aCA/PyAwKSArIDIwMDtcbiAgICAgIGNvbnN0IGNvbmZpZ1N2ZyA9IGNvbmZpZy53aWR0aEhlaWdodFN2Z0NhbnZhcztcblxuICAgICAgY29uZmlnU3ZnLmhlaWdodFN2ZyA9IG1heFkgPiBjb25maWdTdmcuaGVpZ2h0U3ZnID8gbWF4WSA6IGNvbmZpZ1N2Zy5oZWlnaHRTdmc7XG4gICAgICBjb25maWdTdmcud2lkdGhTdmcgPSBtYXhYUmlnaHQgPiBjb25maWdTdmcud2lkdGhTdmcgPyBtYXhYUmlnaHQgOiBjb25maWdTdmcud2lkdGhTdmc7XG5cbiAgICAgIGlmICghY3VycmVudEVsZW1lbnQuYnJhbmNoZXM/Lmxlbmd0aCkge1xuICAgICAgICAvLyBFbGVtZW50IGtow7RuZyBjw7MgbmjDoW5oOiB24bq9IMSRxrDhu51uZyB0aOG6s25nIG5nYW5nXG4gICAgICAgIGNvbnN0IGRyYXdGb3JtVG9XaWR0aEV4aXQgPSAoY3VycmVudEVsZW1lbnQuc3ViQ29kZU9mRWxlbWVudCB8fCBjdXJyZW50RWxlbWVudC5jb2RlKSA9PT0gY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5UWVBFX0VMRU1FTlRfRVhJVCA/IChjdXJyZW50RWxlbWVudC5zcGVjaWZpY193aWR0aCA/PyAwKSAvIDIgOiBsaW5lQmV0d2VlbkVsZW1lbnRzO1xuXG4gICAgICAgIGN1cnJlbnRFbGVtZW50LmF0dHJpYnV0ZVN2Z0QgPSBgTSAke2N1cnJlbnRFbGVtZW50LnNwZWNpZmljX3ggPz8gMH0gJHt0b3AgKyAoY3VycmVudEVsZW1lbnQuc3BlY2lmaWNfaGVpZ2h0ID8/IDApIC8gMn0gbCAke2RyYXdGb3JtVG9XaWR0aEV4aXR9IDBgO1xuICAgICAgICBjdXJyZW50RWxlbWVudC5wb3NpdGlvbl9lbmQgPSAoY3VycmVudEVsZW1lbnQuc3BlY2lmaWNfeCA/PyAwKSArIGxpbmVCZXR3ZWVuRWxlbWVudHM7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50Lm5vZGVPdGhlckNvbmZpZykge1xuICAgICAgICAgIGNvbnN0IHdhaXRXaWR0aCA9IHRoaXMuZ2V0V2lkdGhXYWl0Q29uZmlnKGN1cnJlbnRFbGVtZW50Lm5vZGVPdGhlckNvbmZpZyk7XG4gICAgICAgICAgY29uc3QgZGlzdGFuY2VFbGVtZW50VG9XYWl0ID0gKGN1cnJlbnRFbGVtZW50LnNwZWNpZmljX3dpZHRoID8/IDApICsgY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5ESVNUQU5DRV9UT19XQUlUO1xuICAgICAgICAgIGNvbnN0IGxlZnRTdGFydExpbmUyID0gKGN1cnJlbnRFbGVtZW50LnNwZWNpZmljX3ggPz8gMCkgKyBkaXN0YW5jZUVsZW1lbnRUb1dhaXQgKyB3YWl0V2lkdGg7XG5cbiAgICAgICAgICBjdXJyZW50RWxlbWVudC5hdHRyaWJ1dGVTdmdEID0gYE0gJHtjdXJyZW50RWxlbWVudC5zcGVjaWZpY194ID8/IDB9ICR7dG9wICsgKGN1cnJlbnRFbGVtZW50LnNwZWNpZmljX2hlaWdodCA/PyAwKSAvIDJ9IGwgJHtkaXN0YW5jZUVsZW1lbnRUb1dhaXR9IDBgO1xuICAgICAgICAgIGN1cnJlbnRFbGVtZW50LnBvc2l0aW9uX2VuZCA9IGxlZnRTdGFydExpbmUyICsgbGluZUJldHdlZW5FbGVtZW50cztcblxuICAgICAgICAgIGN1cnJlbnRFbGVtZW50Lm5vZGVPdGhlckNvbmZpZy5zcGVjaWZpY194ID0gKGN1cnJlbnRFbGVtZW50LnNwZWNpZmljX3ggPz8gMCkgKyBkaXN0YW5jZUVsZW1lbnRUb1dhaXQ7XG4gICAgICAgICAgLy8gc3BlY2lmaWNfeSA9IHTDom0gWSBj4bunYSDEkcaw4budbmcgbGluZSDigJQgc2V0VHJhbnNsYXRlUG9zaXRpb25zIHPhur0gdHLhu6sgaGVpZ2h0LzIgxJHhu4MgY8SDbiBnaeG7r2EgZOG7jWNcbiAgICAgICAgICBjdXJyZW50RWxlbWVudC5ub2RlT3RoZXJDb25maWcuc3BlY2lmaWNfeSA9IHRvcCArIChjdXJyZW50RWxlbWVudC5zcGVjaWZpY19oZWlnaHQgPz8gMCkgLyAyO1xuICAgICAgICAgIC8vIMSQ4bqjbSBi4bqjbyBjw7Mga8OtY2ggdGjGsOG7m2MgxJHhu4Mgc2V0VHJhbnNsYXRlUG9zaXRpb25zIHTDrW5oIG9mZnNldCDEkcO6bmdcbiAgICAgICAgICBpZiAoIWN1cnJlbnRFbGVtZW50Lm5vZGVPdGhlckNvbmZpZy5zcGVjaWZpY19oZWlnaHQpIHtcbiAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50Lm5vZGVPdGhlckNvbmZpZy5zcGVjaWZpY19oZWlnaHQgPSBjYW52YXNDb25maWdSZWFkb25seSgpLkVMRU1FTlRfV0FJVF9ERUZBVUxUO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWN1cnJlbnRFbGVtZW50Lm5vZGVPdGhlckNvbmZpZy5zcGVjaWZpY193aWR0aCkge1xuICAgICAgICAgICAgY3VycmVudEVsZW1lbnQubm9kZU90aGVyQ29uZmlnLnNwZWNpZmljX3dpZHRoID0gY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5FTEVNRU5UX1dBSVRfREVGQVVMVDtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVsZXRlIGN1cnJlbnRFbGVtZW50Lm5vZGVPdGhlckNvbmZpZy5hdHRyaWJ1dGVTdmdEO1xuXG4gICAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50LnN1YkNvZGVPZkVsZW1lbnQgIT09IGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuVFlQRV9FTEVNRU5UX0VYSVQpIHtcbiAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50Lm5vZGVPdGhlckNvbmZpZy5hdHRyaWJ1dGVTdmdEID0gYE0gJHtsZWZ0U3RhcnRMaW5lMn0gJHt0b3AgKyAoY3VycmVudEVsZW1lbnQuc3BlY2lmaWNfaGVpZ2h0ID8/IDApIC8gMn0gbCAke2NhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuV0FJVF9UT19FTEVNRU5UfSAwYDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEVsZW1lbnRzIGPDsyBuaMOhbmhcbiAgICAgIGNvbnN0IGhhbGYgPSBNYXRoLmNlaWwoY3VycmVudEVsZW1lbnQuYnJhbmNoZXMubGVuZ3RoIC8gMik7XG4gICAgICBjb25zdCBhYm92ZUhhbGYgPSBjdXJyZW50RWxlbWVudC5icmFuY2hlcy5zbGljZSgwLCBoYWxmKTtcbiAgICAgIGNvbnN0IHVuZGVySGFsZiA9IGN1cnJlbnRFbGVtZW50LmJyYW5jaGVzLnNsaWNlKGhhbGYpO1xuICAgICAgbGV0IGJyYWNoTWlkZGxlOiBJRGlhZ3JhbUVsZW1lbnRCcmFuY2ggfCB1bmRlZmluZWQ7XG5cbiAgICAgIGlmIChhYm92ZUhhbGYubGVuZ3RoICE9PSB1bmRlckhhbGYubGVuZ3RoKSB7XG4gICAgICAgIGJyYWNoTWlkZGxlID0gYWJvdmVIYWxmLnBvcCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBUw41OSCBDSEnhu4BVIENBTyBU4buQSSDEkEEgQ+G7pkEgTkjDgU5IICjEkcOieSBsw6AgY2hp4buBdSBy4buZbmcgdHJvbmcgaG9yaXpvbnRhbCBjb250ZXh0IG5oxrBuZ1xuICAgICAgLy8gZMO5bmcgY2h1bmcgbWF4SGVpZ2h0QnJhbmNoIMSR4buDIMSRxqFuIGdp4bqjbiwgw70gbmdoxKlhIGzDoCBcImtob+G6o25nIHRy4buRbmcgdOG7kWkgdGhp4buDdSBkw6BuaCBjaG8gbmjDoW5oIGtow7RuZyBjw7MgZWxlbWVudFwiKVxuICAgICAgY29uc3QgbWF4V2lkdGhCcmFuY2ggPSB7IHdpZHRoOiAwIH07XG5cbiAgICAgIHRoaXMuY2FsY3VsYXRvck1heEJyYW5jaFdpZHRoKGN1cnJlbnRFbGVtZW50LCBtYXhXaWR0aEJyYW5jaCk7XG4gICAgICBjdXJyZW50RWxlbWVudC5tYXhIZWlnaHRCcmFuY2ggPSBtYXhXaWR0aEJyYW5jaC53aWR0aDtcblxuICAgICAgY29uc3QgbWF4V2lkdGhCcmFjaE1pZGRsZSA9IHsgd2lkdGg6IDAsIGFib3ZlV2lkdGg6IDAsIHVuZGVyV2lkdGg6IDAgfTtcbiAgICAgIGNvbnN0IGxpbmVGb3JtRWxlbWVudFRvQnJhbmNoaW5nID0gKGN1cnJlbnRFbGVtZW50LnNwZWNpZmljX3dpZHRoID8/IDApICsgY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5FTEVNRU5UX01BUkdJTl9ERUZBVUxUX0JSQU5DSDtcblxuICAgICAgLy8gdG9wID0geSArIGhlaWdodC8yOiDEkWnhu4NtIGdp4buvYSB0aGVvIGNoaeG7gXUgWSDihpIgZMO5bmcgbMOgbSB04buNYSDEkeG7mSBZIGPhu6dhIMSRxrDhu51uZyBuZ2FuZyBjaMOtbmhcbiAgICAgIGNvbnN0IHRvcE1pZCA9IHRvcCArIChjdXJyZW50RWxlbWVudC5zcGVjaWZpY19oZWlnaHQgPz8gMCkgLyAyO1xuXG4gICAgICBpZiAoYnJhY2hNaWRkbGUpIHtcbiAgICAgICAgYnJhY2hNaWRkbGUub25UaGVTaWRlID0gJ2NlbnRlcic7XG4gICAgICAgIHRoaXMuY2FsY3VsYXRvckhlaWdodEJyYW5jaChicmFjaE1pZGRsZS5lbGVtZW50cywgbWF4V2lkdGhCcmFjaE1pZGRsZSk7XG4gICAgICAgIGJyYWNoTWlkZGxlLndpZHRoQnJhbmNoID0ge1xuICAgICAgICAgIHdpZHRoOiBtYXhXaWR0aEJyYWNoTWlkZGxlLndpZHRoLFxuICAgICAgICAgIGFib3ZlOiBtYXhXaWR0aEJyYWNoTWlkZGxlLmFib3ZlV2lkdGgsXG4gICAgICAgICAgdW5kZXI6IG1heFdpZHRoQnJhY2hNaWRkbGUudW5kZXJXaWR0aCxcbiAgICAgICAgfTtcbiAgICAgICAgTW9MaWJEaWFncmFtSG9yaXpvbnRhbENhbGN1bGF0b3JCcmFuY2hVdGlsLmRyYXdTdHJhaWdodExpbmUodG9wTWlkLCBsaW5lRm9ybUVsZW1lbnRUb0JyYW5jaGluZywgY3VycmVudEVsZW1lbnQuc3BlY2lmaWNfeCA/PyAwLCBicmFjaE1pZGRsZSwgbWF4V2lkdGhCcmFuY2gud2lkdGgsIGNvbmZpZyk7XG4gICAgICB9XG5cbiAgICAgIGxldCBoYXNOZXh0U2FtZVBhcmVudEVsZW1lbnROZXh0ID0gZmFsc2U7XG4gICAgICBhYm92ZUhhbGYucmV2ZXJzZSgpO1xuXG4gICAgICBhYm92ZUhhbGYuZm9yRWFjaCgoYnJhbmNoLCBpbmRleEJyYW5jaCkgPT4ge1xuICAgICAgICBpZiAoIWhhc05leHRTYW1lUGFyZW50RWxlbWVudE5leHQpIHtcbiAgICAgICAgICBjb25zdCBmbGF0RWxlbWVudE9uQnJhbmNoOiBJRGlhZ3JhbUVsZW1lbnRbXSA9IFtdO1xuXG4gICAgICAgICAgYnVpbGRGbGF0RWxlbWVudChicmFuY2guZWxlbWVudHMsIGZsYXRFbGVtZW50T25CcmFuY2gpO1xuICAgICAgICAgIGhhc05leHRTYW1lUGFyZW50RWxlbWVudE5leHQgPSAhZmxhdEVsZW1lbnRPbkJyYW5jaD8ubGVuZ3RoID8gdHJ1ZSA6ICEhZmxhdEVsZW1lbnRPbkJyYW5jaC5maW5kKChpdGVtKSA9PiBpdGVtLm5leHRfaWQgPT09IGN1cnJlbnRFbGVtZW50Lm5leHRfaWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJhbmNoLm9uVGhlU2lkZSA9ICdhYm92ZSc7XG4gICAgICAgIGNvbnN0IG1heFdpZHRoQiA9IHsgd2lkdGg6IDAsIGFib3ZlV2lkdGg6IDAsIHVuZGVyV2lkdGg6IDAgfTtcblxuICAgICAgICB0aGlzLmNhbGN1bGF0b3JIZWlnaHRCcmFuY2goYnJhbmNoLmVsZW1lbnRzLCBtYXhXaWR0aEIpO1xuICAgICAgICBicmFuY2gud2lkdGhCcmFuY2ggPSB7XG4gICAgICAgICAgd2lkdGg6IG1heFdpZHRoQi53aWR0aCxcbiAgICAgICAgICBhYm92ZTogbWF4V2lkdGhCLmFib3ZlV2lkdGgsXG4gICAgICAgICAgdW5kZXI6IG1heFdpZHRoQi51bmRlcldpZHRoLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGJyYW5jaFByZSA9IGFib3ZlSGFsZltpbmRleEJyYW5jaCAtIDFdO1xuICAgICAgICBsZXQgbGluZUJldHdlZW5CcmFuY2ggPSBtYXhXaWR0aEIudW5kZXJXaWR0aCArIGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuRUxFTUVOVF9NQVJHSU5fQkVUV0VFTl9CUkFOQ0hfREVGQVVMVCAvIDI7XG5cbiAgICAgICAgaWYgKGJyYW5jaFByZSkge1xuICAgICAgICAgIGxpbmVCZXR3ZWVuQnJhbmNoICs9IChicmFuY2hQcmUud2lkdGhCcmFuY2g/LndpZHRoID8/IDApICsgY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5FTEVNRU5UX01BUkdJTl9CRVRXRUVOX0JSQU5DSF9ERUZBVUxUO1xuICAgICAgICB9XG4gICAgICAgIGlmIChicmFjaE1pZGRsZSkge1xuICAgICAgICAgIGxpbmVCZXR3ZWVuQnJhbmNoICs9IChicmFjaE1pZGRsZS53aWR0aEJyYW5jaD8uYWJvdmUgPz8gMCkgKyBjYW52YXNDb25maWdSZWFkb25seSgpLkVMRU1FTlRfTUFSR0lOX0JFVFdFRU5fQlJBTkNIX0RFRkFVTFQgLyAyO1xuICAgICAgICB9XG5cbiAgICAgICAgTW9MaWJEaWFncmFtSG9yaXpvbnRhbENhbGN1bGF0b3JCcmFuY2hVdGlsLmFib3ZlTGluZSh0b3BNaWQsIGxpbmVGb3JtRWxlbWVudFRvQnJhbmNoaW5nLCBjdXJyZW50RWxlbWVudC5zcGVjaWZpY194ID8/IDAsIGxpbmVCZXR3ZWVuQnJhbmNoLCBicmFuY2gsIG1heFdpZHRoQnJhbmNoLndpZHRoLCBjdXJyZW50RWxlbWVudCwgY29uZmlnKTtcbiAgICAgIH0pO1xuXG4gICAgICB1bmRlckhhbGYuZm9yRWFjaCgoYnJhbmNoLCBpbmRleEJyYW5jaCkgPT4ge1xuICAgICAgICBpZiAoIWhhc05leHRTYW1lUGFyZW50RWxlbWVudE5leHQpIHtcbiAgICAgICAgICBjb25zdCBmbGF0RWxlbWVudE9uQnJhbmNoOiBJRGlhZ3JhbUVsZW1lbnRbXSA9IFtdO1xuXG4gICAgICAgICAgYnVpbGRGbGF0RWxlbWVudChicmFuY2guZWxlbWVudHMsIGZsYXRFbGVtZW50T25CcmFuY2gpO1xuICAgICAgICAgIGhhc05leHRTYW1lUGFyZW50RWxlbWVudE5leHQgPSAhZmxhdEVsZW1lbnRPbkJyYW5jaD8ubGVuZ3RoID8gdHJ1ZSA6ICEhZmxhdEVsZW1lbnRPbkJyYW5jaC5maW5kKChpdGVtKSA9PiBpdGVtLm5leHRfaWQgPT09IGN1cnJlbnRFbGVtZW50Lm5leHRfaWQpO1xuICAgICAgICB9XG4gICAgICAgIGJyYW5jaC5vblRoZVNpZGUgPSAndW5kZXInO1xuICAgICAgICBjb25zdCBtYXhXaWR0aEIgPSB7IHdpZHRoOiAwLCBhYm92ZVdpZHRoOiAwLCB1bmRlcldpZHRoOiAwIH07XG5cbiAgICAgICAgdGhpcy5jYWxjdWxhdG9ySGVpZ2h0QnJhbmNoKGJyYW5jaC5lbGVtZW50cywgbWF4V2lkdGhCKTtcbiAgICAgICAgYnJhbmNoLndpZHRoQnJhbmNoID0ge1xuICAgICAgICAgIHdpZHRoOiBtYXhXaWR0aEIud2lkdGgsXG4gICAgICAgICAgYWJvdmU6IG1heFdpZHRoQi5hYm92ZVdpZHRoLFxuICAgICAgICAgIHVuZGVyOiBtYXhXaWR0aEIudW5kZXJXaWR0aCxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBicmFuY2hQcmUgPSB1bmRlckhhbGZbaW5kZXhCcmFuY2ggLSAxXTtcbiAgICAgICAgbGV0IGxpbmVCZXR3ZWVuQnJhbmNoID0gbWF4V2lkdGhCLmFib3ZlV2lkdGggKyBjYW52YXNDb25maWdSZWFkb25seSgpLkVMRU1FTlRfTUFSR0lOX0JFVFdFRU5fQlJBTkNIX0RFRkFVTFQgLyAyO1xuXG4gICAgICAgIGlmIChicmFuY2hQcmUpIHtcbiAgICAgICAgICBsaW5lQmV0d2VlbkJyYW5jaCArPSAoYnJhbmNoUHJlLndpZHRoQnJhbmNoPy53aWR0aCA/PyAwKSArIGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuRUxFTUVOVF9NQVJHSU5fQkVUV0VFTl9CUkFOQ0hfREVGQVVMVDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYnJhY2hNaWRkbGUpIHtcbiAgICAgICAgICBsaW5lQmV0d2VlbkJyYW5jaCArPSAoYnJhY2hNaWRkbGUud2lkdGhCcmFuY2g/LnVuZGVyID8/IDApICsgY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5FTEVNRU5UX01BUkdJTl9CRVRXRUVOX0JSQU5DSF9ERUZBVUxUIC8gMjtcbiAgICAgICAgfVxuXG4gICAgICAgIE1vTGliRGlhZ3JhbUhvcml6b250YWxDYWxjdWxhdG9yQnJhbmNoVXRpbC51bmRlckxpbmUodG9wTWlkLCBsaW5lRm9ybUVsZW1lbnRUb0JyYW5jaGluZywgY3VycmVudEVsZW1lbnQuc3BlY2lmaWNfeCA/PyAwLCBsaW5lQmV0d2VlbkJyYW5jaCwgYnJhbmNoLCBtYXhXaWR0aEJyYW5jaC53aWR0aCwgY3VycmVudEVsZW1lbnQsIGNvbmZpZyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRoaXMuc2V0VHJhbnNsYXRlUG9zaXRpb25zKGVsZW1lbnRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdHJhbnNsYXRlWC9ZIGNobyB04bqldCBj4bqjIGVsZW1lbnRzIChiYW8gZ+G7k20gYnJhbmNoZXMgdsOgIG5vZGVPdGhlckNvbmZpZylcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHNldFRyYW5zbGF0ZVBvc2l0aW9ucyhlbGVtZW50czogQXJyYXk8SURpYWdyYW1FbGVtZW50Pikge1xuICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgIGVsZW1lbnQudHJhbnNsYXRlWCA9IGVsZW1lbnQuc3BlY2lmaWNfeDtcbiAgICAgIGVsZW1lbnQudHJhbnNsYXRlWSA9IGVsZW1lbnQuc3BlY2lmaWNfeTtcblxuICAgICAgaWYgKGVsZW1lbnQubm9kZU90aGVyQ29uZmlnKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldFkgPSAoZWxlbWVudC5ub2RlT3RoZXJDb25maWcuc3BlY2lmaWNfaGVpZ2h0ID8/IDApIC8gMjtcblxuICAgICAgICBlbGVtZW50Lm5vZGVPdGhlckNvbmZpZy50cmFuc2xhdGVYID0gZWxlbWVudC5ub2RlT3RoZXJDb25maWcuc3BlY2lmaWNfeDtcbiAgICAgICAgZWxlbWVudC5ub2RlT3RoZXJDb25maWcudHJhbnNsYXRlWSA9IChlbGVtZW50Lm5vZGVPdGhlckNvbmZpZy5zcGVjaWZpY195ID8/IDApIC0gb2Zmc2V0WTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVsZW1lbnQuYnJhbmNoZXMgJiYgZWxlbWVudC5icmFuY2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGVsZW1lbnQuYnJhbmNoZXMuZm9yRWFjaCgoYnJhbmNoKSA9PiB7XG4gICAgICAgICAgaWYgKGJyYW5jaC5ub2RlT3RoZXJDb25maWcpIHtcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldFkgPSAoYnJhbmNoLm5vZGVPdGhlckNvbmZpZy5zcGVjaWZpY19oZWlnaHQgPz8gMCkgLyAyO1xuXG4gICAgICAgICAgICBicmFuY2gubm9kZU90aGVyQ29uZmlnLnRyYW5zbGF0ZVggPSBicmFuY2gubm9kZU90aGVyQ29uZmlnLnNwZWNpZmljX3g7XG4gICAgICAgICAgICBicmFuY2gubm9kZU90aGVyQ29uZmlnLnRyYW5zbGF0ZVkgPSAoYnJhbmNoLm5vZGVPdGhlckNvbmZpZy5zcGVjaWZpY195ID8/IDApIC0gb2Zmc2V0WTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoYnJhbmNoLmVsZW1lbnRzICYmIGJyYW5jaC5lbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnNldFRyYW5zbGF0ZVBvc2l0aW9ucyhicmFuY2guZWxlbWVudHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKiogVMOtbmggY2hp4buBdSBy4buZbmcgdOG7kWkgxJFhIGPhu6dhIG5ow6FuaCAodHJvbmcgaG9yaXpvbnRhbCA9IGNoaeG7gXUgY2FvIHRo4buxYyBj4bunYSBuaMOhbmgga2jDtG5nIGPDsyBlbGVtZW50KSAqL1xuICBzdGF0aWMgY2FsY3VsYXRvck1heEJyYW5jaFdpZHRoKGVsZW1lbnQ6IElEaWFncmFtRWxlbWVudCwgbWF4V2lkdGhCcmFuY2g6IHsgd2lkdGg6IG51bWJlciB9KSB7XG4gICAgaWYgKCFlbGVtZW50LmJyYW5jaGVzPy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBlbGVtZW50LmJyYW5jaGVzLmZvckVhY2goKGJyYW5jaCkgPT4ge1xuICAgICAgaWYgKCFicmFuY2guZWxlbWVudHM/Lmxlbmd0aCkge1xuICAgICAgICBjb25zdCBsaW5lQnJhbmNoTm9IYXNFbGVtZW50ID0gY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5FTEVNRU5UX1dJRFRIX0RFRkFVTFRfQlJBTkNIX1dIRU5fTk9UX0VMRU1FTlQ7XG5cbiAgICAgICAgbWF4V2lkdGhCcmFuY2gud2lkdGggPSBsaW5lQnJhbmNoTm9IYXNFbGVtZW50ID4gbWF4V2lkdGhCcmFuY2gud2lkdGggPyBsaW5lQnJhbmNoTm9IYXNFbGVtZW50IDogbWF4V2lkdGhCcmFuY2gud2lkdGg7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0b3RhbCA9IHsgaGVpZ2h0OiAwIH07XG5cbiAgICAgIHRoaXMucGx1c1dpZHRoRWxlbWVudEluQnJhbmNoKGJyYW5jaC5lbGVtZW50cywgdG90YWwpO1xuICAgICAgbWF4V2lkdGhCcmFuY2gud2lkdGggPSB0b3RhbC5oZWlnaHQgPiBtYXhXaWR0aEJyYW5jaC53aWR0aCA/IHRvdGFsLmhlaWdodCA6IG1heFdpZHRoQnJhbmNoLndpZHRoO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIFTDrW5oIHThu5VuZyBjaGnhu4F1IHLhu5luZyBjw6FjIGVsZW1lbnRzIHRyb25nIG5ow6FuaCAoZOG7jWMgdGhlbyB0cuG7pWMgWCkgKi9cbiAgc3RhdGljIHBsdXNXaWR0aEVsZW1lbnRJbkJyYW5jaChlbGVtZW50czogSURpYWdyYW1FbGVtZW50W10sIHRvdGFsOiB7IGhlaWdodDogbnVtYmVyIH0pIHtcbiAgICBlbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICBjb25zdCBtYXJnaW4gPSAhZWxlbWVudC5icmFuY2hlcz8ubGVuZ3RoID8gdGhpcy5jaGVja0VsZW1lbnRHZXRNYXJnaW4oZWxlbWVudC5ub2RlT3RoZXJDb25maWcpIDogY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5FTEVNRU5UX01BUkdJTl9ERUZBVUxUX0JSQU5DSDtcblxuICAgICAgdG90YWwuaGVpZ2h0ICs9IChlbGVtZW50LnNwZWNpZmljX3dpZHRoID8/IDApICsgbWFyZ2luO1xuICAgICAgaWYgKCFlbGVtZW50LmJyYW5jaGVzPy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdG90YWwuaGVpZ2h0ICs9IDY0O1xuICAgICAgY29uc3QgdGhlTW9zdEVsZW1lbnRzSW5CcmFuY2ggPSB7IGhlaWdodDogMCB9O1xuXG4gICAgICBlbGVtZW50LmJyYW5jaGVzLmZvckVhY2goKGJyYW5jaCkgPT4ge1xuICAgICAgICBjb25zdCB3aWR0aEluQnJhbmNoID0geyBoZWlnaHQ6IDAgfTtcblxuICAgICAgICB3aWR0aEluQnJhbmNoLmhlaWdodCArPSBjYW52YXNDb25maWdSZWFkb25seSgpLkVMRU1FTlRfTUFSR0lOX0RFRkFVTFRfQlJBTkNIX1RPX0VMRU1FTlRfRklSU1QgKyAyMDtcbiAgICAgICAgaWYgKCFicmFuY2guZWxlbWVudHM/Lmxlbmd0aCkge1xuICAgICAgICAgIHdpZHRoSW5CcmFuY2guaGVpZ2h0ICs9IGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuRUxFTUVOVF9XSURUSF9ERUZBVUxUX0JSQU5DSF9XSEVOX05PVF9FTEVNRU5UO1xuICAgICAgICAgIGlmICh0aGVNb3N0RWxlbWVudHNJbkJyYW5jaC5oZWlnaHQgPCB3aWR0aEluQnJhbmNoLmhlaWdodCkge1xuICAgICAgICAgICAgdGhlTW9zdEVsZW1lbnRzSW5CcmFuY2guaGVpZ2h0ID0gd2lkdGhJbkJyYW5jaC5oZWlnaHQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBsdXNXaWR0aEVsZW1lbnRJbkJyYW5jaChicmFuY2guZWxlbWVudHMsIHdpZHRoSW5CcmFuY2gpO1xuICAgICAgICBpZiAodGhlTW9zdEVsZW1lbnRzSW5CcmFuY2guaGVpZ2h0IDwgd2lkdGhJbkJyYW5jaC5oZWlnaHQpIHtcbiAgICAgICAgICB0aGVNb3N0RWxlbWVudHNJbkJyYW5jaC5oZWlnaHQgPSB3aWR0aEluQnJhbmNoLmhlaWdodDtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHRvdGFsLmhlaWdodCArPSB0aGVNb3N0RWxlbWVudHNJbkJyYW5jaC5oZWlnaHQ7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVMOtbmggY2hp4buBdSBjYW8gKFkgc3BhbikgY+G7p2EgbeG7mXQgbmjDoW5oIOKAlCBkw7luZyDEkeG7gyBvZmZzZXQgY8OhYyBuaMOhbmggdHLDqm4vZMaw4bubaS5cbiAgICogVHJvbmcgaG9yaXpvbnRhbCBjb250ZXh0OiBt4buXaSBuaMOhbmggdHLhuqNpIGTDoGkgdGhlbyBZIChsw6puL3h14buRbmcpLlxuICAgKi9cbiAgc3RhdGljIGNhbGN1bGF0b3JIZWlnaHRCcmFuY2goZWxlbWVudHM6IElEaWFncmFtRWxlbWVudFtdIHwgdW5kZWZpbmVkLCBtYXhXaWR0aDogeyB3aWR0aDogbnVtYmVyOyBhYm92ZVdpZHRoOiBudW1iZXI7IHVuZGVyV2lkdGg6IG51bWJlciB9KSB7XG4gICAgaWYgKCFlbGVtZW50cz8ubGVuZ3RoKSB7XG4gICAgICBjb25zdCB3ID0gY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5ERUZBVUxUX0JSQU5DSF9XSEVOX05PX0VMRU1FTlQ7XG5cbiAgICAgIG1heFdpZHRoLndpZHRoID0gdztcbiAgICAgIG1heFdpZHRoLmFib3ZlV2lkdGggPSB3IC8gMjtcbiAgICAgIG1heFdpZHRoLnVuZGVyV2lkdGggPSB3IC8gMjtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG1heFdpZHRoSW5FbGVtZW50cyA9IHsgd2lkdGg6IDAsIGFib3ZlV2lkdGg6IDAsIHVuZGVyV2lkdGg6IDAgfTtcblxuICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgIGlmICghZWxlbWVudC5icmFuY2hlcz8ubGVuZ3RoKSB7XG4gICAgICAgIC8vIGVsZW1lbnQga2jDtG5nIG5ow6FuaDogZMO5bmcgc3BlY2lmaWNfaGVpZ2h0IGzDoG0gWSBzcGFuXG4gICAgICAgIGlmICgoZWxlbWVudC5zcGVjaWZpY19oZWlnaHQgPz8gMCkgPCBtYXhXaWR0aEluRWxlbWVudHMud2lkdGgpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaCA9IGVsZW1lbnQuc3BlY2lmaWNfaGVpZ2h0ID8/IDA7XG5cbiAgICAgICAgbWF4V2lkdGhJbkVsZW1lbnRzLndpZHRoID0gaDtcbiAgICAgICAgbWF4V2lkdGhJbkVsZW1lbnRzLmFib3ZlV2lkdGggPSBoIC8gMjtcbiAgICAgICAgbWF4V2lkdGhJbkVsZW1lbnRzLnVuZGVyV2lkdGggPSBoIC8gMjtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHdpZHRoRWxlbWVudEluY2x1ZGVCcmFuY2ggPSB7IHdpZHRoOiAwLCBhYm92ZVdpZHRoOiAwLCB1bmRlcldpZHRoOiAwIH07XG4gICAgICBjb25zdCBoID0gZWxlbWVudC5zcGVjaWZpY19oZWlnaHQgPz8gMDtcblxuICAgICAgaWYgKGggPiB3aWR0aEVsZW1lbnRJbmNsdWRlQnJhbmNoLndpZHRoKSB7XG4gICAgICAgIHdpZHRoRWxlbWVudEluY2x1ZGVCcmFuY2gud2lkdGggPSBoO1xuICAgICAgICB3aWR0aEVsZW1lbnRJbmNsdWRlQnJhbmNoLmFib3ZlV2lkdGggPSBoIC8gMjtcbiAgICAgICAgd2lkdGhFbGVtZW50SW5jbHVkZUJyYW5jaC51bmRlcldpZHRoID0gaCAvIDI7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhhbGYgPSBNYXRoLmNlaWwoZWxlbWVudC5icmFuY2hlcy5sZW5ndGggLyAyKTtcbiAgICAgIGNvbnN0IGFib3ZlSGFsZiA9IGVsZW1lbnQuYnJhbmNoZXMuc2xpY2UoMCwgaGFsZik7XG4gICAgICBjb25zdCB1bmRlckhhbGYgPSBlbGVtZW50LmJyYW5jaGVzLnNsaWNlKGhhbGYpO1xuICAgICAgbGV0IGJyYWNoTWlkZGxlOiBJRGlhZ3JhbUVsZW1lbnRCcmFuY2ggfCB1bmRlZmluZWQ7XG5cbiAgICAgIGlmIChhYm92ZUhhbGYubGVuZ3RoICE9PSB1bmRlckhhbGYubGVuZ3RoKSB7XG4gICAgICAgIGJyYWNoTWlkZGxlID0gYWJvdmVIYWxmLnBvcCgpO1xuICAgICAgfVxuICAgICAgaWYgKGJyYWNoTWlkZGxlKSBicmFjaE1pZGRsZS5vblRoZVNpZGUgPSAnY2VudGVyJztcbiAgICAgIGFib3ZlSGFsZi5mb3JFYWNoKChicmFuY2gpID0+IChicmFuY2gub25UaGVTaWRlID0gJ2Fib3ZlJykpO1xuICAgICAgdW5kZXJIYWxmLmZvckVhY2goKGJyYW5jaCkgPT4gKGJyYW5jaC5vblRoZVNpZGUgPSAndW5kZXInKSk7XG5cbiAgICAgIGNvbnN0IHdpZHRoQnJhbmNoID0geyB3aWR0aDogMCwgYWJvdmVXaWR0aDogMCwgdW5kZXJXaWR0aDogMCB9O1xuXG4gICAgICBlbGVtZW50LmJyYW5jaGVzLmZvckVhY2goKGJyYW5jaCkgPT4ge1xuICAgICAgICBjb25zdCB3ID0geyB3aWR0aDogMCwgYWJvdmVXaWR0aDogMCwgdW5kZXJXaWR0aDogMCB9O1xuXG4gICAgICAgIHRoaXMuY2FsY3VsYXRvckhlaWdodEJyYW5jaChicmFuY2guZWxlbWVudHMsIHcpO1xuICAgICAgICBzd2l0Y2ggKGJyYW5jaC5vblRoZVNpZGUpIHtcbiAgICAgICAgICBjYXNlICdhYm92ZSc6XG4gICAgICAgICAgICB3aWR0aEJyYW5jaC5hYm92ZVdpZHRoICs9IHcud2lkdGg7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICd1bmRlcic6XG4gICAgICAgICAgICB3aWR0aEJyYW5jaC51bmRlcldpZHRoICs9IHcud2lkdGg7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdjZW50ZXInOlxuICAgICAgICAgICAgd2lkdGhCcmFuY2guYWJvdmVXaWR0aCArPSB3LmFib3ZlV2lkdGg7XG4gICAgICAgICAgICB3aWR0aEJyYW5jaC51bmRlcldpZHRoICs9IHcudW5kZXJXaWR0aDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgbWFyZ2luQmV0d2VlbkJyYW5jaCA9IChlbGVtZW50LmJyYW5jaGVzLmxlbmd0aCAtIDEpICogY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5FTEVNRU5UX01BUkdJTl9CRVRXRUVOX0JSQU5DSF9ERUZBVUxUO1xuXG4gICAgICB3aWR0aEJyYW5jaC5hYm92ZVdpZHRoICs9IG1hcmdpbkJldHdlZW5CcmFuY2ggLyAyO1xuICAgICAgd2lkdGhCcmFuY2gudW5kZXJXaWR0aCArPSBtYXJnaW5CZXR3ZWVuQnJhbmNoIC8gMjtcbiAgICAgIGNvbnN0IG1heEFib3ZlV2lkdGggPSBNYXRoLm1heCh3aWR0aEVsZW1lbnRJbmNsdWRlQnJhbmNoLmFib3ZlV2lkdGgsIHdpZHRoQnJhbmNoLmFib3ZlV2lkdGgpO1xuICAgICAgY29uc3QgbWF4VW5kZXJXaWR0aCA9IE1hdGgubWF4KHdpZHRoRWxlbWVudEluY2x1ZGVCcmFuY2gudW5kZXJXaWR0aCwgd2lkdGhCcmFuY2gudW5kZXJXaWR0aCk7XG5cbiAgICAgIGlmIChtYXhXaWR0aEluRWxlbWVudHMuYWJvdmVXaWR0aCA8IG1heEFib3ZlV2lkdGgpIHtcbiAgICAgICAgbWF4V2lkdGhJbkVsZW1lbnRzLmFib3ZlV2lkdGggPSBtYXhBYm92ZVdpZHRoO1xuICAgICAgfVxuICAgICAgaWYgKG1heFdpZHRoSW5FbGVtZW50cy51bmRlcldpZHRoIDwgbWF4VW5kZXJXaWR0aCkge1xuICAgICAgICBtYXhXaWR0aEluRWxlbWVudHMudW5kZXJXaWR0aCA9IG1heFVuZGVyV2lkdGg7XG4gICAgICB9XG5cbiAgICAgIG1heFdpZHRoSW5FbGVtZW50cy53aWR0aCA9IG1heFdpZHRoSW5FbGVtZW50cy5hYm92ZVdpZHRoICsgbWF4V2lkdGhJbkVsZW1lbnRzLnVuZGVyV2lkdGg7XG4gICAgfSk7XG5cbiAgICBtYXhXaWR0aC53aWR0aCArPSBtYXhXaWR0aEluRWxlbWVudHMuYWJvdmVXaWR0aCArIG1heFdpZHRoSW5FbGVtZW50cy51bmRlcldpZHRoO1xuICAgIG1heFdpZHRoLmFib3ZlV2lkdGggKz0gbWF4V2lkdGhJbkVsZW1lbnRzLmFib3ZlV2lkdGg7XG4gICAgbWF4V2lkdGgudW5kZXJXaWR0aCArPSBtYXhXaWR0aEluRWxlbWVudHMudW5kZXJXaWR0aDtcbiAgfVxuXG4gIC8qKiBUw61uaCBraG/huqNuZyBjw6FjaCB0aMOqbSB2w6BvIHNhdSBlbGVtZW50IChiYW8gZ+G7k20gd2FpdCBjb25maWcgbuG6v3UgY8OzKSAqL1xuICBwcml2YXRlIHN0YXRpYyBjaGVja0VsZW1lbnRHZXRNYXJnaW4oaGFzV2FpdENvbmZpZz86IElEaWFncmFtRWxlbWVudCk6IG51bWJlciB7XG4gICAgaWYgKGhhc1dhaXRDb25maWcpIHtcbiAgICAgIHJldHVybiBjYW52YXNDb25maWdSZWFkb25seSgpLkRJU1RBTkNFX1RPX1dBSVQgKyB0aGlzLmdldFdpZHRoV2FpdENvbmZpZyhoYXNXYWl0Q29uZmlnKSArIGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuV0FJVF9UT19FTEVNRU5UO1xuICAgIH1cbiAgICByZXR1cm4gY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5FTEVNRU5UX01BUkdJTl9ERUZBVUxUO1xuICB9XG5cbiAgLyoqIFTDrW5oIGNoaeG7gXUgcuG7mW5nIGPhu6dhIHdhaXQgY29uZmlnIG5vZGUgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0V2lkdGhXYWl0Q29uZmlnKGhhc1dhaXRDb25maWc/OiBJRGlhZ3JhbUVsZW1lbnQpOiBudW1iZXIge1xuICAgIGlmIChoYXNXYWl0Q29uZmlnKSB7XG4gICAgICByZXR1cm4gKGhhc1dhaXRDb25maWcuc3BlY2lmaWNfd2lkdGggPz8gY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5FTEVNRU5UX1dBSVRfREVGQVVMVCkgKyBjYW52YXNDb25maWdSZWFkb25seSgpLkRJU1RBTkNFX1dBSVRfVE9fTkVYVF9MSU5FO1xuICAgIH1cbiAgICByZXR1cm4gY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5FTEVNRU5UX1dBSVRfREVGQVVMVCArIGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuRElTVEFOQ0VfV0FJVF9UT19ORVhUX0xJTkU7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { DEFAULT_NAVIGATION_ARROW_STYLE, DEFAULT_NAVIGATION_ENDPOINT_GAP, DEFAULT_NAVIGATION_LINE_STYLE } from './navigation-style.define';
|
|
2
|
+
export class LibsUiDiagramDrawNavigationUtil {
|
|
3
|
+
/** Rule chọn mode mặc định (copy từ workflows/canvas.component.ts:471). */
|
|
4
|
+
static defaultModeResolver(start, end) {
|
|
5
|
+
return start.x < end.x && start.y > end.y ? 'quart-in' : 's-line';
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Build dữ liệu navigation line (next_other_id) từ flat elements để render qua draw-line directive.
|
|
9
|
+
* @param flatElements Danh sách phẳng tất cả elements (sau khi configXYElements đã chạy).
|
|
10
|
+
* @param orientation Chiều layout của diagram.
|
|
11
|
+
* @param styleConfig Tuỳ chỉnh style line/arrow + override resolver mode/gap.
|
|
12
|
+
*/
|
|
13
|
+
static buildNavigationData(flatElements, orientation, styleConfig) {
|
|
14
|
+
const result = [];
|
|
15
|
+
flatElements.forEach((item) => {
|
|
16
|
+
if (item.branches?.length) {
|
|
17
|
+
item.branches.forEach((branch, index) => {
|
|
18
|
+
if (!branch.next_other_id?.length || !branch.nodeOtherConfig) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const nodeOtherConfig = branch.nodeOtherConfig;
|
|
22
|
+
const nextIds = branch.next_other_id;
|
|
23
|
+
nextIds.forEach((nextId, idx) => {
|
|
24
|
+
const target = flatElements.find((el) => el.id === nextId);
|
|
25
|
+
if (!target) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const lineId = nextIds.length > 1 ? `${item.id}_branch_${index}_${idx}` : `${item.id}_branch_${index}`;
|
|
29
|
+
const lineData = this.buildOneLine(lineId, nodeOtherConfig, target, orientation, styleConfig);
|
|
30
|
+
if (lineData) {
|
|
31
|
+
result.push(lineData);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
if (!item.next_other_id?.length || !item.nodeOtherConfig) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const nodeOtherConfig = item.nodeOtherConfig;
|
|
41
|
+
const nextIds = item.next_other_id;
|
|
42
|
+
nextIds.forEach((nextId, idx) => {
|
|
43
|
+
const target = flatElements.find((el) => el.id === nextId);
|
|
44
|
+
if (!target) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const lineId = nextIds.length > 1 ? `${item.id ?? ''}_${idx}` : (item.id ?? '');
|
|
48
|
+
const lineData = this.buildOneLine(lineId, nodeOtherConfig, target, orientation, styleConfig);
|
|
49
|
+
if (lineData) {
|
|
50
|
+
result.push(lineData);
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
return result;
|
|
55
|
+
}
|
|
56
|
+
static buildOneLine(id, source, target, orientation, styleConfig) {
|
|
57
|
+
const gap = styleConfig?.endpointGap ?? DEFAULT_NAVIGATION_ENDPOINT_GAP;
|
|
58
|
+
const points = orientation === 'horizontal' ? this.calcPointsHorizontal(source, target, gap) : this.calcPointsVertical(source, target, gap);
|
|
59
|
+
if (!points) {
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
const resolver = styleConfig?.modeResolver ?? this.defaultModeResolver;
|
|
63
|
+
const mode = resolver(points.start, points.end);
|
|
64
|
+
return {
|
|
65
|
+
id,
|
|
66
|
+
points,
|
|
67
|
+
mode,
|
|
68
|
+
lineStyle: { ...DEFAULT_NAVIGATION_LINE_STYLE, ...styleConfig?.lineStyle },
|
|
69
|
+
arrowStyle: { ...DEFAULT_NAVIGATION_ARROW_STYLE, ...styleConfig?.arrowStyle },
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/** VERTICAL: line navigation đi NGANG — kẹp cạnh phải/trái source → cạnh trái/phải target. */
|
|
73
|
+
static calcPointsVertical(source, target, gap) {
|
|
74
|
+
const sx = source.specific_x ?? 0;
|
|
75
|
+
const sy = source.specific_y ?? 0;
|
|
76
|
+
const sw = source.specific_width ?? 0;
|
|
77
|
+
const sh = source.specific_height ?? 0;
|
|
78
|
+
const tx = target.specific_x ?? 0;
|
|
79
|
+
const ty = target.specific_y ?? 0;
|
|
80
|
+
const tw = target.specific_width ?? 0;
|
|
81
|
+
const th = target.specific_height ?? 0;
|
|
82
|
+
const sMidY = sy + sh / 2;
|
|
83
|
+
const tMidY = ty + th / 2;
|
|
84
|
+
// Default: line đi sang PHẢI từ source → cạnh TRÁI target
|
|
85
|
+
let start = { x: sx + sw, y: sMidY };
|
|
86
|
+
let end = { x: tx - gap, y: tMidY };
|
|
87
|
+
// Source nằm BÊN PHẢI target → line đi sang TRÁI: cạnh TRÁI source → cạnh PHẢI target
|
|
88
|
+
if (sx > tx + tw) {
|
|
89
|
+
start = { x: sx, y: sMidY };
|
|
90
|
+
end = { x: tx + tw + gap, y: tMidY };
|
|
91
|
+
return { start, end };
|
|
92
|
+
}
|
|
93
|
+
// Source nằm PHÍA TRÊN target (cùng cột hoặc gần) → đi XUỐNG vào cạnh TRÊN target
|
|
94
|
+
if (sy < ty && Math.abs(sx + sw / 2 - (tx + tw / 2)) < Math.max(sw, tw)) {
|
|
95
|
+
start = { x: sx + sw / 2, y: sy + sh };
|
|
96
|
+
end = { x: tx + tw / 2, y: ty - gap };
|
|
97
|
+
}
|
|
98
|
+
return { start, end };
|
|
99
|
+
}
|
|
100
|
+
/** HORIZONTAL: line navigation đi DỌC — kẹp cạnh dưới/trên source → cạnh trên/dưới target. */
|
|
101
|
+
static calcPointsHorizontal(source, target, gap) {
|
|
102
|
+
const sx = source.specific_x ?? 0;
|
|
103
|
+
const sy = source.specific_y ?? 0;
|
|
104
|
+
const sw = source.specific_width ?? 0;
|
|
105
|
+
const tx = target.specific_x ?? 0;
|
|
106
|
+
const ty = target.specific_y ?? 0;
|
|
107
|
+
const tw = target.specific_width ?? 0;
|
|
108
|
+
const th = target.specific_height ?? 0;
|
|
109
|
+
// Default: line đi XUỐNG từ source → cạnh TRÊN target
|
|
110
|
+
const start = { x: sx + sw, y: sy };
|
|
111
|
+
const end = { x: tx - gap, y: ty + th / 2 };
|
|
112
|
+
if (sy < ty) {
|
|
113
|
+
end.x = tx + tw / 2;
|
|
114
|
+
end.y = ty - gap;
|
|
115
|
+
}
|
|
116
|
+
return { start, end };
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQtbmF2aWdhdGlvbi1kYXRhLnV0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL3NlcnZpY2VzL2RpYWdyYW0tZHJhdy9zcmMvdXRpbHMvbmF2aWdhdGlvbi9idWlsZC1uYXZpZ2F0aW9uLWRhdGEudXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUUsOEJBQThCLEVBQUUsK0JBQStCLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUUzSSxNQUFNLE9BQU8sK0JBQStCO0lBQzFDLDJFQUEyRTtJQUMzRSxNQUFNLENBQUMsbUJBQW1CLENBQUMsS0FBK0IsRUFBRSxHQUE2QjtRQUN2RixPQUFPLEtBQUssQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO0lBQ3BFLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxZQUErQixFQUFFLFdBQXNDLEVBQUUsV0FBd0M7UUFDMUksTUFBTSxNQUFNLEdBQXlCLEVBQUUsQ0FBQztRQUV4QyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDNUIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDO2dCQUMxQixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRTtvQkFDdEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRSxDQUFDO3dCQUM3RCxPQUFPO29CQUNULENBQUM7b0JBQ0QsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQztv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SUFFRCw4RkFBOEY7SUFDdEYsTUFBTSxDQUFDLG9CQUFvQixDQUFDLE1BQXVCLEVBQUUsTUFBdUIsRUFBRSxHQUFXO1FBQy9GLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxjQUFjLElBQUksQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxjQUFjLElBQUksQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxlQUFlLElBQUksQ0FBQyxDQUFDO1FBRXZDLHNEQUFzRDtRQUN0RCxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUNwQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBRTVDLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDO1lBQ1osR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNwQixHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7UUFDbkIsQ0FBQztRQUNELE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDeEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSURyYXdMaW5lRGF0YUlucHV0LCBJUG9pbnRzLCBUWVBFX01PREUgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWRyYXctbGluZSc7XG5pbXBvcnQgeyBJRGlhZ3JhbUVsZW1lbnQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2RpYWdyYW0uaW50ZXJmYWNlJztcbmltcG9ydCB7IElOYXZpZ2F0aW9uTGluZVN0eWxlQ29uZmlnIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9uYXZpZ2F0aW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBERUZBVUxUX05BVklHQVRJT05fQVJST1dfU1RZTEUsIERFRkFVTFRfTkFWSUdBVElPTl9FTkRQT0lOVF9HQVAsIERFRkFVTFRfTkFWSUdBVElPTl9MSU5FX1NUWUxFIH0gZnJvbSAnLi9uYXZpZ2F0aW9uLXN0eWxlLmRlZmluZSc7XG5cbmV4cG9ydCBjbGFzcyBMaWJzVWlEaWFncmFtRHJhd05hdmlnYXRpb25VdGlsIHtcbiAgLyoqIFJ1bGUgY2jhu41uIG1vZGUgbeG6t2MgxJHhu4tuaCAoY29weSB04burIHdvcmtmbG93cy9jYW52YXMuY29tcG9uZW50LnRzOjQ3MSkuICovXG4gIHN0YXRpYyBkZWZhdWx0TW9kZVJlc29sdmVyKHN0YXJ0OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0sIGVuZDogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9KTogVFlQRV9NT0RFIHtcbiAgICByZXR1cm4gc3RhcnQueCA8IGVuZC54ICYmIHN0YXJ0LnkgPiBlbmQueSA/ICdxdWFydC1pbicgOiAncy1saW5lJztcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBk4buvIGxp4buHdSBuYXZpZ2F0aW9uIGxpbmUgKG5leHRfb3RoZXJfaWQpIHThu6sgZmxhdCBlbGVtZW50cyDEkeG7gyByZW5kZXIgcXVhIGRyYXctbGluZSBkaXJlY3RpdmUuXG4gICAqIEBwYXJhbSBmbGF0RWxlbWVudHMgRGFuaCBzw6FjaCBwaOG6s25nIHThuqV0IGPhuqMgZWxlbWVudHMgKHNhdSBraGkgY29uZmlnWFlFbGVtZW50cyDEkcOjIGNo4bqheSkuXG4gICAqIEBwYXJhbSBvcmllbnRhdGlvbiBDaGnhu4F1IGxheW91dCBj4bunYSBkaWFncmFtLlxuICAgKiBAcGFyYW0gc3R5bGVDb25maWcgVHXhu7MgY2jhu4luaCBzdHlsZSBsaW5lL2Fycm93ICsgb3ZlcnJpZGUgcmVzb2x2ZXIgbW9kZS9nYXAuXG4gICAqL1xuICBzdGF0aWMgYnVpbGROYXZpZ2F0aW9uRGF0YShmbGF0RWxlbWVudHM6IElEaWFncmFtRWxlbWVudFtdLCBvcmllbnRhdGlvbjogJ3ZlcnRpY2FsJyB8ICdob3Jpem9udGFsJywgc3R5bGVDb25maWc/OiBJTmF2aWdhdGlvbkxpbmVTdHlsZUNvbmZpZyk6IElEcmF3TGluZURhdGFJbnB1dFtdIHtcbiAgICBjb25zdCByZXN1bHQ6IElEcmF3TGluZURhdGFJbnB1dFtdID0gW107XG5cbiAgICBmbGF0RWxlbWVudHMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgaWYgKGl0ZW0uYnJhbmNoZXM/Lmxlbmd0aCkge1xuICAgICAgICBpdGVtLmJyYW5jaGVzLmZvckVhY2goKGJyYW5jaCwgaW5kZXgpID0+IHtcbiAgICAgICAgICBpZiAoIWJyYW5jaC5uZXh0X290aGVyX2lkPy5sZW5ndGggfHwgIWJyYW5jaC5ub2RlT3RoZXJDb25maWcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgbm9kZU90aGVyQ29uZmlnID0gYnJhbmNoLm5vZGVPdGhlckNvbmZpZztcbiAgICAgICAgICBjb25zdCBuZXh0SWRzID0gYnJhbmNoLm5leHRfb3RoZXJfaWQ7XG5cbiAgICAgICAgICBuZXh0SWRzLmZvckVhY2goKG5leHRJZCwgaWR4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBmbGF0RWxlbWVudHMuZmluZCgoZWwpID0+IGVsLmlkID09PSBuZXh0SWQpO1xuXG4gICAgICAgICAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBsaW5lSWQgPSBuZXh0SWRzLmxlbmd0aCA+IDEgPyBgJHtpdGVtLmlkfV9icmFuY2hfJHtpbmRleH1fJHtpZHh9YCA6IGAke2l0ZW0uaWR9X2JyYW5jaF8ke2luZGV4fWA7XG4gICAgICAgICAgICBjb25zdCBsaW5lRGF0YSA9IHRoaXMuYnVpbGRPbmVMaW5lKGxpbmVJZCwgbm9kZU90aGVyQ29uZmlnLCB0YXJnZXQsIG9yaWVudGF0aW9uLCBzdHlsZUNvbmZpZyk7XG5cbiAgICAgICAgICAgIGlmIChsaW5lRGF0YSkge1xuICAgICAgICAgICAgICByZXN1bHQucHVzaChsaW5lRGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICghaXRlbS5uZXh0X290aGVyX2lkPy5sZW5ndGggfHwgIWl0ZW0ubm9kZU90aGVyQ29uZmlnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5vZGVPdGhlckNvbmZpZyA9IGl0ZW0ubm9kZU90aGVyQ29uZmlnO1xuICAgICAgY29uc3QgbmV4dElkcyA9IGl0ZW0ubmV4dF9vdGhlcl9pZDtcblxuICAgICAgbmV4dElkcy5mb3JFYWNoKChuZXh0SWQsIGlkeCkgPT4ge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBmbGF0RWxlbWVudHMuZmluZCgoZWwpID0+IGVsLmlkID09PSBuZXh0SWQpO1xuXG4gICAgICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxpbmVJZCA9IG5leHRJZHMubGVuZ3RoID4gMSA/IGAke2l0ZW0uaWQgPz8gJyd9XyR7aWR4fWAgOiAoaXRlbS5pZCA/PyAnJyk7XG4gICAgICAgIGNvbnN0IGxpbmVEYXRhID0gdGhpcy5idWlsZE9uZUxpbmUobGluZUlkLCBub2RlT3RoZXJDb25maWcsIHRhcmdldCwgb3JpZW50YXRpb24sIHN0eWxlQ29uZmlnKTtcblxuICAgICAgICBpZiAobGluZURhdGEpIHtcbiAgICAgICAgICByZXN1bHQucHVzaChsaW5lRGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGJ1aWxkT25lTGluZShpZDogc3RyaW5nLCBzb3VyY2U6IElEaWFncmFtRWxlbWVudCwgdGFyZ2V0OiBJRGlhZ3JhbUVsZW1lbnQsIG9yaWVudGF0aW9uOiAndmVydGljYWwnIHwgJ2hvcml6b250YWwnLCBzdHlsZUNvbmZpZz86IElOYXZpZ2F0aW9uTGluZVN0eWxlQ29uZmlnKTogSURyYXdMaW5lRGF0YUlucHV0IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBnYXAgPSBzdHlsZUNvbmZpZz8uZW5kcG9pbnRHYXAgPz8gREVGQVVMVF9OQVZJR0FUSU9OX0VORFBPSU5UX0dBUDtcbiAgICBjb25zdCBwb2ludHMgPSBvcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnID8gdGhpcy5jYWxjUG9pbnRzSG9yaXpvbnRhbChzb3VyY2UsIHRhcmdldCwgZ2FwKSA6IHRoaXMuY2FsY1BvaW50c1ZlcnRpY2FsKHNvdXJjZSwgdGFyZ2V0LCBnYXApO1xuXG4gICAgaWYgKCFwb2ludHMpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IHJlc29sdmVyID0gc3R5bGVDb25maWc/Lm1vZGVSZXNvbHZlciA/PyB0aGlzLmRlZmF1bHRNb2RlUmVzb2x2ZXI7XG4gICAgY29uc3QgbW9kZSA9IHJlc29sdmVyKHBvaW50cy5zdGFydCwgcG9pbnRzLmVuZCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQsXG4gICAgICBwb2ludHMsXG4gICAgICBtb2RlLFxuICAgICAgbGluZVN0eWxlOiB7IC4uLkRFRkFVTFRfTkFWSUdBVElPTl9MSU5FX1NUWUxFLCAuLi5zdHlsZUNvbmZpZz8ubGluZVN0eWxlIH0sXG4gICAgICBhcnJvd1N0eWxlOiB7IC4uLkRFRkFVTFRfTkFWSUdBVElPTl9BUlJPV19TVFlMRSwgLi4uc3R5bGVDb25maWc/LmFycm93U3R5bGUgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFZFUlRJQ0FMOiBsaW5lIG5hdmlnYXRpb24gxJFpIE5HQU5HIOKAlCBr4bq5cCBj4bqhbmggcGjhuqNpL3Ryw6FpIHNvdXJjZSDihpIgY+G6oW5oIHRyw6FpL3Bo4bqjaSB0YXJnZXQuICovXG4gIHByaXZhdGUgc3RhdGljIGNhbGNQb2ludHNWZXJ0aWNhbChzb3VyY2U6IElEaWFncmFtRWxlbWVudCwgdGFyZ2V0OiBJRGlhZ3JhbUVsZW1lbnQsIGdhcDogbnVtYmVyKTogSVBvaW50cyB7XG4gICAgY29uc3Qgc3ggPSBzb3VyY2Uuc3BlY2lmaWNfeCA/PyAwO1xuICAgIGNvbnN0IHN5ID0gc291cmNlLnNwZWNpZmljX3kgPz8gMDtcbiAgICBjb25zdCBzdyA9IHNvdXJjZS5zcGVjaWZpY193aWR0aCA/PyAwO1xuICAgIGNvbnN0IHNoID0gc291cmNlLnNwZWNpZmljX2hlaWdodCA/PyAwO1xuICAgIGNvbnN0IHR4ID0gdGFyZ2V0LnNwZWNpZmljX3ggPz8gMDtcbiAgICBjb25zdCB0eSA9IHRhcmdldC5zcGVjaWZpY195ID8/IDA7XG4gICAgY29uc3QgdHcgPSB0YXJnZXQuc3BlY2lmaWNfd2lkdGggPz8gMDtcbiAgICBjb25zdCB0aCA9IHRhcmdldC5zcGVjaWZpY19oZWlnaHQgPz8gMDtcblxuICAgIGNvbnN0IHNNaWRZID0gc3kgKyBzaCAvIDI7XG4gICAgY29uc3QgdE1pZFkgPSB0eSArIHRoIC8gMjtcblxuICAgIC8vIERlZmF1bHQ6IGxpbmUgxJFpIHNhbmcgUEjhuqJJIHThu6sgc291cmNlIOKGkiBj4bqhbmggVFLDgUkgdGFyZ2V0XG4gICAgbGV0IHN0YXJ0ID0geyB4OiBzeCArIHN3LCB5OiBzTWlkWSB9O1xuICAgIGxldCBlbmQgPSB7IHg6IHR4IC0gZ2FwLCB5OiB0TWlkWSB9O1xuXG4gICAgLy8gU291cmNlIG7hurFtIELDik4gUEjhuqJJIHRhcmdldCDihpIgbGluZSDEkWkgc2FuZyBUUsOBSTogY+G6oW5oIFRSw4FJIHNvdXJjZSDihpIgY+G6oW5oIFBI4bqiSSB0YXJnZXRcbiAgICBpZiAoc3ggPiB0eCArIHR3KSB7XG4gICAgICBzdGFydCA9IHsgeDogc3gsIHk6IHNNaWRZIH07XG4gICAgICBlbmQgPSB7IHg6IHR4ICsgdHcgKyBnYXAsIHk6IHRNaWRZIH07XG4gICAgICByZXR1cm4geyBzdGFydCwgZW5kIH07XG4gICAgfVxuXG4gICAgLy8gU291cmNlIG7hurFtIFBIw41BIFRSw4pOIHRhcmdldCAoY8O5bmcgY+G7mXQgaG/hurdjIGfhuqduKSDihpIgxJFpIFhV4buQTkcgdsOgbyBj4bqhbmggVFLDik4gdGFyZ2V0XG4gICAgaWYgKHN5IDwgdHkgJiYgTWF0aC5hYnMoc3ggKyBzdyAvIDIgLSAodHggKyB0dyAvIDIpKSA8IE1hdGgubWF4KHN3LCB0dykpIHtcbiAgICAgIHN0YXJ0ID0geyB4OiBzeCArIHN3IC8gMiwgeTogc3kgKyBzaCB9O1xuICAgICAgZW5kID0geyB4OiB0eCArIHR3IC8gMiwgeTogdHkgLSBnYXAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgc3RhcnQsIGVuZCB9O1xuICB9XG5cbiAgLyoqIEhPUklaT05UQUw6IGxpbmUgbmF2aWdhdGlvbiDEkWkgROG7jEMg4oCUIGvhurlwIGPhuqFuaCBkxrDhu5tpL3Ryw6puIHNvdXJjZSDihpIgY+G6oW5oIHRyw6puL2TGsOG7m2kgdGFyZ2V0LiAqL1xuICBwcml2YXRlIHN0YXRpYyBjYWxjUG9pbnRzSG9yaXpvbnRhbChzb3VyY2U6IElEaWFncmFtRWxlbWVudCwgdGFyZ2V0OiBJRGlhZ3JhbUVsZW1lbnQsIGdhcDogbnVtYmVyKTogSVBvaW50cyB7XG4gICAgY29uc3Qgc3ggPSBzb3VyY2Uuc3BlY2lmaWNfeCA/PyAwO1xuICAgIGNvbnN0IHN5ID0gc291cmNlLnNwZWNpZmljX3kgPz8gMDtcbiAgICBjb25zdCBzdyA9IHNvdXJjZS5zcGVjaWZpY193aWR0aCA/PyAwO1xuICAgIGNvbnN0IHR4ID0gdGFyZ2V0LnNwZWNpZmljX3ggPz8gMDtcbiAgICBjb25zdCB0eSA9IHRhcmdldC5zcGVjaWZpY195ID8/IDA7XG4gICAgY29uc3QgdHcgPSB0YXJnZXQuc3BlY2lmaWNfd2lkdGggPz8gMDtcbiAgICBjb25zdCB0aCA9IHRhcmdldC5zcGVjaWZpY19oZWlnaHQgPz8gMDtcblxuICAgIC8vIERlZmF1bHQ6IGxpbmUgxJFpIFhV4buQTkcgdOG7qyBzb3VyY2Ug4oaSIGPhuqFuaCBUUsOKTiB0YXJnZXRcbiAgICBjb25zdCBzdGFydCA9IHsgeDogc3ggKyBzdywgeTogc3kgfTtcbiAgICBjb25zdCBlbmQgPSB7IHg6IHR4IC0gZ2FwLCB5OiB0eSArIHRoIC8gMiB9O1xuXG4gICAgaWYgKHN5IDwgdHkpIHtcbiAgICAgIGVuZC54ID0gdHggKyB0dyAvIDI7XG4gICAgICBlbmQueSA9IHR5IC0gZ2FwO1xuICAgIH1cbiAgICByZXR1cm4geyBzdGFydCwgZW5kIH07XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export const DEFAULT_NAVIGATION_LINE_STYLE = {
|
|
2
|
+
curve: 10,
|
|
3
|
+
distancePoint: 20,
|
|
4
|
+
stroke: 'var(--libs-ui-color-light-1, #4e8cf7)',
|
|
5
|
+
strokeDasharray: '5',
|
|
6
|
+
strokeWidth: '1',
|
|
7
|
+
};
|
|
8
|
+
export const DEFAULT_NAVIGATION_ARROW_STYLE = {
|
|
9
|
+
width: 4,
|
|
10
|
+
height: 8,
|
|
11
|
+
fill: 'var(--libs-ui-color-light-1, #4e8cf7)',
|
|
12
|
+
};
|
|
13
|
+
export const DEFAULT_NAVIGATION_ENDPOINT_GAP = 8;
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2aWdhdGlvbi1zdHlsZS5kZWZpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL3NlcnZpY2VzL2RpYWdyYW0tZHJhdy9zcmMvdXRpbHMvbmF2aWdhdGlvbi9uYXZpZ2F0aW9uLXN0eWxlLmRlZmluZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLENBQUMsTUFBTSw2QkFBNkIsR0FBZTtJQUN2RCxLQUFLLEVBQUUsRUFBRTtJQUNULGFBQWEsRUFBRSxFQUFFO0lBQ2pCLE1BQU0sRUFBRSx1Q0FBdUM7SUFDL0MsZUFBZSxFQUFFLEdBQUc7SUFDcEIsV0FBVyxFQUFFLEdBQUc7Q0FDakIsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLDhCQUE4QixHQUFnQjtJQUN6RCxLQUFLLEVBQUUsQ0FBQztJQUNSLE1BQU0sRUFBRSxDQUFDO0lBQ1QsSUFBSSxFQUFFLHVDQUF1QztDQUM5QyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sK0JBQStCLEdBQUcsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSUFycm93U3R5bGUsIElMaW5lU3R5bGUgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWRyYXctbGluZSc7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX05BVklHQVRJT05fTElORV9TVFlMRTogSUxpbmVTdHlsZSA9IHtcbiAgY3VydmU6IDEwLFxuICBkaXN0YW5jZVBvaW50OiAyMCxcbiAgc3Ryb2tlOiAndmFyKC0tbGlicy11aS1jb2xvci1saWdodC0xLCAjNGU4Y2Y3KScsXG4gIHN0cm9rZURhc2hhcnJheTogJzUnLFxuICBzdHJva2VXaWR0aDogJzEnLFxufTtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfTkFWSUdBVElPTl9BUlJPV19TVFlMRTogSUFycm93U3R5bGUgPSB7XG4gIHdpZHRoOiA0LFxuICBoZWlnaHQ6IDgsXG4gIGZpbGw6ICd2YXIoLS1saWJzLXVpLWNvbG9yLWxpZ2h0LTEsICM0ZThjZjcpJyxcbn07XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX05BVklHQVRJT05fRU5EUE9JTlRfR0FQID0gODtcbiJdfQ==
|