@plait/draw 0.62.0-next.6 → 0.62.0-next.7

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.
Files changed (137) hide show
  1. package/arrow-line.component.d.ts +26 -0
  2. package/constants/pointer.d.ts +3 -3
  3. package/esm2022/arrow-line.component.mjs +157 -0
  4. package/esm2022/constants/geometry.mjs +3 -3
  5. package/esm2022/constants/pointer.mjs +4 -4
  6. package/esm2022/engines/flowchart/note-curly-left.mjs +2 -2
  7. package/esm2022/engines/flowchart/note-curly-right.mjs +7 -7
  8. package/esm2022/engines/flowchart/note-square.mjs +2 -2
  9. package/esm2022/engines/uml/required-interface.mjs +3 -2
  10. package/esm2022/generators/arrow-line-active.generator.mjs +81 -0
  11. package/esm2022/generators/arrow-line-auto-complete.generator.mjs +46 -0
  12. package/esm2022/generators/arrow-line.generator.mjs +13 -0
  13. package/esm2022/generators/index.mjs +3 -3
  14. package/esm2022/geometry.component.mjs +4 -4
  15. package/esm2022/image.component.mjs +4 -4
  16. package/esm2022/interfaces/arrow-line.mjs +70 -0
  17. package/esm2022/interfaces/element.mjs +2 -2
  18. package/esm2022/interfaces/index.mjs +14 -7
  19. package/esm2022/interfaces/vector-line.mjs +6 -0
  20. package/esm2022/plugins/with-arrow-line-auto-complete-reaction.mjs +41 -0
  21. package/esm2022/plugins/with-arrow-line-auto-complete.mjs +74 -0
  22. package/esm2022/plugins/with-arrow-line-bound-reaction.mjs +53 -0
  23. package/esm2022/plugins/with-arrow-line-create.mjs +53 -0
  24. package/esm2022/plugins/with-arrow-line-resize.mjs +158 -0
  25. package/esm2022/plugins/with-arrow-line-text-move.mjs +53 -0
  26. package/esm2022/plugins/with-arrow-line-text.mjs +63 -0
  27. package/esm2022/plugins/with-draw-fragment.mjs +13 -13
  28. package/esm2022/plugins/with-draw-resize.mjs +12 -5
  29. package/esm2022/plugins/with-draw.mjs +27 -20
  30. package/esm2022/plugins/with-geometry-resize.mjs +1 -1
  31. package/esm2022/plugins/with-swimlane.mjs +1 -20
  32. package/esm2022/plugins/with-table.mjs +21 -3
  33. package/esm2022/public-api.mjs +3 -3
  34. package/esm2022/table.component.mjs +6 -6
  35. package/esm2022/transforms/arrow-line.mjs +100 -0
  36. package/esm2022/transforms/geometry.mjs +4 -4
  37. package/esm2022/transforms/index.mjs +12 -11
  38. package/esm2022/transforms/swimlane.mjs +1 -29
  39. package/esm2022/transforms/table-text.mjs +5 -5
  40. package/esm2022/transforms/table.mjs +30 -0
  41. package/esm2022/utils/arrow-line/arrow-line-arrow.mjs +123 -0
  42. package/esm2022/utils/arrow-line/arrow-line-basic.mjs +257 -0
  43. package/esm2022/utils/arrow-line/arrow-line-common.mjs +127 -0
  44. package/esm2022/utils/arrow-line/arrow-line-resize.mjs +309 -0
  45. package/esm2022/utils/arrow-line/elbow.mjs +114 -0
  46. package/esm2022/utils/arrow-line/index.mjs +6 -0
  47. package/esm2022/utils/clipboard.mjs +10 -10
  48. package/esm2022/utils/common.mjs +3 -3
  49. package/esm2022/utils/geometry.mjs +13 -13
  50. package/esm2022/utils/hit.mjs +67 -44
  51. package/esm2022/utils/index.mjs +2 -2
  52. package/esm2022/utils/memorize.mjs +4 -5
  53. package/esm2022/utils/position/arrow-line.mjs +67 -0
  54. package/esm2022/utils/position/geometry.mjs +1 -1
  55. package/esm2022/utils/selected.mjs +3 -3
  56. package/esm2022/utils/swimlane.mjs +11 -5
  57. package/esm2022/utils/table-selected.mjs +3 -4
  58. package/esm2022/utils/table.mjs +16 -1
  59. package/fesm2022/plait-draw.mjs +448 -372
  60. package/fesm2022/plait-draw.mjs.map +1 -1
  61. package/generators/arrow-line-active.generator.d.ts +13 -0
  62. package/generators/{line-auto-complete.generator.d.ts → arrow-line-auto-complete.generator.d.ts} +1 -1
  63. package/generators/arrow-line.generator.d.ts +8 -0
  64. package/generators/index.d.ts +2 -2
  65. package/geometry.component.d.ts +2 -2
  66. package/image.component.d.ts +2 -2
  67. package/interfaces/arrow-line.d.ts +75 -0
  68. package/interfaces/element.d.ts +1 -1
  69. package/interfaces/index.d.ts +6 -4
  70. package/interfaces/vector-line.d.ts +16 -0
  71. package/package.json +1 -1
  72. package/plugins/with-arrow-line-auto-complete-reaction.d.ts +2 -0
  73. package/plugins/with-arrow-line-auto-complete.d.ts +7 -0
  74. package/plugins/with-arrow-line-bound-reaction.d.ts +2 -0
  75. package/plugins/with-arrow-line-create.d.ts +2 -0
  76. package/plugins/with-arrow-line-resize.d.ts +2 -0
  77. package/plugins/with-arrow-line-text-move.d.ts +2 -0
  78. package/plugins/with-arrow-line-text.d.ts +2 -0
  79. package/plugins/with-draw-fragment.d.ts +2 -2
  80. package/plugins/with-swimlane.d.ts +1 -2
  81. package/public-api.d.ts +2 -2
  82. package/table.component.d.ts +2 -2
  83. package/transforms/arrow-line.d.ts +12 -0
  84. package/transforms/index.d.ts +8 -8
  85. package/transforms/swimlane.d.ts +1 -3
  86. package/transforms/table-text.d.ts +2 -3
  87. package/transforms/table.d.ts +3 -0
  88. package/utils/arrow-line/arrow-line-arrow.d.ts +4 -0
  89. package/utils/arrow-line/arrow-line-basic.d.ts +13 -0
  90. package/utils/{line/line-common.d.ts → arrow-line/arrow-line-common.d.ts} +3 -3
  91. package/utils/{line/line-resize.d.ts → arrow-line/arrow-line-resize.d.ts} +3 -3
  92. package/utils/{line → arrow-line}/elbow.d.ts +7 -7
  93. package/utils/arrow-line/index.d.ts +5 -0
  94. package/utils/clipboard.d.ts +4 -4
  95. package/utils/geometry.d.ts +17 -17
  96. package/utils/hit.d.ts +7 -4
  97. package/utils/index.d.ts +1 -1
  98. package/utils/position/arrow-line.d.ts +16 -0
  99. package/utils/selected.d.ts +2 -2
  100. package/utils/swimlane.d.ts +1 -1
  101. package/utils/table.d.ts +2 -0
  102. package/esm2022/generators/line-active.generator.mjs +0 -81
  103. package/esm2022/generators/line-auto-complete.generator.mjs +0 -46
  104. package/esm2022/generators/line.generator.mjs +0 -13
  105. package/esm2022/interfaces/line.mjs +0 -70
  106. package/esm2022/line.component.mjs +0 -155
  107. package/esm2022/plugins/with-line-auto-complete-reaction.mjs +0 -41
  108. package/esm2022/plugins/with-line-auto-complete.mjs +0 -75
  109. package/esm2022/plugins/with-line-bound-reaction.mjs +0 -53
  110. package/esm2022/plugins/with-line-create.mjs +0 -53
  111. package/esm2022/plugins/with-line-resize.mjs +0 -158
  112. package/esm2022/plugins/with-line-text-move.mjs +0 -53
  113. package/esm2022/plugins/with-line-text.mjs +0 -62
  114. package/esm2022/transforms/line.mjs +0 -100
  115. package/esm2022/utils/line/elbow.mjs +0 -114
  116. package/esm2022/utils/line/index.mjs +0 -6
  117. package/esm2022/utils/line/line-arrow.mjs +0 -123
  118. package/esm2022/utils/line/line-basic.mjs +0 -257
  119. package/esm2022/utils/line/line-common.mjs +0 -123
  120. package/esm2022/utils/line/line-resize.mjs +0 -309
  121. package/esm2022/utils/position/line.mjs +0 -67
  122. package/generators/line-active.generator.d.ts +0 -13
  123. package/generators/line.generator.d.ts +0 -8
  124. package/interfaces/line.d.ts +0 -75
  125. package/line.component.d.ts +0 -26
  126. package/plugins/with-line-auto-complete-reaction.d.ts +0 -2
  127. package/plugins/with-line-auto-complete.d.ts +0 -7
  128. package/plugins/with-line-bound-reaction.d.ts +0 -2
  129. package/plugins/with-line-create.d.ts +0 -2
  130. package/plugins/with-line-resize.d.ts +0 -2
  131. package/plugins/with-line-text-move.d.ts +0 -2
  132. package/plugins/with-line-text.d.ts +0 -2
  133. package/transforms/line.d.ts +0 -12
  134. package/utils/line/index.d.ts +0 -5
  135. package/utils/line/line-arrow.d.ts +0 -4
  136. package/utils/line/line-basic.d.ts +0 -13
  137. package/utils/position/line.d.ts +0 -16
@@ -1,309 +0,0 @@
1
- import { generateElbowLineRoute, removeDuplicatePoints, simplifyOrthogonalPoints } from '@plait/common';
2
- import { Point, RectangleClient, createDebugGenerator } from '@plait/core';
3
- import { LINE_ALIGN_TOLERANCE } from '../../constants/line';
4
- import { getElbowLineRouteOptions, getLineHandleRefPair } from './line-common';
5
- const debugKey = 'debug:plait:line-mirror';
6
- const debugGenerator = createDebugGenerator(debugKey);
7
- export const alignPoints = (basePoint, movingPoint) => {
8
- const newPoint = [...movingPoint];
9
- if (Point.isVertical(newPoint, basePoint, LINE_ALIGN_TOLERANCE)) {
10
- newPoint[0] = basePoint[0];
11
- }
12
- if (Point.isHorizontal(newPoint, basePoint, LINE_ALIGN_TOLERANCE)) {
13
- newPoint[1] = basePoint[1];
14
- }
15
- return newPoint;
16
- };
17
- export function getResizedPreviousAndNextPoint(nextRenderPoints, sourcePoint, targetPoint, handleIndex) {
18
- const referencePoint = {
19
- previous: null,
20
- next: null
21
- };
22
- const startPoint = nextRenderPoints[handleIndex];
23
- const endPoint = nextRenderPoints[handleIndex + 1];
24
- const isHorizontal = Point.isHorizontal(startPoint, endPoint);
25
- const isVertical = Point.isVertical(startPoint, endPoint);
26
- const previousPoint = nextRenderPoints[handleIndex - 1] ?? nextRenderPoints[0];
27
- const beforePreviousPoint = nextRenderPoints[handleIndex - 2] ?? sourcePoint;
28
- if ((isHorizontal && Point.isHorizontal(beforePreviousPoint, previousPoint)) ||
29
- (isVertical && Point.isVertical(beforePreviousPoint, previousPoint))) {
30
- referencePoint.previous = previousPoint;
31
- }
32
- const nextPoint = nextRenderPoints[handleIndex + 2] ?? nextRenderPoints[nextRenderPoints.length - 1];
33
- const afterNextPoint = nextRenderPoints[handleIndex + 3] ?? targetPoint;
34
- if ((isHorizontal && Point.isHorizontal(nextPoint, afterNextPoint)) || (isVertical && Point.isVertical(nextPoint, afterNextPoint))) {
35
- referencePoint.next = nextPoint;
36
- }
37
- return referencePoint;
38
- }
39
- export function alignElbowSegment(startKeyPoint, endKeyPoint, resizeState, resizedPreviousAndNextPoint) {
40
- let newStartPoint = startKeyPoint;
41
- let newEndPoint = endKeyPoint;
42
- if (Point.isHorizontal(startKeyPoint, endKeyPoint)) {
43
- const offsetY = Point.getOffsetY(resizeState.startPoint, resizeState.endPoint);
44
- let pointY = startKeyPoint[1] + offsetY;
45
- if (resizedPreviousAndNextPoint.previous && Math.abs(resizedPreviousAndNextPoint.previous[1] - pointY) < LINE_ALIGN_TOLERANCE) {
46
- pointY = resizedPreviousAndNextPoint.previous[1];
47
- }
48
- else if (resizedPreviousAndNextPoint.next && Math.abs(resizedPreviousAndNextPoint.next[1] - pointY) < LINE_ALIGN_TOLERANCE) {
49
- pointY = resizedPreviousAndNextPoint.next[1];
50
- }
51
- newStartPoint = [startKeyPoint[0], pointY];
52
- newEndPoint = [endKeyPoint[0], pointY];
53
- }
54
- if (Point.isVertical(startKeyPoint, endKeyPoint)) {
55
- const offsetX = Point.getOffsetX(resizeState.startPoint, resizeState.endPoint);
56
- let pointX = startKeyPoint[0] + offsetX;
57
- if (resizedPreviousAndNextPoint.previous && Math.abs(resizedPreviousAndNextPoint.previous[0] - pointX) < LINE_ALIGN_TOLERANCE) {
58
- pointX = resizedPreviousAndNextPoint.previous[0];
59
- }
60
- else if (resizedPreviousAndNextPoint.next && Math.abs(resizedPreviousAndNextPoint.next[0] - pointX) < LINE_ALIGN_TOLERANCE) {
61
- pointX = resizedPreviousAndNextPoint.next[0];
62
- }
63
- newStartPoint = [pointX, startKeyPoint[1]];
64
- newEndPoint = [pointX, endKeyPoint[1]];
65
- }
66
- return [newStartPoint, newEndPoint];
67
- }
68
- export function getIndexAndDeleteCountByKeyPoint(board, element, dataPoints, nextRenderPoints, handleIndex) {
69
- let index = null;
70
- let deleteCount = null;
71
- const startKeyPoint = nextRenderPoints[handleIndex];
72
- const endKeyPoint = nextRenderPoints[handleIndex + 1];
73
- if (!startKeyPoint || !endKeyPoint) {
74
- return {
75
- index,
76
- deleteCount
77
- };
78
- }
79
- const midDataPoints = dataPoints.slice(1, -1);
80
- const startIndex = midDataPoints.findIndex(item => Point.isEquals(item, startKeyPoint));
81
- const endIndex = midDataPoints.findIndex(item => Point.isEquals(item, endKeyPoint));
82
- if (Math.max(startIndex, endIndex) > -1) {
83
- if (startIndex > -1 && endIndex > -1) {
84
- return {
85
- index: startIndex,
86
- deleteCount: 2
87
- };
88
- }
89
- if (startIndex > -1 && endIndex === -1) {
90
- const isReplace = startIndex < midDataPoints.length - 1 &&
91
- Point.isAlign([midDataPoints[startIndex], midDataPoints[startIndex + 1], startKeyPoint, endKeyPoint]);
92
- if (isReplace) {
93
- return {
94
- index: startIndex,
95
- deleteCount: 2
96
- };
97
- }
98
- return {
99
- index: startIndex,
100
- deleteCount: 1
101
- };
102
- }
103
- if (startIndex === -1 && endIndex > -1) {
104
- const isReplace = endIndex > 0 && Point.isAlign([midDataPoints[endIndex], midDataPoints[endIndex - 1], startKeyPoint, endKeyPoint]);
105
- if (isReplace) {
106
- return {
107
- index: endIndex - 1,
108
- deleteCount: 2
109
- };
110
- }
111
- return {
112
- index: endIndex,
113
- deleteCount: 1
114
- };
115
- }
116
- }
117
- else {
118
- for (let i = 0; i < midDataPoints.length - 1; i++) {
119
- const currentPoint = midDataPoints[i];
120
- const nextPoint = midDataPoints[i + 1];
121
- if (Point.isAlign([currentPoint, nextPoint, startKeyPoint, endKeyPoint])) {
122
- index = i;
123
- deleteCount = 2;
124
- break;
125
- }
126
- if (Point.isAlign([currentPoint, nextPoint, startKeyPoint])) {
127
- index = Math.min(i + 1, midDataPoints.length - 1);
128
- deleteCount = 1;
129
- break;
130
- }
131
- if (Point.isAlign([currentPoint, nextPoint, endKeyPoint])) {
132
- index = Math.max(i - 1, 0);
133
- deleteCount = 1;
134
- break;
135
- }
136
- }
137
- }
138
- if (index === null) {
139
- deleteCount = 0;
140
- if (midDataPoints.length > 0) {
141
- const handleRefPair = getLineHandleRefPair(board, element);
142
- const params = getElbowLineRouteOptions(board, element, handleRefPair);
143
- const keyPoints = removeDuplicatePoints(generateElbowLineRoute(params, board));
144
- const nextKeyPoints = simplifyOrthogonalPoints(keyPoints.slice(1, keyPoints.length - 1));
145
- const nextDataPoints = [nextRenderPoints[0], ...midDataPoints, nextRenderPoints[nextRenderPoints.length - 1]];
146
- const mirrorDataPoints = getMirrorDataPoints(board, nextDataPoints, nextKeyPoints, params);
147
- for (let i = handleIndex - 1; i >= 0; i--) {
148
- const previousIndex = mirrorDataPoints.slice(1, -1).findIndex(item => Point.isEquals(item, nextRenderPoints[i]));
149
- if (previousIndex > -1) {
150
- index = previousIndex + 1;
151
- break;
152
- }
153
- }
154
- if (index === null) {
155
- index = 0;
156
- // When renderPoints is a straight line and dataPoints are not on the line,
157
- // the default 'deleteCount' is set to midDataPoints.length.
158
- if (Point.isAlign(nextRenderPoints)) {
159
- deleteCount = midDataPoints.length;
160
- }
161
- }
162
- }
163
- else {
164
- index = 0;
165
- }
166
- }
167
- return {
168
- index,
169
- deleteCount
170
- };
171
- }
172
- export function getMirrorDataPoints(board, nextDataPoints, nextKeyPoints, params) {
173
- for (let index = 1; index < nextDataPoints.length - 2; index++) {
174
- adjustByCustomPointStartIndex(board, index, nextDataPoints, nextKeyPoints, params);
175
- }
176
- return nextDataPoints;
177
- }
178
- /**
179
- * adjust based parallel segment
180
- */
181
- const adjustByCustomPointStartIndex = (board, customPointStartIndex, nextDataPoints, nextKeyPoints, params) => {
182
- const beforePoint = nextDataPoints[customPointStartIndex - 1];
183
- const startPoint = nextDataPoints[customPointStartIndex];
184
- const endPoint = nextDataPoints[customPointStartIndex + 1];
185
- const afterPoint = nextDataPoints[customPointStartIndex + 2];
186
- const beforeSegment = [beforePoint, startPoint];
187
- const afterSegment = [endPoint, afterPoint];
188
- const isStraightWithBefore = Point.isAlign(beforeSegment);
189
- const isStraightWithAfter = Point.isAlign(afterSegment);
190
- let isAdjustStart = false;
191
- let isAdjustEnd = false;
192
- if (!isStraightWithBefore || !isStraightWithAfter) {
193
- const midKeyPointsWithBefore = getMidKeyPoints(nextKeyPoints, beforeSegment[0], beforeSegment[1]);
194
- const midKeyPointsWithAfter = getMidKeyPoints(nextKeyPoints, afterSegment[0], afterSegment[1]);
195
- const hasMidKeyPoints = midKeyPointsWithBefore.length > 0 && midKeyPointsWithAfter.length > 0;
196
- isAdjustStart = !isStraightWithBefore && !hasMidKeyPoints;
197
- isAdjustEnd = !isStraightWithAfter && !hasMidKeyPoints;
198
- }
199
- if (isAdjustStart || isAdjustEnd) {
200
- const parallelSegment = [startPoint, endPoint];
201
- const parallelSegments = findOrthogonalParallelSegments(parallelSegment, nextKeyPoints);
202
- const mirrorSegments = findMirrorSegments(board, parallelSegment, parallelSegments, params.sourceRectangle, params.targetRectangle);
203
- if (mirrorSegments.length === 1) {
204
- const mirrorSegment = mirrorSegments[0];
205
- if (isAdjustStart) {
206
- nextDataPoints.splice(customPointStartIndex, 1, mirrorSegment[0]);
207
- }
208
- if (isAdjustEnd) {
209
- nextDataPoints.splice(customPointStartIndex + 1, 1, mirrorSegment[1]);
210
- }
211
- }
212
- else {
213
- const isHorizontal = Point.isHorizontal(startPoint, endPoint);
214
- const adjustIndex = isHorizontal ? 0 : 1;
215
- if (isAdjustStart) {
216
- const newStartPoint = [startPoint[0], startPoint[1]];
217
- newStartPoint[adjustIndex] = beforePoint[adjustIndex];
218
- nextDataPoints.splice(customPointStartIndex, 1, newStartPoint);
219
- }
220
- if (isAdjustEnd) {
221
- const newEndPoint = [endPoint[0], endPoint[1]];
222
- newEndPoint[adjustIndex] = afterPoint[adjustIndex];
223
- nextDataPoints.splice(customPointStartIndex + 1, 1, newEndPoint);
224
- }
225
- }
226
- }
227
- };
228
- export function isUpdatedHandleIndex(board, element, dataPoints, nextRenderPoints, handleIndex) {
229
- const { deleteCount } = getIndexAndDeleteCountByKeyPoint(board, element, dataPoints, nextRenderPoints, handleIndex);
230
- if (deleteCount !== null && deleteCount > 1) {
231
- return true;
232
- }
233
- return false;
234
- }
235
- export function getMidKeyPoints(simplifiedNextKeyPoints, startPoint, endPoint) {
236
- let midElbowPoints = [];
237
- let startPointIndex = -1;
238
- let endPointIndex = -1;
239
- for (let i = 0; i < simplifiedNextKeyPoints.length; i++) {
240
- if (Point.isAlign([simplifiedNextKeyPoints[i], startPoint])) {
241
- startPointIndex = i;
242
- }
243
- if (startPointIndex > -1 && Point.isAlign([simplifiedNextKeyPoints[i], endPoint])) {
244
- endPointIndex = i;
245
- break;
246
- }
247
- }
248
- if (startPointIndex > -1 && endPointIndex > -1) {
249
- midElbowPoints = simplifiedNextKeyPoints.slice(startPointIndex, endPointIndex + 1);
250
- }
251
- return midElbowPoints;
252
- }
253
- function findOrthogonalParallelSegments(segment, keyPoints) {
254
- const isHorizontalSegment = Point.isHorizontal(segment[0], segment[1]);
255
- const parallelSegments = [];
256
- for (let i = 0; i < keyPoints.length - 1; i++) {
257
- const current = keyPoints[i];
258
- const next = keyPoints[i + 1];
259
- const isHorizontal = Point.isHorizontal(current, next, 0.1);
260
- if (isHorizontalSegment && isHorizontal) {
261
- parallelSegments.push([current, next]);
262
- }
263
- if (!isHorizontalSegment && !isHorizontal) {
264
- parallelSegments.push([current, next]);
265
- }
266
- }
267
- return parallelSegments;
268
- }
269
- function findMirrorSegments(board, segment, parallelSegments, sourceRectangle, targetRectangle) {
270
- debugGenerator.isDebug() && debugGenerator.clear();
271
- const mirrorSegments = [];
272
- for (let index = 0; index < parallelSegments.length; index++) {
273
- const parallelPath = parallelSegments[index];
274
- const startPoint = [segment[0][0], segment[0][1]];
275
- const endPoint = [segment[1][0], segment[1][1]];
276
- const isHorizontal = Point.isHorizontal(startPoint, endPoint);
277
- const adjustDataIndex = isHorizontal ? 0 : 1;
278
- startPoint[adjustDataIndex] = parallelPath[0][adjustDataIndex];
279
- endPoint[adjustDataIndex] = parallelPath[1][adjustDataIndex];
280
- const fakeRectangle = RectangleClient.getRectangleByPoints([startPoint, endPoint, ...parallelPath]);
281
- const isValid = !RectangleClient.isHit(fakeRectangle, sourceRectangle) && !RectangleClient.isHit(fakeRectangle, targetRectangle);
282
- if (isValid) {
283
- mirrorSegments.push([startPoint, endPoint]);
284
- debugGenerator.isDebug() && debugGenerator.drawPolygon(board, RectangleClient.getCornerPoints(fakeRectangle));
285
- }
286
- }
287
- return mirrorSegments;
288
- }
289
- export const hasIllegalElbowPoint = (midDataPoints) => {
290
- if (midDataPoints.length === 1) {
291
- return true;
292
- }
293
- return midDataPoints.some((item, index) => {
294
- const beforePoint = midDataPoints[index - 1];
295
- const afterPoint = midDataPoints[index + 1];
296
- const beforeSegment = beforePoint && [beforePoint, item];
297
- const afterSegment = afterPoint && [item, afterPoint];
298
- const isStraightWithBefore = beforeSegment && Point.isAlign(beforeSegment);
299
- const isStraightWithAfter = afterSegment && Point.isAlign(afterSegment);
300
- if (index === 0) {
301
- return !isStraightWithAfter;
302
- }
303
- if (index === midDataPoints.length - 1) {
304
- return !isStraightWithBefore;
305
- }
306
- return !isStraightWithBefore && !isStraightWithAfter;
307
- });
308
- };
309
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluZS1yZXNpemUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kcmF3L3NyYy91dGlscy9saW5lL2xpbmUtcmVzaXplLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBc0Msc0JBQXNCLEVBQUUscUJBQXFCLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUksT0FBTyxFQUFjLEtBQUssRUFBRSxlQUFlLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDdkYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDNUQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLG9CQUFvQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRy9FLE1BQU0sUUFBUSxHQUFHLHlCQUF5QixDQUFDO0FBQzNDLE1BQU0sY0FBYyxHQUFHLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBRXRELE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxDQUFDLFNBQWdCLEVBQUUsV0FBa0IsRUFBRSxFQUFFO0lBQ2hFLE1BQU0sUUFBUSxHQUFVLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQztJQUN6QyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxvQkFBb0IsQ0FBQyxFQUFFLENBQUM7UUFDOUQsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBQ0QsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsb0JBQW9CLENBQUMsRUFBRSxDQUFDO1FBQ2hFLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUNELE9BQU8sUUFBUSxDQUFDO0FBQ3BCLENBQUMsQ0FBQztBQUVGLE1BQU0sVUFBVSw4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TUFBTSxtQkFBbUIsR0FBRyxZQUFZLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN4RSxJQUFJLEtBQUssS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNkLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQztRQUNoQyxDQUFDO1FBQ0QsSUFBSSxLQUFLLEtBQUssYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNyQyxPQUFPLENBQUMsb0JBQW9CLENBQUM7UUFDakMsQ0FBQztRQUNELE9BQU8sQ0FBQyxvQkFBb0IsSUFBSSxDQUFDLG1CQUFtQixDQUFDO0lBQ3pELENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRWxib3dMaW5lUm91dGVPcHRpb25zLCBSZXNpemVTdGF0ZSwgZ2VuZXJhdGVFbGJvd0xpbmVSb3V0ZSwgcmVtb3ZlRHVwbGljYXRlUG9pbnRzLCBzaW1wbGlmeU9ydGhvZ29uYWxQb2ludHMgfSBmcm9tICdAcGxhaXQvY29tbW9uJztcbmltcG9ydCB7IFBsYWl0Qm9hcmQsIFBvaW50LCBSZWN0YW5nbGVDbGllbnQsIGNyZWF0ZURlYnVnR2VuZXJhdG9yIH0gZnJvbSAnQHBsYWl0L2NvcmUnO1xuaW1wb3J0IHsgTElORV9BTElHTl9UT0xFUkFOQ0UgfSBmcm9tICcuLi8uLi9jb25zdGFudHMvbGluZSc7XG5pbXBvcnQgeyBnZXRFbGJvd0xpbmVSb3V0ZU9wdGlvbnMsIGdldExpbmVIYW5kbGVSZWZQYWlyIH0gZnJvbSAnLi9saW5lLWNvbW1vbic7XG5pbXBvcnQgeyBQbGFpdExpbmUgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcblxuY29uc3QgZGVidWdLZXkgPSAnZGVidWc6cGxhaXQ6bGluZS1taXJyb3InO1xuY29uc3QgZGVidWdHZW5lcmF0b3IgPSBjcmVhdGVEZWJ1Z0dlbmVyYXRvcihkZWJ1Z0tleSk7XG5cbmV4cG9ydCBjb25zdCBhbGlnblBvaW50cyA9IChiYXNlUG9pbnQ6IFBvaW50LCBtb3ZpbmdQb2ludDogUG9pbnQpID0+IHtcbiAgICBjb25zdCBuZXdQb2ludDogUG9pbnQgPSBbLi4ubW92aW5nUG9pbnRdO1xuICAgIGlmIChQb2ludC5pc1ZlcnRpY2FsKG5ld1BvaW50LCBiYXNlUG9pbnQsIExJTkVfQUxJR05fVE9MRVJBTkNFKSkge1xuICAgICAgICBuZXdQb2ludFswXSA9IGJhc2VQb2ludFswXTtcbiAgICB9XG4gICAgaWYgKFBvaW50LmlzSG9yaXpvbnRhbChuZXdQb2ludCwgYmFzZVBvaW50LCBMSU5FX0FMSUdOX1RPTEVSQU5DRSkpIHtcbiAgICAgICAgbmV3UG9pbnRbMV0gPSBiYXNlUG9pbnRbMV07XG4gICAgfVxuICAgIHJldHVybiBuZXdQb2ludDtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZXNpemVkUHJldmlvdXNBbmROZXh0UG9pbnQobmV4dFJlbmRlclBvaW50czogUG9pbnRbXSwgc291cmNlUG9pbnQ6IFBvaW50LCB0YXJnZXRQb2ludDogUG9pbnQsIGhhbmRsZUluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCByZWZlcmVuY2VQb2ludDogeyBwcmV2aW91czogUG9pbnQgfCBudWxsOyBuZXh0OiBQb2ludCB8IG51bGwgfSA9IHtcbiAgICAgICAgcHJldmlvdXM6IG51bGwsXG4gICAgICAgIG5leHQ6IG51bGxcbiAgICB9O1xuXG4gICAgY29uc3Qgc3RhcnRQb2ludCA9IG5leHRSZW5kZXJQb2ludHNbaGFuZGxlSW5kZXhdO1xuICAgIGNvbnN0IGVuZFBvaW50ID0gbmV4dFJlbmRlclBvaW50c1toYW5kbGVJbmRleCArIDFdO1xuICAgIGNvbnN0IGlzSG9yaXpvbnRhbCA9IFBvaW50LmlzSG9yaXpvbnRhbChzdGFydFBvaW50LCBlbmRQb2ludCk7XG4gICAgY29uc3QgaXNWZXJ0aWNhbCA9IFBvaW50LmlzVmVydGljYWwoc3RhcnRQb2ludCwgZW5kUG9pbnQpO1xuICAgIGNvbnN0IHByZXZpb3VzUG9pbnQgPSBuZXh0UmVuZGVyUG9pbnRzW2hhbmRsZUluZGV4IC0gMV0gPz8gbmV4dFJlbmRlclBvaW50c1swXTtcbiAgICBjb25zdCBiZWZvcmVQcmV2aW91c1BvaW50ID0gbmV4dFJlbmRlclBvaW50c1toYW5kbGVJbmRleCAtIDJdID8/IHNvdXJjZVBvaW50O1xuICAgIGlmIChcbiAgICAgICAgKGlzSG9yaXpvbnRhbCAmJiBQb2ludC5pc0hvcml6b250YWwoYmVmb3JlUHJldmlvdXNQb2ludCwgcHJldmlvdXNQb2ludCkpIHx8XG4gICAgICAgIChpc1ZlcnRpY2FsICYmIFBvaW50LmlzVmVydGljYWwoYmVmb3JlUHJldmlvdXNQb2ludCwgcHJldmlvdXNQb2ludCkpXG4gICAgKSB7XG4gICAgICAgIHJlZmVyZW5jZVBvaW50LnByZXZpb3VzID0gcHJldmlvdXNQb2ludDtcbiAgICB9XG5cbiAgICBjb25zdCBuZXh0UG9pbnQgPSBuZXh0UmVuZGVyUG9pbnRzW2hhbmRsZUluZGV4ICsgMl0gPz8gbmV4dFJlbmRlclBvaW50c1tuZXh0UmVuZGVyUG9pbnRzLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IGFmdGVyTmV4dFBvaW50ID0gbmV4dFJlbmRlclBvaW50c1toYW5kbGVJbmRleCArIDNdID8/IHRhcmdldFBvaW50O1xuICAgIGlmICgoaXNIb3Jpem9udGFsICYmIFBvaW50LmlzSG9yaXpvbnRhbChuZXh0UG9pbnQsIGFmdGVyTmV4dFBvaW50KSkgfHwgKGlzVmVydGljYWwgJiYgUG9pbnQuaXNWZXJ0aWNhbChuZXh0UG9pbnQsIGFmdGVyTmV4dFBvaW50KSkpIHtcbiAgICAgICAgcmVmZXJlbmNlUG9pbnQubmV4dCA9IG5leHRQb2ludDtcbiAgICB9XG4gICAgcmV0dXJuIHJlZmVyZW5jZVBvaW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWxpZ25FbGJvd1NlZ21lbnQoXG4gICAgc3RhcnRLZXlQb2ludDogUG9pbnQsXG4gICAgZW5kS2V5UG9pbnQ6IFBvaW50LFxuICAgIHJlc2l6ZVN0YXRlOiBSZXNpemVTdGF0ZSxcbiAgICByZXNpemVkUHJldmlvdXNBbmROZXh0UG9pbnQ6IHsgcHJldmlvdXM6IFBvaW50IHwgbnVsbDsgbmV4dDogUG9pbnQgfCBudWxsIH1cbikge1xuICAgIGxldCBuZXdTdGFydFBvaW50ID0gc3RhcnRLZXlQb2ludDtcbiAgICBsZXQgbmV3RW5kUG9pbnQgPSBlbmRLZXlQb2ludDtcbiAgICBpZiAoUG9pbnQuaXNIb3Jpem9udGFsKHN0YXJ0S2V5UG9pbnQsIGVuZEtleVBvaW50KSkge1xuICAgICAgICBjb25zdCBvZmZzZXRZID0gUG9pbnQuZ2V0T2Zmc2V0WShyZXNpemVTdGF0ZS5zdGFydFBvaW50LCByZXNpemVTdGF0ZS5lbmRQb2ludCk7XG4gICAgICAgIGxldCBwb2ludFkgPSBzdGFydEtleVBvaW50WzFdICsgb2Zmc2V0WTtcbiAgICAgICAgaWYgKHJlc2l6ZWRQcmV2aW91c0FuZE5leHRQb2ludC5wcmV2aW91cyAmJiBNYXRoLmFicyhyZXNpemVkUHJldmlvdXNBbmROZXh0UG9pbnQucHJldmlvdXNbMV0gLSBwb2ludFkpIDwgTElORV9BTElHTl9UT0xFUkFOQ0UpIHtcbiAgICAgICAgICAgIHBvaW50WSA9IHJlc2l6ZWRQcmV2aW91c0FuZE5leHRQb2ludC5wcmV2aW91c1sxXTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXNpemVkUHJldmlvdXNBbmROZXh0UG9pbnQubmV4dCAmJiBNYXRoLmFicyhyZXNpemVkUHJldmlvdXNBbmROZXh0UG9pbnQubmV4dFsxXSAtIHBvaW50WSkgPCBMSU5FX0FMSUdOX1RPTEVSQU5DRSkge1xuICAgICAgICAgICAgcG9pbnRZID0gcmVzaXplZFByZXZpb3VzQW5kTmV4dFBvaW50Lm5leHRbMV07XG4gICAgICAgIH1cbiAgICAgICAgbmV3U3RhcnRQb2ludCA9IFtzdGFydEtleVBvaW50WzBdLCBwb2ludFldO1xuICAgICAgICBuZXdFbmRQb2ludCA9IFtlbmRLZXlQb2ludFswXSwgcG9pbnRZXTtcbiAgICB9XG4gICAgaWYgKFBvaW50LmlzVmVydGljYWwoc3RhcnRLZXlQb2ludCwgZW5kS2V5UG9pbnQpKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldFggPSBQb2ludC5nZXRPZmZzZXRYKHJlc2l6ZVN0YXRlLnN0YXJ0UG9pbnQsIHJlc2l6ZVN0YXRlLmVuZFBvaW50KTtcbiAgICAgICAgbGV0IHBvaW50WCA9IHN0YXJ0S2V5UG9pbnRbMF0gKyBvZmZzZXRYO1xuICAgICAgICBpZiAocmVzaXplZFByZXZpb3VzQW5kTmV4dFBvaW50LnByZXZpb3VzICYmIE1hdGguYWJzKHJlc2l6ZWRQcmV2aW91c0FuZE5leHRQb2ludC5wcmV2aW91c1swXSAtIHBvaW50WCkgPCBMSU5FX0FMSUdOX1RPTEVSQU5DRSkge1xuICAgICAgICAgICAgcG9pbnRYID0gcmVzaXplZFByZXZpb3VzQW5kTmV4dFBvaW50LnByZXZpb3VzWzBdO1xuICAgICAgICB9IGVsc2UgaWYgKHJlc2l6ZWRQcmV2aW91c0FuZE5leHRQb2ludC5uZXh0ICYmIE1hdGguYWJzKHJlc2l6ZWRQcmV2aW91c0FuZE5leHRQb2ludC5uZXh0WzBdIC0gcG9pbnRYKSA8IExJTkVfQUxJR05fVE9MRVJBTkNFKSB7XG4gICAgICAgICAgICBwb2ludFggPSByZXNpemVkUHJldmlvdXNBbmROZXh0UG9pbnQubmV4dFswXTtcbiAgICAgICAgfVxuICAgICAgICBuZXdTdGFydFBvaW50ID0gW3BvaW50WCwgc3RhcnRLZXlQb2ludFsxXV07XG4gICAgICAgIG5ld0VuZFBvaW50ID0gW3BvaW50WCwgZW5kS2V5UG9pbnRbMV1dO1xuICAgIH1cbiAgICByZXR1cm4gW25ld1N0YXJ0UG9pbnQsIG5ld0VuZFBvaW50XTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEluZGV4QW5kRGVsZXRlQ291bnRCeUtleVBvaW50KFxuICAgIGJvYXJkOiBQbGFpdEJvYXJkLFxuICAgIGVsZW1lbnQ6IFBsYWl0TGluZSxcbiAgICBkYXRhUG9pbnRzOiBQb2ludFtdLFxuICAgIG5leHRSZW5kZXJQb2ludHM6IFBvaW50W10sXG4gICAgaGFuZGxlSW5kZXg6IG51bWJlclxuKSB7XG4gICAgbGV0IGluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgZGVsZXRlQ291bnQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gICAgY29uc3Qgc3RhcnRLZXlQb2ludCA9IG5leHRSZW5kZXJQb2ludHNbaGFuZGxlSW5kZXhdO1xuICAgIGNvbnN0IGVuZEtleVBvaW50ID0gbmV4dFJlbmRlclBvaW50c1toYW5kbGVJbmRleCArIDFdO1xuICAgIGlmICghc3RhcnRLZXlQb2ludCB8fCAhZW5kS2V5UG9pbnQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgZGVsZXRlQ291bnRcbiAgICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgbWlkRGF0YVBvaW50cyA9IGRhdGFQb2ludHMuc2xpY2UoMSwgLTEpO1xuICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBtaWREYXRhUG9pbnRzLmZpbmRJbmRleChpdGVtID0+IFBvaW50LmlzRXF1YWxzKGl0ZW0sIHN0YXJ0S2V5UG9pbnQpKTtcbiAgICBjb25zdCBlbmRJbmRleCA9IG1pZERhdGFQb2ludHMuZmluZEluZGV4KGl0ZW0gPT4gUG9pbnQuaXNFcXVhbHMoaXRlbSwgZW5kS2V5UG9pbnQpKTtcblxuICAgIGlmIChNYXRoLm1heChzdGFydEluZGV4LCBlbmRJbmRleCkgPiAtMSkge1xuICAgICAgICBpZiAoc3RhcnRJbmRleCA+IC0xICYmIGVuZEluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaW5kZXg6IHN0YXJ0SW5kZXgsXG4gICAgICAgICAgICAgICAgZGVsZXRlQ291bnQ6IDJcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXJ0SW5kZXggPiAtMSAmJiBlbmRJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzUmVwbGFjZSA9XG4gICAgICAgICAgICAgICAgc3RhcnRJbmRleCA8IG1pZERhdGFQb2ludHMubGVuZ3RoIC0gMSAmJlxuICAgICAgICAgICAgICAgIFBvaW50LmlzQWxpZ24oW21pZERhdGFQb2ludHNbc3RhcnRJbmRleF0sIG1pZERhdGFQb2ludHNbc3RhcnRJbmRleCArIDFdLCBzdGFydEtleVBvaW50LCBlbmRLZXlQb2ludF0pO1xuICAgICAgICAgICAgaWYgKGlzUmVwbGFjZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGluZGV4OiBzdGFydEluZGV4LFxuICAgICAgICAgICAgICAgICAgICBkZWxldGVDb3VudDogMlxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGluZGV4OiBzdGFydEluZGV4LFxuICAgICAgICAgICAgICAgIGRlbGV0ZUNvdW50OiAxXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGFydEluZGV4ID09PSAtMSAmJiBlbmRJbmRleCA+IC0xKSB7XG4gICAgICAgICAgICBjb25zdCBpc1JlcGxhY2UgPVxuICAgICAgICAgICAgICAgIGVuZEluZGV4ID4gMCAmJiBQb2ludC5pc0FsaWduKFttaWREYXRhUG9pbnRzW2VuZEluZGV4XSwgbWlkRGF0YVBvaW50c1tlbmRJbmRleCAtIDFdLCBzdGFydEtleVBvaW50LCBlbmRLZXlQb2ludF0pO1xuICAgICAgICAgICAgaWYgKGlzUmVwbGFjZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGluZGV4OiBlbmRJbmRleCAtIDEsXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZUNvdW50OiAyXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaW5kZXg6IGVuZEluZGV4LFxuICAgICAgICAgICAgICAgIGRlbGV0ZUNvdW50OiAxXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtaWREYXRhUG9pbnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFBvaW50ID0gbWlkRGF0YVBvaW50c1tpXTtcbiAgICAgICAgICAgIGNvbnN0IG5leHRQb2ludCA9IG1pZERhdGFQb2ludHNbaSArIDFdO1xuICAgICAgICAgICAgaWYgKFBvaW50LmlzQWxpZ24oW2N1cnJlbnRQb2ludCwgbmV4dFBvaW50LCBzdGFydEtleVBvaW50LCBlbmRLZXlQb2ludF0pKSB7XG4gICAgICAgICAgICAgICAgaW5kZXggPSBpO1xuICAgICAgICAgICAgICAgIGRlbGV0ZUNvdW50ID0gMjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChQb2ludC5pc0FsaWduKFtjdXJyZW50UG9pbnQsIG5leHRQb2ludCwgc3RhcnRLZXlQb2ludF0pKSB7XG4gICAgICAgICAgICAgICAgaW5kZXggPSBNYXRoLm1pbihpICsgMSwgbWlkRGF0YVBvaW50cy5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgICAgICBkZWxldGVDb3VudCA9IDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoUG9pbnQuaXNBbGlnbihbY3VycmVudFBvaW50LCBuZXh0UG9pbnQsIGVuZEtleVBvaW50XSkpIHtcbiAgICAgICAgICAgICAgICBpbmRleCA9IE1hdGgubWF4KGkgLSAxLCAwKTtcbiAgICAgICAgICAgICAgICBkZWxldGVDb3VudCA9IDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGluZGV4ID09PSBudWxsKSB7XG4gICAgICAgIGRlbGV0ZUNvdW50ID0gMDtcbiAgICAgICAgaWYgKG1pZERhdGFQb2ludHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlUmVmUGFpciA9IGdldExpbmVIYW5kbGVSZWZQYWlyKGJvYXJkLCBlbGVtZW50KTtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IGdldEVsYm93TGluZVJvdXRlT3B0aW9ucyhib2FyZCwgZWxlbWVudCwgaGFuZGxlUmVmUGFpcik7XG4gICAgICAgICAgICBjb25zdCBrZXlQb2ludHMgPSByZW1vdmVEdXBsaWNhdGVQb2ludHMoZ2VuZXJhdGVFbGJvd0xpbmVSb3V0ZShwYXJhbXMsIGJvYXJkKSk7XG4gICAgICAgICAgICBjb25zdCBuZXh0S2V5UG9pbnRzID0gc2ltcGxpZnlPcnRob2dvbmFsUG9pbnRzKGtleVBvaW50cy5zbGljZSgxLCBrZXlQb2ludHMubGVuZ3RoIC0gMSkpO1xuICAgICAgICAgICAgY29uc3QgbmV4dERhdGFQb2ludHMgPSBbbmV4dFJlbmRlclBvaW50c1swXSwgLi4ubWlkRGF0YVBvaW50cywgbmV4dFJlbmRlclBvaW50c1tuZXh0UmVuZGVyUG9pbnRzLmxlbmd0aCAtIDFdXTtcbiAgICAgICAgICAgIGNvbnN0IG1pcnJvckRhdGFQb2ludHMgPSBnZXRNaXJyb3JEYXRhUG9pbnRzKGJvYXJkLCBuZXh0RGF0YVBvaW50cywgbmV4dEtleVBvaW50cywgcGFyYW1zKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBoYW5kbGVJbmRleCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJldmlvdXNJbmRleCA9IG1pcnJvckRhdGFQb2ludHMuc2xpY2UoMSwgLTEpLmZpbmRJbmRleChpdGVtID0+IFBvaW50LmlzRXF1YWxzKGl0ZW0sIG5leHRSZW5kZXJQb2ludHNbaV0pKTtcbiAgICAgICAgICAgICAgICBpZiAocHJldmlvdXNJbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gcHJldmlvdXNJbmRleCArIDE7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICAvLyBXaGVuIHJlbmRlclBvaW50cyBpcyBhIHN0cmFpZ2h0IGxpbmUgYW5kIGRhdGFQb2ludHMgYXJlIG5vdCBvbiB0aGUgbGluZSxcbiAgICAgICAgICAgICAgICAvLyB0aGUgZGVmYXVsdCAnZGVsZXRlQ291bnQnIGlzIHNldCB0byBtaWREYXRhUG9pbnRzLmxlbmd0aC5cbiAgICAgICAgICAgICAgICBpZiAoUG9pbnQuaXNBbGlnbihuZXh0UmVuZGVyUG9pbnRzKSkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGVDb3VudCA9IG1pZERhdGFQb2ludHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGluZGV4ID0gMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIGluZGV4LFxuICAgICAgICBkZWxldGVDb3VudFxuICAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNaXJyb3JEYXRhUG9pbnRzKGJvYXJkOiBQbGFpdEJvYXJkLCBuZXh0RGF0YVBvaW50czogUG9pbnRbXSwgbmV4dEtleVBvaW50czogUG9pbnRbXSwgcGFyYW1zOiBFbGJvd0xpbmVSb3V0ZU9wdGlvbnMpIHtcbiAgICBmb3IgKGxldCBpbmRleCA9IDE7IGluZGV4IDwgbmV4dERhdGFQb2ludHMubGVuZ3RoIC0gMjsgaW5kZXgrKykge1xuICAgICAgICBhZGp1c3RCeUN1c3RvbVBvaW50U3RhcnRJbmRleChib2FyZCwgaW5kZXgsIG5leHREYXRhUG9pbnRzLCBuZXh0S2V5UG9pbnRzLCBwYXJhbXMpO1xuICAgIH1cbiAgICByZXR1cm4gbmV4dERhdGFQb2ludHM7XG59XG5cbi8qKlxuICogYWRqdXN0IGJhc2VkIHBhcmFsbGVsIHNlZ21lbnRcbiAqL1xuY29uc3QgYWRqdXN0QnlDdXN0b21Qb2ludFN0YXJ0SW5kZXggPSAoXG4gICAgYm9hcmQ6IFBsYWl0Qm9hcmQsXG4gICAgY3VzdG9tUG9pbnRTdGFydEluZGV4OiBudW1iZXIsXG4gICAgbmV4dERhdGFQb2ludHM6IFBvaW50W10sXG4gICAgbmV4dEtleVBvaW50czogUG9pbnRbXSxcbiAgICBwYXJhbXM6IEVsYm93TGluZVJvdXRlT3B0aW9uc1xuKSA9PiB7XG4gICAgY29uc3QgYmVmb3JlUG9pbnQgPSBuZXh0RGF0YVBvaW50c1tjdXN0b21Qb2ludFN0YXJ0SW5kZXggLSAxXTtcbiAgICBjb25zdCBzdGFydFBvaW50ID0gbmV4dERhdGFQb2ludHNbY3VzdG9tUG9pbnRTdGFydEluZGV4XTtcbiAgICBjb25zdCBlbmRQb2ludCA9IG5leHREYXRhUG9pbnRzW2N1c3RvbVBvaW50U3RhcnRJbmRleCArIDFdO1xuICAgIGNvbnN0IGFmdGVyUG9pbnQgPSBuZXh0RGF0YVBvaW50c1tjdXN0b21Qb2ludFN0YXJ0SW5kZXggKyAyXTtcbiAgICBjb25zdCBiZWZvcmVTZWdtZW50ID0gW2JlZm9yZVBvaW50LCBzdGFydFBvaW50XTtcbiAgICBjb25zdCBhZnRlclNlZ21lbnQgPSBbZW5kUG9pbnQsIGFmdGVyUG9pbnRdO1xuICAgIGNvbnN0IGlzU3RyYWlnaHRXaXRoQmVmb3JlID0gUG9pbnQuaXNBbGlnbihiZWZvcmVTZWdtZW50KTtcbiAgICBjb25zdCBpc1N0cmFpZ2h0V2l0aEFmdGVyID0gUG9pbnQuaXNBbGlnbihhZnRlclNlZ21lbnQpO1xuICAgIGxldCBpc0FkanVzdFN0YXJ0ID0gZmFsc2U7XG4gICAgbGV0IGlzQWRqdXN0RW5kID0gZmFsc2U7XG4gICAgaWYgKCFpc1N0cmFpZ2h0V2l0aEJlZm9yZSB8fCAhaXNTdHJhaWdodFdpdGhBZnRlcikge1xuICAgICAgICBjb25zdCBtaWRLZXlQb2ludHNXaXRoQmVmb3JlID0gZ2V0TWlkS2V5UG9pbnRzKG5leHRLZXlQb2ludHMsIGJlZm9yZVNlZ21lbnRbMF0sIGJlZm9yZVNlZ21lbnRbMV0pO1xuICAgICAgICBjb25zdCBtaWRLZXlQb2ludHNXaXRoQWZ0ZXIgPSBnZXRNaWRLZXlQb2ludHMobmV4dEtleVBvaW50cywgYWZ0ZXJTZWdtZW50WzBdLCBhZnRlclNlZ21lbnRbMV0pO1xuICAgICAgICBjb25zdCBoYXNNaWRLZXlQb2ludHMgPSBtaWRLZXlQb2ludHNXaXRoQmVmb3JlLmxlbmd0aCA+IDAgJiYgbWlkS2V5UG9pbnRzV2l0aEFmdGVyLmxlbmd0aCA+IDA7XG4gICAgICAgIGlzQWRqdXN0U3RhcnQgPSAhaXNTdHJhaWdodFdpdGhCZWZvcmUgJiYgIWhhc01pZEtleVBvaW50cztcbiAgICAgICAgaXNBZGp1c3RFbmQgPSAhaXNTdHJhaWdodFdpdGhBZnRlciAmJiAhaGFzTWlkS2V5UG9pbnRzO1xuICAgIH1cbiAgICBpZiAoaXNBZGp1c3RTdGFydCB8fCBpc0FkanVzdEVuZCkge1xuICAgICAgICBjb25zdCBwYXJhbGxlbFNlZ21lbnQgPSBbc3RhcnRQb2ludCwgZW5kUG9pbnRdIGFzIFtQb2ludCwgUG9pbnRdO1xuICAgICAgICBjb25zdCBwYXJhbGxlbFNlZ21lbnRzID0gZmluZE9ydGhvZ29uYWxQYXJhbGxlbFNlZ21lbnRzKHBhcmFsbGVsU2VnbWVudCwgbmV4dEtleVBvaW50cyk7XG4gICAgICAgIGNvbnN0IG1pcnJvclNlZ21lbnRzID0gZmluZE1pcnJvclNlZ21lbnRzKGJvYXJkLCBwYXJhbGxlbFNlZ21lbnQsIHBhcmFsbGVsU2VnbWVudHMsIHBhcmFtcy5zb3VyY2VSZWN0YW5nbGUsIHBhcmFtcy50YXJnZXRSZWN0YW5nbGUpO1xuICAgICAgICBpZiAobWlycm9yU2VnbWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBjb25zdCBtaXJyb3JTZWdtZW50ID0gbWlycm9yU2VnbWVudHNbMF07XG4gICAgICAgICAgICBpZiAoaXNBZGp1c3RTdGFydCkge1xuICAgICAgICAgICAgICAgIG5leHREYXRhUG9pbnRzLnNwbGljZShjdXN0b21Qb2ludFN0YXJ0SW5kZXgsIDEsIG1pcnJvclNlZ21lbnRbMF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzQWRqdXN0RW5kKSB7XG4gICAgICAgICAgICAgICAgbmV4dERhdGFQb2ludHMuc3BsaWNlKGN1c3RvbVBvaW50U3RhcnRJbmRleCArIDEsIDEsIG1pcnJvclNlZ21lbnRbMV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgaXNIb3Jpem9udGFsID0gUG9pbnQuaXNIb3Jpem9udGFsKHN0YXJ0UG9pbnQsIGVuZFBvaW50KTtcbiAgICAgICAgICAgIGNvbnN0IGFkanVzdEluZGV4ID0gaXNIb3Jpem9udGFsID8gMCA6IDE7XG4gICAgICAgICAgICBpZiAoaXNBZGp1c3RTdGFydCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1N0YXJ0UG9pbnQgPSBbc3RhcnRQb2ludFswXSwgc3RhcnRQb2ludFsxXV0gYXMgUG9pbnQ7XG4gICAgICAgICAgICAgICAgbmV3U3RhcnRQb2ludFthZGp1c3RJbmRleF0gPSBiZWZvcmVQb2ludFthZGp1c3RJbmRleF07XG4gICAgICAgICAgICAgICAgbmV4dERhdGFQb2ludHMuc3BsaWNlKGN1c3RvbVBvaW50U3RhcnRJbmRleCwgMSwgbmV3U3RhcnRQb2ludCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNBZGp1c3RFbmQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdFbmRQb2ludCA9IFtlbmRQb2ludFswXSwgZW5kUG9pbnRbMV1dIGFzIFBvaW50O1xuICAgICAgICAgICAgICAgIG5ld0VuZFBvaW50W2FkanVzdEluZGV4XSA9IGFmdGVyUG9pbnRbYWRqdXN0SW5kZXhdO1xuICAgICAgICAgICAgICAgIG5leHREYXRhUG9pbnRzLnNwbGljZShjdXN0b21Qb2ludFN0YXJ0SW5kZXggKyAxLCAxLCBuZXdFbmRQb2ludCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gaXNVcGRhdGVkSGFuZGxlSW5kZXgoXG4gICAgYm9hcmQ6IFBsYWl0Qm9hcmQsXG4gICAgZWxlbWVudDogUGxhaXRMaW5lLFxuICAgIGRhdGFQb2ludHM6IFBvaW50W10sXG4gICAgbmV4dFJlbmRlclBvaW50czogUG9pbnRbXSxcbiAgICBoYW5kbGVJbmRleDogbnVtYmVyXG4pIHtcbiAgICBjb25zdCB7IGRlbGV0ZUNvdW50IH0gPSBnZXRJbmRleEFuZERlbGV0ZUNvdW50QnlLZXlQb2ludChib2FyZCwgZWxlbWVudCwgZGF0YVBvaW50cywgbmV4dFJlbmRlclBvaW50cywgaGFuZGxlSW5kZXgpO1xuICAgIGlmIChkZWxldGVDb3VudCAhPT0gbnVsbCAmJiBkZWxldGVDb3VudCA+IDEpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1pZEtleVBvaW50cyhzaW1wbGlmaWVkTmV4dEtleVBvaW50czogUG9pbnRbXSwgc3RhcnRQb2ludDogUG9pbnQsIGVuZFBvaW50OiBQb2ludCkge1xuICAgIGxldCBtaWRFbGJvd1BvaW50czogUG9pbnRbXSA9IFtdO1xuICAgIGxldCBzdGFydFBvaW50SW5kZXggPSAtMTtcbiAgICBsZXQgZW5kUG9pbnRJbmRleCA9IC0xO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2ltcGxpZmllZE5leHRLZXlQb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKFBvaW50LmlzQWxpZ24oW3NpbXBsaWZpZWROZXh0S2V5UG9pbnRzW2ldLCBzdGFydFBvaW50XSkpIHtcbiAgICAgICAgICAgIHN0YXJ0UG9pbnRJbmRleCA9IGk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXJ0UG9pbnRJbmRleCA+IC0xICYmIFBvaW50LmlzQWxpZ24oW3NpbXBsaWZpZWROZXh0S2V5UG9pbnRzW2ldLCBlbmRQb2ludF0pKSB7XG4gICAgICAgICAgICBlbmRQb2ludEluZGV4ID0gaTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChzdGFydFBvaW50SW5kZXggPiAtMSAmJiBlbmRQb2ludEluZGV4ID4gLTEpIHtcbiAgICAgICAgbWlkRWxib3dQb2ludHMgPSBzaW1wbGlmaWVkTmV4dEtleVBvaW50cy5zbGljZShzdGFydFBvaW50SW5kZXgsIGVuZFBvaW50SW5kZXggKyAxKTtcbiAgICB9XG4gICAgcmV0dXJuIG1pZEVsYm93UG9pbnRzO1xufVxuXG5mdW5jdGlvbiBmaW5kT3J0aG9nb25hbFBhcmFsbGVsU2VnbWVudHMoc2VnbWVudDogW1BvaW50LCBQb2ludF0sIGtleVBvaW50czogUG9pbnRbXSk6IFtQb2ludCwgUG9pbnRdW10ge1xuICAgIGNvbnN0IGlzSG9yaXpvbnRhbFNlZ21lbnQgPSBQb2ludC5pc0hvcml6b250YWwoc2VnbWVudFswXSwgc2VnbWVudFsxXSk7XG4gICAgY29uc3QgcGFyYWxsZWxTZWdtZW50czogW1BvaW50LCBQb2ludF1bXSA9IFtdO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlQb2ludHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBrZXlQb2ludHNbaV07XG4gICAgICAgIGNvbnN0IG5leHQgPSBrZXlQb2ludHNbaSArIDFdO1xuICAgICAgICBjb25zdCBpc0hvcml6b250YWwgPSBQb2ludC5pc0hvcml6b250YWwoY3VycmVudCwgbmV4dCwgMC4xKTtcbiAgICAgICAgaWYgKGlzSG9yaXpvbnRhbFNlZ21lbnQgJiYgaXNIb3Jpem9udGFsKSB7XG4gICAgICAgICAgICBwYXJhbGxlbFNlZ21lbnRzLnB1c2goW2N1cnJlbnQsIG5leHRdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzSG9yaXpvbnRhbFNlZ21lbnQgJiYgIWlzSG9yaXpvbnRhbCkge1xuICAgICAgICAgICAgcGFyYWxsZWxTZWdtZW50cy5wdXNoKFtjdXJyZW50LCBuZXh0XSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGFyYWxsZWxTZWdtZW50cztcbn1cblxuZnVuY3Rpb24gZmluZE1pcnJvclNlZ21lbnRzKFxuICAgIGJvYXJkOiBQbGFpdEJvYXJkLFxuICAgIHNlZ21lbnQ6IFtQb2ludCwgUG9pbnRdLFxuICAgIHBhcmFsbGVsU2VnbWVudHM6IFtQb2ludCwgUG9pbnRdW10sXG4gICAgc291cmNlUmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnQsXG4gICAgdGFyZ2V0UmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnRcbikge1xuICAgIGRlYnVnR2VuZXJhdG9yLmlzRGVidWcoKSAmJiBkZWJ1Z0dlbmVyYXRvci5jbGVhcigpO1xuXG4gICAgY29uc3QgbWlycm9yU2VnbWVudHM6IFtQb2ludCwgUG9pbnRdW10gPSBbXTtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcGFyYWxsZWxTZWdtZW50cy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgY29uc3QgcGFyYWxsZWxQYXRoID0gcGFyYWxsZWxTZWdtZW50c1tpbmRleF07XG4gICAgICAgIGNvbnN0IHN0YXJ0UG9pbnQgPSBbc2VnbWVudFswXVswXSwgc2VnbWVudFswXVsxXV0gYXMgUG9pbnQ7XG4gICAgICAgIGNvbnN0IGVuZFBvaW50ID0gW3NlZ21lbnRbMV1bMF0sIHNlZ21lbnRbMV1bMV1dIGFzIFBvaW50O1xuICAgICAgICBjb25zdCBpc0hvcml6b250YWwgPSBQb2ludC5pc0hvcml6b250YWwoc3RhcnRQb2ludCwgZW5kUG9pbnQpO1xuICAgICAgICBjb25zdCBhZGp1c3REYXRhSW5kZXggPSBpc0hvcml6b250YWwgPyAwIDogMTtcbiAgICAgICAgc3RhcnRQb2ludFthZGp1c3REYXRhSW5kZXhdID0gcGFyYWxsZWxQYXRoWzBdW2FkanVzdERhdGFJbmRleF07XG4gICAgICAgIGVuZFBvaW50W2FkanVzdERhdGFJbmRleF0gPSBwYXJhbGxlbFBhdGhbMV1bYWRqdXN0RGF0YUluZGV4XTtcbiAgICAgICAgY29uc3QgZmFrZVJlY3RhbmdsZSA9IFJlY3RhbmdsZUNsaWVudC5nZXRSZWN0YW5nbGVCeVBvaW50cyhbc3RhcnRQb2ludCwgZW5kUG9pbnQsIC4uLnBhcmFsbGVsUGF0aF0pO1xuICAgICAgICBjb25zdCBpc1ZhbGlkID0gIVJlY3RhbmdsZUNsaWVudC5pc0hpdChmYWtlUmVjdGFuZ2xlLCBzb3VyY2VSZWN0YW5nbGUpICYmICFSZWN0YW5nbGVDbGllbnQuaXNIaXQoZmFrZVJlY3RhbmdsZSwgdGFyZ2V0UmVjdGFuZ2xlKTtcbiAgICAgICAgaWYgKGlzVmFsaWQpIHtcbiAgICAgICAgICAgIG1pcnJvclNlZ21lbnRzLnB1c2goW3N0YXJ0UG9pbnQsIGVuZFBvaW50XSk7XG5cbiAgICAgICAgICAgIGRlYnVnR2VuZXJhdG9yLmlzRGVidWcoKSAmJiBkZWJ1Z0dlbmVyYXRvci5kcmF3UG9seWdvbihib2FyZCwgUmVjdGFuZ2xlQ2xpZW50LmdldENvcm5lclBvaW50cyhmYWtlUmVjdGFuZ2xlKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1pcnJvclNlZ21lbnRzO1xufVxuXG5leHBvcnQgY29uc3QgaGFzSWxsZWdhbEVsYm93UG9pbnQgPSAobWlkRGF0YVBvaW50czogUG9pbnRbXSk6IGJvb2xlYW4gPT4ge1xuICAgIGlmIChtaWREYXRhUG9pbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIG1pZERhdGFQb2ludHMuc29tZSgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgYmVmb3JlUG9pbnQgPSBtaWREYXRhUG9pbnRzW2luZGV4IC0gMV07XG4gICAgICAgIGNvbnN0IGFmdGVyUG9pbnQgPSBtaWREYXRhUG9pbnRzW2luZGV4ICsgMV07XG4gICAgICAgIGNvbnN0IGJlZm9yZVNlZ21lbnQgPSBiZWZvcmVQb2ludCAmJiBbYmVmb3JlUG9pbnQsIGl0ZW1dO1xuICAgICAgICBjb25zdCBhZnRlclNlZ21lbnQgPSBhZnRlclBvaW50ICYmIFtpdGVtLCBhZnRlclBvaW50XTtcbiAgICAgICAgY29uc3QgaXNTdHJhaWdodFdpdGhCZWZvcmUgPSBiZWZvcmVTZWdtZW50ICYmIFBvaW50LmlzQWxpZ24oYmVmb3JlU2VnbWVudCk7XG4gICAgICAgIGNvbnN0IGlzU3RyYWlnaHRXaXRoQWZ0ZXIgPSBhZnRlclNlZ21lbnQgJiYgUG9pbnQuaXNBbGlnbihhZnRlclNlZ21lbnQpO1xuICAgICAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiAhaXNTdHJhaWdodFdpdGhBZnRlcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5kZXggPT09IG1pZERhdGFQb2ludHMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgcmV0dXJuICFpc1N0cmFpZ2h0V2l0aEJlZm9yZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gIWlzU3RyYWlnaHRXaXRoQmVmb3JlICYmICFpc1N0cmFpZ2h0V2l0aEFmdGVyO1xuICAgIH0pO1xufTtcbiJdfQ==
@@ -1,67 +0,0 @@
1
- import { RectangleClient } from '@plait/core';
2
- import { LineShape, PlaitLine } from '../../interfaces';
3
- import { RESIZE_HANDLE_DIAMETER, getPointOnPolyline } from '@plait/common';
4
- import { getLinePoints, getMiddlePoints } from '../line/line-basic';
5
- export var LineResizeHandle;
6
- (function (LineResizeHandle) {
7
- LineResizeHandle["source"] = "source";
8
- LineResizeHandle["target"] = "target";
9
- LineResizeHandle["addHandle"] = "addHandle";
10
- })(LineResizeHandle || (LineResizeHandle = {}));
11
- export const getHitLineResizeHandleRef = (board, element, point) => {
12
- let dataPoints = PlaitLine.getPoints(board, element);
13
- const index = getHitPointIndex(dataPoints, point);
14
- if (index !== -1) {
15
- const handleIndex = index;
16
- if (index === 0) {
17
- return { handle: LineResizeHandle.source, handleIndex };
18
- }
19
- if (index === dataPoints.length - 1) {
20
- return { handle: LineResizeHandle.target, handleIndex };
21
- }
22
- // elbow line, data points only verify source connection point and target connection point
23
- if (element.shape !== LineShape.elbow) {
24
- return { handleIndex };
25
- }
26
- }
27
- const middlePoints = getMiddlePoints(board, element);
28
- const indexOfMiddlePoints = getHitPointIndex(middlePoints, point);
29
- if (indexOfMiddlePoints !== -1) {
30
- return {
31
- handle: LineResizeHandle.addHandle,
32
- handleIndex: indexOfMiddlePoints
33
- };
34
- }
35
- return undefined;
36
- };
37
- export function getHitPointIndex(points, movingPoint) {
38
- const rectangles = points.map(point => {
39
- return {
40
- x: point[0] - RESIZE_HANDLE_DIAMETER / 2,
41
- y: point[1] - RESIZE_HANDLE_DIAMETER / 2,
42
- width: RESIZE_HANDLE_DIAMETER,
43
- height: RESIZE_HANDLE_DIAMETER
44
- };
45
- });
46
- const rectangle = rectangles.find(rectangle => {
47
- return RectangleClient.isHit(RectangleClient.getRectangleByPoints([movingPoint, movingPoint]), rectangle);
48
- });
49
- return rectangle ? rectangles.indexOf(rectangle) : -1;
50
- }
51
- export const getHitLineTextIndex = (board, element, point) => {
52
- const texts = element.texts;
53
- if (!texts.length)
54
- return -1;
55
- const points = getLinePoints(board, element);
56
- return texts.findIndex(text => {
57
- const center = getPointOnPolyline(points, text.position);
58
- const rectangle = {
59
- x: center[0] - text.width / 2,
60
- y: center[1] - text.height / 2,
61
- width: text.width,
62
- height: text.height
63
- };
64
- return RectangleClient.isHit(rectangle, RectangleClient.getRectangleByPoints([point, point]));
65
- });
66
- };
67
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2RyYXcvc3JjL3V0aWxzL3Bvc2l0aW9uL2xpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixlQUFlLEVBQW1DLE1BQU0sYUFBYSxDQUFDO0FBQ2xHLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDeEQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNFLE9BQU8sRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFcEUsTUFBTSxDQUFOLElBQVksZ0JBSVg7QUFKRCxXQUFZLGdCQUFnQjtJQUN4QixxQ0FBbUIsQ0FBQTtJQUNuQixxQ0FBbUIsQ0FBQTtJQUNuQiwyQ0FBeUIsQ0FBQTtBQUM3QixDQUFDLEVBSlcsZ0JBQWdCLEtBQWhCLGdCQUFnQixRQUkzQjtBQUVELE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHLENBQUMsS0FBaUIsRUFBRSxPQUFrQixFQUFFLEtBQVksRUFBRSxFQUFFO0lBQzdGLElBQUksVUFBVSxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3JELE1BQU0sS0FBSyxHQUFHLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNsRCxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2YsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBQzFCLElBQUksS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2QsT0FBTyxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLENBQUM7UUFDNUQsQ0FBQztRQUNELElBQUksS0FBSyxLQUFLLFVBQVUsQ0FBQyxNQUFNLEdBQUcs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cnQgeyBQbGFpdEJvYXJkLCBQb2ludCwgUmVjdGFuZ2xlQ2xpZW50LCBkaXN0YW5jZUJldHdlZW5Qb2ludEFuZFNlZ21lbnRzIH0gZnJvbSAnQHBsYWl0L2NvcmUnO1xuaW1wb3J0IHsgTGluZVNoYXBlLCBQbGFpdExpbmUgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IFJFU0laRV9IQU5ETEVfRElBTUVURVIsIGdldFBvaW50T25Qb2x5bGluZSB9IGZyb20gJ0BwbGFpdC9jb21tb24nO1xuaW1wb3J0IHsgZ2V0TGluZVBvaW50cywgZ2V0TWlkZGxlUG9pbnRzIH0gZnJvbSAnLi4vbGluZS9saW5lLWJhc2ljJztcblxuZXhwb3J0IGVudW0gTGluZVJlc2l6ZUhhbmRsZSB7XG4gICAgJ3NvdXJjZScgPSAnc291cmNlJyxcbiAgICAndGFyZ2V0JyA9ICd0YXJnZXQnLFxuICAgICdhZGRIYW5kbGUnID0gJ2FkZEhhbmRsZSdcbn1cblxuZXhwb3J0IGNvbnN0IGdldEhpdExpbmVSZXNpemVIYW5kbGVSZWYgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnQ6IFBsYWl0TGluZSwgcG9pbnQ6IFBvaW50KSA9PiB7XG4gICAgbGV0IGRhdGFQb2ludHMgPSBQbGFpdExpbmUuZ2V0UG9pbnRzKGJvYXJkLCBlbGVtZW50KTtcbiAgICBjb25zdCBpbmRleCA9IGdldEhpdFBvaW50SW5kZXgoZGF0YVBvaW50cywgcG9pbnQpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgY29uc3QgaGFuZGxlSW5kZXggPSBpbmRleDtcbiAgICAgICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4geyBoYW5kbGU6IExpbmVSZXNpemVIYW5kbGUuc291cmNlLCBoYW5kbGVJbmRleCB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbmRleCA9PT0gZGF0YVBvaW50cy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICByZXR1cm4geyBoYW5kbGU6IExpbmVSZXNpemVIYW5kbGUudGFyZ2V0LCBoYW5kbGVJbmRleCB9O1xuICAgICAgICB9XG4gICAgICAgIC8vIGVsYm93IGxpbmUsIGRhdGEgcG9pbnRzIG9ubHkgdmVyaWZ5IHNvdXJjZSBjb25uZWN0aW9uIHBvaW50IGFuZCB0YXJnZXQgY29ubmVjdGlvbiBwb2ludFxuICAgICAgICBpZiAoZWxlbWVudC5zaGFwZSAhPT0gTGluZVNoYXBlLmVsYm93KSB7XG4gICAgICAgICAgICByZXR1cm4geyBoYW5kbGVJbmRleCB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG1pZGRsZVBvaW50cyA9IGdldE1pZGRsZVBvaW50cyhib2FyZCwgZWxlbWVudCk7XG4gICAgY29uc3QgaW5kZXhPZk1pZGRsZVBvaW50cyA9IGdldEhpdFBvaW50SW5kZXgobWlkZGxlUG9pbnRzLCBwb2ludCk7XG4gICAgaWYgKGluZGV4T2ZNaWRkbGVQb2ludHMgIT09IC0xKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBoYW5kbGU6IExpbmVSZXNpemVIYW5kbGUuYWRkSGFuZGxlLFxuICAgICAgICAgICAgaGFuZGxlSW5kZXg6IGluZGV4T2ZNaWRkbGVQb2ludHNcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRIaXRQb2ludEluZGV4KHBvaW50czogUG9pbnRbXSwgbW92aW5nUG9pbnQ6IFBvaW50KSB7XG4gICAgY29uc3QgcmVjdGFuZ2xlcyA9IHBvaW50cy5tYXAocG9pbnQgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogcG9pbnRbMF0gLSBSRVNJWkVfSEFORExFX0RJQU1FVEVSIC8gMixcbiAgICAgICAgICAgIHk6IHBvaW50WzFdIC0gUkVTSVpFX0hBTkRMRV9ESUFNRVRFUiAvIDIsXG4gICAgICAgICAgICB3aWR0aDogUkVTSVpFX0hBTkRMRV9ESUFNRVRFUixcbiAgICAgICAgICAgIGhlaWdodDogUkVTSVpFX0hBTkRMRV9ESUFNRVRFUlxuICAgICAgICB9O1xuICAgIH0pO1xuICAgIGNvbnN0IHJlY3RhbmdsZSA9IHJlY3RhbmdsZXMuZmluZChyZWN0YW5nbGUgPT4ge1xuICAgICAgICByZXR1cm4gUmVjdGFuZ2xlQ2xpZW50LmlzSGl0KFJlY3RhbmdsZUNsaWVudC5nZXRSZWN0YW5nbGVCeVBvaW50cyhbbW92aW5nUG9pbnQsIG1vdmluZ1BvaW50XSksIHJlY3RhbmdsZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlY3RhbmdsZSA/IHJlY3RhbmdsZXMuaW5kZXhPZihyZWN0YW5nbGUpIDogLTE7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRIaXRMaW5lVGV4dEluZGV4ID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBlbGVtZW50OiBQbGFpdExpbmUsIHBvaW50OiBQb2ludCkgPT4ge1xuICAgIGNvbnN0IHRleHRzID0gZWxlbWVudC50ZXh0cztcbiAgICBpZiAoIXRleHRzLmxlbmd0aCkgcmV0dXJuIC0xO1xuXG4gICAgY29uc3QgcG9pbnRzID0gZ2V0TGluZVBvaW50cyhib2FyZCwgZWxlbWVudCk7XG4gICAgcmV0dXJuIHRleHRzLmZpbmRJbmRleCh0ZXh0ID0+IHtcbiAgICAgICAgY29uc3QgY2VudGVyID0gZ2V0UG9pbnRPblBvbHlsaW5lKHBvaW50cywgdGV4dC5wb3NpdGlvbik7XG4gICAgICAgIGNvbnN0IHJlY3RhbmdsZSA9IHtcbiAgICAgICAgICAgIHg6IGNlbnRlclswXSAtIHRleHQud2lkdGghIC8gMixcbiAgICAgICAgICAgIHk6IGNlbnRlclsxXSAtIHRleHQuaGVpZ2h0ISAvIDIsXG4gICAgICAgICAgICB3aWR0aDogdGV4dC53aWR0aCEsXG4gICAgICAgICAgICBoZWlnaHQ6IHRleHQuaGVpZ2h0IVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gUmVjdGFuZ2xlQ2xpZW50LmlzSGl0KHJlY3RhbmdsZSwgUmVjdGFuZ2xlQ2xpZW50LmdldFJlY3RhbmdsZUJ5UG9pbnRzKFtwb2ludCwgcG9pbnRdKSk7XG4gICAgfSk7XG59O1xuIl19
@@ -1,13 +0,0 @@
1
- import { Point } from '@plait/core';
2
- import { PlaitLine } from '../interfaces';
3
- import { Generator } from '@plait/common';
4
- export interface ActiveData {
5
- selected: boolean;
6
- linePoints: Point[];
7
- }
8
- export declare class LineActiveGenerator extends Generator<PlaitLine, ActiveData> {
9
- onlySelectedCurrentLine: boolean;
10
- canDraw(element: PlaitLine, data: ActiveData): boolean;
11
- draw(element: PlaitLine, data: ActiveData): SVGGElement;
12
- needUpdate(): boolean;
13
- }
@@ -1,8 +0,0 @@
1
- import { PlaitLine } from '../interfaces';
2
- import { Generator } from '@plait/common';
3
- export interface ShapeData {
4
- }
5
- export declare class LineShapeGenerator extends Generator<PlaitLine, ShapeData> {
6
- canDraw(element: PlaitLine, data: ShapeData): boolean;
7
- draw(element: PlaitLine, data: ShapeData): SVGGElement;
8
- }
@@ -1,75 +0,0 @@
1
- import { Direction, PlaitBoard, PlaitElement, Point, PointOfRectangle, Vector } from '@plait/core';
2
- import { Element } from 'slate';
3
- import { StrokeStyle } from './element';
4
- import { PlaitShapeElement } from '.';
5
- export declare enum LineMarkerType {
6
- arrow = "arrow",
7
- none = "none",
8
- openTriangle = "open-triangle",
9
- solidTriangle = "solid-triangle",
10
- sharpArrow = "sharp-arrow",
11
- oneSideUp = "one-side-up",
12
- oneSideDown = "one-side-down",
13
- hollowTriangle = "hollow-triangle",
14
- singleSlash = "single-slash"
15
- }
16
- export declare enum LineShape {
17
- straight = "straight",
18
- curve = "curve",
19
- elbow = "elbow"
20
- }
21
- export declare enum LineHandleKey {
22
- source = "source",
23
- target = "target"
24
- }
25
- export interface LineText {
26
- text: Element;
27
- position: number;
28
- width: number;
29
- height: number;
30
- }
31
- export interface LineHandle {
32
- boundId?: string;
33
- connection?: PointOfRectangle;
34
- marker: LineMarkerType;
35
- }
36
- export interface LineHandleRef {
37
- key: LineHandleKey;
38
- direction: Direction;
39
- point: PointOfRectangle;
40
- vector: Vector;
41
- boundElement?: PlaitShapeElement;
42
- }
43
- export interface LineHandleRefPair {
44
- source: LineHandleRef;
45
- target: LineHandleRef;
46
- }
47
- export interface PlaitLine extends PlaitElement {
48
- type: 'line';
49
- shape: LineShape;
50
- points: Point[];
51
- source: LineHandle;
52
- target: LineHandle;
53
- texts: LineText[];
54
- strokeColor?: string;
55
- strokeWidth?: number;
56
- strokeStyle?: StrokeStyle;
57
- opacity: number;
58
- }
59
- export interface PlaitStraightLine extends PlaitLine {
60
- shape: LineShape.straight;
61
- }
62
- export interface PlaitCurveLine extends PlaitLine {
63
- shape: LineShape.curve;
64
- }
65
- export interface PlaitElbowLine extends PlaitLine {
66
- shape: LineShape.elbow;
67
- }
68
- export declare const PlaitLine: {
69
- isSourceMarkOrTargetMark(line: PlaitLine, markType: LineMarkerType, handleKey: LineHandleKey): boolean;
70
- isSourceMark(line: PlaitLine, markType: LineMarkerType): boolean;
71
- isTargetMark(line: PlaitLine, markType: LineMarkerType): boolean;
72
- isBoundElementOfSource(line: PlaitLine, element: PlaitShapeElement): boolean;
73
- isBoundElementOfTarget(line: PlaitLine, element: PlaitShapeElement): boolean;
74
- getPoints(board: PlaitBoard, line: PlaitLine): Point[];
75
- };
@@ -1,26 +0,0 @@
1
- import { PlaitBoard, PlaitPluginElementContext, OnContextChanged } from '@plait/core';
2
- import { LineText, PlaitGeometry, PlaitLine } from './interfaces';
3
- import { LineShapeGenerator } from './generators/line.generator';
4
- import { LineActiveGenerator } from './generators/line-active.generator';
5
- import { CommonElementFlavour, TextManage } from '@plait/common';
6
- interface BoundedElements {
7
- source?: PlaitGeometry;
8
- target?: PlaitGeometry;
9
- }
10
- export declare class LineComponent extends CommonElementFlavour<PlaitLine, PlaitBoard> implements OnContextChanged<PlaitLine, PlaitBoard> {
11
- shapeGenerator: LineShapeGenerator;
12
- activeGenerator: LineActiveGenerator;
13
- boundedElements: BoundedElements;
14
- constructor();
15
- initializeGenerator(): void;
16
- initialize(): void;
17
- getBoundedElements(): BoundedElements;
18
- onContextChanged(value: PlaitPluginElementContext<PlaitLine, PlaitBoard>, previous: PlaitPluginElementContext<PlaitLine, PlaitBoard>): void;
19
- initializeTextManagesByElement(): void;
20
- drawText(): void;
21
- createTextManage(text: LineText, index: number): TextManage;
22
- updateText(previousTexts: LineText[], currentTexts: LineText[]): void;
23
- updateTextRectangle(): void;
24
- destroy(): void;
25
- }
26
- export {};
@@ -1,2 +0,0 @@
1
- import { PlaitBoard } from '@plait/core';
2
- export declare const withLineAutoCompleteReaction: (board: PlaitBoard) => PlaitBoard;
@@ -1,7 +0,0 @@
1
- import { PlaitBoard } from '@plait/core';
2
- import { PlaitLine } from '../interfaces';
3
- export declare const WithLineAutoCompletePluginKey = "plait-line-auto-complete-plugin-key";
4
- export interface LineAutoCompleteOptions {
5
- afterComplete: (element: PlaitLine) => {};
6
- }
7
- export declare const withLineAutoComplete: (board: PlaitBoard) => PlaitBoard;
@@ -1,2 +0,0 @@
1
- import { PlaitBoard } from '@plait/core';
2
- export declare const withLineBoundReaction: (board: PlaitBoard) => PlaitBoard;
@@ -1,2 +0,0 @@
1
- import { PlaitBoard } from '@plait/core';
2
- export declare const withLineCreateByDraw: (board: PlaitBoard) => PlaitBoard;
@@ -1,2 +0,0 @@
1
- import { PlaitBoard } from '@plait/core';
2
- export declare const withLineResize: (board: PlaitBoard) => PlaitBoard;
@@ -1,2 +0,0 @@
1
- import { PlaitBoard } from '@plait/core';
2
- export declare const withLineTextMove: (board: PlaitBoard) => PlaitBoard;
@@ -1,2 +0,0 @@
1
- import { PlaitBoard } from '@plait/core';
2
- export declare const withLineText: (board: PlaitBoard) => PlaitBoard;
@@ -1,12 +0,0 @@
1
- import { Path, PlaitBoard } from '@plait/core';
2
- import { LineHandleKey, LineMarkerType, LineText, PlaitGeometry, PlaitLine } from '../interfaces';
3
- export declare const resizeLine: (board: PlaitBoard, options: Partial<PlaitLine>, path: Path) => void;
4
- export declare const setLineTexts: (board: PlaitBoard, element: PlaitLine, texts: LineText[]) => void;
5
- export declare const removeLineText: (board: PlaitBoard, element: PlaitLine, index: number) => void;
6
- export declare const setLineMark: (board: PlaitBoard, handleKey: LineHandleKey, marker: LineMarkerType) => void;
7
- export declare const setLineShape: (board: PlaitBoard, newProperties: Partial<PlaitLine>) => void;
8
- export declare const collectLineUpdatedRefsByGeometry: (board: PlaitBoard, geometry: PlaitGeometry, refs: {
9
- property: Partial<PlaitLine>;
10
- path: Path;
11
- }[]) => void;
12
- export declare const connectLineToGeometry: (board: PlaitBoard, lineElement: PlaitLine, handle: LineHandleKey, geometryElement: PlaitGeometry) => void;