@plait/draw 0.50.1 → 0.51.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -1
- package/constants/line.d.ts +1 -0
- package/engines/basic-shapes/ellipse.d.ts +1 -10
- package/engines/flowchart/terminal.d.ts +1 -0
- package/esm2022/constants/line.mjs +2 -1
- package/esm2022/engines/basic-shapes/comment.mjs +4 -5
- package/esm2022/engines/basic-shapes/ellipse.mjs +5 -29
- package/esm2022/engines/basic-shapes/parallelogram.mjs +3 -2
- package/esm2022/engines/basic-shapes/pentagon.mjs +3 -3
- package/esm2022/engines/basic-shapes/polygon.mjs +20 -4
- package/esm2022/engines/basic-shapes/process-arrow.mjs +3 -3
- package/esm2022/engines/basic-shapes/rectangle.mjs +4 -4
- package/esm2022/engines/basic-shapes/round-comment.mjs +4 -5
- package/esm2022/engines/basic-shapes/round-rectangle.mjs +3 -3
- package/esm2022/engines/basic-shapes/star.mjs +3 -3
- package/esm2022/engines/basic-shapes/trapezoid.mjs +3 -2
- package/esm2022/engines/basic-shapes/triangle.mjs +5 -4
- package/esm2022/engines/flowchart/delay.mjs +6 -6
- package/esm2022/engines/flowchart/manual-input.mjs +5 -4
- package/esm2022/engines/flowchart/manual-loop.mjs +3 -2
- package/esm2022/engines/flowchart/merge.mjs +4 -4
- package/esm2022/engines/flowchart/stored-data.mjs +16 -10
- package/esm2022/engines/flowchart/terminal.mjs +37 -27
- package/esm2022/generators/geometry-shape.generator.mjs +3 -3
- package/esm2022/generators/line-active.generator.mjs +52 -68
- package/esm2022/generators/line.generator.mjs +2 -2
- package/esm2022/geometry.component.mjs +7 -7
- package/esm2022/image.component.mjs +4 -4
- package/esm2022/interfaces/geometry.mjs +1 -1
- package/esm2022/interfaces/line.mjs +2 -2
- package/esm2022/line.component.mjs +42 -12
- package/esm2022/plugins/with-draw-fragment.mjs +3 -3
- package/esm2022/plugins/with-draw-hotkey.mjs +6 -6
- package/esm2022/plugins/with-draw-resize.mjs +149 -0
- package/esm2022/plugins/with-draw.mjs +14 -8
- package/esm2022/plugins/with-geometry-create.mjs +10 -10
- package/esm2022/plugins/with-geometry-resize.mjs +27 -74
- package/esm2022/plugins/with-line-auto-complete.mjs +17 -5
- package/esm2022/plugins/with-line-bound-reaction.mjs +6 -5
- package/esm2022/plugins/with-line-create.mjs +2 -2
- package/esm2022/plugins/with-line-resize.mjs +105 -19
- package/esm2022/plugins/with-line-text-move.mjs +5 -4
- package/esm2022/plugins/with-line-text.mjs +7 -5
- package/esm2022/transforms/geometry.mjs +4 -4
- package/esm2022/transforms/line.mjs +6 -8
- package/esm2022/utils/clipboard.mjs +2 -2
- package/esm2022/utils/geometry.mjs +16 -33
- package/esm2022/utils/hit.mjs +18 -10
- package/esm2022/utils/index.mjs +2 -2
- package/esm2022/utils/line/elbow.mjs +101 -0
- package/esm2022/utils/line/index.mjs +6 -0
- package/esm2022/utils/line/line-arrow.mjs +123 -0
- package/esm2022/utils/line/line-basic.mjs +258 -0
- package/esm2022/utils/line/line-common.mjs +111 -0
- package/esm2022/utils/line/line-resize.mjs +313 -0
- package/esm2022/utils/polygon.mjs +30 -0
- package/esm2022/utils/position/geometry.mjs +5 -6
- package/esm2022/utils/position/line.mjs +38 -15
- package/esm2022/utils/resize-align-reaction.mjs +316 -0
- package/esm2022/utils/resize-align.mjs +37 -0
- package/fesm2022/plait-draw.mjs +2117 -1152
- package/fesm2022/plait-draw.mjs.map +1 -1
- package/generators/line-active.generator.d.ts +4 -2
- package/interfaces/geometry.d.ts +1 -0
- package/interfaces/line.d.ts +4 -0
- package/package.json +1 -1
- package/plugins/with-draw-resize.d.ts +13 -0
- package/utils/geometry.d.ts +1 -3
- package/utils/hit.d.ts +3 -1
- package/utils/index.d.ts +1 -1
- package/utils/line/elbow.d.ts +19 -0
- package/utils/line/index.d.ts +5 -0
- package/utils/{line-arrow.d.ts → line/line-arrow.d.ts} +1 -1
- package/utils/line/line-basic.d.ts +13 -0
- package/utils/line/line-common.d.ts +35 -0
- package/utils/line/line-resize.d.ts +23 -0
- package/utils/polygon.d.ts +4 -0
- package/utils/position/geometry.d.ts +2 -3
- package/utils/position/line.d.ts +4 -2
- package/utils/resize-align-reaction.d.ts +42 -0
- package/utils/resize-align.d.ts +8 -0
- package/esm2022/utils/line-arrow.mjs +0 -123
- package/esm2022/utils/line.mjs +0 -392
- package/utils/line.d.ts +0 -25
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { arrowPoints, createG, createPath, distanceBetweenPointAndPoint, drawLinearPath, rotate } from '@plait/core';
|
|
2
|
+
import { LineMarkerType, PlaitLine } from '../../interfaces';
|
|
3
|
+
import { getExtendPoint, getUnitVectorByPointAndPoint } from '@plait/common';
|
|
4
|
+
import { getStrokeWidthByElement } from '../style';
|
|
5
|
+
const ARROW_LENGTH = 20;
|
|
6
|
+
export const drawLineArrow = (element, points, options) => {
|
|
7
|
+
const arrowG = createG();
|
|
8
|
+
if (PlaitLine.isSourceMark(element, LineMarkerType.none) && PlaitLine.isTargetMark(element, LineMarkerType.none)) {
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
const strokeWidth = getStrokeWidthByElement(element);
|
|
12
|
+
const offset = (strokeWidth * strokeWidth) / 3;
|
|
13
|
+
if (points.length === 1) {
|
|
14
|
+
points = [points[0], [points[0][0] + 0.1, points[0][1]]];
|
|
15
|
+
}
|
|
16
|
+
if (!PlaitLine.isSourceMark(element, LineMarkerType.none)) {
|
|
17
|
+
const source = getExtendPoint(points[0], points[1], ARROW_LENGTH + offset);
|
|
18
|
+
const sourceArrow = getArrow(element, { marker: element.source.marker, source, target: points[0], isSource: true }, options);
|
|
19
|
+
sourceArrow && arrowG.appendChild(sourceArrow);
|
|
20
|
+
}
|
|
21
|
+
if (!PlaitLine.isTargetMark(element, LineMarkerType.none)) {
|
|
22
|
+
const source = getExtendPoint(points[points.length - 1], points[points.length - 2], ARROW_LENGTH + offset);
|
|
23
|
+
const arrow = getArrow(element, { marker: element.target.marker, source, target: points[points.length - 1], isSource: false }, options);
|
|
24
|
+
arrow && arrowG.appendChild(arrow);
|
|
25
|
+
}
|
|
26
|
+
return arrowG;
|
|
27
|
+
};
|
|
28
|
+
const getArrow = (element, arrowOptions, options) => {
|
|
29
|
+
const { marker, target, source, isSource } = arrowOptions;
|
|
30
|
+
let targetArrow;
|
|
31
|
+
switch (marker) {
|
|
32
|
+
case LineMarkerType.openTriangle: {
|
|
33
|
+
targetArrow = drawOpenTriangle(element, source, target, options);
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
case LineMarkerType.solidTriangle: {
|
|
37
|
+
targetArrow = drawSolidTriangle(source, target, options);
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
40
|
+
case LineMarkerType.arrow: {
|
|
41
|
+
targetArrow = drawArrow(element, source, target, options);
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
case LineMarkerType.sharpArrow: {
|
|
45
|
+
targetArrow = drawSharpArrow(source, target, options);
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
case LineMarkerType.oneSideUp: {
|
|
49
|
+
targetArrow = drawOneSideArrow(source, target, isSource ? 'down' : 'up', options);
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
case LineMarkerType.oneSideDown: {
|
|
53
|
+
targetArrow = drawOneSideArrow(source, target, isSource ? 'up' : 'down', options);
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
case LineMarkerType.hollowTriangle: {
|
|
57
|
+
targetArrow = drawHollowTriangleArrow(source, target, options);
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
case LineMarkerType.singleSlash: {
|
|
61
|
+
targetArrow = drawSingleSlash(source, target, isSource, options);
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return targetArrow;
|
|
66
|
+
};
|
|
67
|
+
const drawSharpArrow = (source, target, options) => {
|
|
68
|
+
const startPoint = target;
|
|
69
|
+
const { pointLeft, pointRight } = arrowPoints(source, target, 20);
|
|
70
|
+
const g = createG();
|
|
71
|
+
const path = createPath();
|
|
72
|
+
let polylinePath = `M${pointRight[0]},${pointRight[1]}A25,25,20,0,1,${pointLeft[0]},${pointLeft[1]}L${startPoint[0]},${startPoint[1]}Z`;
|
|
73
|
+
path.setAttribute('d', polylinePath);
|
|
74
|
+
path.setAttribute('stroke', `${options?.stroke}`);
|
|
75
|
+
path.setAttribute('stroke-width', `${options?.strokeWidth}`);
|
|
76
|
+
path.setAttribute('fill', `${options?.stroke}`);
|
|
77
|
+
g.appendChild(path);
|
|
78
|
+
return g;
|
|
79
|
+
};
|
|
80
|
+
const drawArrow = (element, source, target, options) => {
|
|
81
|
+
const unitVector = getUnitVectorByPointAndPoint(source, target);
|
|
82
|
+
const strokeWidth = getStrokeWidthByElement(element);
|
|
83
|
+
const endPoint = [target[0] + (strokeWidth * unitVector[0]) / 2, target[1] + (strokeWidth * unitVector[1]) / 2];
|
|
84
|
+
const distance = distanceBetweenPointAndPoint(...source, ...endPoint);
|
|
85
|
+
const middlePoint = [
|
|
86
|
+
endPoint[0] - (((distance * 3) / 5 + strokeWidth) / 2) * unitVector[0],
|
|
87
|
+
endPoint[1] - (((distance * 3) / 5 + strokeWidth) / 2) * unitVector[1]
|
|
88
|
+
];
|
|
89
|
+
const { pointLeft, pointRight } = arrowPoints(source, endPoint, 30);
|
|
90
|
+
const arrowG = drawLinearPath([pointLeft, endPoint, pointRight, middlePoint], { ...options, fill: options.stroke }, true);
|
|
91
|
+
const path = arrowG.querySelector('path');
|
|
92
|
+
path.setAttribute('stroke-linejoin', 'round');
|
|
93
|
+
return arrowG;
|
|
94
|
+
};
|
|
95
|
+
const drawSolidTriangle = (source, target, options) => {
|
|
96
|
+
const endPoint = target;
|
|
97
|
+
const { pointLeft, pointRight } = arrowPoints(source, endPoint, 30);
|
|
98
|
+
return drawLinearPath([pointLeft, endPoint, pointRight], { ...options, fill: options.stroke }, true);
|
|
99
|
+
};
|
|
100
|
+
const drawOpenTriangle = (element, source, target, options) => {
|
|
101
|
+
const unitVector = getUnitVectorByPointAndPoint(source, target);
|
|
102
|
+
const strokeWidth = getStrokeWidthByElement(element);
|
|
103
|
+
const endPoint = [target[0] + (strokeWidth * unitVector[0]) / 2, target[1] + (strokeWidth * unitVector[1]) / 2];
|
|
104
|
+
const { pointLeft, pointRight } = arrowPoints(source, endPoint, 40);
|
|
105
|
+
return drawLinearPath([pointLeft, endPoint, pointRight], options);
|
|
106
|
+
};
|
|
107
|
+
const drawOneSideArrow = (source, target, side, options) => {
|
|
108
|
+
const { pointLeft, pointRight } = arrowPoints(source, target, 40);
|
|
109
|
+
return drawLinearPath([side === 'up' ? pointRight : pointLeft, target], options);
|
|
110
|
+
};
|
|
111
|
+
const drawSingleSlash = (source, target, isSource, options) => {
|
|
112
|
+
const length = distanceBetweenPointAndPoint(...source, ...target);
|
|
113
|
+
const middlePoint = getExtendPoint(target, source, length / 2);
|
|
114
|
+
const angle = isSource ? 120 : 60;
|
|
115
|
+
const start = rotate(...source, ...middlePoint, (angle * Math.PI) / 180);
|
|
116
|
+
const end = rotate(...target, ...middlePoint, (angle * Math.PI) / 180);
|
|
117
|
+
return drawLinearPath([start, end], options);
|
|
118
|
+
};
|
|
119
|
+
const drawHollowTriangleArrow = (source, target, options) => {
|
|
120
|
+
const { pointLeft, pointRight } = arrowPoints(source, target, 30);
|
|
121
|
+
return drawLinearPath([pointLeft, pointRight, target], { ...options, fill: 'white' }, true);
|
|
122
|
+
};
|
|
123
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluZS1hcnJvdy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2RyYXcvc3JjL3V0aWxzL2xpbmUvbGluZS1hcnJvdy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVMsV0FBVyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsNEJBQTRCLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM1SCxPQUFPLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRTdELE9BQU8sRUFBRSxjQUFjLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0UsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBUW5ELE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQztBQUV4QixNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxPQUFrQixFQUFFLE1BQWUsRUFBRSxPQUFnQixFQUFFLEVBQUU7SUFDbkYsTUFBTSxNQUFNLEdBQUcsT0FBTyxFQUFFLENBQUM7SUFDekIsSUFBSSxTQUFTLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksU0FBUyxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQzlHLE9BQU8sSUFBSSxDQUFDO0tBQ2Y7SUFDRCxNQUFNLFdBQVcsR0FBRyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNyRCxNQUFNLE1BQU0sR0FBRyxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDL0MsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUNyQixNQUFNLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMs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QUcsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUM7SUFDbEUsTUFBTSxXQUFXLEdBQUcsY0FBYyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQy9ELE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDbEMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEdBQUcsTUFBTSxFQUFFLEdBQUcsV0FBVyxFQUFFLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQVUsQ0FBQztJQUNsRixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxNQUFNLEVBQUUsR0FBRyxXQUFXLEVBQUUsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBVSxDQUFDO0lBQ2hGLE9BQU8sY0FBYyxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ2pELENBQUMsQ0FBQztBQUVGLE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxNQUFhLEVBQUUsTUFBYSxFQUFFLE9BQWdCLEVBQUUsRUFBRTtJQUMvRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2xFLE9BQU8sY0FBYyxDQUFDLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLEdBQUcsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNoRyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQb2ludCwgYXJyb3dQb2ludHMsIGNyZWF0ZUcsIGNyZWF0ZVBhdGgsIGRpc3RhbmNlQmV0d2VlblBvaW50QW5kUG9pbnQsIGRyYXdMaW5lYXJQYXRoLCByb3RhdGUgfSBmcm9tICdAcGxhaXQvY29yZSc7XG5pbXBvcnQgeyBMaW5lTWFya2VyVHlwZSwgUGxhaXRMaW5lIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBPcHRpb25zIH0gZnJvbSAncm91Z2hqcy9iaW4vY29yZSc7XG5pbXBvcnQgeyBnZXRFeHRlbmRQb2ludCwgZ2V0VW5pdFZlY3RvckJ5UG9pbnRBbmRQb2ludCB9IGZyb20gJ0BwbGFpdC9jb21tb24nO1xuaW1wb3J0IHsgZ2V0U3Ryb2tlV2lkdGhCeUVsZW1lbnQgfSBmcm9tICcuLi9zdHlsZSc7XG5cbmludGVyZmFjZSBBcnJvd09wdGlvbnMge1xuICAgIG1hcmtlcjogTGluZU1hcmtlclR5cGU7XG4gICAgc291cmNlOiBQb2ludDtcbiAgICB0YXJnZXQ6IFBvaW50O1xuICAgIGlzU291cmNlOiBib29sZWFuO1xufVxuY29uc3QgQVJST1dfTEVOR1RIID0gMjA7XG5cbmV4cG9ydCBjb25zdCBkcmF3TGluZUFycm93ID0gKGVsZW1lbnQ6IFBsYWl0TGluZSwgcG9pbnRzOiBQb2ludFtdLCBvcHRpb25zOiBPcHRpb25zKSA9PiB7XG4gICAgY29uc3QgYXJyb3dHID0gY3JlYXRlRygpO1xuICAgIGlmIChQbGFpdExpbmUuaXNTb3VyY2VNYXJrKGVsZW1lbnQsIExpbmVNYXJrZXJUeXBlLm5vbmUpICYmIFBsYWl0TGluZS5pc1RhcmdldE1hcmsoZWxlbWVudCwgTGluZU1hcmtlclR5cGUubm9uZSkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHN0cm9rZVdpZHRoID0gZ2V0U3Ryb2tlV2lkdGhCeUVsZW1lbnQoZWxlbWVudCk7XG4gICAgY29uc3Qgb2Zmc2V0ID0gKHN0cm9rZVdpZHRoICogc3Ryb2tlV2lkdGgpIC8gMztcbiAgICBpZiAocG9pbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBwb2ludHMgPSBbcG9pbnRzWzBdLCBbcG9pbnRzWzBdWzBdICsgMC4xLCBwb2ludHNbMF1bMV1dXTtcbiAgICB9XG5cbiAgICBpZiAoIVBsYWl0TGluZS5pc1NvdXJjZU1hcmsoZWxlbWVudCwgTGluZU1hcmtlclR5cGUubm9uZSkpIHtcbiAgICAgICAgY29uc3Qgc291cmNlID0gZ2V0RXh0ZW5kUG9pbnQocG9pbnRzWzBdLCBwb2ludHNbMV0sIEFSUk9XX0xFTkdUSCArIG9mZnNldCk7XG4gICAgICAgIGNvbnN0IHNvdXJjZUFycm93ID0gZ2V0QXJyb3coZWxlbWVudCwgeyBtYXJrZXI6IGVsZW1lbnQuc291cmNlLm1hcmtlciwgc291cmNlLCB0YXJnZXQ6IHBvaW50c1swXSwgaXNTb3VyY2U6IHRydWUgfSwgb3B0aW9ucyk7XG4gICAgICAgIHNvdXJjZUFycm93ICYmIGFycm93Ry5hcHBlbmRDaGlsZChzb3VyY2VBcnJvdyk7XG4gICAgfVxuICAgIGlmICghUGxhaXRMaW5lLmlzVGFyZ2V0TWFyayhlbGVtZW50LCBMaW5lTWFya2VyVHlwZS5ub25lKSkge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSBnZXRFeHRlbmRQb2ludChwb2ludHNbcG9pbnRzLmxlbmd0aCAtIDFdLCBwb2ludHNbcG9pbnRzLmxlbmd0aCAtIDJdLCBBUlJPV19MRU5HVEggKyBvZmZzZXQpO1xuICAgICAgICBjb25zdCBhcnJvdyA9IGdldEFycm93KFxuICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgIHsgbWFya2VyOiBlbGVtZW50LnRhcmdldC5tYXJrZXIsIHNvdXJjZSwgdGFyZ2V0OiBwb2ludHNbcG9pbnRzLmxlbmd0aCAtIDFdLCBpc1NvdXJjZTogZmFsc2UgfSxcbiAgICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgKTtcblxuICAgICAgICBhcnJvdyAmJiBhcnJvd0cuYXBwZW5kQ2hpbGQoYXJyb3cpO1xuICAgIH1cbiAgICByZXR1cm4gYXJyb3dHO1xufTtcblxuY29uc3QgZ2V0QXJyb3cgPSAoZWxlbWVudDogUGxhaXRMaW5lLCBhcnJvd09wdGlvbnM6IEFycm93T3B0aW9ucywgb3B0aW9uczogT3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IHsgbWFya2VyLCB0YXJnZXQsIHNvdXJjZSwgaXNTb3VyY2UgfSA9IGFycm93T3B0aW9ucztcbiAgICBsZXQgdGFyZ2V0QXJyb3c7XG4gICAgc3dpdGNoIChtYXJrZXIpIHtcbiAgICAgICAgY2FzZSBMaW5lTWFya2VyVHlwZS5vcGVuVHJpYW5nbGU6IHtcbiAgICAgICAgICAgIHRhcmdldEFycm93ID0gZHJhd09wZW5UcmlhbmdsZShlbGVtZW50LCBzb3VyY2UsIHRhcmdldCwgb3B0aW9ucyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIExpbmVNYXJrZXJUeXBlLnNvbGlkVHJpYW5nbGU6IHtcbiAgICAgICAgICAgIHRhcmdldEFycm93ID0gZHJhd1NvbGlkVHJpYW5nbGUoc291cmNlLCB0YXJnZXQsIG9wdGlvbnMpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBMaW5lTWFya2VyVHlwZS5hcnJvdzoge1xuICAgICAgICAgICAgdGFyZ2V0QXJyb3cgPSBkcmF3QXJyb3coZWxlbWVudCwgc291cmNlLCB0YXJnZXQsIG9wdGlvbnMpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBMaW5lTWFya2VyVHlwZS5zaGFycEFycm93OiB7XG4gICAgICAgICAgICB0YXJnZXRBcnJvdyA9IGRyYXdTaGFycEFycm93KHNvdXJjZSwgdGFyZ2V0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgTGluZU1hcmtlclR5cGUub25lU2lkZVVwOiB7XG4gICAgICAgICAgICB0YXJnZXRBcnJvdyA9IGRyYXdPbmVTaWRlQXJyb3coc291cmNlLCB0YXJnZXQsIGlzU291cmNlID8gJ2Rvd24nIDogJ3VwJywgb3B0aW9ucyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIExpbmVNYXJrZXJUeXBlLm9uZVNpZGVEb3duOiB7XG4gICAgICAgICAgICB0YXJnZXRBcnJvdyA9IGRyYXdPbmVTaWRlQXJyb3coc291cmNlLCB0YXJnZXQsIGlzU291cmNlID8gJ3VwJyA6ICdkb3duJywgb3B0aW9ucyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIExpbmVNYXJrZXJUeXBlLmhvbGxvd1RyaWFuZ2xlOiB7XG4gICAgICAgICAgICB0YXJnZXRBcnJvdyA9IGRyYXdIb2xsb3dUcmlhbmdsZUFycm93KHNvdXJjZSwgdGFyZ2V0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgTGluZU1hcmtlclR5cGUuc2luZ2xlU2xhc2g6IHtcbiAgICAgICAgICAgIHRhcmdldEFycm93ID0gZHJhd1NpbmdsZVNsYXNoKHNvdXJjZSwgdGFyZ2V0LCBpc1NvdXJjZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0QXJyb3c7XG59O1xuXG5jb25zdCBkcmF3U2hhcnBBcnJvdyA9IChzb3VyY2U6IFBvaW50LCB0YXJnZXQ6IFBvaW50LCBvcHRpb25zOiBPcHRpb25zKSA9PiB7XG4gICAgY29uc3Qgc3RhcnRQb2ludDogUG9pbnQgPSB0YXJnZXQ7XG4gICAgY29uc3QgeyBwb2ludExlZnQsIHBvaW50UmlnaHQgfSA9IGFycm93UG9pbnRzKHNvdXJjZSwgdGFyZ2V0LCAyMCk7XG4gICAgY29uc3QgZyA9IGNyZWF0ZUcoKTtcbiAgICBjb25zdCBwYXRoID0gY3JlYXRlUGF0aCgpO1xuICAgIGxldCBwb2x5bGluZVBhdGggPSBgTSR7cG9pbnRSaWdodFswXX0sJHtwb2ludFJpZ2h0WzFdfUEyNSwyNSwyMCwwLDEsJHtwb2ludExlZnRbMF19LCR7cG9pbnRMZWZ0WzFdfUwke3N0YXJ0UG9pbnRbMF19LCR7c3RhcnRQb2ludFsxXX1aYDtcbiAgICBwYXRoLnNldEF0dHJpYnV0ZSgnZCcsIHBvbHlsaW5lUGF0aCk7XG4gICAgcGF0aC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsIGAke29wdGlvbnM/LnN0cm9rZX1gKTtcbiAgICBwYXRoLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLXdpZHRoJywgYCR7b3B0aW9ucz8uc3Ryb2tlV2lkdGh9YCk7XG4gICAgcGF0aC5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCBgJHtvcHRpb25zPy5zdHJva2V9YCk7XG4gICAgZy5hcHBlbmRDaGlsZChwYXRoKTtcbiAgICByZXR1cm4gZztcbn07XG5cbmNvbnN0IGRyYXdBcnJvdyA9IChlbGVtZW50OiBQbGFpdExpbmUsIHNvdXJjZTogUG9pbnQsIHRhcmdldDogUG9pbnQsIG9wdGlvbnM6IE9wdGlvbnMpID0+IHtcbiAgICBjb25zdCB1bml0VmVjdG9yID0gZ2V0VW5pdFZlY3RvckJ5UG9pbnRBbmRQb2ludChzb3VyY2UsIHRhcmdldCk7XG4gICAgY29uc3Qgc3Ryb2tlV2lkdGggPSBnZXRTdHJva2VXaWR0aEJ5RWxlbWVudChlbGVtZW50KTtcbiAgICBjb25zdCBlbmRQb2ludDogUG9pbnQgPSBbdGFyZ2V0WzBdICsgKHN0cm9rZVdpZHRoICogdW5pdFZlY3RvclswXSkgLyAyLCB0YXJnZXRbMV0gKyAoc3Ryb2tlV2lkdGggKiB1bml0VmVjdG9yWzFdKSAvIDJdO1xuICAgIGNvbnN0IGRpc3RhbmNlID0gZGlzdGFuY2VCZXR3ZWVuUG9pbnRBbmRQb2ludCguLi5zb3VyY2UsIC4uLmVuZFBvaW50KTtcbiAgICBjb25zdCBtaWRkbGVQb2ludDogUG9pbnQgPSBbXG4gICAgICAgIGVuZFBvaW50WzBdIC0gKCgoZGlzdGFuY2UgKiAzKSAvIDUgKyBzdHJva2VXaWR0aCkgLyAyKSAqIHVuaXRWZWN0b3JbMF0sXG4gICAgICAgIGVuZFBvaW50WzFdIC0gKCgoZGlzdGFuY2UgKiAzKSAvIDUgKyBzdHJva2VXaWR0aCkgLyAyKSAqIHVuaXRWZWN0b3JbMV1cbiAgICBdO1xuICAgIGNvbnN0IHsgcG9pbnRMZWZ0LCBwb2ludFJpZ2h0IH0gPSBhcnJvd1BvaW50cyhzb3VyY2UsIGVuZFBvaW50LCAzMCk7XG4gICAgY29uc3QgYXJyb3dHID0gZHJhd0xpbmVhclBhdGgoW3BvaW50TGVmdCwgZW5kUG9pbnQsIHBvaW50UmlnaHQsIG1pZGRsZVBvaW50XSwgeyAuLi5vcHRpb25zLCBmaWxsOiBvcHRpb25zLnN0cm9rZSB9LCB0cnVlKTtcbiAgICBjb25zdCBwYXRoID0gYXJyb3dHLnF1ZXJ5U2VsZWN0b3IoJ3BhdGgnKTtcbiAgICBwYXRoIS5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS1saW5lam9pbicsICdyb3VuZCcpO1xuICAgIHJldHVybiBhcnJvd0c7XG59O1xuXG5jb25zdCBkcmF3U29saWRUcmlhbmdsZSA9IChzb3VyY2U6IFBvaW50LCB0YXJnZXQ6IFBvaW50LCBvcHRpb25zOiBPcHRpb25zKSA9PiB7XG4gICAgY29uc3QgZW5kUG9pbnQ6IFBvaW50ID0gdGFyZ2V0O1xuICAgIGNvbnN0IHsgcG9pbnRMZWZ0LCBwb2ludFJpZ2h0IH0gPSBhcnJvd1BvaW50cyhzb3VyY2UsIGVuZFBvaW50LCAzMCk7XG4gICAgcmV0dXJuIGRyYXdMaW5lYXJQYXRoKFtwb2ludExlZnQsIGVuZFBvaW50LCBwb2ludFJpZ2h0XSwgeyAuLi5vcHRpb25zLCBmaWxsOiBvcHRpb25zLnN0cm9rZSB9LCB0cnVlKTtcbn07XG5cbmNvbnN0IGRyYXdPcGVuVHJpYW5nbGUgPSAoZWxlbWVudDogUGxhaXRMaW5lLCBzb3VyY2U6IFBvaW50LCB0YXJnZXQ6IFBvaW50LCBvcHRpb25zOiBPcHRpb25zKSA9PiB7XG4gICAgY29uc3QgdW5pdFZlY3RvciA9IGdldFVuaXRWZWN0b3JCeVBvaW50QW5kUG9pbnQoc291cmNlLCB0YXJnZXQpO1xuICAgIGNvbnN0IHN0cm9rZVdpZHRoID0gZ2V0U3Ryb2tlV2lkdGhCeUVsZW1lbnQoZWxlbWVudCk7XG4gICAgY29uc3QgZW5kUG9pbnQ6IFBvaW50ID0gW3RhcmdldFswXSArIChzdHJva2VXaWR0aCAqIHVuaXRWZWN0b3JbMF0pIC8gMiwgdGFyZ2V0WzFdICsgKHN0cm9rZVdpZHRoICogdW5pdFZlY3RvclsxXSkgLyAyXTtcbiAgICBjb25zdCB7IHBvaW50TGVmdCwgcG9pbnRSaWdodCB9ID0gYXJyb3dQb2ludHMoc291cmNlLCBlbmRQb2ludCwgNDApO1xuICAgIHJldHVybiBkcmF3TGluZWFyUGF0aChbcG9pbnRMZWZ0LCBlbmRQb2ludCwgcG9pbnRSaWdodF0sIG9wdGlvbnMpO1xufTtcblxuY29uc3QgZHJhd09uZVNpZGVBcnJvdyA9IChzb3VyY2U6IFBvaW50LCB0YXJnZXQ6IFBvaW50LCBzaWRlOiBzdHJpbmcsIG9wdGlvbnM6IE9wdGlvbnMpID0+IHtcbiAgICBjb25zdCB7IHBvaW50TGVmdCwgcG9pbnRSaWdodCB9ID0gYXJyb3dQb2ludHMoc291cmNlLCB0YXJnZXQsIDQwKTtcbiAgICByZXR1cm4gZHJhd0xpbmVhclBhdGgoW3NpZGUgPT09ICd1cCcgPyBwb2ludFJpZ2h0IDogcG9pbnRMZWZ0LCB0YXJnZXRdLCBvcHRpb25zKTtcbn07XG5cbmNvbnN0IGRyYXdTaW5nbGVTbGFzaCA9IChzb3VyY2U6IFBvaW50LCB0YXJnZXQ6IFBvaW50LCBpc1NvdXJjZTogYm9vbGVhbiwgb3B0aW9uczogT3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IGxlbmd0aCA9IGRpc3RhbmNlQmV0d2VlblBvaW50QW5kUG9pbnQoLi4uc291cmNlLCAuLi50YXJnZXQpO1xuICAgIGNvbnN0IG1pZGRsZVBvaW50ID0gZ2V0RXh0ZW5kUG9pbnQodGFyZ2V0LCBzb3VyY2UsIGxlbmd0aCAvIDIpO1xuICAgIGNvbnN0IGFuZ2xlID0gaXNTb3VyY2UgPyAxMjAgOiA2MDtcbiAgICBjb25zdCBzdGFydCA9IHJvdGF0ZSguLi5zb3VyY2UsIC4uLm1pZGRsZVBvaW50LCAoYW5nbGUgKiBNYXRoLlBJKSAvIDE4MCkgYXMgUG9pbnQ7XG4gICAgY29uc3QgZW5kID0gcm90YXRlKC4uLnRhcmdldCwgLi4ubWlkZGxlUG9pbnQsIChhbmdsZSAqIE1hdGguUEkpIC8gMTgwKSBhcyBQb2ludDtcbiAgICByZXR1cm4gZHJhd0xpbmVhclBhdGgoW3N0YXJ0LCBlbmRdLCBvcHRpb25zKTtcbn07XG5cbmNvbnN0IGRyYXdIb2xsb3dUcmlhbmdsZUFycm93ID0gKHNvdXJjZTogUG9pbnQsIHRhcmdldDogUG9pbnQsIG9wdGlvbnM6IE9wdGlvbnMpID0+IHtcbiAgICBjb25zdCB7IHBvaW50TGVmdCwgcG9pbnRSaWdodCB9ID0gYXJyb3dQb2ludHMoc291cmNlLCB0YXJnZXQsIDMwKTtcbiAgICByZXR1cm4gZHJhd0xpbmVhclBhdGgoW3BvaW50TGVmdCwgcG9pbnRSaWdodCwgdGFyZ2V0XSwgeyAuLi5vcHRpb25zLCBmaWxsOiAnd2hpdGUnIH0sIHRydWUpO1xufTtcbiJdfQ==
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
import { Point, idCreator, PlaitBoard, createG, RectangleClient, findElements, drawLinearPath, createMask, createRect, distanceBetweenPointAndPoint, catmullRomFitting } from '@plait/core';
|
|
2
|
+
import { pointsOnBezierCurves } from 'points-on-curve';
|
|
3
|
+
import { getPointOnPolyline, getPointByVector, removeDuplicatePoints, getExtendPoint, isSourceAndTargetIntersect } from '@plait/common';
|
|
4
|
+
import { LineMarkerType, LineShape, PlaitDrawElement, PlaitLine } from '../../interfaces';
|
|
5
|
+
import { getNearestPoint } from '../geometry';
|
|
6
|
+
import { getLineDashByElement, getStrokeColorByElement, getStrokeWidthByElement } from '../style/stroke';
|
|
7
|
+
import { getEngine } from '../../engines';
|
|
8
|
+
import { getShape } from '../shape';
|
|
9
|
+
import { DefaultLineStyle, LINE_TEXT_SPACE } from '../../constants/line';
|
|
10
|
+
import { LineShapeGenerator } from '../../generators/line.generator';
|
|
11
|
+
import { REACTION_MARGIN } from '../../constants';
|
|
12
|
+
import { getHitOutlineGeometry } from '../position/geometry';
|
|
13
|
+
import { getLineMemorizedLatest } from '../memorize';
|
|
14
|
+
import { alignPoints } from './line-resize';
|
|
15
|
+
import { getElbowLineRouteOptions, getLineHandleRefPair } from './line-common';
|
|
16
|
+
import { getElbowPoints, getNextSourceAndTargetPoints } from './elbow';
|
|
17
|
+
import { drawLineArrow } from './line-arrow';
|
|
18
|
+
export const createLineElement = (shape, points, source, target, texts, options) => {
|
|
19
|
+
return {
|
|
20
|
+
id: idCreator(),
|
|
21
|
+
type: 'line',
|
|
22
|
+
shape,
|
|
23
|
+
source,
|
|
24
|
+
texts: texts ? texts : [],
|
|
25
|
+
target,
|
|
26
|
+
opacity: 1,
|
|
27
|
+
points,
|
|
28
|
+
...options
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
export const getLinePoints = (board, element) => {
|
|
32
|
+
switch (element.shape) {
|
|
33
|
+
case LineShape.elbow: {
|
|
34
|
+
return getElbowPoints(board, element);
|
|
35
|
+
}
|
|
36
|
+
case LineShape.curve: {
|
|
37
|
+
return getCurvePoints(board, element);
|
|
38
|
+
}
|
|
39
|
+
default: {
|
|
40
|
+
const points = PlaitLine.getPoints(board, element);
|
|
41
|
+
const handleRefPair = getLineHandleRefPair(board, element);
|
|
42
|
+
points[0] = handleRefPair.source.point;
|
|
43
|
+
points[points.length - 1] = handleRefPair.target.point;
|
|
44
|
+
return points;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
export const getCurvePoints = (board, element) => {
|
|
49
|
+
if (element.points.length === 2) {
|
|
50
|
+
const handleRefPair = getLineHandleRefPair(board, element);
|
|
51
|
+
const { source, target } = handleRefPair;
|
|
52
|
+
const sourceBoundElement = handleRefPair.source.boundElement;
|
|
53
|
+
const targetBoundElement = handleRefPair.target.boundElement;
|
|
54
|
+
let curvePoints = [source.point];
|
|
55
|
+
const sumDistance = distanceBetweenPointAndPoint(...source.point, ...target.point);
|
|
56
|
+
const offset = 12 + sumDistance / 3;
|
|
57
|
+
if (sourceBoundElement) {
|
|
58
|
+
curvePoints.push(getPointByVector(source.point, source.vector, offset));
|
|
59
|
+
}
|
|
60
|
+
if (targetBoundElement) {
|
|
61
|
+
curvePoints.push(getPointByVector(target.point, target.vector, offset));
|
|
62
|
+
}
|
|
63
|
+
const isSingleBound = (sourceBoundElement && !targetBoundElement) || (!sourceBoundElement && targetBoundElement);
|
|
64
|
+
if (isSingleBound) {
|
|
65
|
+
curvePoints.push(target.point);
|
|
66
|
+
const points = Q2C(curvePoints);
|
|
67
|
+
return pointsOnBezierCurves(points);
|
|
68
|
+
}
|
|
69
|
+
if (!sourceBoundElement && !targetBoundElement) {
|
|
70
|
+
curvePoints.push(getPointByVector(source.point, source.vector, offset));
|
|
71
|
+
curvePoints.push(getPointByVector(target.point, target.vector, offset));
|
|
72
|
+
}
|
|
73
|
+
curvePoints.push(target.point);
|
|
74
|
+
return pointsOnBezierCurves(curvePoints);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
let dataPoints = PlaitLine.getPoints(board, element);
|
|
78
|
+
dataPoints = removeDuplicatePoints(dataPoints);
|
|
79
|
+
const points = catmullRomFitting(dataPoints);
|
|
80
|
+
return pointsOnBezierCurves(points);
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
export function getMiddlePoints(board, element) {
|
|
84
|
+
const result = [];
|
|
85
|
+
const shape = element.shape;
|
|
86
|
+
const hideBuffer = 10;
|
|
87
|
+
if (shape === LineShape.straight) {
|
|
88
|
+
const points = PlaitLine.getPoints(board, element);
|
|
89
|
+
for (let i = 0; i < points.length - 1; i++) {
|
|
90
|
+
const distance = distanceBetweenPointAndPoint(...points[i], ...points[i + 1]);
|
|
91
|
+
if (distance < hideBuffer)
|
|
92
|
+
continue;
|
|
93
|
+
result.push([(points[i][0] + points[i + 1][0]) / 2, (points[i][1] + points[i + 1][1]) / 2]);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
if (shape === LineShape.curve) {
|
|
97
|
+
const points = PlaitLine.getPoints(board, element);
|
|
98
|
+
const pointsOnBezier = getCurvePoints(board, element);
|
|
99
|
+
if (points.length === 2) {
|
|
100
|
+
const start = 0;
|
|
101
|
+
const endIndex = pointsOnBezier.length - 1;
|
|
102
|
+
const middleIndex = Math.round((start + endIndex) / 2);
|
|
103
|
+
result.push(pointsOnBezier[middleIndex]);
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
for (let i = 0; i < points.length - 1; i++) {
|
|
107
|
+
const startIndex = pointsOnBezier.findIndex(point => point[0] === points[i][0] && point[1] === points[i][1]);
|
|
108
|
+
const endIndex = pointsOnBezier.findIndex(point => point[0] === points[i + 1][0] && point[1] === points[i + 1][1]);
|
|
109
|
+
const middleIndex = Math.round((startIndex + endIndex) / 2);
|
|
110
|
+
const distance = distanceBetweenPointAndPoint(...points[i], ...points[i + 1]);
|
|
111
|
+
if (distance < hideBuffer)
|
|
112
|
+
continue;
|
|
113
|
+
result.push(pointsOnBezier[middleIndex]);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
if (shape === LineShape.elbow) {
|
|
118
|
+
const renderPoints = getElbowPoints(board, element);
|
|
119
|
+
const options = getElbowLineRouteOptions(board, element);
|
|
120
|
+
const isIntersect = isSourceAndTargetIntersect(options);
|
|
121
|
+
if (!isIntersect) {
|
|
122
|
+
const [nextSourcePoint, nextTargetPoint] = getNextSourceAndTargetPoints(board, element);
|
|
123
|
+
for (let i = 0; i < renderPoints.length - 1; i++) {
|
|
124
|
+
if ((i == 0 && Point.isEquals(renderPoints[i + 1], nextSourcePoint)) ||
|
|
125
|
+
(i === renderPoints.length - 2 && Point.isEquals(renderPoints[renderPoints.length - 2], nextTargetPoint))) {
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
const [currentX, currentY] = renderPoints[i];
|
|
129
|
+
const [nextX, nextY] = renderPoints[i + 1];
|
|
130
|
+
const middlePoint = [(currentX + nextX) / 2, (currentY + nextY) / 2];
|
|
131
|
+
result.push(middlePoint);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return result;
|
|
136
|
+
}
|
|
137
|
+
export const drawLine = (board, element) => {
|
|
138
|
+
const strokeWidth = getStrokeWidthByElement(element);
|
|
139
|
+
const strokeColor = getStrokeColorByElement(board, element);
|
|
140
|
+
const strokeLineDash = getLineDashByElement(element);
|
|
141
|
+
const options = { stroke: strokeColor, strokeWidth, strokeLineDash };
|
|
142
|
+
const lineG = createG();
|
|
143
|
+
let points = getLinePoints(board, element);
|
|
144
|
+
let line;
|
|
145
|
+
if (element.shape === LineShape.curve) {
|
|
146
|
+
line = PlaitBoard.getRoughSVG(board).curve(points, options);
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
line = drawLinearPath(points, options);
|
|
150
|
+
}
|
|
151
|
+
const id = idCreator();
|
|
152
|
+
line.setAttribute('mask', `url(#${id})`);
|
|
153
|
+
lineG.appendChild(line);
|
|
154
|
+
const { mask, maskTargetFillRect } = drawMask(board, element, id);
|
|
155
|
+
lineG.appendChild(mask);
|
|
156
|
+
line.appendChild(maskTargetFillRect);
|
|
157
|
+
const arrow = drawLineArrow(element, points, { stroke: strokeColor, strokeWidth });
|
|
158
|
+
arrow && lineG.appendChild(arrow);
|
|
159
|
+
return lineG;
|
|
160
|
+
};
|
|
161
|
+
export const getConnectionByNearestPoint = (board, point, hitElement) => {
|
|
162
|
+
let rectangle = RectangleClient.getRectangleByPoints(hitElement.points);
|
|
163
|
+
let nearestPoint = getNearestPoint(hitElement, point);
|
|
164
|
+
const hitConnector = getHitConnectorPoint(nearestPoint, hitElement, rectangle);
|
|
165
|
+
nearestPoint = hitConnector ? hitConnector : nearestPoint;
|
|
166
|
+
return [(nearestPoint[0] - rectangle.x) / rectangle.width, (nearestPoint[1] - rectangle.y) / rectangle.height];
|
|
167
|
+
};
|
|
168
|
+
export const getHitConnectorPoint = (point, hitElement, rectangle) => {
|
|
169
|
+
const shape = getShape(hitElement);
|
|
170
|
+
const connector = getEngine(shape).getConnectorPoints(rectangle);
|
|
171
|
+
const points = RectangleClient.getPoints(RectangleClient.getRectangleByCenterPoint(point, 10, 10));
|
|
172
|
+
const pointRectangle = RectangleClient.getRectangleByPoints(points);
|
|
173
|
+
return connector.find(point => {
|
|
174
|
+
return RectangleClient.isHit(pointRectangle, RectangleClient.getRectangleByPoints([point, point]));
|
|
175
|
+
});
|
|
176
|
+
};
|
|
177
|
+
export const getLineTextRectangle = (board, element, index) => {
|
|
178
|
+
const text = element.texts[index];
|
|
179
|
+
const elbowPoints = getLinePoints(board, element);
|
|
180
|
+
const point = getPointOnPolyline(elbowPoints, text.position);
|
|
181
|
+
return {
|
|
182
|
+
x: point[0] - text.width / 2,
|
|
183
|
+
y: point[1] - text.height / 2,
|
|
184
|
+
width: text.width,
|
|
185
|
+
height: text.height
|
|
186
|
+
};
|
|
187
|
+
};
|
|
188
|
+
export const getLines = (board) => {
|
|
189
|
+
return findElements(board, {
|
|
190
|
+
match: (element) => PlaitDrawElement.isLine(element),
|
|
191
|
+
recursion: (element) => PlaitDrawElement.isDrawElement(element)
|
|
192
|
+
});
|
|
193
|
+
};
|
|
194
|
+
// quadratic Bezier to cubic Bezier
|
|
195
|
+
export const Q2C = (points) => {
|
|
196
|
+
const result = [];
|
|
197
|
+
const numSegments = points.length / 3;
|
|
198
|
+
for (let i = 0; i < numSegments; i++) {
|
|
199
|
+
const start = points[i];
|
|
200
|
+
const qControl = points[i + 1];
|
|
201
|
+
const end = points[i + 2];
|
|
202
|
+
const startDistance = distanceBetweenPointAndPoint(...start, ...qControl);
|
|
203
|
+
const endDistance = distanceBetweenPointAndPoint(...end, ...qControl);
|
|
204
|
+
const cControl1 = getExtendPoint(start, qControl, (startDistance * 2) / 3);
|
|
205
|
+
const cControl2 = getExtendPoint(end, qControl, (endDistance * 2) / 3);
|
|
206
|
+
result.push(start, cControl1, cControl2, end);
|
|
207
|
+
}
|
|
208
|
+
return result;
|
|
209
|
+
};
|
|
210
|
+
export const handleLineCreating = (board, lineShape, sourcePoint, movingPoint, sourceElement, lineShapeG) => {
|
|
211
|
+
const hitElement = getHitOutlineGeometry(board, movingPoint, REACTION_MARGIN);
|
|
212
|
+
const targetConnection = hitElement ? getConnectionByNearestPoint(board, movingPoint, hitElement) : undefined;
|
|
213
|
+
const connection = sourceElement ? getConnectionByNearestPoint(board, sourcePoint, sourceElement) : undefined;
|
|
214
|
+
const targetBoundId = hitElement ? hitElement.id : undefined;
|
|
215
|
+
const lineGenerator = new LineShapeGenerator(board);
|
|
216
|
+
const memorizedLatest = getLineMemorizedLatest();
|
|
217
|
+
let sourceMarker, targetMarker;
|
|
218
|
+
sourceMarker = memorizedLatest.source;
|
|
219
|
+
targetMarker = memorizedLatest.target;
|
|
220
|
+
sourceMarker && delete memorizedLatest.source;
|
|
221
|
+
targetMarker && delete memorizedLatest.target;
|
|
222
|
+
const temporaryLineElement = createLineElement(lineShape, [sourcePoint, movingPoint], { marker: sourceMarker || LineMarkerType.none, connection: connection, boundId: sourceElement?.id }, { marker: targetMarker || LineMarkerType.arrow, connection: targetConnection, boundId: targetBoundId }, [], {
|
|
223
|
+
strokeWidth: DefaultLineStyle.strokeWidth,
|
|
224
|
+
...memorizedLatest
|
|
225
|
+
});
|
|
226
|
+
const linePoints = getLinePoints(board, temporaryLineElement);
|
|
227
|
+
const otherPoint = linePoints[0];
|
|
228
|
+
temporaryLineElement.points[1] = alignPoints(otherPoint, movingPoint);
|
|
229
|
+
lineGenerator.processDrawing(temporaryLineElement, lineShapeG);
|
|
230
|
+
PlaitBoard.getElementActiveHost(board).append(lineShapeG);
|
|
231
|
+
return temporaryLineElement;
|
|
232
|
+
};
|
|
233
|
+
function drawMask(board, element, id) {
|
|
234
|
+
const mask = createMask();
|
|
235
|
+
mask.setAttribute('id', id);
|
|
236
|
+
const points = getLinePoints(board, element);
|
|
237
|
+
let rectangle = RectangleClient.getRectangleByPoints(points);
|
|
238
|
+
rectangle = RectangleClient.getOutlineRectangle(rectangle, -30);
|
|
239
|
+
const maskFillRect = createRect(rectangle, {
|
|
240
|
+
fill: 'white'
|
|
241
|
+
});
|
|
242
|
+
mask.appendChild(maskFillRect);
|
|
243
|
+
const texts = element.texts;
|
|
244
|
+
texts.forEach((text, index) => {
|
|
245
|
+
let textRectangle = getLineTextRectangle(board, element, index);
|
|
246
|
+
textRectangle = RectangleClient.inflate(textRectangle, LINE_TEXT_SPACE * 2);
|
|
247
|
+
const rect = createRect(textRectangle, {
|
|
248
|
+
fill: 'black'
|
|
249
|
+
});
|
|
250
|
+
mask.appendChild(rect);
|
|
251
|
+
});
|
|
252
|
+
// open line
|
|
253
|
+
const maskTargetFillRect = createRect(rectangle);
|
|
254
|
+
maskTargetFillRect.setAttribute('opacity', '0');
|
|
255
|
+
maskTargetFillRect.setAttribute('fill', 'none');
|
|
256
|
+
return { mask, maskTargetFillRect };
|
|
257
|
+
}
|
|
258
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluZS1iYXNpYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2RyYXcvc3JjL3V0aWxzL2xpbmUvbGluZS1iYXNpYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsS0FBSyxFQUNMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsT0FBTyxFQUNQLGVBQWUsRUFDZixZQUFZLEVBRVosY0FBYyxFQUNkLFVBQVUsRUFDVixVQUFVLEVBQ1YsNEJBQTRCLEVBQzVCLGlCQUFpQixFQUNwQixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsZ0JBQWdCLEVBQUUscUJBQXFCLEVBQUUsY0FBYyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hJLE9BQU8sRUFBYyxjQUFjLEVBQUUsU0FBUyxFQUFZLGdCQUFnQixFQUFFLFNBQVMsRUFBYyxNQUFNLGtCQUFrQixDQUFDO0FBQzVILE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDOUMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLHVCQUF1QixFQUFFLHVCQUF1QixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekcsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNyRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDN0QsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3JELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxFQUFFLHdCQUF3QixFQUFFLG9CQUFvQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFBRSxjQUFjLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDdkUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUU3QyxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxDQUM3QixLQUFnQixFQUNoQixNQUFzQixFQUN0QixNQUFrQixFQUNsQixNQUFrQixFQUNsQixLQUFrQixFQUNsQixPQUF3RCxFQUMvQyxFQUFFO0lBQ1gsT0FBTztRQUNILEVBQUUsRUFBRSxTQUFTLEVBQUU7UUFDZixJQUFJLEVBQUUsTUFBTTtRQUNaLEtBQUs7UUFDTCxNQUFNO1FBQ04sS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQ3pCLE1BQU07UUFDTixPQUFPLEVBQUUsQ0FBQztRQUNWLE1BQU07UUFDTixHQUFHLE9BQU87S0FDYixDQUFDO0FBQ04sQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLENBQUMsS0FBaUIsRUFBRSxPQUFrQixFQUFFLEVBQUU7SUFDbkUsUUFBUSxPQUFPLENBQUMsS0FBSyxFQUFFO1FBQ25CLEtBQUssU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2xCLE9BQU8sY0FBYyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztTQUN6QztRQUNELEtBQUssU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2xCLE9BQU8sY0FBYyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztTQUN6QztRQUNELE9BQU8sQ0FBQyxDQUFDO1lBQ0wsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDbkQsTUFBTSxhQUFhLEdBQUcsb0JBQW9CLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQzNELE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztZQUN2QyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztZQUN2RCxPQUFPLE1BQU0sQ0FBQztTQUNqQjtLQUNKO0FBQ0wsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLENBQUMsS0FBaUIsRUFBRSxPQUFrQixFQUFFLEVBQUU7SUFDcEUsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDN0IsTUFBTSxhQUFhLEdBQUcsb0JBQW9CLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzNELE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsYUFBYSxDQUFDO1FBQ3pDLE1BQU0sa0JBQWtCLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUM7UUFDN0QsTUFBTSxrQkFBa0IsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQztRQUM3RCxJQUFJLFdBQVcsR0FBWSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQyxNQUFNLFdBQVcsR0FBRyw0QkFBNEIsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkYsTUFBTSxNQUFNLEdBQUcsRUFBRSxHQUFHLFdBQVcsR0FBRyxDQUFDLENBQUM7UUFDcEMsSUFBSSxrQkFBa0IsRUFBRTtZQUNwQixXQUFXLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1NBQzNFO1FBQ0QsSUFBSSxrQkFBa0IsRUFBRTtZQUNwQixXQUFXLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1NBQzNFO1FBQ0QsTUFBTSxhQUFhLEdBQUcsQ0FBQyxrQkFBa0IsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLGtCQUFrQixJQUFJLGtCQUFrQixDQUFDLENBQUM7UUFDakgsSUFBSSxhQUFhLEVBQUU7WUFDZixXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMvQixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDaEMsT0FBTyxvQkFBb0IsQ0FBQyxNQUFNLENBQVksQ0FBQztTQUNsRDtRQUNELElBQUksQ0FBQyxrQkFBa0IsSUFBSSxDQUFDLGtCQUFrQixFQUFFO1lBQzVDLFdBQVcsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDeEUsV0FBVyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztTQUMzRTtRQUNELFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9CLE9BQU8sb0JBQW9CLENBQUMsV0FBVyxDQUFZLENBQUM7S0FDdkQ7U0FBTTtRQUNILElBQUksVUFBVSxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3JELFVBQVUsR0FBRyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMvQyxNQUFNLE1BQU0sR0FBRyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM3QyxPQUFPLG9CQUFvQixDQUFDLE1BQU0sQ0FBWSxDQUFDO0tBQ2xEO0FBQ0wsQ0FBQyxDQUFDO0FBRUYsTUFBTSxVQUFVLGVBQWUsQ0FBQyxLQUFpQixFQUFFLE9BQWtCO0lBQ2pFLE1BQU0sTUFBTSxHQUFZLEVBQUUsQ0FBQztJQUMzQixNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO0lBQzVCLE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQztJQUN0QixJQUFJLEtBQUssS0FBSyxTQUFTLENBQUMsUUFBUSxFQUFFO1FBQzlCLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ25ELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN4QyxNQUFNLFFBQVEsR0FBRyw0QkFBNEIsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5RSxJQUFJLFFBQVEsR0FBRyxVQUFVO2dCQUFFLFNBQVM7WUFDcEMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDL0Y7S0FDSjtJQUNELElBQUksS0FBSyxLQUFLLFNBQVMsQ0FBQyxLQUFLLEVBQUU7UUFDM0IsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDbkQsTUFBTSxjQUFjLEdBQUcsY0FBYyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN0RCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3JCLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQztZQUNoQixNQUFNLFFBQVEsR0FBRyxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztZQUMzQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3ZELE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7U0FDNUM7YUFBTTtZQUNILEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDeEMsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM3RyxNQUFNLFFBQVEsR0FBRyxjQUFjLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbkgsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDNUQsTUFBTSxRQUFRLEdBQUcsNEJBQTRCLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzlFLElBQUksUUFBUSxHQUFHLFVBQVU7b0JBQUUsU0FBUztnQkFDcEMsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQzthQUM1QztTQUNKO0tBQ0o7SUFDRCxJQUFJLEtBQUssS0FBSyxTQUFTLENBQUMsS0FBSyxFQUFFO1FBQzNCLE1BQU0sWUFBWSxHQUFHLGNBQWMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDcEQsTUFBTSxPQUFPLEdBQUcsd0JBQXdCLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3pELE1BQU0sV0FBVyxHQUFHLDBCQUEwQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDZCxNQUFNLENBQUMsZUFBZSxFQUFFLGVBQWUsQ0FBQyxHQUFHLDRCQUE0QixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztZQUN4RixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzlDLElBQ0ksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxlQUFlLENBQUMsQ0FBQztvQkFDaEUsQ0FBQyxDQUFDLEtBQUssWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRSxlQUFlLENBQUMsQ0FBQyxFQUMzRztvQkFDRSxTQUFTO2lCQUNaO2dCQUNELE1BQU0sQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM3QyxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxHQUFHLFlBQVksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQzNDLE1BQU0sV0FBVyxHQUFHLENBQUMsQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBVSxDQUFDO2dCQUM5RSxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQzVCO1NBQ0o7S0FDSjtJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2xCLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxLQUFpQixFQUFFLE9BQWtCLEVBQUUsRUFBRTtJQUM5RCxNQUFNLFdBQVcsR0FBRyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNyRCxNQUFNLFdBQVcsR0FBRyx1QkFBdUIsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDNUQsTUFBTSxjQUFjLEdBQUcsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDckQsTUFBTSxPQUFPLEdBQUcsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsQ0FBQztJQUNyRSxNQUFNLEtBQUssR0FBRyxPQUFPLEVBQUUsQ0FBQztJQUN4QixJQUFJLE1BQU0sR0FBRyxhQUFhLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzNDLElBQUksSUFBSSxDQUFDO0lBQ1QsSUFBSSxPQUFPLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBQyxLQUFLLEVBQUU7UUFDbkMsSUFBSSxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztLQUMvRDtTQUFNO1FBQ0gsSUFBSSxHQUFHLGNBQWMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7S0FDMUM7SUFDRCxNQUFNLEVBQUUsR0FBRyxTQUFTLEVBQUUsQ0FBQztJQUN2QixJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDekMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4QixNQUFNLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDbEUsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4QixJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDckMsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDbkYsS0FBSyxJQUFJLEtBQUssQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbEMsT0FBTyxLQUFLLENBQUM7QUFDakIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsQ0FBQyxLQUFpQixFQUFFLEtBQVksRUFBRSxVQUFzQixFQUFTLEVBQUU7SUFDMUcsSUFBSSxTQUFTLEdBQUcsZUFBZSxDQUFDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN4RSxJQUFJLFlBQVksR0FBRyxlQUFlLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3RELE1BQU0sWUFBWSxHQUFHLG9CQUFvQixDQUFDLFlBQVksRUFBRSxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDL0UsWUFBWSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUM7SUFDMUQsT0FBTyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDbkgsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxLQUFZLEVBQUUsVUFBc0IsRUFBRSxTQUEwQixFQUFFLEVBQUU7SUFDckcsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ25DLE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNqRSxNQUFNLE1BQU0sR0FBRyxlQUFlLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbkcsTUFBTSxjQUFjLEdBQUcsZUFBZSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3BFLE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUMxQixPQUFPLGVBQWUsQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLGVBQWUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdkcsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLEtBQWlCLEVBQUUsT0FBa0IsRUFBRSxLQUFhLEVBQW1CLEVBQUU7SUFDMUcsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsQyxNQUFNLFdBQVcsR0FBRyxhQUFhLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2xELE1BQU0sS0FBSyxHQUFHLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDN0QsT0FBTztRQUNILENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQU0sR0FBRyxDQUFDO1FBQzdCLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU8sR0FBRyxDQUFDO1FBQzlCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBTTtRQUNsQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU87S0FDdkIsQ0FBQztBQUNOLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxDQUFDLEtBQWlCLEVBQUUsRUFBRTtJQUMxQyxPQUFPLFlBQVksQ0FBQyxLQUFLLEVBQUU7UUFDdkIsS0FBSyxFQUFFLENBQUMsT0FBcUIsRUFBRSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztRQUNsRSxTQUFTLEVBQUUsQ0FBQyxPQUFxQixFQUFFLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDO0tBQ2hGLENBQWdCLENBQUM7QUFDdEIsQ0FBQyxDQUFDO0FBRUYsbUNBQW1DO0FBQ25DLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQWUsRUFBRSxFQUFFO0lBQ25DLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztJQUNsQixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUN0QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ2xDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQy9CLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDMUIsTUFBTSxhQUFhLEdBQUcsNEJBQTRCLENBQUMsR0FBRyxLQUFLLEVBQUUsR0FBRyxRQUFRLENBQUMsQ0FBQztRQUMxRSxNQUFNLFdBQVcsR0FBRyw0QkFBNEIsQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLFFBQVEsQ0FBQyxDQUFDO1FBQ3RFLE1BQU0sU0FBUyxHQUFHLGNBQWMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUMsYUFBYSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzNFLE1BQU0sU0FBUyxHQUFHLGNBQWMsQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3ZFLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUM7S0FDakQ7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxDQUM5QixLQUFpQixFQUNqQixTQUFvQixFQUNwQixXQUFrQixFQUNsQixXQUFrQixFQUNsQixhQUFnQyxFQUNoQyxVQUF1QixFQUN6QixFQUFFO0lBQ0EsTUFBTSxVQUFVLEdBQUcscUJBQXFCLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUM5RSxNQUFNLGdCQUFnQixHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsMkJBQTJCLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQzlHLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsMkJBQTJCLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQzlHLE1BQU0sYUFBYSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQzdELE1BQU0sYUFBYSxHQUFHLElBQUksa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEQsTUFBTSxlQUFlLEdBQUcsc0JBQXNCLEVBQUUsQ0FBQztJQUNqRCxJQUFJLFlBQVksRUFBRSxZQUFZLENBQUM7SUFDL0IsWUFBWSxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUM7SUFDdEMsWUFBWSxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUM7SUFDdEMsWUFBWSxJQUFJLE9BQU8sZUFBZSxDQUFDLE1BQU0sQ0FBQztJQUM5QyxZQUFZLElBQUksT0FBTyxlQUFlLENBQUMsTUFBTSxDQUFDO0lBQzlDLE1BQU0sb0JBQW9CLEdBQUcsaUJBQWlCLENBQzFDLFNBQVMsRUFDVCxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsRUFDMUIsRUFBRSxNQUFNLEVBQUUsWUFBWSxJQUFJLGNBQWMsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLEVBQUUsRUFBRSxFQUNuRyxFQUFFLE1BQU0sRUFBRSxZQUFZLElBQUksY0FBYyxDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxFQUN0RyxFQUFFLEVBQ0Y7UUFDSSxXQUFXLEVBQUUsZ0JBQWdCLENBQUMsV0FBVztRQUN6QyxHQUFHLGVBQWU7S0FDckIsQ0FDSixDQUFDO0lBQ0YsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDLEtBQUssRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0lBQzlELE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN0RSxhQUFhLENBQUMsY0FBYyxDQUFDLG9CQUFvQixFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQy9ELFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDMUQsT0FBTyxvQkFBb0IsQ0FBQztBQUNoQyxDQUFDLENBQUM7QUFFRixTQUFTLFFBQVEsQ0FBQyxLQUFpQixFQUFFLE9BQWtCLEVBQUUsRUFBVTtJQUMvRCxNQUFNLElBQUksR0FBRyxVQUFVLEVBQUUsQ0FBQztJQUMxQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM1QixNQUFNLE1BQU0sR0FBRyxhQUFhLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzdDLElBQUksU0FBUyxHQUFHLGVBQWUsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM3RCxTQUFTLEdBQUcsZUFBZSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hFLE1BQU0sWUFBWSxHQUFHLFVBQVUsQ0FBQyxTQUFTLEVBQUU7UUFDdkMsSUFBSSxFQUFFLE9BQU87S0FDaEIsQ0FBQyxDQUFDO0lBQ0gsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUUvQixNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO0lBQzVCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUU7UUFDMUIsSUFBSSxhQUFhLEdBQUcsb0JBQW9CLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNoRSxhQUFhLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsZUFBZSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzVFLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxhQUFhLEVBQUU7WUFDbkMsSUFBSSxFQUFFLE9BQU87U0FDaEIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQixDQUFDLENBQUMsQ0FBQztJQUNILFlBQVk7SUFDWixNQUFNLGtCQUFrQixHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNqRCxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ2hELGtCQUFrQixDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDaEQsT0FBTyxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxDQUFDO0FBQ3hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIFBvaW50LFxuICAgIGlkQ3JlYXRvcixcbiAgICBQbGFpdEJvYXJkLFxuICAgIGNyZWF0ZUcsXG4gICAgUmVjdGFuZ2xlQ2xpZW50LFxuICAgIGZpbmRFbGVtZW50cyxcbiAgICBQbGFpdEVsZW1lbnQsXG4gICAgZHJhd0xpbmVhclBhdGgsXG4gICAgY3JlYXRlTWFzayxcbiAgICBjcmVhdGVSZWN0LFxuICAgIGRpc3RhbmNlQmV0d2VlblBvaW50QW5kUG9pbnQsXG4gICAgY2F0bXVsbFJvbUZpdHRpbmdcbn0gZnJvbSAnQHBsYWl0L2NvcmUnO1xuaW1wb3J0IHsgcG9pbnRzT25CZXppZXJDdXJ2ZXMgfSBmcm9tICdwb2ludHMtb24tY3VydmUnO1xuaW1wb3J0IHsgZ2V0UG9pbnRPblBvbHlsaW5lLCBnZXRQb2ludEJ5VmVjdG9yLCByZW1vdmVEdXBsaWNhdGVQb2ludHMsIGdldEV4dGVuZFBvaW50LCBpc1NvdXJjZUFuZFRhcmdldEludGVyc2VjdCB9IGZyb20gJ0BwbGFpdC9jb21tb24nO1xuaW1wb3J0IHsgTGluZUhhbmRsZSwgTGluZU1hcmtlclR5cGUsIExpbmVTaGFwZSwgTGluZVRleHQsIFBsYWl0RHJhd0VsZW1lbnQsIFBsYWl0TGluZSwgUGxhaXRTaGFwZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgZ2V0TmVhcmVzdFBvaW50IH0gZnJvbSAnLi4vZ2VvbWV0cnknO1xuaW1wb3J0IHsgZ2V0TGluZURhc2hCeUVsZW1lbnQsIGdldFN0cm9rZUNvbG9yQnlFbGVtZW50LCBnZXRTdHJva2VXaWR0aEJ5RWxlbWVudCB9IGZyb20gJy4uL3N0eWxlL3N0cm9rZSc7XG5pbXBvcnQgeyBnZXRFbmdpbmUgfSBmcm9tICcuLi8uLi9lbmdpbmVzJztcbmltcG9ydCB7IGdldFNoYXBlIH0gZnJvbSAnLi4vc2hhcGUnO1xuaW1wb3J0IHsgRGVmYXVsdExpbmVTdHlsZSwgTElORV9URVhUX1NQQUNFIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL2xpbmUnO1xuaW1wb3J0IHsgTGluZVNoYXBlR2VuZXJhdG9yIH0gZnJvbSAnLi4vLi4vZ2VuZXJhdG9ycy9saW5lLmdlbmVyYXRvcic7XG5pbXBvcnQgeyBSRUFDVElPTl9NQVJHSU4gfSBmcm9tICcuLi8uLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgZ2V0SGl0T3V0bGluZUdlb21ldHJ5IH0gZnJvbSAnLi4vcG9zaXRpb24vZ2VvbWV0cnknO1xuaW1wb3J0IHsgZ2V0TGluZU1lbW9yaXplZExhdGVzdCB9IGZyb20gJy4uL21lbW9yaXplJztcbmltcG9ydCB7IGFsaWduUG9pbnRzIH0gZnJvbSAnLi9saW5lLXJlc2l6ZSc7XG5pbXBvcnQgeyBnZXRFbGJvd0xpbmVSb3V0ZU9wdGlvbnMsIGdldExpbmVIYW5kbGVSZWZQYWlyIH0gZnJvbSAnLi9saW5lLWNvbW1vbic7XG5pbXBvcnQgeyBnZXRFbGJvd1BvaW50cywgZ2V0TmV4dFNvdXJjZUFuZFRhcmdldFBvaW50cyB9IGZyb20gJy4vZWxib3cnO1xuaW1wb3J0IHsgZHJhd0xpbmVBcnJvdyB9IGZyb20gJy4vbGluZS1hcnJvdyc7XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVMaW5lRWxlbWVudCA9IChcbiAgICBzaGFwZTogTGluZVNoYXBlLFxuICAgIHBvaW50czogW1BvaW50LCBQb2ludF0sXG4gICAgc291cmNlOiBMaW5lSGFuZGxlLFxuICAgIHRhcmdldDogTGluZUhhbmRsZSxcbiAgICB0ZXh0cz86IExpbmVUZXh0W10sXG4gICAgb3B0aW9ucz86IFBpY2s8UGxhaXRMaW5lLCAnc3Ryb2tlQ29sb3InIHwgJ3N0cm9rZVdpZHRoJz5cbik6IFBsYWl0TGluZSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IGlkQ3JlYXRvcigpLFxuICAgICAgICB0eXBlOiAnbGluZScsXG4gICAgICAgIHNoYXBlLFxuICAgICAgICBzb3VyY2UsXG4gICAgICAgIHRleHRzOiB0ZXh0cyA/IHRleHRzIDogW10sXG4gICAgICAgIHRhcmdldCxcbiAgICAgICAgb3BhY2l0eTogMSxcbiAgICAgICAgcG9pbnRzLFxuICAgICAgICAuLi5vcHRpb25zXG4gICAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRMaW5lUG9pbnRzID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBlbGVtZW50OiBQbGFpdExpbmUpID0+IHtcbiAgICBzd2l0Y2ggKGVsZW1lbnQuc2hhcGUpIHtcbiAgICAgICAgY2FzZSBMaW5lU2hhcGUuZWxib3c6IHtcbiAgICAgICAgICAgIHJldHVybiBnZXRFbGJvd1BvaW50cyhib2FyZCwgZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBMaW5lU2hhcGUuY3VydmU6IHtcbiAgICAgICAgICAgIHJldHVybiBnZXRDdXJ2ZVBvaW50cyhib2FyZCwgZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgY29uc3QgcG9pbnRzID0gUGxhaXRMaW5lLmdldFBvaW50cyhib2FyZCwgZWxlbWVudCk7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVSZWZQYWlyID0gZ2V0TGluZUhhbmRsZVJlZlBhaXIoYm9hcmQsIGVsZW1lbnQpO1xuICAgICAgICAgICAgcG9pbnRzWzBdID0gaGFuZGxlUmVmUGFpci5zb3VyY2UucG9pbnQ7XG4gICAgICAgICAgICBwb2ludHNbcG9pbnRzLmxlbmd0aCAtIDFdID0gaGFuZGxlUmVmUGFpci50YXJnZXQucG9pbnQ7XG4gICAgICAgICAgICByZXR1cm4gcG9pbnRzO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGdldEN1cnZlUG9pbnRzID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBlbGVtZW50OiBQbGFpdExpbmUpID0+IHtcbiAgICBpZiAoZWxlbWVudC5wb2ludHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZVJlZlBhaXIgPSBnZXRMaW5lSGFuZGxlUmVmUGFpcihib2FyZCwgZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IHsgc291cmNlLCB0YXJnZXQgfSA9IGhhbmRsZVJlZlBhaXI7XG4gICAgICAgIGNvbnN0IHNvdXJjZUJvdW5kRWxlbWVudCA9IGhhbmRsZVJlZlBhaXIuc291cmNlLmJvdW5kRWxlbWVudDtcbiAgICAgICAgY29uc3QgdGFyZ2V0Qm91bmRFbGVtZW50ID0gaGFuZGxlUmVmUGFpci50YXJnZXQuYm91bmRFbGVtZW50O1xuICAgICAgICBsZXQgY3VydmVQb2ludHM6IFBvaW50W10gPSBbc291cmNlLnBvaW50XTtcbiAgICAgICAgY29uc3Qgc3VtRGlzdGFuY2UgPSBkaXN0YW5jZUJldHdlZW5Qb2ludEFuZFBvaW50KC4uLnNvdXJjZS5wb2ludCwgLi4udGFyZ2V0LnBvaW50KTtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gMTIgKyBzdW1EaXN0YW5jZSAvIDM7XG4gICAgICAgIGlmIChzb3VyY2VCb3VuZEVsZW1lbnQpIHtcbiAgICAgICAgICAgIGN1cnZlUG9pbnRzLnB1c2goZ2V0UG9pbnRCeVZlY3Rvcihzb3VyY2UucG9pbnQsIHNvdXJjZS52ZWN0b3IsIG9mZnNldCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0YXJnZXRCb3VuZEVsZW1lbnQpIHtcbiAgICAgICAgICAgIGN1cnZlUG9pbnRzLnB1c2goZ2V0UG9pbnRCeVZlY3Rvcih0YXJnZXQucG9pbnQsIHRhcmdldC52ZWN0b3IsIG9mZnNldCkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlzU2luZ2xlQm91bmQgPSAoc291cmNlQm91bmRFbGVtZW50ICYmICF0YXJnZXRCb3VuZEVsZW1lbnQpIHx8ICghc291cmNlQm91bmRFbGVtZW50ICYmIHRhcmdldEJvdW5kRWxlbWVudCk7XG4gICAgICAgIGlmIChpc1NpbmdsZUJvdW5kKSB7XG4gICAgICAgICAgICBjdXJ2ZVBvaW50cy5wdXNoKHRhcmdldC5wb2ludCk7XG4gICAgICAgICAgICBjb25zdCBwb2ludHMgPSBRMkMoY3VydmVQb2ludHMpO1xuICAgICAgICAgICAgcmV0dXJuIHBvaW50c09uQmV6aWVyQ3VydmVzKHBvaW50cykgYXMgUG9pbnRbXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNvdXJjZUJvdW5kRWxlbWVudCAmJiAhdGFyZ2V0Qm91bmRFbGVtZW50KSB7XG4gICAgICAgICAgICBjdXJ2ZVBvaW50cy5wdXNoKGdldFBvaW50QnlWZWN0b3Ioc291cmNlLnBvaW50LCBzb3VyY2UudmVjdG9yLCBvZmZzZXQpKTtcbiAgICAgICAgICAgIGN1cnZlUG9pbnRzLnB1c2goZ2V0UG9pbnRCeVZlY3Rvcih0YXJnZXQucG9pbnQsIHRhcmdldC52ZWN0b3IsIG9mZnNldCkpO1xuICAgICAgICB9XG4gICAgICAgIGN1cnZlUG9pbnRzLnB1c2godGFyZ2V0LnBvaW50KTtcbiAgICAgICAgcmV0dXJuIHBvaW50c09uQmV6aWVyQ3VydmVzKGN1cnZlUG9pbnRzKSBhcyBQb2ludFtdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBkYXRhUG9pbnRzID0gUGxhaXRMaW5lLmdldFBvaW50cyhib2FyZCwgZWxlbWVudCk7XG4gICAgICAgIGRhdGFQb2ludHMgPSByZW1vdmVEdXBsaWNhdGVQb2ludHMoZGF0YVBvaW50cyk7XG4gICAgICAgIGNvbnN0IHBvaW50cyA9IGNhdG11bGxSb21GaXR0aW5nKGRhdGFQb2ludHMpO1xuICAgICAgICByZXR1cm4gcG9pbnRzT25CZXppZXJDdXJ2ZXMocG9pbnRzKSBhcyBQb2ludFtdO1xuICAgIH1cbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNaWRkbGVQb2ludHMoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnQ6IFBsYWl0TGluZSkge1xuICAgIGNvbnN0IHJlc3VsdDogUG9pbnRbXSA9IFtdO1xuICAgIGNvbnN0IHNoYXBlID0gZWxlbWVudC5zaGFwZTtcbiAgICBjb25zdCBoaWRlQnVmZmVyID0gMTA7XG4gICAgaWYgKHNoYXBlID09PSBMaW5lU2hhcGUuc3RyYWlnaHQpIHtcbiAgICAgICAgY29uc3QgcG9pbnRzID0gUGxhaXRMaW5lLmdldFBvaW50cyhib2FyZCwgZWxlbWVudCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBkaXN0YW5jZUJldHdlZW5Qb2ludEFuZFBvaW50KC4uLnBvaW50c1tpXSwgLi4ucG9pbnRzW2kgKyAxXSk7XG4gICAgICAgICAgICBpZiAoZGlzdGFuY2UgPCBoaWRlQnVmZmVyKSBjb250aW51ZTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKFsocG9pbnRzW2ldWzBdICsgcG9pbnRzW2kgKyAxXVswXSkgLyAyLCAocG9pbnRzW2ldWzFdICsgcG9pbnRzW2kgKyAxXVsxXSkgLyAyXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNoYXBlID09PSBMaW5lU2hhcGUuY3VydmUpIHtcbiAgICAgICAgY29uc3QgcG9pbnRzID0gUGxhaXRMaW5lLmdldFBvaW50cyhib2FyZCwgZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IHBvaW50c09uQmV6aWVyID0gZ2V0Q3VydmVQb2ludHMoYm9hcmQsIGVsZW1lbnQpO1xuICAgICAgICBpZiAocG9pbnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSAwO1xuICAgICAgICAgICAgY29uc3QgZW5kSW5kZXggPSBwb2ludHNPbkJlemllci5sZW5ndGggLSAxO1xuICAgICAgICAgICAgY29uc3QgbWlkZGxlSW5kZXggPSBNYXRoLnJvdW5kKChzdGFydCArIGVuZEluZGV4KSAvIDIpO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2gocG9pbnRzT25CZXppZXJbbWlkZGxlSW5kZXhdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBwb2ludHNPbkJlemllci5maW5kSW5kZXgocG9pbnQgPT4gcG9pbnRbMF0gPT09IHBvaW50c1tpXVswXSAmJiBwb2ludFsxXSA9PT0gcG9pbnRzW2ldWzFdKTtcbiAgICAgICAgICAgICAgICBjb25zdCBlbmRJbmRleCA9IHBvaW50c09uQmV6aWVyLmZpbmRJbmRleChwb2ludCA9PiBwb2ludFswXSA9PT0gcG9pbnRzW2kgKyAxXVswXSAmJiBwb2ludFsxXSA9PT0gcG9pbnRzW2kgKyAxXVsxXSk7XG4gICAgICAgICAgICAgICAgY29uc3QgbWlkZGxlSW5kZXggPSBNYXRoLnJvdW5kKChzdGFydEluZGV4ICsgZW5kSW5kZXgpIC8gMik7XG4gICAgICAgICAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBkaXN0YW5jZUJldHdlZW5Qb2ludEFuZFBvaW50KC4uLnBvaW50c1tpXSwgLi4ucG9pbnRzW2kgKyAxXSk7XG4gICAgICAgICAgICAgICAgaWYgKGRpc3RhbmNlIDwgaGlkZUJ1ZmZlcikgY29udGludWU7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gocG9pbnRzT25CZXppZXJbbWlkZGxlSW5kZXhdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoc2hhcGUgPT09IExpbmVTaGFwZS5lbGJvdykge1xuICAgICAgICBjb25zdCByZW5kZXJQb2ludHMgPSBnZXRFbGJvd1BvaW50cyhib2FyZCwgZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBnZXRFbGJvd0xpbmVSb3V0ZU9wdGlvbnMoYm9hcmQsIGVsZW1lbnQpO1xuICAgICAgICBjb25zdCBpc0ludGVyc2VjdCA9IGlzU291cmNlQW5kVGFyZ2V0SW50ZXJzZWN0KG9wdGlvbnMpO1xuICAgICAgICBpZiAoIWlzSW50ZXJzZWN0KSB7XG4gICAgICAgICAgICBjb25zdCBbbmV4dFNvdXJjZVBvaW50LCBuZXh0VGFyZ2V0UG9pbnRdID0gZ2V0TmV4dFNvdXJjZUFuZFRhcmdldFBvaW50cyhib2FyZCwgZWxlbWVudCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlbmRlclBvaW50cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIChpID09IDAgJiYgUG9pbnQuaXNFcXVhbHMocmVuZGVyUG9pbnRzW2kgKyAxXSwgbmV4dFNvdXJjZVBvaW50KSkgfHxcbiAgICAgICAgICAgICAgICAgICAgKGkgPT09IHJlbmRlclBvaW50cy5sZW5ndGggLSAyICYmIFBvaW50LmlzRXF1YWxzKHJlbmRlclBvaW50c1tyZW5kZXJQb2ludHMubGVuZ3RoIC0gMl0sIG5leHRUYXJnZXRQb2ludCkpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBbY3VycmVudFgsIGN1cnJlbnRZXSA9IHJlbmRlclBvaW50c1tpXTtcbiAgICAgICAgICAgICAgICBjb25zdCBbbmV4dFgsIG5leHRZXSA9IHJlbmRlclBvaW50c1tpICsgMV07XG4gICAgICAgICAgICAgICAgY29uc3QgbWlkZGxlUG9pbnQgPSBbKGN1cnJlbnRYICsgbmV4dFgpIC8gMiwgKGN1cnJlbnRZICsgbmV4dFkpIC8gMl0gYXMgUG9pbnQ7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobWlkZGxlUG9pbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBjb25zdCBkcmF3TGluZSA9IChib2FyZDogUGxhaXRCb2FyZCwgZWxlbWVudDogUGxhaXRMaW5lKSA9PiB7XG4gICAgY29uc3Qgc3Ryb2tlV2lkdGggPSBnZXRTdHJva2VXaWR0aEJ5RWxlbWVudChlbGVtZW50KTtcbiAgICBjb25zdCBzdHJva2VDb2xvciA9IGdldFN0cm9rZUNvbG9yQnlFbGVtZW50KGJvYXJkLCBlbGVtZW50KTtcbiAgICBjb25zdCBzdHJva2VMaW5lRGFzaCA9IGdldExpbmVEYXNoQnlFbGVtZW50KGVsZW1lbnQpO1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7IHN0cm9rZTogc3Ryb2tlQ29sb3IsIHN0cm9rZVdpZHRoLCBzdHJva2VMaW5lRGFzaCB9O1xuICAgIGNvbnN0IGxpbmVHID0gY3JlYXRlRygpO1xuICAgIGxldCBwb2ludHMgPSBnZXRMaW5lUG9pbnRzKGJvYXJkLCBlbGVtZW50KTtcbiAgICBsZXQgbGluZTtcbiAgICBpZiAoZWxlbWVudC5zaGFwZSA9PT0gTGluZVNoYXBlLmN1cnZlKSB7XG4gICAgICAgIGxpbmUgPSBQbGFpdEJvYXJkLmdldFJvdWdoU1ZHKGJvYXJkKS5jdXJ2ZShwb2ludHMsIG9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxpbmUgPSBkcmF3TGluZWFyUGF0aChwb2ludHMsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBjb25zdCBpZCA9IGlkQ3JlYXRvcigpO1xuICAgIGxpbmUuc2V0QXR0cmlidXRlKCdtYXNrJywgYHVybCgjJHtpZH0pYCk7XG4gICAgbGluZUcuYXBwZW5kQ2hpbGQobGluZSk7XG4gICAgY29uc3QgeyBtYXNrLCBtYXNrVGFyZ2V0RmlsbFJlY3QgfSA9IGRyYXdNYXNrKGJvYXJkLCBlbGVtZW50LCBpZCk7XG4gICAgbGluZUcuYXBwZW5kQ2hpbGQobWFzayk7XG4gICAgbGluZS5hcHBlbmRDaGlsZChtYXNrVGFyZ2V0RmlsbFJlY3QpO1xuICAgIGNvbnN0IGFycm93ID0gZHJhd0xpbmVBcnJvdyhlbGVtZW50LCBwb2ludHMsIHsgc3Ryb2tlOiBzdHJva2VDb2xvciwgc3Ryb2tlV2lkdGggfSk7XG4gICAgYXJyb3cgJiYgbGluZUcuYXBwZW5kQ2hpbGQoYXJyb3cpO1xuICAgIHJldHVybiBsaW5lRztcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb25uZWN0aW9uQnlOZWFyZXN0UG9pbnQgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIHBvaW50OiBQb2ludCwgaGl0RWxlbWVudDogUGxhaXRTaGFwZSk6IFBvaW50ID0+IHtcbiAgICBsZXQgcmVjdGFuZ2xlID0gUmVjdGFuZ2xlQ2xpZW50LmdldFJlY3RhbmdsZUJ5UG9pbnRzKGhpdEVsZW1lbnQucG9pbnRzKTtcbiAgICBsZXQgbmVhcmVzdFBvaW50ID0gZ2V0TmVhcmVzdFBvaW50KGhpdEVsZW1lbnQsIHBvaW50KTtcbiAgICBjb25zdCBoaXRDb25uZWN0b3IgPSBnZXRIaXRDb25uZWN0b3JQb2ludChuZWFyZXN0UG9pbnQsIGhpdEVsZW1lbnQsIHJlY3RhbmdsZSk7XG4gICAgbmVhcmVzdFBvaW50ID0gaGl0Q29ubmVjdG9yID8gaGl0Q29ubmVjdG9yIDogbmVhcmVzdFBvaW50O1xuICAgIHJldHVybiBbKG5lYXJlc3RQb2ludFswXSAtIHJlY3RhbmdsZS54KSAvIHJlY3RhbmdsZS53aWR0aCwgKG5lYXJlc3RQb2ludFsxXSAtIHJlY3RhbmdsZS55KSAvIHJlY3RhbmdsZS5oZWlnaHRdO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEhpdENvbm5lY3RvclBvaW50ID0gKHBvaW50OiBQb2ludCwgaGl0RWxlbWVudDogUGxhaXRTaGFwZSwgcmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnQpID0+IHtcbiAgICBjb25zdCBzaGFwZSA9IGdldFNoYXBlKGhpdEVsZW1lbnQpO1xuICAgIGNvbnN0IGNvbm5lY3RvciA9IGdldEVuZ2luZShzaGFwZSkuZ2V0Q29ubmVjdG9yUG9pbnRzKHJlY3RhbmdsZSk7XG4gICAgY29uc3QgcG9pbnRzID0gUmVjdGFuZ2xlQ2xpZW50LmdldFBvaW50cyhSZWN0YW5nbGVDbGllbnQuZ2V0UmVjdGFuZ2xlQnlDZW50ZXJQb2ludChwb2ludCwgMTAsIDEwKSk7XG4gICAgY29uc3QgcG9pbnRSZWN0YW5nbGUgPSBSZWN0YW5nbGVDbGllbnQuZ2V0UmVjdGFuZ2xlQnlQb2ludHMocG9pbnRzKTtcbiAgICByZXR1cm4gY29ubmVjdG9yLmZpbmQocG9pbnQgPT4ge1xuICAgICAgICByZXR1cm4gUmVjdGFuZ2xlQ2xpZW50LmlzSGl0KHBvaW50UmVjdGFuZ2xlLCBSZWN0YW5nbGVDbGllbnQuZ2V0UmVjdGFuZ2xlQnlQb2ludHMoW3BvaW50LCBwb2ludF0pKTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRMaW5lVGV4dFJlY3RhbmdsZSA9IChib2FyZDogUGxhaXRCb2FyZCwgZWxlbWVudDogUGxhaXRMaW5lLCBpbmRleDogbnVtYmVyKTogUmVjdGFuZ2xlQ2xpZW50ID0+IHtcbiAgICBjb25zdCB0ZXh0ID0gZWxlbWVudC50ZXh0c1tpbmRleF07XG4gICAgY29uc3QgZWxib3dQb2ludHMgPSBnZXRMaW5lUG9pbnRzKGJvYXJkLCBlbGVtZW50KTtcbiAgICBjb25zdCBwb2ludCA9IGdldFBvaW50T25Qb2x5bGluZShlbGJvd1BvaW50cywgdGV4dC5wb3NpdGlvbik7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDogcG9pbnRbMF0gLSB0ZXh0LndpZHRoISAvIDIsXG4gICAgICAgIHk6IHBvaW50WzFdIC0gdGV4dC5oZWlnaHQhIC8gMixcbiAgICAgICAgd2lkdGg6IHRleHQud2lkdGghLFxuICAgICAgICBoZWlnaHQ6IHRleHQuaGVpZ2h0IVxuICAgIH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0TGluZXMgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQpID0+IHtcbiAgICByZXR1cm4gZmluZEVsZW1lbnRzKGJvYXJkLCB7XG4gICAgICAgIG1hdGNoOiAoZWxlbWVudDogUGxhaXRFbGVtZW50KSA9PiBQbGFpdERyYXdFbGVtZW50LmlzTGluZShlbGVtZW50KSxcbiAgICAgICAgcmVjdXJzaW9uOiAoZWxlbWVudDogUGxhaXRFbGVtZW50KSA9PiBQbGFpdERyYXdFbGVtZW50LmlzRHJhd0VsZW1lbnQoZWxlbWVudClcbiAgICB9KSBhcyBQbGFpdExpbmVbXTtcbn07XG5cbi8vIHF1YWRyYXRpYyBCZXppZXIgdG8gY3ViaWMgQmV6aWVyXG5leHBvcnQgY29uc3QgUTJDID0gKHBvaW50czogUG9pbnRbXSkgPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGNvbnN0IG51bVNlZ21lbnRzID0gcG9pbnRzLmxlbmd0aCAvIDM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1TZWdtZW50czsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gcG9pbnRzW2ldO1xuICAgICAgICBjb25zdCBxQ29udHJvbCA9IHBvaW50c1tpICsgMV07XG4gICAgICAgIGNvbnN0IGVuZCA9IHBvaW50c1tpICsgMl07XG4gICAgICAgIGNvbnN0IHN0YXJ0RGlzdGFuY2UgPSBkaXN0YW5jZUJldHdlZW5Qb2ludEFuZFBvaW50KC4uLnN0YXJ0LCAuLi5xQ29udHJvbCk7XG4gICAgICAgIGNvbnN0IGVuZERpc3RhbmNlID0gZGlzdGFuY2VCZXR3ZWVuUG9pbnRBbmRQb2ludCguLi5lbmQsIC4uLnFDb250cm9sKTtcbiAgICAgICAgY29uc3QgY0NvbnRyb2wxID0gZ2V0RXh0ZW5kUG9pbnQoc3RhcnQsIHFDb250cm9sLCAoc3RhcnREaXN0YW5jZSAqIDIpIC8gMyk7XG4gICAgICAgIGNvbnN0IGNDb250cm9sMiA9IGdldEV4dGVuZFBvaW50KGVuZCwgcUNvbnRyb2wsIChlbmREaXN0YW5jZSAqIDIpIC8gMyk7XG4gICAgICAgIHJlc3VsdC5wdXNoKHN0YXJ0LCBjQ29udHJvbDEsIGNDb250cm9sMiwgZW5kKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmV4cG9ydCBjb25zdCBoYW5kbGVMaW5lQ3JlYXRpbmcgPSAoXG4gICAgYm9hcmQ6IFBsYWl0Qm9hcmQsXG4gICAgbGluZVNoYXBlOiBMaW5lU2hhcGUsXG4gICAgc291cmNlUG9pbnQ6IFBvaW50LFxuICAgIG1vdmluZ1BvaW50OiBQb2ludCxcbiAgICBzb3VyY2VFbGVtZW50OiBQbGFpdFNoYXBlIHwgbnVsbCxcbiAgICBsaW5lU2hhcGVHOiBTVkdHRWxlbWVudFxuKSA9PiB7XG4gICAgY29uc3QgaGl0RWxlbWVudCA9IGdldEhpdE91dGxpbmVHZW9tZXRyeShib2FyZCwgbW92aW5nUG9pbnQsIFJFQUNUSU9OX01BUkdJTik7XG4gICAgY29uc3QgdGFyZ2V0Q29ubmVjdGlvbiA9IGhpdEVsZW1lbnQgPyBnZXRDb25uZWN0aW9uQnlOZWFyZXN0UG9pbnQoYm9hcmQsIG1vdmluZ1BvaW50LCBoaXRFbGVtZW50KSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBjb25uZWN0aW9uID0gc291cmNlRWxlbWVudCA/IGdldENvbm5lY3Rpb25CeU5lYXJlc3RQb2ludChib2FyZCwgc291cmNlUG9pbnQsIHNvdXJjZUVsZW1lbnQpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHRhcmdldEJvdW5kSWQgPSBoaXRFbGVtZW50ID8gaGl0RWxlbWVudC5pZCA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBsaW5lR2VuZXJhdG9yID0gbmV3IExpbmVTaGFwZUdlbmVyYXRvcihib2FyZCk7XG4gICAgY29uc3QgbWVtb3JpemVkTGF0ZXN0ID0gZ2V0TGluZU1lbW9yaXplZExhdGVzdCgpO1xuICAgIGxldCBzb3VyY2VNYXJrZXIsIHRhcmdldE1hcmtlcjtcbiAgICBzb3VyY2VNYXJrZXIgPSBtZW1vcml6ZWRMYXRlc3Quc291cmNlO1xuICAgIHRhcmdldE1hcmtlciA9IG1lbW9yaXplZExhdGVzdC50YXJnZXQ7XG4gICAgc291cmNlTWFya2VyICYmIGRlbGV0ZSBtZW1vcml6ZWRMYXRlc3Quc291cmNlO1xuICAgIHRhcmdldE1hcmtlciAmJiBkZWxldGUgbWVtb3JpemVkTGF0ZXN0LnRhcmdldDtcbiAgICBjb25zdCB0ZW1wb3JhcnlMaW5lRWxlbWVudCA9IGNyZWF0ZUxpbmVFbGVtZW50KFxuICAgICAgICBsaW5lU2hhcGUsXG4gICAgICAgIFtzb3VyY2VQb2ludCwgbW92aW5nUG9pbnRdLFxuICAgICAgICB7IG1hcmtlcjogc291cmNlTWFya2VyIHx8IExpbmVNYXJrZXJUeXBlLm5vbmUsIGNvbm5lY3Rpb246IGNvbm5lY3Rpb24sIGJvdW5kSWQ6IHNvdXJjZUVsZW1lbnQ/LmlkIH0sXG4gICAgICAgIHsgbWFya2VyOiB0YXJnZXRNYXJrZXIgfHwgTGluZU1hcmtlclR5cGUuYXJyb3csIGNvbm5lY3Rpb246IHRhcmdldENvbm5lY3Rpb24sIGJvdW5kSWQ6IHRhcmdldEJvdW5kSWQgfSxcbiAgICAgICAgW10sXG4gICAgICAgIHtcbiAgICAgICAgICAgIHN0cm9rZVdpZHRoOiBEZWZhdWx0TGluZVN0eWxlLnN0cm9rZVdpZHRoLFxuICAgICAgICAgICAgLi4ubWVtb3JpemVkTGF0ZXN0XG4gICAgICAgIH1cbiAgICApO1xuICAgIGNvbnN0IGxpbmVQb2ludHMgPSBnZXRMaW5lUG9pbnRzKGJvYXJkLCB0ZW1wb3JhcnlMaW5lRWxlbWVudCk7XG4gICAgY29uc3Qgb3RoZXJQb2ludCA9IGxpbmVQb2ludHNbMF07XG4gICAgdGVtcG9yYXJ5TGluZUVsZW1lbnQucG9pbnRzWzFdID0gYWxpZ25Qb2ludHMob3RoZXJQb2ludCwgbW92aW5nUG9pbnQpO1xuICAgIGxpbmVHZW5lcmF0b3IucHJvY2Vzc0RyYXdpbmcodGVtcG9yYXJ5TGluZUVsZW1lbnQsIGxpbmVTaGFwZUcpO1xuICAgIFBsYWl0Qm9hcmQuZ2V0RWxlbWVudEFjdGl2ZUhvc3QoYm9hcmQpLmFwcGVuZChsaW5lU2hhcGVHKTtcbiAgICByZXR1cm4gdGVtcG9yYXJ5TGluZUVsZW1lbnQ7XG59O1xuXG5mdW5jdGlvbiBkcmF3TWFzayhib2FyZDogUGxhaXRCb2FyZCwgZWxlbWVudDogUGxhaXRMaW5lLCBpZDogc3RyaW5nKSB7XG4gICAgY29uc3QgbWFzayA9IGNyZWF0ZU1hc2soKTtcbiAgICBtYXNrLnNldEF0dHJpYnV0ZSgnaWQnLCBpZCk7XG4gICAgY29uc3QgcG9pbnRzID0gZ2V0TGluZVBvaW50cyhib2FyZCwgZWxlbWVudCk7XG4gICAgbGV0IHJlY3RhbmdsZSA9IFJlY3RhbmdsZUNsaWVudC5nZXRSZWN0YW5nbGVCeVBvaW50cyhwb2ludHMpO1xuICAgIHJlY3RhbmdsZSA9IFJlY3RhbmdsZUNsaWVudC5nZXRPdXRsaW5lUmVjdGFuZ2xlKHJlY3RhbmdsZSwgLTMwKTtcbiAgICBjb25zdCBtYXNrRmlsbFJlY3QgPSBjcmVhdGVSZWN0KHJlY3RhbmdsZSwge1xuICAgICAgICBmaWxsOiAnd2hpdGUnXG4gICAgfSk7XG4gICAgbWFzay5hcHBlbmRDaGlsZChtYXNrRmlsbFJlY3QpO1xuXG4gICAgY29uc3QgdGV4dHMgPSBlbGVtZW50LnRleHRzO1xuICAgIHRleHRzLmZvckVhY2goKHRleHQsIGluZGV4KSA9PiB7XG4gICAgICAgIGxldCB0ZXh0UmVjdGFuZ2xlID0gZ2V0TGluZVRleHRSZWN0YW5nbGUoYm9hcmQsIGVsZW1lbnQsIGluZGV4KTtcbiAgICAgICAgdGV4dFJlY3RhbmdsZSA9IFJlY3RhbmdsZUNsaWVudC5pbmZsYXRlKHRleHRSZWN0YW5nbGUsIExJTkVfVEVYVF9TUEFDRSAqIDIpO1xuICAgICAgICBjb25zdCByZWN0ID0gY3JlYXRlUmVjdCh0ZXh0UmVjdGFuZ2xlLCB7XG4gICAgICAgICAgICBmaWxsOiAnYmxhY2snXG4gICAgICAgIH0pO1xuICAgICAgICBtYXNrLmFwcGVuZENoaWxkKHJlY3QpO1xuICAgIH0pO1xuICAgIC8vIG9wZW4gbGluZVxuICAgIGNvbnN0IG1hc2tUYXJnZXRGaWxsUmVjdCA9IGNyZWF0ZVJlY3QocmVjdGFuZ2xlKTtcbiAgICBtYXNrVGFyZ2V0RmlsbFJlY3Quc2V0QXR0cmlidXRlKCdvcGFjaXR5JywgJzAnKTtcbiAgICBtYXNrVGFyZ2V0RmlsbFJlY3Quc2V0QXR0cmlidXRlKCdmaWxsJywgJ25vbmUnKTtcbiAgICByZXR1cm4geyBtYXNrLCBtYXNrVGFyZ2V0RmlsbFJlY3QgfTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { getElementById, RectangleClient, Direction } from '@plait/core';
|
|
2
|
+
import { getDirectionFactor, rotateVectorAnti90, getDirectionByVector, getOppositeDirection, getDirectionByPointOfRectangle, getSourceAndTargetOuterRectangle, getNextPoint } from '@plait/common';
|
|
3
|
+
import { BasicShapes, LineHandleKey, LineMarkerType, PlaitLine } from '../../interfaces';
|
|
4
|
+
import { getStrokeWidthByElement } from '../style/stroke';
|
|
5
|
+
import { getEngine } from '../../engines';
|
|
6
|
+
import { getShape } from '../shape';
|
|
7
|
+
import { getSourceAndTargetRectangle } from './elbow';
|
|
8
|
+
export const getLineHandleRefPair = (board, element) => {
|
|
9
|
+
const strokeWidth = getStrokeWidthByElement(element);
|
|
10
|
+
const sourceBoundElement = element.source.boundId ? getElementById(board, element.source.boundId) : undefined;
|
|
11
|
+
const targetBoundElement = element.target.boundId ? getElementById(board, element.target.boundId) : undefined;
|
|
12
|
+
let sourcePoint = sourceBoundElement ? getConnectionPoint(sourceBoundElement, element.source.connection) : element.points[0];
|
|
13
|
+
let targetPoint = targetBoundElement
|
|
14
|
+
? getConnectionPoint(targetBoundElement, element.target.connection)
|
|
15
|
+
: element.points[element.points.length - 1];
|
|
16
|
+
let sourceDirection = getDirectionByVector([targetPoint[0] - sourcePoint[0], targetPoint[1] - sourcePoint[1]]) || Direction.right;
|
|
17
|
+
let targetDirection = getOppositeDirection(sourceDirection);
|
|
18
|
+
const sourceFactor = getDirectionFactor(sourceDirection);
|
|
19
|
+
const targetFactor = getDirectionFactor(targetDirection);
|
|
20
|
+
const sourceHandleRef = {
|
|
21
|
+
key: LineHandleKey.source,
|
|
22
|
+
point: sourcePoint,
|
|
23
|
+
direction: sourceDirection,
|
|
24
|
+
vector: [sourceFactor.x, sourceFactor.y]
|
|
25
|
+
};
|
|
26
|
+
const targetHandleRef = {
|
|
27
|
+
key: LineHandleKey.target,
|
|
28
|
+
point: targetPoint,
|
|
29
|
+
direction: targetDirection,
|
|
30
|
+
vector: [targetFactor.x, targetFactor.y]
|
|
31
|
+
};
|
|
32
|
+
if (sourceBoundElement) {
|
|
33
|
+
const connectionOffset = PlaitLine.isSourceMarkOrTargetMark(element, LineMarkerType.none, LineHandleKey.source) ? 0 : strokeWidth;
|
|
34
|
+
const sourceVector = getVectorByConnection(sourceBoundElement, element.source.connection);
|
|
35
|
+
const direction = getDirectionByVector(sourceVector);
|
|
36
|
+
sourceDirection = direction ? direction : sourceDirection;
|
|
37
|
+
sourcePoint = getConnectionPoint(sourceBoundElement, element.source.connection, sourceDirection, connectionOffset);
|
|
38
|
+
sourceHandleRef.boundElement = sourceBoundElement;
|
|
39
|
+
sourceHandleRef.direction = sourceDirection;
|
|
40
|
+
sourceHandleRef.point = sourcePoint;
|
|
41
|
+
sourceHandleRef.vector = sourceVector;
|
|
42
|
+
}
|
|
43
|
+
if (targetBoundElement) {
|
|
44
|
+
const connectionOffset = PlaitLine.isSourceMarkOrTargetMark(element, LineMarkerType.none, LineHandleKey.target) ? 0 : strokeWidth;
|
|
45
|
+
const targetVector = getVectorByConnection(targetBoundElement, element.target.connection);
|
|
46
|
+
const direction = getDirectionByVector(targetVector);
|
|
47
|
+
targetDirection = direction ? direction : targetDirection;
|
|
48
|
+
targetPoint = getConnectionPoint(targetBoundElement, element.target.connection, targetDirection, connectionOffset);
|
|
49
|
+
targetHandleRef.boundElement = targetBoundElement;
|
|
50
|
+
targetHandleRef.direction = targetDirection;
|
|
51
|
+
targetHandleRef.point = targetPoint;
|
|
52
|
+
targetHandleRef.vector = targetVector;
|
|
53
|
+
}
|
|
54
|
+
return { source: sourceHandleRef, target: targetHandleRef };
|
|
55
|
+
};
|
|
56
|
+
export const getConnectionPoint = (geometry, connection, direction, delta) => {
|
|
57
|
+
const rectangle = RectangleClient.getRectangleByPoints(geometry.points);
|
|
58
|
+
if (direction && delta) {
|
|
59
|
+
const directionFactor = getDirectionFactor(direction);
|
|
60
|
+
const point = RectangleClient.getConnectionPoint(rectangle, connection);
|
|
61
|
+
return [point[0] + directionFactor.x * delta, point[1] + directionFactor.y * delta];
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
return RectangleClient.getConnectionPoint(rectangle, connection);
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
export const getVectorByConnection = (boundElement, connection) => {
|
|
68
|
+
const rectangle = RectangleClient.getRectangleByPoints(boundElement.points);
|
|
69
|
+
const shape = getShape(boundElement);
|
|
70
|
+
const engine = getEngine(shape);
|
|
71
|
+
let vector = [0, 0];
|
|
72
|
+
const direction = getDirectionByPointOfRectangle(connection);
|
|
73
|
+
if (direction && boundElement.shape !== BasicShapes.ellipse) {
|
|
74
|
+
const factor = getDirectionFactor(direction);
|
|
75
|
+
return [factor.x, factor.y];
|
|
76
|
+
}
|
|
77
|
+
if (engine.getEdgeByConnectionPoint) {
|
|
78
|
+
const edge = engine.getEdgeByConnectionPoint(rectangle, connection);
|
|
79
|
+
if (edge) {
|
|
80
|
+
const lineVector = [edge[1][0] - edge[0][0], edge[1][1] - edge[0][1]];
|
|
81
|
+
return rotateVectorAnti90(lineVector);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (engine.getTangentVectorByConnectionPoint) {
|
|
85
|
+
const lineVector = engine.getTangentVectorByConnectionPoint(rectangle, connection);
|
|
86
|
+
if (lineVector) {
|
|
87
|
+
return rotateVectorAnti90(lineVector);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return vector;
|
|
91
|
+
};
|
|
92
|
+
export const getElbowLineRouteOptions = (board, element, handleRefPair) => {
|
|
93
|
+
handleRefPair = handleRefPair ?? getLineHandleRefPair(board, element);
|
|
94
|
+
const { sourceRectangle, targetRectangle } = getSourceAndTargetRectangle(board, element, handleRefPair);
|
|
95
|
+
const { sourceOuterRectangle, targetOuterRectangle } = getSourceAndTargetOuterRectangle(sourceRectangle, targetRectangle);
|
|
96
|
+
const sourcePoint = handleRefPair.source.point;
|
|
97
|
+
const targetPoint = handleRefPair.target.point;
|
|
98
|
+
const nextSourcePoint = getNextPoint(sourcePoint, sourceOuterRectangle, handleRefPair.source.direction);
|
|
99
|
+
const nextTargetPoint = getNextPoint(targetPoint, targetOuterRectangle, handleRefPair.target.direction);
|
|
100
|
+
return {
|
|
101
|
+
sourcePoint,
|
|
102
|
+
nextSourcePoint,
|
|
103
|
+
sourceRectangle,
|
|
104
|
+
sourceOuterRectangle,
|
|
105
|
+
targetPoint,
|
|
106
|
+
nextTargetPoint,
|
|
107
|
+
targetRectangle,
|
|
108
|
+
targetOuterRectangle
|
|
109
|
+
};
|
|
110
|
+
};
|
|
111
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluZS1jb21tb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kcmF3L3NyYy91dGlscy9saW5lL2xpbmUtY29tbW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUIsY0FBYyxFQUFFLGVBQWUsRUFBb0IsU0FBUyxFQUFVLE1BQU0sYUFBYSxDQUFDO0FBQ3RILE9BQU8sRUFDSCxrQkFBa0IsRUFDbEIsa0JBQWtCLEVBQ2xCLG9CQUFvQixFQUNwQixvQkFBb0IsRUFDcEIsOEJBQThCLEVBQzlCLGdDQUFnQyxFQUNoQyxZQUFZLEVBQ2YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQW9DLGNBQWMsRUFBaUIsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDMUksT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUV0RCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLEtBQWlCLEVBQUUsT0FBa0IsRUFBcUIsRUFBRTtJQUM3RixNQUFNLFdBQVcsR0FBRyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNyRCxNQUFNLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQWdCLEtBQUssRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDN0gsTUFBTSxrQkFBa0IsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFn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T0FBTztRQUNILFdBQVc7UUFDWCxlQUFlO1FBQ2YsZUFBZTtRQUNmLG9CQUFvQjtRQUNwQixXQUFXO1FBQ1gsZUFBZTtRQUNmLGVBQWU7UUFDZixvQkFBb0I7S0FDdkIsQ0FBQztBQUNOLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBvaW50LCBQbGFpdEJvYXJkLCBnZXRFbGVtZW50QnlJZCwgUmVjdGFuZ2xlQ2xpZW50LCBQb2ludE9mUmVjdGFuZ2xlLCBEaXJlY3Rpb24sIFZlY3RvciB9IGZyb20gJ0BwbGFpdC9jb3JlJztcbmltcG9ydCB7XG4gICAgZ2V0RGlyZWN0aW9uRmFjdG9yLFxuICAgIHJvdGF0ZVZlY3RvckFudGk5MCxcbiAgICBnZXREaXJlY3Rpb25CeVZlY3RvcixcbiAgICBnZXRPcHBvc2l0ZURpcmVjdGlvbixcbiAgICBnZXREaXJlY3Rpb25CeVBvaW50T2ZSZWN0YW5nbGUsXG4gICAgZ2V0U291cmNlQW5kVGFyZ2V0T3V0ZXJSZWN0YW5nbGUsXG4gICAgZ2V0TmV4dFBvaW50XG59IGZyb20gJ0BwbGFpdC9jb21tb24nO1xuaW1wb3J0IHsgQmFzaWNTaGFwZXMsIExpbmVIYW5kbGVLZXksIExpbmVIYW5kbGVSZWYsIExpbmVIYW5kbGVSZWZQYWlyLCBMaW5lTWFya2VyVHlwZSwgUGxhaXRHZW9tZXRyeSwgUGxhaXRMaW5lIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBnZXRTdHJva2VXaWR0aEJ5RWxlbWVudCB9IGZyb20gJy4uL3N0eWxlL3N0cm9rZSc7XG5pbXBvcnQgeyBnZXRFbmdpbmUgfSBmcm9tICcuLi8uLi9lbmdpbmVzJztcbmltcG9ydCB7IGdldFNoYXBlIH0gZnJvbSAnLi4vc2hhcGUnO1xuaW1wb3J0IHsgZ2V0U291cmNlQW5kVGFyZ2V0UmVjdGFuZ2xlIH0gZnJvbSAnLi9lbGJvdyc7XG5cbmV4cG9ydCBjb25zdCBnZXRMaW5lSGFuZGxlUmVmUGFpciA9IChib2FyZDogUGxhaXRCb2FyZCwgZWxlbWVudDogUGxhaXRMaW5lKTogTGluZUhhbmRsZVJlZlBhaXIgPT4ge1xuICAgIGNvbnN0IHN0cm9rZVdpZHRoID0gZ2V0U3Ryb2tlV2lkdGhCeUVsZW1lbnQoZWxlbWVudCk7XG4gICAgY29uc3Qgc291cmNlQm91bmRFbGVtZW50ID0gZWxlbWVudC5zb3VyY2UuYm91bmRJZCA/IGdldEVsZW1lbnRCeUlkPFBsYWl0R2VvbWV0cnk+KGJvYXJkLCBlbGVtZW50LnNvdXJjZS5ib3VuZElkKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCB0YXJnZXRCb3VuZEVsZW1lbnQgPSBlbGVtZW50LnRhcmdldC5ib3VuZElkID8gZ2V0RWxlbWVudEJ5SWQ8UGxhaXRHZW9tZXRyeT4oYm9hcmQsIGVsZW1lbnQudGFyZ2V0LmJvdW5kSWQpIDogdW5kZWZpbmVkO1xuICAgIGxldCBzb3VyY2VQb2ludCA9IHNvdXJjZUJvdW5kRWxlbWVudCA/IGdldENvbm5lY3Rpb25Qb2ludChzb3VyY2VCb3VuZEVsZW1lbnQsIGVsZW1lbnQuc291cmNlLmNvbm5lY3Rpb24hKSA6IGVsZW1lbnQucG9pbnRzWzBdO1xuICAgIGxldCB0YXJnZXRQb2ludCA9IHRhcmdldEJvdW5kRWxlbWVudFxuICAgICAgICA/IGdldENvbm5lY3Rpb25Qb2ludCh0YXJnZXRCb3VuZEVsZW1lbnQsIGVsZW1lbnQudGFyZ2V0LmNvbm5lY3Rpb24hKVxuICAgICAgICA6IGVsZW1lbnQucG9pbnRzW2VsZW1lbnQucG9pbnRzLmxlbmd0aCAtIDFdO1xuICAgIGxldCBzb3VyY2VEaXJlY3Rpb24gPSBnZXREaXJlY3Rpb25CeVZlY3RvcihbdGFyZ2V0UG9pbnRbMF0gLSBzb3VyY2VQb2ludFswXSwgdGFyZ2V0UG9pbnRbMV0gLSBzb3VyY2VQb2ludFsxXV0pIHx8IERpcmVjdGlvbi5yaWdodDtcbiAgICBsZXQgdGFyZ2V0RGlyZWN0aW9uID0gZ2V0T3Bwb3NpdGVEaXJlY3Rpb24oc291cmNlRGlyZWN0aW9uKTtcbiAgICBjb25zdCBzb3VyY2VGYWN0b3IgPSBnZXREaXJlY3Rpb25GYWN0b3Ioc291cmNlRGlyZWN0aW9uKTtcbiAgICBjb25zdCB0YXJnZXRGYWN0b3IgPSBnZXREaXJlY3Rpb25GYWN0b3IodGFyZ2V0RGlyZWN0aW9uKTtcbiAgICBjb25zdCBzb3VyY2VIYW5kbGVSZWY6IExpbmVIYW5kbGVSZWYgPSB7XG4gICAgICAgIGtleTogTGluZUhhbmRsZUtleS5zb3VyY2UsXG4gICAgICAgIHBvaW50OiBzb3VyY2VQb2ludCxcbiAgICAgICAgZGlyZWN0aW9uOiBzb3VyY2VEaXJlY3Rpb24sXG4gICAgICAgIHZlY3RvcjogW3NvdXJjZUZhY3Rvci54LCBzb3VyY2VGYWN0b3IueV1cbiAgICB9O1xuICAgIGNvbnN0IHRhcmdldEhhbmRsZVJlZjogTGluZUhhbmRsZVJlZiA9IHtcbiAgICAgICAga2V5OiBMaW5lSGFuZGxlS2V5LnRhcmdldCxcbiAgICAgICAgcG9pbnQ6IHRhcmdldFBvaW50LFxuICAgICAgICBkaXJlY3Rpb246IHRhcmdldERpcmVjdGlvbixcbiAgICAgICAgdmVjdG9yOiBbdGFyZ2V0RmFjdG9yLngsIHRhcmdldEZhY3Rvci55XVxuICAgIH07XG4gICAgaWYgKHNvdXJjZUJvdW5kRWxlbWVudCkge1xuICAgICAgICBjb25zdCBjb25uZWN0aW9uT2Zmc2V0ID0gUGxhaXRMaW5lLmlzU291cmNlTWFya09yVGFyZ2V0TWFyayhlbGVtZW50LCBMaW5lTWFya2VyVHlwZS5ub25lLCBMaW5lSGFuZGxlS2V5LnNvdXJjZSkgPyAwIDogc3Ryb2tlV2lkdGg7XG4gICAgICAgIGNvbnN0IHNvdXJjZVZlY3RvciA9IGdldFZlY3RvckJ5Q29ubmVjdGlvbihzb3VyY2VCb3VuZEVsZW1lbnQsIGVsZW1lbnQuc291cmNlLmNvbm5lY3Rpb24hKTtcbiAgICAgICAgY29uc3QgZGlyZWN0aW9uID0gZ2V0RGlyZWN0aW9uQnlWZWN0b3Ioc291cmNlVmVjdG9yKTtcbiAgICAgICAgc291cmNlRGlyZWN0aW9uID0gZGlyZWN0aW9uID8gZGlyZWN0aW9uIDogc291cmNlRGlyZWN0aW9uO1xuICAgICAgICBzb3VyY2VQb2ludCA9IGdldENvbm5lY3Rpb25Qb2ludChzb3VyY2VCb3VuZEVsZW1lbnQsIGVsZW1lbnQuc291cmNlLmNvbm5lY3Rpb24hLCBzb3VyY2VEaXJlY3Rpb24sIGNvbm5lY3Rpb25PZmZzZXQpO1xuICAgICAgICBzb3VyY2VIYW5kbGVSZWYuYm91bmRFbGVtZW50ID0gc291cmNlQm91bmRFbGVtZW50O1xuICAgICAgICBzb3VyY2VIYW5kbGVSZWYuZGlyZWN0aW9uID0gc291cmNlRGlyZWN0aW9uO1xuICAgICAgICBzb3VyY2VIYW5kbGVSZWYucG9pbnQgPSBzb3VyY2VQb2ludDtcbiAgICAgICAgc291cmNlSGFuZGxlUmVmLnZlY3RvciA9IHNvdXJjZVZlY3RvcjtcbiAgICB9XG4gICAgaWYgKHRhcmdldEJvdW5kRWxlbWVudCkge1xuICAgICAgICBjb25zdCBjb25uZWN0aW9uT2Zmc2V0ID0gUGxhaXRMaW5lLmlzU291cmNlTWFya09yVGFyZ2V0TWFyayhlbGVtZW50LCBMaW5lTWFya2VyVHlwZS5ub25lLCBMaW5lSGFuZGxlS2V5LnRhcmdldCkgPyAwIDogc3Ryb2tlV2lkdGg7XG4gICAgICAgIGNvbnN0IHRhcmdldFZlY3RvciA9IGdldFZlY3RvckJ5Q29ubmVjdGlvbih0YXJnZXRCb3VuZEVsZW1lbnQsIGVsZW1lbnQudGFyZ2V0LmNvbm5lY3Rpb24hKTtcbiAgICAgICAgY29uc3QgZGlyZWN0aW9uID0gZ2V0RGlyZWN0aW9uQnlWZWN0b3IodGFyZ2V0VmVjdG9yKTtcbiAgICAgICAgdGFyZ2V0RGlyZWN0aW9uID0gZGlyZWN0aW9uID8gZGlyZWN0aW9uIDogdGFyZ2V0RGlyZWN0aW9uO1xuICAgICAgICB0YXJnZXRQb2ludCA9IGdldENvbm5lY3Rpb25Qb2ludCh0YXJnZXRCb3VuZEVsZW1lbnQsIGVsZW1lbnQudGFyZ2V0LmNvbm5lY3Rpb24hLCB0YXJnZXREaXJlY3Rpb24sIGNvbm5lY3Rpb25PZmZzZXQpO1xuICAgICAgICB0YXJnZXRIYW5kbGVSZWYuYm91bmRFbGVtZW50ID0gdGFyZ2V0Qm91bmRFbGVtZW50O1xuICAgICAgICB0YXJnZXRIYW5kbGVSZWYuZGlyZWN0aW9uID0gdGFyZ2V0RGlyZWN0aW9uO1xuICAgICAgICB0YXJnZXRIYW5kbGVSZWYucG9pbnQgPSB0YXJnZXRQb2ludDtcbiAgICAgICAgdGFyZ2V0SGFuZGxlUmVmLnZlY3RvciA9IHRhcmdldFZlY3RvcjtcbiAgICB9XG4gICAgcmV0dXJuIHsgc291cmNlOiBzb3VyY2VIYW5kbGVSZWYsIHRhcmdldDogdGFyZ2V0SGFuZGxlUmVmIH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29ubmVjdGlvblBvaW50ID0gKGdlb21ldHJ5OiBQbGFpdEdlb21ldHJ5LCBjb25uZWN0aW9uOiBQb2ludCwgZGlyZWN0aW9uPzogRGlyZWN0aW9uLCBkZWx0YT86IG51bWJlcik6IFBvaW50ID0+IHtcbiAgICBjb25zdCByZWN0YW5nbGUgPSBSZWN0YW5nbGVDbGllbnQuZ2V0UmVjdGFuZ2xlQnlQb2ludHMoZ2VvbWV0cnkucG9pbnRzKTtcbiAgICBpZiAoZGlyZWN0aW9uICYmIGRlbHRhKSB7XG4gICAgICAgIGNvbnN0IGRpcmVjdGlvbkZhY3RvciA9IGdldERpcmVjdGlvbkZhY3RvcihkaXJlY3Rpb24pO1xuICAgICAgICBjb25zdCBwb2ludCA9IFJlY3RhbmdsZUNsaWVudC5nZXRDb25uZWN0aW9uUG9pbnQocmVjdGFuZ2xlLCBjb25uZWN0aW9uKTtcbiAgICAgICAgcmV0dXJuIFtwb2ludFswXSArIGRpcmVjdGlvbkZhY3Rvci54ICogZGVsdGEsIHBvaW50WzFdICsgZGlyZWN0aW9uRmFjdG9yLnkgKiBkZWx0YV07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFJlY3RhbmdsZUNsaWVudC5nZXRDb25uZWN0aW9uUG9pbnQocmVjdGFuZ2xlLCBjb25uZWN0aW9uKTtcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VmVjdG9yQnlDb25uZWN0aW9uID0gKGJvdW5kRWxlbWVudDogUGxhaXRHZW9tZXRyeSwgY29ubmVjdGlvbjogUG9pbnRPZlJlY3RhbmdsZSk6IFZlY3RvciA9PiB7XG4gICAgY29uc3QgcmVjdGFuZ2xlID0gUmVjdGFuZ2xlQ2xpZW50LmdldFJlY3RhbmdsZUJ5UG9pbnRzKGJvdW5kRWxlbWVudC5wb2ludHMpO1xuICAgIGNvbnN0IHNoYXBlID0gZ2V0U2hhcGUoYm91bmRFbGVtZW50KTtcbiAgICBjb25zdCBlbmdpbmUgPSBnZXRFbmdpbmUoc2hhcGUpO1xuICAgIGxldCB2ZWN0b3I6IFZlY3RvciA9IFswLCAwXTtcbiAgICBjb25zdCBkaXJlY3Rpb24gPSBnZXREaXJlY3Rpb25CeVBvaW50T2ZSZWN0YW5nbGUoY29ubmVjdGlvbik7XG4gICAgaWYgKGRpcmVjdGlvbiAmJiBib3VuZEVsZW1lbnQuc2hhcGUgIT09IEJhc2ljU2hhcGVzLmVsbGlwc2UpIHtcbiAgICAgICAgY29uc3QgZmFjdG9yID0gZ2V0RGlyZWN0aW9uRmFjdG9yKGRpcmVjdGlvbik7XG4gICAgICAgIHJldHVybiBbZmFjdG9yLngsIGZhY3Rvci55XTtcbiAgICB9XG4gICAgaWYgKGVuZ2luZS5nZXRFZGdlQnlDb25uZWN0aW9uUG9pbnQpIHtcbiAgICAgICAgY29uc3QgZWRnZSA9IGVuZ2luZS5nZXRFZGdlQnlDb25uZWN0aW9uUG9pbnQocmVjdGFuZ2xlLCBjb25uZWN0aW9uKTtcbiAgICAgICAgaWYgKGVkZ2UpIHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmVWZWN0b3IgPSBbZWRnZVsxXVswXSAtIGVkZ2VbMF1bMF0sIGVkZ2VbMV1bMV0gLSBlZGdlWzBdWzFdXSBhcyBWZWN0b3I7XG4gICAgICAgICAgICByZXR1cm4gcm90YXRlVmVjdG9yQW50aTkwKGxpbmVWZWN0b3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChlbmdpbmUuZ2V0VGFuZ2VudFZlY3RvckJ5Q29ubmVjdGlvblBvaW50KSB7XG4gICAgICAgIGNvbnN0IGxpbmVWZWN0b3IgPSBlbmdpbmUuZ2V0VGFuZ2VudFZlY3RvckJ5Q29ubmVjdGlvblBvaW50KHJlY3RhbmdsZSwgY29ubmVjdGlvbik7XG4gICAgICAgIGlmIChsaW5lVmVjdG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gcm90YXRlVmVjdG9yQW50aTkwKGxpbmVWZWN0b3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2ZWN0b3I7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RWxib3dMaW5lUm91dGVPcHRpb25zID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBlbGVtZW50OiBQbGFpdExpbmUsIGhhbmRsZVJlZlBhaXI/OiBMaW5lSGFuZGxlUmVmUGFpcikgPT4ge1xuICAgIGhhbmRsZVJlZlBhaXIgPSBoYW5kbGVSZWZQYWlyID8/IGdldExpbmVIYW5kbGVSZWZQYWlyKGJvYXJkLCBlbGVtZW50KTtcbiAgICBjb25zdCB7IHNvdXJjZVJlY3RhbmdsZSwgdGFyZ2V0UmVjdGFuZ2xlIH0gPSBnZXRTb3VyY2VBbmRUYXJnZXRSZWN0YW5nbGUoYm9hcmQsIGVsZW1lbnQsIGhhbmRsZVJlZlBhaXIpO1xuICAgIGNvbnN0IHsgc291cmNlT3V0ZXJSZWN0YW5nbGUsIHRhcmdldE91dGVyUmVjdGFuZ2xlIH0gPSBnZXRTb3VyY2VBbmRUYXJnZXRPdXRlclJlY3RhbmdsZShzb3VyY2VSZWN0YW5nbGUsIHRhcmdldFJlY3RhbmdsZSk7XG4gICAgY29uc3Qgc291cmNlUG9pbnQgPSBoYW5kbGVSZWZQYWlyLnNvdXJjZS5wb2ludDtcbiAgICBjb25zdCB0YXJnZXRQb2ludCA9IGhhbmRsZVJlZlBhaXIudGFyZ2V0LnBvaW50O1xuICAgIGNvbnN0IG5leHRTb3VyY2VQb2ludCA9IGdldE5leHRQb2ludChzb3VyY2VQb2ludCwgc291cmNlT3V0ZXJSZWN0YW5nbGUsIGhhbmRsZVJlZlBhaXIuc291cmNlLmRpcmVjdGlvbik7XG4gICAgY29uc3QgbmV4dFRhcmdldFBvaW50ID0gZ2V0TmV4dFBvaW50KHRhcmdldFBvaW50LCB0YXJnZXRPdXRlclJlY3RhbmdsZSwgaGFuZGxlUmVmUGFpci50YXJnZXQuZGlyZWN0aW9uKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBzb3VyY2VQb2ludCxcbiAgICAgICAgbmV4dFNvdXJjZVBvaW50LFxuICAgICAgICBzb3VyY2VSZWN0YW5nbGUsXG4gICAgICAgIHNvdXJjZU91dGVyUmVjdGFuZ2xlLFxuICAgICAgICB0YXJnZXRQb2ludCxcbiAgICAgICAgbmV4dFRhcmdldFBvaW50LFxuICAgICAgICB0YXJnZXRSZWN0YW5nbGUsXG4gICAgICAgIHRhcmdldE91dGVyUmVjdGFuZ2xlXG4gICAgfTtcbn07XG4iXX0=
|