@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.
Files changed (84) hide show
  1. package/README.md +13 -1
  2. package/constants/line.d.ts +1 -0
  3. package/engines/basic-shapes/ellipse.d.ts +1 -10
  4. package/engines/flowchart/terminal.d.ts +1 -0
  5. package/esm2022/constants/line.mjs +2 -1
  6. package/esm2022/engines/basic-shapes/comment.mjs +4 -5
  7. package/esm2022/engines/basic-shapes/ellipse.mjs +5 -29
  8. package/esm2022/engines/basic-shapes/parallelogram.mjs +3 -2
  9. package/esm2022/engines/basic-shapes/pentagon.mjs +3 -3
  10. package/esm2022/engines/basic-shapes/polygon.mjs +20 -4
  11. package/esm2022/engines/basic-shapes/process-arrow.mjs +3 -3
  12. package/esm2022/engines/basic-shapes/rectangle.mjs +4 -4
  13. package/esm2022/engines/basic-shapes/round-comment.mjs +4 -5
  14. package/esm2022/engines/basic-shapes/round-rectangle.mjs +3 -3
  15. package/esm2022/engines/basic-shapes/star.mjs +3 -3
  16. package/esm2022/engines/basic-shapes/trapezoid.mjs +3 -2
  17. package/esm2022/engines/basic-shapes/triangle.mjs +5 -4
  18. package/esm2022/engines/flowchart/delay.mjs +6 -6
  19. package/esm2022/engines/flowchart/manual-input.mjs +5 -4
  20. package/esm2022/engines/flowchart/manual-loop.mjs +3 -2
  21. package/esm2022/engines/flowchart/merge.mjs +4 -4
  22. package/esm2022/engines/flowchart/stored-data.mjs +16 -10
  23. package/esm2022/engines/flowchart/terminal.mjs +37 -27
  24. package/esm2022/generators/geometry-shape.generator.mjs +3 -3
  25. package/esm2022/generators/line-active.generator.mjs +52 -68
  26. package/esm2022/generators/line.generator.mjs +2 -2
  27. package/esm2022/geometry.component.mjs +7 -7
  28. package/esm2022/image.component.mjs +4 -4
  29. package/esm2022/interfaces/geometry.mjs +1 -1
  30. package/esm2022/interfaces/line.mjs +2 -2
  31. package/esm2022/line.component.mjs +42 -12
  32. package/esm2022/plugins/with-draw-fragment.mjs +3 -3
  33. package/esm2022/plugins/with-draw-hotkey.mjs +6 -6
  34. package/esm2022/plugins/with-draw-resize.mjs +149 -0
  35. package/esm2022/plugins/with-draw.mjs +14 -8
  36. package/esm2022/plugins/with-geometry-create.mjs +10 -10
  37. package/esm2022/plugins/with-geometry-resize.mjs +27 -74
  38. package/esm2022/plugins/with-line-auto-complete.mjs +17 -5
  39. package/esm2022/plugins/with-line-bound-reaction.mjs +6 -5
  40. package/esm2022/plugins/with-line-create.mjs +2 -2
  41. package/esm2022/plugins/with-line-resize.mjs +105 -19
  42. package/esm2022/plugins/with-line-text-move.mjs +5 -4
  43. package/esm2022/plugins/with-line-text.mjs +7 -5
  44. package/esm2022/transforms/geometry.mjs +4 -4
  45. package/esm2022/transforms/line.mjs +6 -8
  46. package/esm2022/utils/clipboard.mjs +2 -2
  47. package/esm2022/utils/geometry.mjs +16 -33
  48. package/esm2022/utils/hit.mjs +18 -10
  49. package/esm2022/utils/index.mjs +2 -2
  50. package/esm2022/utils/line/elbow.mjs +101 -0
  51. package/esm2022/utils/line/index.mjs +6 -0
  52. package/esm2022/utils/line/line-arrow.mjs +123 -0
  53. package/esm2022/utils/line/line-basic.mjs +258 -0
  54. package/esm2022/utils/line/line-common.mjs +111 -0
  55. package/esm2022/utils/line/line-resize.mjs +313 -0
  56. package/esm2022/utils/polygon.mjs +30 -0
  57. package/esm2022/utils/position/geometry.mjs +5 -6
  58. package/esm2022/utils/position/line.mjs +38 -15
  59. package/esm2022/utils/resize-align-reaction.mjs +316 -0
  60. package/esm2022/utils/resize-align.mjs +37 -0
  61. package/fesm2022/plait-draw.mjs +2117 -1152
  62. package/fesm2022/plait-draw.mjs.map +1 -1
  63. package/generators/line-active.generator.d.ts +4 -2
  64. package/interfaces/geometry.d.ts +1 -0
  65. package/interfaces/line.d.ts +4 -0
  66. package/package.json +1 -1
  67. package/plugins/with-draw-resize.d.ts +13 -0
  68. package/utils/geometry.d.ts +1 -3
  69. package/utils/hit.d.ts +3 -1
  70. package/utils/index.d.ts +1 -1
  71. package/utils/line/elbow.d.ts +19 -0
  72. package/utils/line/index.d.ts +5 -0
  73. package/utils/{line-arrow.d.ts → line/line-arrow.d.ts} +1 -1
  74. package/utils/line/line-basic.d.ts +13 -0
  75. package/utils/line/line-common.d.ts +35 -0
  76. package/utils/line/line-resize.d.ts +23 -0
  77. package/utils/polygon.d.ts +4 -0
  78. package/utils/position/geometry.d.ts +2 -3
  79. package/utils/position/line.d.ts +4 -2
  80. package/utils/resize-align-reaction.d.ts +42 -0
  81. package/utils/resize-align.d.ts +8 -0
  82. package/esm2022/utils/line-arrow.mjs +0 -123
  83. package/esm2022/utils/line.mjs +0 -392
  84. package/utils/line.d.ts +0 -25
@@ -1,392 +0,0 @@
1
- import { Point, idCreator, distanceBetweenPointAndSegments, PlaitBoard, createG, getElementById, RectangleClient, findElements, drawLinearPath, createMask, createRect, ACTIVE_STROKE_WIDTH, Direction, distanceBetweenPointAndPoint, catmullRomFitting } from '@plait/core';
2
- import { getPoints, getRectangleByPoints, getPointOnPolyline, getDirectionFactor, rotateVectorAnti90, getDirectionByVector, getOppositeDirection, getDirectionByPointOfRectangle, getPointByVector, removeDuplicatePoints, reduceRouteMargin, generateElbowLineRoute, getNextPoint, getExtendPoint } from '@plait/common';
3
- import { BasicShapes, LineHandleKey, LineMarkerType, LineShape, PlaitDrawElement, PlaitLine } from '../interfaces';
4
- import { getPointsByCenterPoint, getNearestPoint, createGeometryElement } from './geometry';
5
- import { getLineDashByElement, getStrokeColorByElement, getStrokeWidthByElement } from './style/stroke';
6
- import { getEngine } from '../engines';
7
- import { drawLineArrow } from './line-arrow';
8
- import { pointsOnBezierCurves } from 'points-on-curve';
9
- import { getShape } from './shape';
10
- import { DefaultLineStyle, LINE_TEXT_SPACE } from '../constants/line';
11
- import { LineShapeGenerator } from '../generators/line.generator';
12
- import { REACTION_MARGIN } from '../constants';
13
- import { getHitOutlineGeometry } from './position/geometry';
14
- import { getLineMemorizedLatest } from './memorize';
15
- export const createLineElement = (shape, points, source, target, texts, options) => {
16
- return {
17
- id: idCreator(),
18
- type: 'line',
19
- shape,
20
- source,
21
- texts: texts ? texts : [],
22
- target,
23
- opacity: 1,
24
- points,
25
- ...options
26
- };
27
- };
28
- export const getLinePoints = (board, element) => {
29
- switch (element.shape) {
30
- case LineShape.elbow: {
31
- return getElbowPoints(board, element);
32
- }
33
- case LineShape.curve: {
34
- return getCurvePoints(board, element);
35
- }
36
- default: {
37
- const points = PlaitLine.getPoints(board, element);
38
- const handleRefPair = getLineHandleRefPair(board, element);
39
- points[0] = handleRefPair.source.point;
40
- points[points.length - 1] = handleRefPair.target.point;
41
- return points;
42
- }
43
- }
44
- };
45
- export const getLineHandleRefPair = (board, element) => {
46
- const strokeWidth = getStrokeWidthByElement(element);
47
- const sourceBoundElement = element.source.boundId ? getElementById(board, element.source.boundId) : undefined;
48
- const targetBoundElement = element.target.boundId ? getElementById(board, element.target.boundId) : undefined;
49
- let sourcePoint = sourceBoundElement ? getConnectionPoint(sourceBoundElement, element.source.connection) : element.points[0];
50
- let targetPoint = targetBoundElement
51
- ? getConnectionPoint(targetBoundElement, element.target.connection)
52
- : element.points[element.points.length - 1];
53
- let sourceDirection = getDirectionByVector([targetPoint[0] - sourcePoint[0], targetPoint[1] - sourcePoint[1]]) || Direction.right;
54
- let targetDirection = getOppositeDirection(sourceDirection);
55
- const sourceFactor = getDirectionFactor(sourceDirection);
56
- const targetFactor = getDirectionFactor(targetDirection);
57
- const sourceHandleRef = {
58
- key: LineHandleKey.source,
59
- point: sourcePoint,
60
- direction: sourceDirection,
61
- vector: [sourceFactor.x, sourceFactor.y]
62
- };
63
- const targetHandleRef = {
64
- key: LineHandleKey.target,
65
- point: targetPoint,
66
- direction: targetDirection,
67
- vector: [targetFactor.x, targetFactor.y]
68
- };
69
- if (sourceBoundElement) {
70
- const connectionOffset = PlaitLine.isSourceMarkOrTargetMark(element, LineMarkerType.none, LineHandleKey.source) ? 0 : strokeWidth;
71
- const sourceVector = getVectorByConnection(sourceBoundElement, element.source.connection);
72
- const direction = getDirectionByVector(sourceVector);
73
- sourceDirection = direction ? direction : sourceDirection;
74
- sourcePoint = getConnectionPoint(sourceBoundElement, element.source.connection, sourceDirection, connectionOffset);
75
- sourceHandleRef.boundElement = sourceBoundElement;
76
- sourceHandleRef.direction = sourceDirection;
77
- sourceHandleRef.point = sourcePoint;
78
- sourceHandleRef.vector = sourceVector;
79
- }
80
- if (targetBoundElement) {
81
- const connectionOffset = PlaitLine.isSourceMarkOrTargetMark(element, LineMarkerType.none, LineHandleKey.target) ? 0 : strokeWidth;
82
- const targetVector = getVectorByConnection(targetBoundElement, element.target.connection);
83
- const direction = getDirectionByVector(targetVector);
84
- targetDirection = direction ? direction : targetDirection;
85
- targetPoint = getConnectionPoint(targetBoundElement, element.target.connection, targetDirection, connectionOffset);
86
- targetHandleRef.boundElement = targetBoundElement;
87
- targetHandleRef.direction = targetDirection;
88
- targetHandleRef.point = targetPoint;
89
- targetHandleRef.vector = targetVector;
90
- }
91
- return { source: sourceHandleRef, target: targetHandleRef };
92
- };
93
- const createFakeElement = (startPoint, vector) => {
94
- const point = getPointByVector(startPoint, vector, -25);
95
- const points = getPointsByCenterPoint(point, 50, 50);
96
- return createGeometryElement(BasicShapes.rectangle, points, '');
97
- };
98
- export const getElbowPoints = (board, element) => {
99
- if (element.points.length === 2) {
100
- const handleRefPair = getLineHandleRefPair(board, element);
101
- let sourceElement = element.source.boundId ? getElementById(board, element.source.boundId) : undefined;
102
- let targetElement = element.target.boundId ? getElementById(board, element.target.boundId) : undefined;
103
- let points = [];
104
- if (!sourceElement) {
105
- const source = handleRefPair.source;
106
- sourceElement = createFakeElement(source.point, source.vector);
107
- }
108
- if (!targetElement) {
109
- const target = handleRefPair.target;
110
- targetElement = createFakeElement(target.point, target.vector);
111
- }
112
- const targetRectangle = RectangleClient.inflate(getRectangleByPoints(targetElement.points), getStrokeWidthByElement(targetElement) * 2);
113
- const sourceRectangle = RectangleClient.inflate(getRectangleByPoints(sourceElement.points), getStrokeWidthByElement(sourceElement) * 2);
114
- const sourcePoint = handleRefPair.source.point;
115
- const targetPoint = handleRefPair.target.point;
116
- const { sourceOffset, targetOffset } = reduceRouteMargin(sourceRectangle, targetRectangle);
117
- const sourceOuterRectangle = RectangleClient.expand(sourceRectangle, sourceOffset[3], sourceOffset[0], sourceOffset[1], sourceOffset[2]);
118
- const targetOuterRectangle = RectangleClient.expand(targetRectangle, targetOffset[3], targetOffset[0], targetOffset[1], targetOffset[2]);
119
- const nextSourcePoint = getNextPoint(sourcePoint, sourceOuterRectangle, handleRefPair.source.direction);
120
- const nextTargetPoint = getNextPoint(targetPoint, targetOuterRectangle, handleRefPair.target.direction);
121
- const isIntersect = RectangleClient.isPointInRectangle(targetRectangle, sourcePoint) ||
122
- RectangleClient.isPointInRectangle(targetOuterRectangle, nextSourcePoint) ||
123
- RectangleClient.isPointInRectangle(sourceOuterRectangle, nextTargetPoint) ||
124
- RectangleClient.isPointInRectangle(sourceRectangle, targetPoint);
125
- if (!isIntersect) {
126
- points = generateElbowLineRoute({
127
- sourcePoint,
128
- nextSourcePoint,
129
- sourceRectangle,
130
- sourceOuterRectangle,
131
- targetPoint,
132
- nextTargetPoint,
133
- targetRectangle,
134
- targetOuterRectangle
135
- });
136
- }
137
- else {
138
- points = getPoints(handleRefPair.source.point, handleRefPair.source.direction, handleRefPair.target.point, handleRefPair.target.direction, 0);
139
- }
140
- points = removeDuplicatePoints(points);
141
- return points;
142
- }
143
- return element.points;
144
- };
145
- export const getCurvePoints = (board, element) => {
146
- if (element.points.length === 2) {
147
- const handleRefPair = getLineHandleRefPair(board, element);
148
- const { source, target } = handleRefPair;
149
- const sourceBoundElement = handleRefPair.source.boundElement;
150
- const targetBoundElement = handleRefPair.target.boundElement;
151
- let curvePoints = [source.point];
152
- const sumDistance = distanceBetweenPointAndPoint(...source.point, ...target.point);
153
- const offset = 12 + sumDistance / 3;
154
- if (sourceBoundElement) {
155
- curvePoints.push(getPointByVector(source.point, source.vector, offset));
156
- }
157
- if (targetBoundElement) {
158
- curvePoints.push(getPointByVector(target.point, target.vector, offset));
159
- }
160
- const isSingleBound = (sourceBoundElement && !targetBoundElement) || (!sourceBoundElement && targetBoundElement);
161
- if (isSingleBound) {
162
- curvePoints.push(target.point);
163
- const points = Q2C(curvePoints);
164
- return pointsOnBezierCurves(points);
165
- }
166
- if (!sourceBoundElement && !targetBoundElement) {
167
- curvePoints.push(getPointByVector(source.point, source.vector, offset));
168
- curvePoints.push(getPointByVector(target.point, target.vector, offset));
169
- }
170
- curvePoints.push(target.point);
171
- return pointsOnBezierCurves(curvePoints);
172
- }
173
- else {
174
- let allPoints = PlaitLine.getPoints(board, element);
175
- allPoints = removeDuplicatePoints(allPoints);
176
- const points = catmullRomFitting(allPoints);
177
- return pointsOnBezierCurves(points);
178
- }
179
- };
180
- export const transformOpsToPoints = (ops) => {
181
- const result = [];
182
- for (let item of ops) {
183
- if (item.op === 'move') {
184
- result.push([item.data[0], item.data[1]]);
185
- }
186
- else {
187
- result.push([item.data[0], item.data[1]]);
188
- result.push([item.data[2], item.data[3]]);
189
- result.push([item.data[4], item.data[5]]);
190
- }
191
- }
192
- return result;
193
- };
194
- export const isHitPolyLine = (pathPoints, point, strokeWidth, expand = 0) => {
195
- const distance = distanceBetweenPointAndSegments(pathPoints, point);
196
- return distance <= strokeWidth + expand;
197
- };
198
- export const getHitLineTextIndex = (board, element, point) => {
199
- const texts = element.texts;
200
- if (!texts.length)
201
- return -1;
202
- const points = getLinePoints(board, element);
203
- return texts.findIndex(text => {
204
- const center = getPointOnPolyline(points, text.position);
205
- const rectangle = {
206
- x: center[0] - text.width / 2,
207
- y: center[1] - text.height / 2,
208
- width: text.width,
209
- height: text.height
210
- };
211
- return RectangleClient.isHit(rectangle, RectangleClient.toRectangleClient([point, point]));
212
- });
213
- };
214
- export const isHitLineText = (board, element, point) => {
215
- return getHitLineTextIndex(board, element, point) !== -1;
216
- };
217
- export const drawLine = (board, element) => {
218
- const strokeWidth = getStrokeWidthByElement(element);
219
- const strokeColor = getStrokeColorByElement(board, element);
220
- const strokeLineDash = getLineDashByElement(element);
221
- const options = { stroke: strokeColor, strokeWidth, strokeLineDash };
222
- const lineG = createG();
223
- let points = getLinePoints(board, element);
224
- let line;
225
- if (element.shape === LineShape.curve) {
226
- line = PlaitBoard.getRoughSVG(board).curve(points, options);
227
- }
228
- else {
229
- line = drawLinearPath(points, options);
230
- }
231
- const id = idCreator();
232
- line.setAttribute('mask', `url(#${id})`);
233
- lineG.appendChild(line);
234
- const { mask, maskTargetFillRect } = drawMask(board, element, id);
235
- lineG.appendChild(mask);
236
- line.appendChild(maskTargetFillRect);
237
- const arrow = drawLineArrow(element, points, { stroke: strokeColor, strokeWidth });
238
- arrow && lineG.appendChild(arrow);
239
- return lineG;
240
- };
241
- function drawMask(board, element, id) {
242
- const mask = createMask();
243
- mask.setAttribute('id', id);
244
- const points = getLinePoints(board, element);
245
- let rectangle = getRectangleByPoints(points);
246
- rectangle = RectangleClient.getOutlineRectangle(rectangle, -30);
247
- const maskFillRect = createRect(rectangle, {
248
- fill: 'white'
249
- });
250
- mask.appendChild(maskFillRect);
251
- const texts = element.texts;
252
- texts.forEach((text, index) => {
253
- let textRectangle = getLineTextRectangle(board, element, index);
254
- textRectangle = RectangleClient.inflate(textRectangle, LINE_TEXT_SPACE * 2);
255
- const rect = createRect(textRectangle, {
256
- fill: 'black'
257
- });
258
- mask.appendChild(rect);
259
- });
260
- // open line
261
- const maskTargetFillRect = createRect(rectangle);
262
- maskTargetFillRect.setAttribute('opacity', '0');
263
- maskTargetFillRect.setAttribute('fill', 'none');
264
- return { mask, maskTargetFillRect };
265
- }
266
- export const getConnectionPoint = (geometry, connection, direction, delta) => {
267
- const rectangle = getRectangleByPoints(geometry.points);
268
- if (direction && delta) {
269
- const directionFactor = getDirectionFactor(direction);
270
- const point = RectangleClient.getConnectionPoint(rectangle, connection);
271
- return [point[0] + directionFactor.x * delta, point[1] + directionFactor.y * delta];
272
- }
273
- else {
274
- return RectangleClient.getConnectionPoint(rectangle, connection);
275
- }
276
- };
277
- export const transformPointToConnection = (board, point, hitElement) => {
278
- let rectangle = getRectangleByPoints(hitElement.points);
279
- rectangle = RectangleClient.inflate(rectangle, ACTIVE_STROKE_WIDTH);
280
- let nearestPoint = getNearestPoint(hitElement, point, ACTIVE_STROKE_WIDTH);
281
- const hitConnector = getHitConnectorPoint(nearestPoint, hitElement, rectangle);
282
- nearestPoint = hitConnector ? hitConnector : nearestPoint;
283
- return [(nearestPoint[0] - rectangle.x) / rectangle.width, (nearestPoint[1] - rectangle.y) / rectangle.height];
284
- };
285
- // export const getConnectionByPointOnRectangleEdge = (board: PlaitBoard, point: Point, hitElement: PlaitShape): Point => {
286
- // let rectangle = getRectangleByPoints(hitElement.points);
287
- // const hitConnector = getHitConnectorPoint(point, hitElement, rectangle);
288
- // const newPoint = hitConnector ?? point;
289
- // return [(newPoint[0] - rectangle.x) / rectangle.width, (newPoint[1] - rectangle.y) / rectangle.height];
290
- // };
291
- export const getHitConnectorPoint = (movingPoint, hitElement, rectangle) => {
292
- const shape = getShape(hitElement);
293
- const connector = getEngine(shape).getConnectorPoints(rectangle);
294
- const points = getPointsByCenterPoint(movingPoint, 10, 10);
295
- const pointRectangle = getRectangleByPoints(points);
296
- return connector.find(point => {
297
- return RectangleClient.isHit(pointRectangle, RectangleClient.toRectangleClient([point, point]));
298
- });
299
- };
300
- export const getLineTextRectangle = (board, element, index) => {
301
- const text = element.texts[index];
302
- const elbowPoints = getLinePoints(board, element);
303
- const point = getPointOnPolyline(elbowPoints, text.position);
304
- return {
305
- x: point[0] - text.width / 2,
306
- y: point[1] - text.height / 2,
307
- width: text.width,
308
- height: text.height
309
- };
310
- };
311
- export const getBoardLines = (board) => {
312
- return findElements(board, {
313
- match: (element) => PlaitDrawElement.isLine(element),
314
- recursion: (element) => PlaitDrawElement.isDrawElement(element)
315
- });
316
- };
317
- // quadratic Bezier to cubic Bezier
318
- export const Q2C = (points) => {
319
- const result = [];
320
- const numSegments = points.length / 3;
321
- for (let i = 0; i < numSegments; i++) {
322
- const start = points[i];
323
- const qControl = points[i + 1];
324
- const end = points[i + 2];
325
- const startDistance = distanceBetweenPointAndPoint(...start, ...qControl);
326
- const endDistance = distanceBetweenPointAndPoint(...end, ...qControl);
327
- const cControl1 = getExtendPoint(start, qControl, (startDistance * 2) / 3);
328
- const cControl2 = getExtendPoint(end, qControl, (endDistance * 2) / 3);
329
- result.push(start, cControl1, cControl2, end);
330
- }
331
- return result;
332
- };
333
- export const getVectorByConnection = (boundElement, connection) => {
334
- const rectangle = getRectangleByPoints(boundElement.points);
335
- const shape = getShape(boundElement);
336
- const engine = getEngine(shape);
337
- let vector = [0, 0];
338
- const direction = getDirectionByPointOfRectangle(connection);
339
- if (direction) {
340
- const factor = getDirectionFactor(direction);
341
- return [factor.x, factor.y];
342
- }
343
- if (engine.getEdgeByConnectionPoint) {
344
- const edge = engine.getEdgeByConnectionPoint(rectangle, connection);
345
- if (edge) {
346
- const lineVector = [edge[1][0] - edge[0][0], edge[1][1] - edge[0][1]];
347
- return rotateVectorAnti90(lineVector);
348
- }
349
- }
350
- if (engine.getTangentVectorByConnectionPoint) {
351
- const lineVector = engine.getTangentVectorByConnectionPoint(rectangle, connection);
352
- if (lineVector) {
353
- return rotateVectorAnti90(lineVector);
354
- }
355
- }
356
- return vector;
357
- };
358
- export const alignPoints = (basePoint, movingPoint) => {
359
- const offset = 3;
360
- const newPoint = [...movingPoint];
361
- if (Point.isVerticalAlign(newPoint, basePoint, offset)) {
362
- newPoint[0] = basePoint[0];
363
- }
364
- if (Point.isHorizontalAlign(newPoint, basePoint, offset)) {
365
- newPoint[1] = basePoint[1];
366
- }
367
- return newPoint;
368
- };
369
- export const handleLineCreating = (board, lineShape, startPoint, movingPoint, sourceElement, lineShapeG) => {
370
- const hitElement = getHitOutlineGeometry(board, movingPoint, REACTION_MARGIN);
371
- const targetConnection = hitElement ? transformPointToConnection(board, movingPoint, hitElement) : undefined;
372
- const connection = sourceElement ? transformPointToConnection(board, startPoint, sourceElement) : undefined;
373
- const targetBoundId = hitElement ? hitElement.id : undefined;
374
- const lineGenerator = new LineShapeGenerator(board);
375
- const memorizedLatest = getLineMemorizedLatest();
376
- let sourceMarker, targetMarker;
377
- sourceMarker = memorizedLatest.source;
378
- targetMarker = memorizedLatest.target;
379
- sourceMarker && delete memorizedLatest.source;
380
- targetMarker && delete memorizedLatest.target;
381
- const temporaryLineElement = createLineElement(lineShape, [startPoint, movingPoint], { marker: sourceMarker || LineMarkerType.none, connection: connection, boundId: sourceElement?.id }, { marker: targetMarker || LineMarkerType.arrow, connection: targetConnection, boundId: targetBoundId }, [], {
382
- strokeWidth: DefaultLineStyle.strokeWidth,
383
- ...memorizedLatest
384
- });
385
- const linePoints = getLinePoints(board, temporaryLineElement);
386
- const otherPoint = linePoints[0];
387
- temporaryLineElement.points[1] = alignPoints(otherPoint, movingPoint);
388
- lineGenerator.processDrawing(temporaryLineElement, lineShapeG);
389
- PlaitBoard.getElementActiveHost(board).append(lineShapeG);
390
- return temporaryLineElement;
391
- };
392
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2RyYXcvc3JjL3V0aWxzL2xpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILEtBQUssRUFDTCxTQUFTLEVBQ1QsK0JBQStCLEVBQy9CLFVBQVUsRUFDVixPQUFPLEVBQ1AsY0FBYyxFQUNkLGVBQWUsRUFDZixZQUFZLEVBRVosY0FBYyxFQUNkLFVBQVUsRUFDVixVQUFVLEVBQ1YsbUJBQW1CLEVBRW5CLFNBQVMsRUFFVCw0QkFBNEIsRUFDNUIsaUJBQWlCLEVBQ3BCLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFDSCxTQUFTLEVBQ1Qsb0JBQW9CLEVBQ3BCLGtCQUFrQixFQUNsQixrQkFBa0IsRUFDbEIsa0JBQWtCLEVBQ2xCLG9CQUFvQixFQUNwQixvQkFBb0IsRUFDcEIsOEJBQThCLEVBQzlCLGdCQUFnQixFQUNoQixxQkFBcUIsRUFDckIsaUJBQWlCLEVBQ2pCLHNCQUFzQixFQUN0QixZQUFZLEVBQ1osY0FBYyxFQUNqQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0gsV0FBVyxFQUVYLGFBQWEsRUFFYixjQUFjLEVBQ2QsU0FBUyxFQUVULGdCQUFnQixFQUVoQixTQUFTLEVBRVosTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLHNCQUFzQixFQUFFLGVBQWUsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM1RixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsdUJBQXVCLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4RyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDN0MsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFdkQsT0FBTyxFQUFFLFFBQVEs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QUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIFBvaW50LFxuICAgIGlkQ3JlYXRvcixcbiAgICBkaXN0YW5jZUJldHdlZW5Qb2ludEFuZFNlZ21lbnRzLFxuICAgIFBsYWl0Qm9hcmQsXG4gICAgY3JlYXRlRyxcbiAgICBnZXRFbGVtZW50QnlJZCxcbiAgICBSZWN0YW5nbGVDbGllbnQsXG4gICAgZmluZEVsZW1lbnRzLFxuICAgIFBsYWl0RWxlbWVudCxcbiAgICBkcmF3TGluZWFyUGF0aCxcbiAgICBjcmVhdGVNYXNrLFxuICAgIGNyZWF0ZVJlY3QsXG4gICAgQUNUSVZFX1NUUk9LRV9XSURUSCxcbiAgICBQb2ludE9mUmVjdGFuZ2xlLFxuICAgIERpcmVjdGlvbixcbiAgICBWZWN0b3IsXG4gICAgZGlzdGFuY2VCZXR3ZWVuUG9pbnRBbmRQb2ludCxcbiAgICBjYXRtdWxsUm9tRml0dGluZ1xufSBmcm9tICdAcGxhaXQvY29yZSc7XG5pbXBvcnQge1xuICAgIGdldFBvaW50cyxcbiAgICBnZXRSZWN0YW5nbGVCeVBvaW50cyxcbiAgICBnZXRQb2ludE9uUG9seWxpbmUsXG4gICAgZ2V0RGlyZWN0aW9uRmFjdG9yLFxuICAgIHJvdGF0ZVZlY3RvckFudGk5MCxcbiAgICBnZXREaXJlY3Rpb25CeVZlY3RvcixcbiAgICBnZXRPcHBvc2l0ZURpcmVjdGlvbixcbiAgICBnZXREaXJlY3Rpb25CeVBvaW50T2ZSZWN0YW5nbGUsXG4gICAgZ2V0UG9pbnRCeVZlY3RvcixcbiAgICByZW1vdmVEdXBsaWNhdGVQb2ludHMsXG4gICAgcmVkdWNlUm91dGVNYXJnaW4sXG4gICAgZ2VuZXJhdGVFbGJvd0xpbmVSb3V0ZSxcbiAgICBnZXROZXh0UG9pbnQsXG4gICAgZ2V0RXh0ZW5kUG9pbnRcbn0gZnJvbSAnQHBsYWl0L2NvbW1vbic7XG5pbXBvcnQge1xuICAgIEJhc2ljU2hhcGVzLFxuICAgIExpbmVIYW5kbGUsXG4gICAgTGluZUhhbmRsZUtleSxcbiAgICBMaW5lSGFuZGxlUmVmLFxuICAgIExpbmVNYXJrZXJUeXBlLFxuICAgIExpbmVTaGFwZSxcbiAgICBMaW5lVGV4dCxcbiAgICBQbGFpdERyYXdFbGVtZW50LFxuICAgIFBsYWl0R2VvbWV0cnksXG4gICAgUGxhaXRMaW5lLFxuICAgIFBsYWl0U2hhcGVcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBnZXRQb2ludHNCeUNlbnRlclBvaW50LCBnZXROZWFyZXN0UG9pbnQsIGNyZWF0ZUdlb21ldHJ5RWxlbWVudCB9IGZyb20gJy4vZ2VvbWV0cnknO1xuaW1wb3J0IHsgZ2V0TGluZURhc2hCeUVsZW1lbnQsIGdldFN0cm9rZUNvbG9yQnlFbGVtZW50LCBnZXRTdHJva2VXaWR0aEJ5RWxlbWVudCB9IGZyb20gJy4vc3R5bGUvc3Ryb2tlJztcbmltcG9ydCB7IGdldEVuZ2luZSB9IGZyb20gJy4uL2VuZ2luZXMnO1xuaW1wb3J0IHsgZHJhd0xpbmVBcnJvdyB9IGZyb20gJy4vbGluZS1hcnJvdyc7XG5pbXBvcnQgeyBwb2ludHNPbkJlemllckN1cnZlcyB9IGZyb20gJ3BvaW50cy1vbi1jdXJ2ZSc7XG5pbXBvcnQgeyBPcCB9IGZyb20gJ3JvdWdoanMvYmluL2NvcmUnO1xuaW1wb3J0IHsgZ2V0U2hhcGUgfSBmcm9tICcuL3NoYXBlJztcbmltcG9ydCB7IERlZmF1bHRMaW5lU3R5bGUsIExJTkVfVEVYVF9TUEFDRSB9IGZyb20gJy4uL2NvbnN0YW50cy9saW5lJztcbmltcG9ydCB7IExpbmVTaGFwZUdlbmVyYXRvciB9IGZyb20gJy4uL2dlbmVyYXRvcnMvbGluZS5nZW5lcmF0b3InO1xuaW1wb3J0IHsgUkVBQ1RJT05fTUFSR0lOIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IGdldEhpdE91dGxpbmVHZW9tZXRyeSB9IGZyb20gJy4vcG9zaXRpb24vZ2VvbWV0cnknO1xuaW1wb3J0IHsgZ2V0TGluZU1lbW9yaXplZExhdGVzdCB9IGZyb20gJy4vbWVtb3JpemUnO1xuXG5leHBvcnQgY29uc3QgY3JlYXRlTGluZUVsZW1lbnQgPSAoXG4gICAgc2hhcGU6IExpbmVTaGFwZSxcbiAgICBwb2ludHM6IFtQb2ludCwgUG9pbnRdLFxuICAgIHNvdXJjZTogTGluZUhhbmRsZSxcbiAgICB0YXJnZXQ6IExpbmVIYW5kbGUsXG4gICAgdGV4dHM/OiBMaW5lVGV4dFtdLFxuICAgIG9wdGlvbnM/OiBQaWNrPFBsYWl0TGluZSwgJ3N0cm9rZUNvbG9yJyB8ICdzdHJva2VXaWR0aCc+XG4pOiBQbGFpdExpbmUgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBpZENyZWF0b3IoKSxcbiAgICAgICAgdHlwZTogJ2xpbmUnLFxuICAgICAgICBzaGFwZSxcbiAgICAgICAgc291cmNlLFxuICAgICAgICB0ZXh0czogdGV4dHMgPyB0ZXh0cyA6IFtdLFxuICAgICAgICB0YXJnZXQsXG4gICAgICAgIG9wYWNpdHk6IDEsXG4gICAgICAgIHBvaW50cyxcbiAgICAgICAgLi4ub3B0aW9uc1xuICAgIH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0TGluZVBvaW50cyA9IChib2FyZDogUGxhaXRCb2FyZCwgZWxlbWVudDogUGxhaXRMaW5lKSA9PiB7XG4gICAgc3dpdGNoIChlbGVtZW50LnNoYXBlKSB7XG4gICAgICAgIGNhc2UgTGluZVNoYXBlLmVsYm93OiB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0RWxib3dQb2ludHMoYm9hcmQsIGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgTGluZVNoYXBlLmN1cnZlOiB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0Q3VydmVQb2ludHMoYm9hcmQsIGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGNvbnN0IHBvaW50cyA9IFBsYWl0TGluZS5nZXRQb2ludHMoYm9hcmQsIGVsZW1lbnQpO1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlUmVmUGFpciA9IGdldExpbmVIYW5kbGVSZWZQYWlyKGJvYXJkLCBlbGVtZW50KTtcbiAgICAgICAgICAgIHBvaW50c1swXSA9IGhhbmRsZVJlZlBhaXIuc291cmNlLnBvaW50O1xuICAgICAgICAgICAgcG9pbnRzW3BvaW50cy5sZW5ndGggLSAxXSA9IGhhbmRsZVJlZlBhaXIudGFyZ2V0LnBvaW50O1xuICAgICAgICAgICAgcmV0dXJuIHBvaW50cztcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbmV4cG9ydCBjb25zdCBnZXRMaW5lSGFuZGxlUmVmUGFpciA9IChib2FyZDogUGxhaXRCb2FyZCwgZWxlbWVudDogUGxhaXRMaW5lKSA9PiB7XG4gICAgY29uc3Qgc3Ryb2tlV2lkdGggPSBnZXRTdHJva2VXaWR0aEJ5RWxlbWVudChlbGVtZW50KTtcbiAgICBjb25zdCBzb3VyY2VCb3VuZEVsZW1lbnQgPSBlbGVtZW50LnNvdXJjZS5ib3VuZElkID8gZ2V0RWxlbWVudEJ5SWQ8UGxhaXRHZW9tZXRyeT4oYm9hcmQsIGVsZW1lbnQuc291cmNlLmJvdW5kSWQpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHRhcmdldEJvdW5kRWxlbWVudCA9IGVsZW1lbnQudGFyZ2V0LmJvdW5kSWQgPyBnZXRFbGVtZW50QnlJZDxQbGFpdEdlb21ldHJ5Pihib2FyZCwgZWxlbWVudC50YXJnZXQuYm91bmRJZCkgOiB1bmRlZmluZWQ7XG4gICAgbGV0IHNvdXJjZVBvaW50ID0gc291cmNlQm91bmRFbGVtZW50ID8gZ2V0Q29ubmVjdGlvblBvaW50KHNvdXJjZUJvdW5kRWxlbWVudCwgZWxlbWVudC5zb3VyY2UuY29ubmVjdGlvbiEpIDogZWxlbWVudC5wb2ludHNbMF07XG4gICAgbGV0IHRhcmdldFBvaW50ID0gdGFyZ2V0Qm91bmRFbGVtZW50XG4gICAgICAgID8gZ2V0Q29ubmVjdGlvblBvaW50KHRhcmdldEJvdW5kRWxlbWVudCwgZWxlbWVudC50YXJnZXQuY29ubmVjdGlvbiEpXG4gICAgICAgIDogZWxlbWVudC5wb2ludHNbZWxlbWVudC5wb2ludHMubGVuZ3RoIC0gMV07XG4gICAgbGV0IHNvdXJjZURpcmVjdGlvbiA9IGdldERpcmVjdGlvbkJ5VmVjdG9yKFt0YXJnZXRQb2ludFswXSAtIHNvdXJjZVBvaW50WzBdLCB0YXJnZXRQb2ludFsxXSAtIHNvdXJjZVBvaW50WzFdXSkgfHwgRGlyZWN0aW9uLnJpZ2h0O1xuICAgIGxldCB0YXJnZXREaXJlY3Rpb24gPSBnZXRPcHBvc2l0ZURpcmVjdGlvbihzb3VyY2VEaXJlY3Rpb24pO1xuICAgIGNvbnN0IHNvdXJjZUZhY3RvciA9IGdldERpcmVjdGlvbkZhY3Rvcihzb3VyY2VEaXJlY3Rpb24pO1xuICAgIGNvbnN0IHRhcmdldEZhY3RvciA9IGdldERpcmVjdGlvbkZhY3Rvcih0YXJnZXREaXJlY3Rpb24pO1xuICAgIGNvbnN0IHNvdXJjZUhhbmRsZVJlZjogTGluZUhhbmRsZVJlZiA9IHtcbiAgICAgICAga2V5OiBMaW5lSGFuZGxlS2V5LnNvdXJjZSxcbiAgICAgICAgcG9pbnQ6IHNvdXJjZVBvaW50LFxuICAgICAgICBkaXJlY3Rpb246IHNvdXJjZURpcmVjdGlvbixcbiAgICAgICAgdmVjdG9yOiBbc291cmNlRmFjdG9yLngsIHNvdXJjZUZhY3Rvci55XVxuICAgIH07XG4gICAgY29uc3QgdGFyZ2V0SGFuZGxlUmVmOiBMaW5lSGFuZGxlUmVmID0ge1xuICAgICAgICBrZXk6IExpbmVIYW5kbGVLZXkudGFyZ2V0LFxuICAgICAgICBwb2ludDogdGFyZ2V0UG9pbnQsXG4gICAgICAgIGRpcmVjdGlvbjogdGFyZ2V0RGlyZWN0aW9uLFxuICAgICAgICB2ZWN0b3I6IFt0YXJnZXRGYWN0b3IueCwgdGFyZ2V0RmFjdG9yLnldXG4gICAgfTtcbiAgICBpZiAoc291cmNlQm91bmRFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb25PZmZzZXQgPSBQbGFpdExpbmUuaXNTb3VyY2VNYXJrT3JUYXJnZXRNYXJrKGVsZW1lbnQsIExpbmVNYXJrZXJUeXBlLm5vbmUsIExpbmVIYW5kbGVLZXkuc291cmNlKSA/IDAgOiBzdHJva2VXaWR0aDtcbiAgICAgICAgY29uc3Qgc291cmNlVmVjdG9yID0gZ2V0VmVjdG9yQnlDb25uZWN0aW9uKHNvdXJjZUJvdW5kRWxlbWVudCwgZWxlbWVudC5zb3VyY2UuY29ubmVjdGlvbiEpO1xuICAgICAgICBjb25zdCBkaXJlY3Rpb24gPSBnZXREaXJlY3Rpb25CeVZlY3Rvcihzb3VyY2VWZWN0b3IpO1xuICAgICAgICBzb3VyY2VEaXJlY3Rpb24gPSBkaXJlY3Rpb24gPyBkaXJlY3Rpb24gOiBzb3VyY2VEaXJlY3Rpb247XG4gICAgICAgIHNvdXJjZVBvaW50ID0gZ2V0Q29ubmVjdGlvblBvaW50KHNvdXJjZUJvdW5kRWxlbWVudCwgZWxlbWVudC5zb3VyY2UuY29ubmVjdGlvbiEsIHNvdXJjZURpcmVjdGlvbiwgY29ubmVjdGlvbk9mZnNldCk7XG4gICAgICAgIHNvdXJjZUhhbmRsZVJlZi5ib3VuZEVsZW1lbnQgPSBzb3VyY2VCb3VuZEVsZW1lbnQ7XG4gICAgICAgIHNvdXJjZUhhbmRsZVJlZi5kaXJlY3Rpb24gPSBzb3VyY2VEaXJlY3Rpb247XG4gICAgICAgIHNvdXJjZUhhbmRsZVJlZi5wb2ludCA9IHNvdXJjZVBvaW50O1xuICAgICAgICBzb3VyY2VIYW5kbGVSZWYudmVjdG9yID0gc291cmNlVmVjdG9yO1xuICAgIH1cbiAgICBpZiAodGFyZ2V0Qm91bmRFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb25PZmZzZXQgPSBQbGFpdExpbmUuaXNTb3VyY2VNYXJrT3JUYXJnZXRNYXJrKGVsZW1lbnQsIExpbmVNYXJrZXJUeXBlLm5vbmUsIExpbmVIYW5kbGVLZXkudGFyZ2V0KSA/IDAgOiBzdHJva2VXaWR0aDtcbiAgICAgICAgY29uc3QgdGFyZ2V0VmVjdG9yID0gZ2V0VmVjdG9yQnlDb25uZWN0aW9uKHRhcmdldEJvdW5kRWxlbWVudCwgZWxlbWVudC50YXJnZXQuY29ubmVjdGlvbiEpO1xuICAgICAgICBjb25zdCBkaXJlY3Rpb24gPSBnZXREaXJlY3Rpb25CeVZlY3Rvcih0YXJnZXRWZWN0b3IpO1xuICAgICAgICB0YXJnZXREaXJlY3Rpb24gPSBkaXJlY3Rpb24gPyBkaXJlY3Rpb24gOiB0YXJnZXREaXJlY3Rpb247XG4gICAgICAgIHRhcmdldFBvaW50ID0gZ2V0Q29ubmVjdGlvblBvaW50KHRhcmdldEJvdW5kRWxlbWVudCwgZWxlbWVudC50YXJnZXQuY29ubmVjdGlvbiEsIHRhcmdldERpcmVjdGlvbiwgY29ubmVjdGlvbk9mZnNldCk7XG4gICAgICAgIHRhcmdldEhhbmRsZVJlZi5ib3VuZEVsZW1lbnQgPSB0YXJnZXRCb3VuZEVsZW1lbnQ7XG4gICAgICAgIHRhcmdldEhhbmRsZVJlZi5kaXJlY3Rpb24gPSB0YXJnZXREaXJlY3Rpb247XG4gICAgICAgIHRhcmdldEhhbmRsZVJlZi5wb2ludCA9IHRhcmdldFBvaW50O1xuICAgICAgICB0YXJnZXRIYW5kbGVSZWYudmVjdG9yID0gdGFyZ2V0VmVjdG9yO1xuICAgIH1cbiAgICByZXR1cm4geyBzb3VyY2U6IHNvdXJjZUhhbmRsZVJlZiwgdGFyZ2V0OiB0YXJnZXRIYW5kbGVSZWYgfTtcbn07XG5cbmNvbnN0IGNyZWF0ZUZha2VFbGVtZW50ID0gKHN0YXJ0UG9pbnQ6IFBvaW50LCB2ZWN0b3I6IFZlY3RvcikgPT4ge1xuICAgIGNvbnN0IHBvaW50ID0gZ2V0UG9pbnRCeVZlY3RvcihzdGFydFBvaW50LCB2ZWN0b3IsIC0yNSk7XG4gICAgY29uc3QgcG9pbnRzID0gZ2V0UG9pbnRzQnlDZW50ZXJQb2ludChwb2ludCwgNTAsIDUwKTtcbiAgICByZXR1cm4gY3JlYXRlR2VvbWV0cnlFbGVtZW50KEJhc2ljU2hhcGVzLnJlY3RhbmdsZSwgcG9pbnRzLCAnJyk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RWxib3dQb2ludHMgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnQ6IFBsYWl0TGluZSkgPT4ge1xuICAgIGlmIChlbGVtZW50LnBvaW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgY29uc3QgaGFuZGxlUmVmUGFpciA9IGdldExpbmVIYW5kbGVSZWZQYWlyKGJvYXJkLCBlbGVtZW50KTtcbiAgICAgICAgbGV0IHNvdXJjZUVsZW1lbnQgPSBlbGVtZW50LnNvdXJjZS5ib3VuZElkID8gZ2V0RWxlbWVudEJ5SWQ8UGxhaXRHZW9tZXRyeT4oYm9hcmQsIGVsZW1lbnQuc291cmNlLmJvdW5kSWQpIDogdW5kZWZpbmVkO1xuICAgICAgICBsZXQgdGFyZ2V0RWxlbWVudCA9IGVsZW1lbnQudGFyZ2V0LmJvdW5kSWQgPyBnZXRFbGVtZW50QnlJZDxQbGFpdEdlb21ldHJ5Pihib2FyZCwgZWxlbWVudC50YXJnZXQuYm91bmRJZCkgOiB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBwb2ludHM6IFBvaW50W10gPSBbXTtcbiAgICAgICAgaWYgKCFzb3VyY2VFbGVtZW50KSB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBoYW5kbGVSZWZQYWlyLnNvdXJjZTtcbiAgICAgICAgICAgIHNvdXJjZUVsZW1lbnQgPSBjcmVhdGVGYWtlRWxlbWVudChzb3VyY2UucG9pbnQsIHNvdXJjZS52ZWN0b3IpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGFyZ2V0RWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gaGFuZGxlUmVmUGFpci50YXJnZXQ7XG4gICAgICAgICAgICB0YXJnZXRFbGVtZW50ID0gY3JlYXRlRmFrZUVsZW1lbnQodGFyZ2V0LnBvaW50LCB0YXJnZXQudmVjdG9yKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YXJnZXRSZWN0YW5nbGUgPSBSZWN0YW5nbGVDbGllbnQuaW5mbGF0ZShcbiAgICAgICAgICAgIGdldFJlY3RhbmdsZUJ5UG9pbnRzKHRhcmdldEVsZW1lbnQucG9pbnRzKSxcbiAgICAgICAgICAgIGdldFN0cm9rZVdpZHRoQnlFbGVtZW50KHRhcmdldEVsZW1lbnQpICogMlxuICAgICAgICApO1xuICAgICAgICBjb25zdCBzb3VyY2VSZWN0YW5nbGUgPSBSZWN0YW5nbGVDbGllbnQuaW5mbGF0ZShcbiAgICAgICAgICAgIGdldFJlY3RhbmdsZUJ5UG9pbnRzKHNvdXJjZUVsZW1lbnQucG9pbnRzKSxcbiAgICAgICAgICAgIGdldFN0cm9rZVdpZHRoQnlFbGVtZW50KHNvdXJjZUVsZW1lbnQpICogMlxuICAgICAgICApO1xuICAgICAgICBjb25zdCBzb3VyY2VQb2ludCA9IGhhbmRsZVJlZlBhaXIuc291cmNlLnBvaW50O1xuICAgICAgICBjb25zdCB0YXJnZXRQb2ludCA9IGhhbmRsZVJlZlBhaXIudGFyZ2V0LnBvaW50O1xuICAgICAgICBjb25zdCB7IHNvdXJjZU9mZnNldCwgdGFyZ2V0T2Zmc2V0IH0gPSByZWR1Y2VSb3V0ZU1hcmdpbihzb3VyY2VSZWN0YW5nbGUsIHRhcmdldFJlY3RhbmdsZSk7XG4gICAgICAgIGNvbnN0IHNvdXJjZU91dGVyUmVjdGFuZ2xlID0gUmVjdGFuZ2xlQ2xpZW50LmV4cGFuZChcbiAgICAgICAgICAgIHNvdXJjZVJlY3RhbmdsZSxcbiAgICAgICAgICAgIHNvdXJjZU9mZnNldFszXSxcbiAgICAgICAgICAgIHNvdXJjZU9mZnNldFswXSxcbiAgICAgICAgICAgIHNvdXJjZU9mZnNldFsxXSxcbiAgICAgICAgICAgIHNvdXJjZU9mZnNldFsyXVxuICAgICAgICApO1xuICAgICAgICBjb25zdCB0YXJnZXRPdXRlclJlY3RhbmdsZSA9IFJlY3RhbmdsZUNsaWVudC5leHBhbmQoXG4gICAgICAgICAgICB0YXJnZXRSZWN0YW5nbGUsXG4gICAgICAgICAgICB0YXJnZXRPZmZzZXRbM10sXG4gICAgICAgICAgICB0YXJnZXRPZmZzZXRbMF0sXG4gICAgICAgICAgICB0YXJnZXRPZmZzZXRbMV0sXG4gICAgICAgICAgICB0YXJnZXRPZmZzZXRbMl1cbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgbmV4dFNvdXJjZVBvaW50ID0gZ2V0TmV4dFBvaW50KHNvdXJjZVBvaW50LCBzb3VyY2VPdXRlclJlY3RhbmdsZSwgaGFuZGxlUmVmUGFpci5zb3VyY2UuZGlyZWN0aW9uKTtcbiAgICAgICAgY29uc3QgbmV4dFRhcmdldFBvaW50ID0gZ2V0TmV4dFBvaW50KHRhcmdldFBvaW50LCB0YXJnZXRPdXRlclJlY3RhbmdsZSwgaGFuZGxlUmVmUGFpci50YXJnZXQuZGlyZWN0aW9uKTtcbiAgICAgICAgY29uc3QgaXNJbnRlcnNlY3QgPVxuICAgICAgICAgICAgUmVjdGFuZ2xlQ2xpZW50LmlzUG9pbnRJblJlY3RhbmdsZSh0YXJnZXRSZWN0YW5nbGUsIHNvdXJjZVBvaW50KSB8fFxuICAgICAgICAgICAgUmVjdGFuZ2xlQ2xpZW50LmlzUG9pbnRJblJlY3RhbmdsZSh0YXJnZXRPdXRlclJlY3RhbmdsZSwgbmV4dFNvdXJjZVBvaW50KSB8fFxuICAgICAgICAgICAgUmVjdGFuZ2xlQ2xpZW50LmlzUG9pbnRJblJlY3RhbmdsZShzb3VyY2VPdXRlclJlY3RhbmdsZSwgbmV4dFRhcmdldFBvaW50KSB8fFxuICAgICAgICAgICAgUmVjdGFuZ2xlQ2xpZW50LmlzUG9pbnRJblJlY3RhbmdsZShzb3VyY2VSZWN0YW5nbGUsIHRhcmdldFBvaW50KTtcbiAgICAgICAgaWYgKCFpc0ludGVyc2VjdCkge1xuICAgICAgICAgICAgcG9pbnRzID0gZ2VuZXJhdGVFbGJvd0xpbmVSb3V0ZSh7XG4gICAgICAgICAgICAgICAgc291cmNlUG9pbnQsXG4gICAgICAgICAgICAgICAgbmV4dFNvdXJjZVBvaW50LFxuICAgICAgICAgICAgICAgIHNvdXJjZVJlY3RhbmdsZSxcbiAgICAgICAgICAgICAgICBzb3VyY2VPdXRlclJlY3RhbmdsZSxcbiAgICAgICAgICAgICAgICB0YXJnZXRQb2ludCxcbiAgICAgICAgICAgICAgICBuZXh0VGFyZ2V0UG9pbnQsXG4gICAgICAgICAgICAgICAgdGFyZ2V0UmVjdGFuZ2xlLFxuICAgICAgICAgICAgICAgIHRhcmdldE91dGVyUmVjdGFuZ2xlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBvaW50cyA9IGdldFBvaW50cyhcbiAgICAgICAgICAgICAgICBoYW5kbGVSZWZQYWlyLnNvdXJjZS5wb2ludCxcbiAgICAgICAgICAgICAgICBoYW5kbGVSZWZQYWlyLnNvdXJjZS5kaXJlY3Rpb24sXG4gICAgICAgICAgICAgICAgaGFuZGxlUmVmUGFpci50YXJnZXQucG9pbnQsXG4gICAgICAgICAgICAgICAgaGFuZGxlUmVmUGFpci50YXJnZXQuZGlyZWN0aW9uLFxuICAgICAgICAgICAgICAgIDBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcG9pbnRzID0gcmVtb3ZlRHVwbGljYXRlUG9pbnRzKHBvaW50cyk7XG4gICAgICAgIHJldHVybiBwb2ludHM7XG4gICAgfVxuICAgIHJldHVybiBlbGVtZW50LnBvaW50cztcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDdXJ2ZVBvaW50cyA9IChib2FyZDogUGxhaXRCb2FyZCwgZWxlbWVudDogUGxhaXRMaW5lKSA9PiB7XG4gICAgaWYgKGVsZW1lbnQucG9pbnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICBjb25zdCBoYW5kbGVSZWZQYWlyID0gZ2V0TGluZUhhbmRsZVJlZlBhaXIoYm9hcmQsIGVsZW1lbnQpO1xuICAgICAgICBjb25zdCB7IHNvdXJjZSwgdGFyZ2V0IH0gPSBoYW5kbGVSZWZQYWlyO1xuICAgICAgICBjb25zdCBzb3VyY2VCb3VuZEVsZW1lbnQgPSBoYW5kbGVSZWZQYWlyLnNvdXJjZS5ib3VuZEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHRhcmdldEJvdW5kRWxlbWVudCA9IGhhbmRsZVJlZlBhaXIudGFyZ2V0LmJvdW5kRWxlbWVudDtcbiAgICAgICAgbGV0IGN1cnZlUG9pbnRzOiBQb2ludFtdID0gW3NvdXJjZS5wb2ludF07XG4gICAgICAgIGNvbnN0IHN1bURpc3RhbmNlID0gZGlzdGFuY2VCZXR3ZWVuUG9pbnRBbmRQb2ludCguLi5zb3VyY2UucG9pbnQsIC4uLnRhcmdldC5wb2ludCk7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IDEyICsgc3VtRGlzdGFuY2UgLyAzO1xuICAgICAgICBpZiAoc291cmNlQm91bmRFbGVtZW50KSB7XG4gICAgICAgICAgICBjdXJ2ZVBvaW50cy5wdXNoKGdldFBvaW50QnlWZWN0b3Ioc291cmNlLnBvaW50LCBzb3VyY2UudmVjdG9yLCBvZmZzZXQpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGFyZ2V0Qm91bmRFbGVtZW50KSB7XG4gICAgICAgICAgICBjdXJ2ZVBvaW50cy5wdXNoKGdldFBvaW50QnlWZWN0b3IodGFyZ2V0LnBvaW50LCB0YXJnZXQudmVjdG9yLCBvZmZzZXQpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpc1NpbmdsZUJvdW5kID0gKHNvdXJjZUJvdW5kRWxlbWVudCAmJiAhdGFyZ2V0Qm91bmRFbGVtZW50KSB8fCAoIXNvdXJjZUJvdW5kRWxlbWVudCAmJiB0YXJnZXRCb3VuZEVsZW1lbnQpO1xuICAgICAgICBpZiAoaXNTaW5nbGVCb3VuZCkge1xuICAgICAgICAgICAgY3VydmVQb2ludHMucHVzaCh0YXJnZXQucG9pbnQpO1xuICAgICAgICAgICAgY29uc3QgcG9pbnRzID0gUTJDKGN1cnZlUG9pbnRzKTtcbiAgICAgICAgICAgIHJldHVybiBwb2ludHNPbkJlemllckN1cnZlcyhwb2ludHMpIGFzIFBvaW50W107XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzb3VyY2VCb3VuZEVsZW1lbnQgJiYgIXRhcmdldEJvdW5kRWxlbWVudCkge1xuICAgICAgICAgICAgY3VydmVQb2ludHMucHVzaChnZXRQb2ludEJ5VmVjdG9yKHNvdXJjZS5wb2ludCwgc291cmNlLnZlY3Rvciwgb2Zmc2V0KSk7XG4gICAgICAgICAgICBjdXJ2ZVBvaW50cy5wdXNoKGdldFBvaW50QnlWZWN0b3IodGFyZ2V0LnBvaW50LCB0YXJnZXQudmVjdG9yLCBvZmZzZXQpKTtcbiAgICAgICAgfVxuICAgICAgICBjdXJ2ZVBvaW50cy5wdXNoKHRhcmdldC5wb2ludCk7XG4gICAgICAgIHJldHVybiBwb2ludHNPbkJlemllckN1cnZlcyhjdXJ2ZVBvaW50cykgYXMgUG9pbnRbXTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgYWxsUG9pbnRzID0gUGxhaXRMaW5lLmdldFBvaW50cyhib2FyZCwgZWxlbWVudCk7XG4gICAgICAgIGFsbFBvaW50cyA9IHJlbW92ZUR1cGxpY2F0ZVBvaW50cyhhbGxQb2ludHMpO1xuICAgICAgICBjb25zdCBwb2ludHMgPSBjYXRtdWxsUm9tRml0dGluZyhhbGxQb2ludHMpO1xuICAgICAgICByZXR1cm4gcG9pbnRzT25CZXppZXJDdXJ2ZXMocG9pbnRzKSBhcyBQb2ludFtdO1xuICAgIH1cbn07XG5cbmV4cG9ydCBjb25zdCB0cmFuc2Zvcm1PcHNUb1BvaW50cyA9IChvcHM6IE9wW10pID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGxldCBpdGVtIG9mIG9wcykge1xuICAgICAgICBpZiAoaXRlbS5vcCA9PT0gJ21vdmUnKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChbaXRlbS5kYXRhWzBdLCBpdGVtLmRhdGFbMV1dKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKFtpdGVtLmRhdGFbMF0sIGl0ZW0uZGF0YVsxXV0pO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goW2l0ZW0uZGF0YVsyXSwgaXRlbS5kYXRhWzNdXSk7XG4gICAgICAgICAgICByZXN1bHQucHVzaChbaXRlbS5kYXRhWzRdLCBpdGVtLmRhdGFbNV1dKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufTtcblxuZXhwb3J0IGNvbnN0IGlzSGl0UG9seUxpbmUgPSAocGF0aFBvaW50czogUG9pbnRbXSwgcG9pbnQ6IFBvaW50LCBzdHJva2VXaWR0aDogbnVtYmVyLCBleHBhbmQ6IG51bWJlciA9IDApID0+IHtcbiAgICBjb25zdCBkaXN0YW5jZSA9IGRpc3RhbmNlQmV0d2VlblBvaW50QW5kU2VnbWVudHMocGF0aFBvaW50cywgcG9pbnQpO1xuICAgIHJldHVybiBkaXN0YW5jZSA8PSBzdHJva2VXaWR0aCArIGV4cGFuZDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRIaXRMaW5lVGV4dEluZGV4ID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBlbGVtZW50OiBQbGFpdExpbmUsIHBvaW50OiBQb2ludCkgPT4ge1xuICAgIGNvbnN0IHRleHRzID0gZWxlbWVudC50ZXh0cztcbiAgICBpZiAoIXRleHRzLmxlbmd0aCkgcmV0dXJuIC0xO1xuXG4gICAgY29uc3QgcG9pbnRzID0gZ2V0TGluZVBvaW50cyhib2FyZCwgZWxlbWVudCk7XG4gICAgcmV0dXJuIHRleHRzLmZpbmRJbmRleCh0ZXh0ID0+IHtcbiAgICAgICAgY29uc3QgY2VudGVyID0gZ2V0UG9pbnRPblBvbHlsaW5lKHBvaW50cywgdGV4dC5wb3NpdGlvbik7XG4gICAgICAgIGNvbnN0IHJlY3RhbmdsZSA9IHtcbiAgICAgICAgICAgIHg6IGNlbnRlclswXSAtIHRleHQud2lkdGghIC8gMixcbiAgICAgICAgICAgIHk6IGNlbnRlclsxXSAtIHRleHQuaGVpZ2h0ISAvIDIsXG4gICAgICAgICAgICB3aWR0aDogdGV4dC53aWR0aCEsXG4gICAgICAgICAgICBoZWlnaHQ6IHRleHQuaGVpZ2h0IVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gUmVjdGFuZ2xlQ2xpZW50LmlzSGl0KHJlY3RhbmdsZSwgUmVjdGFuZ2xlQ2xpZW50LnRvUmVjdGFuZ2xlQ2xpZW50KFtwb2ludCwgcG9pbnRdKSk7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNIaXRMaW5lVGV4dCA9IChib2FyZDogUGxhaXRCb2FyZCwgZWxlbWVudDogUGxhaXRMaW5lLCBwb2ludDogUG9pbnQpID0+IHtcbiAgICByZXR1cm4gZ2V0SGl0TGluZVRleHRJbmRleChib2FyZCwgZWxlbWVudCwgcG9pbnQpICE9PSAtMTtcbn07XG5cbmV4cG9ydCBjb25zdCBkcmF3TGluZSA9IChib2FyZDogUGxhaXRCb2FyZCwgZWxlbWVudDogUGxhaXRMaW5lKSA9PiB7XG4gICAgY29uc3Qgc3Ryb2tlV2lkdGggPSBnZXRTdHJva2VXaWR0aEJ5RWxlbWVudChlbGVtZW50KTtcbiAgICBjb25zdCBzdHJva2VDb2xvciA9IGdldFN0cm9rZUNvbG9yQnlFbGVtZW50KGJvYXJkLCBlbGVtZW50KTtcbiAgICBjb25zdCBzdHJva2VMaW5lRGFzaCA9IGdldExpbmVEYXNoQnlFbGVtZW50KGVsZW1lbnQpO1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7IHN0cm9rZTogc3Ryb2tlQ29sb3IsIHN0cm9rZVdpZHRoLCBzdHJva2VMaW5lRGFzaCB9O1xuICAgIGNvbnN0IGxpbmVHID0gY3JlYXRlRygpO1xuICAgIGxldCBwb2ludHMgPSBnZXRMaW5lUG9pbnRzKGJvYXJkLCBlbGVtZW50KTtcbiAgICBsZXQgbGluZTtcbiAgICBpZiAoZWxlbWVudC5zaGFwZSA9PT0gTGluZVNoYXBlLmN1cnZlKSB7XG4gICAgICAgIGxpbmUgPSBQbGFpdEJvYXJkLmdldFJvdWdoU1ZHKGJvYXJkKS5jdXJ2ZShwb2ludHMsIG9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxpbmUgPSBkcmF3TGluZWFyUGF0aChwb2ludHMsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBjb25zdCBpZCA9IGlkQ3JlYXRvcigpO1xuICAgIGxpbmUuc2V0QXR0cmlidXRlKCdtYXNrJywgYHVybCgjJHtpZH0pYCk7XG4gICAgbGluZUcuYXBwZW5kQ2hpbGQobGluZSk7XG4gICAgY29uc3QgeyBtYXNrLCBtYXNrVGFyZ2V0RmlsbFJlY3QgfSA9IGRyYXdNYXNrKGJvYXJkLCBlbGVtZW50LCBpZCk7XG4gICAgbGluZUcuYXBwZW5kQ2hpbGQobWFzayk7XG4gICAgbGluZS5hcHBlbmRDaGlsZChtYXNrVGFyZ2V0RmlsbFJlY3QpO1xuICAgIGNvbnN0IGFycm93ID0gZHJhd0xpbmVBcnJvdyhlbGVtZW50LCBwb2ludHMsIHsgc3Ryb2tlOiBzdHJva2VDb2xvciwgc3Ryb2tlV2lkdGggfSk7XG4gICAgYXJyb3cgJiYgbGluZUcuYXBwZW5kQ2hpbGQoYXJyb3cpO1xuICAgIHJldHVybiBsaW5lRztcbn07XG5cbmZ1bmN0aW9uIGRyYXdNYXNrKGJvYXJkOiBQbGFpdEJvYXJkLCBlbGVtZW50OiBQbGFpdExpbmUsIGlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBtYXNrID0gY3JlYXRlTWFzaygpO1xuICAgIG1hc2suc2V0QXR0cmlidXRlKCdpZCcsIGlkKTtcbiAgICBjb25zdCBwb2ludHMgPSBnZXRMaW5lUG9pbnRzKGJvYXJkLCBlbGVtZW50KTtcbiAgICBsZXQgcmVjdGFuZ2xlID0gZ2V0UmVjdGFuZ2xlQnlQb2ludHMocG9pbnRzKTtcbiAgICByZWN0YW5nbGUgPSBSZWN0YW5nbGVDbGllbnQuZ2V0T3V0bGluZVJlY3RhbmdsZShyZWN0YW5nbGUsIC0zMCk7XG4gICAgY29uc3QgbWFza0ZpbGxSZWN0ID0gY3JlYXRlUmVjdChyZWN0YW5nbGUsIHtcbiAgICAgICAgZmlsbDogJ3doaXRlJ1xuICAgIH0pO1xuICAgIG1hc2suYXBwZW5kQ2hpbGQobWFza0ZpbGxSZWN0KTtcblxuICAgIGNvbnN0IHRleHRzID0gZWxlbWVudC50ZXh0cztcbiAgICB0ZXh0cy5mb3JFYWNoKCh0ZXh0LCBpbmRleCkgPT4ge1xuICAgICAgICBsZXQgdGV4dFJlY3RhbmdsZSA9IGdldExpbmVUZXh0UmVjdGFuZ2xlKGJvYXJkLCBlbGVtZW50LCBpbmRleCk7XG4gICAgICAgIHRleHRSZWN0YW5nbGUgPSBSZWN0YW5nbGVDbGllbnQuaW5mbGF0ZSh0ZXh0UmVjdGFuZ2xlLCBMSU5FX1RFWFRfU1BBQ0UgKiAyKTtcbiAgICAgICAgY29uc3QgcmVjdCA9IGNyZWF0ZVJlY3QodGV4dFJlY3RhbmdsZSwge1xuICAgICAgICAgICAgZmlsbDogJ2JsYWNrJ1xuICAgICAgICB9KTtcbiAgICAgICAgbWFzay5hcHBlbmRDaGlsZChyZWN0KTtcbiAgICB9KTtcbiAgICAvLyBvcGVuIGxpbmVcbiAgICBjb25zdCBtYXNrVGFyZ2V0RmlsbFJlY3QgPSBjcmVhdGVSZWN0KHJlY3RhbmdsZSk7XG4gICAgbWFza1RhcmdldEZpbGxSZWN0LnNldEF0dHJpYnV0ZSgnb3BhY2l0eScsICcwJyk7XG4gICAgbWFza1RhcmdldEZpbGxSZWN0LnNldEF0dHJpYnV0ZSgnZmlsbCcsICdub25lJyk7XG4gICAgcmV0dXJuIHsgbWFzaywgbWFza1RhcmdldEZpbGxSZWN0IH07XG59XG5cbmV4cG9ydCBjb25zdCBnZXRDb25uZWN0aW9uUG9pbnQgPSAoZ2VvbWV0cnk6IFBsYWl0R2VvbWV0cnksIGNvbm5lY3Rpb246IFBvaW50LCBkaXJlY3Rpb24/OiBEaXJlY3Rpb24sIGRlbHRhPzogbnVtYmVyKTogUG9pbnQgPT4ge1xuICAgIGNvbnN0IHJlY3RhbmdsZSA9IGdldFJlY3RhbmdsZUJ5UG9pbnRzKGdlb21ldHJ5LnBvaW50cyk7XG4gICAgaWYgKGRpcmVjdGlvbiAmJiBkZWx0YSkge1xuICAgICAgICBjb25zdCBkaXJlY3Rpb25GYWN0b3IgPSBnZXREaXJlY3Rpb25GYWN0b3IoZGlyZWN0aW9uKTtcbiAgICAgICAgY29uc3QgcG9pbnQgPSBSZWN0YW5nbGVDbGllbnQuZ2V0Q29ubmVjdGlvblBvaW50KHJlY3RhbmdsZSwgY29ubmVjdGlvbik7XG4gICAgICAgIHJldHVybiBbcG9pbnRbMF0gKyBkaXJlY3Rpb25GYWN0b3IueCAqIGRlbHRhLCBwb2ludFsxXSArIGRpcmVjdGlvbkZhY3Rvci55ICogZGVsdGFdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBSZWN0YW5nbGVDbGllbnQuZ2V0Q29ubmVjdGlvblBvaW50KHJlY3RhbmdsZSwgY29ubmVjdGlvbik7XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHRyYW5zZm9ybVBvaW50VG9Db25uZWN0aW9uID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBwb2ludDogUG9pbnQsIGhpdEVsZW1lbnQ6IFBsYWl0U2hhcGUpOiBQb2ludCA9PiB7XG4gICAgbGV0IHJlY3RhbmdsZSA9IGdldFJlY3RhbmdsZUJ5UG9pbnRzKGhpdEVsZW1lbnQucG9pbnRzKTtcbiAgICByZWN0YW5nbGUgPSBSZWN0YW5nbGVDbGllbnQuaW5mbGF0ZShyZWN0YW5nbGUsIEFDVElWRV9TVFJPS0VfV0lEVEgpO1xuICAgIGxldCBuZWFyZXN0UG9pbnQgPSBnZXROZWFyZXN0UG9pbnQoaGl0RWxlbWVudCwgcG9pbnQsIEFDVElWRV9TVFJPS0VfV0lEVEgpO1xuICAgIGNvbnN0IGhpdENvbm5lY3RvciA9IGdldEhpdENvbm5lY3RvclBvaW50KG5lYXJlc3RQb2ludCwgaGl0RWxlbWVudCwgcmVjdGFuZ2xlKTtcbiAgICBuZWFyZXN0UG9pbnQgPSBoaXRDb25uZWN0b3IgPyBoaXRDb25uZWN0b3IgOiBuZWFyZXN0UG9pbnQ7XG4gICAgcmV0dXJuIFsobmVhcmVzdFBvaW50WzBdIC0gcmVjdGFuZ2xlLngpIC8gcmVjdGFuZ2xlLndpZHRoLCAobmVhcmVzdFBvaW50WzFdIC0gcmVjdGFuZ2xlLnkpIC8gcmVjdGFuZ2xlLmhlaWdodF07XG59O1xuXG4vLyBleHBvcnQgY29uc3QgZ2V0Q29ubmVjdGlvbkJ5UG9pbnRPblJlY3RhbmdsZUVkZ2UgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIHBvaW50OiBQb2ludCwgaGl0RWxlbWVudDogUGxhaXRTaGFwZSk6IFBvaW50ID0+IHtcbi8vICAgICBsZXQgcmVjdGFuZ2xlID0gZ2V0UmVjdGFuZ2xlQnlQb2ludHMoaGl0RWxlbWVudC5wb2ludHMpO1xuLy8gICAgIGNvbnN0IGhpdENvbm5lY3RvciA9IGdldEhpdENvbm5lY3RvclBvaW50KHBvaW50LCBoaXRFbGVtZW50LCByZWN0YW5nbGUpO1xuLy8gICAgIGNvbnN0IG5ld1BvaW50ID0gaGl0Q29ubmVjdG9yID8/IHBvaW50O1xuLy8gICAgIHJldHVybiBbKG5ld1BvaW50WzBdIC0gcmVjdGFuZ2xlLngpIC8gcmVjdGFuZ2xlLndpZHRoLCAobmV3UG9pbnRbMV0gLSByZWN0YW5nbGUueSkgLyByZWN0YW5nbGUuaGVpZ2h0XTtcbi8vIH07XG5cbmV4cG9ydCBjb25zdCBnZXRIaXRDb25uZWN0b3JQb2ludCA9IChtb3ZpbmdQb2ludDogUG9pbnQsIGhpdEVsZW1lbnQ6IFBsYWl0U2hhcGUsIHJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50KSA9PiB7XG4gICAgY29uc3Qgc2hhcGUgPSBnZXRTaGFwZShoaXRFbGVtZW50KTtcbiAgICBjb25zdCBjb25uZWN0b3IgPSBnZXRFbmdpbmUoc2hhcGUpLmdldENvbm5lY3RvclBvaW50cyhyZWN0YW5nbGUpO1xuICAgIGNvbnN0IHBvaW50cyA9IGdldFBvaW50c0J5Q2VudGVyUG9pbnQobW92aW5nUG9pbnQsIDEwLCAxMCk7XG4gICAgY29uc3QgcG9pbnRSZWN0YW5nbGUgPSBnZXRSZWN0YW5nbGVCeVBvaW50cyhwb2ludHMpO1xuICAgIHJldHVybiBjb25uZWN0b3IuZmluZChwb2ludCA9PiB7XG4gICAgICAgIHJldHVybiBSZWN0YW5nbGVDbGllbnQuaXNIaXQocG9pbnRSZWN0YW5nbGUsIFJlY3RhbmdsZUNsaWVudC50b1JlY3RhbmdsZUNsaWVudChbcG9pbnQsIHBvaW50XSkpO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldExpbmVUZXh0UmVjdGFuZ2xlID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBlbGVtZW50OiBQbGFpdExpbmUsIGluZGV4OiBudW1iZXIpOiBSZWN0YW5nbGVDbGllbnQgPT4ge1xuICAgIGNvbnN0IHRleHQgPSBlbGVtZW50LnRleHRzW2luZGV4XTtcbiAgICBjb25zdCBlbGJvd1BvaW50cyA9IGdldExpbmVQb2ludHMoYm9hcmQsIGVsZW1lbnQpO1xuICAgIGNvbnN0IHBvaW50ID0gZ2V0UG9pbnRPblBvbHlsaW5lKGVsYm93UG9pbnRzLCB0ZXh0LnBvc2l0aW9uKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB4OiBwb2ludFswXSAtIHRleHQud2lkdGghIC8gMixcbiAgICAgICAgeTogcG9pbnRbMV0gLSB0ZXh0LmhlaWdodCEgLyAyLFxuICAgICAgICB3aWR0aDogdGV4dC53aWR0aCEsXG4gICAgICAgIGhlaWdodDogdGV4dC5oZWlnaHQhXG4gICAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRCb2FyZExpbmVzID0gKGJvYXJkOiBQbGFpdEJvYXJkKSA9PiB7XG4gICAgcmV0dXJuIGZpbmRFbGVtZW50cyhib2FyZCwge1xuICAgICAgICBtYXRjaDogKGVsZW1lbnQ6IFBsYWl0RWxlbWVudCkgPT4gUGxhaXREcmF3RWxlbWVudC5pc0xpbmUoZWxlbWVudCksXG4gICAgICAgIHJlY3Vyc2lvbjogKGVsZW1lbnQ6IFBsYWl0RWxlbWVudCkgPT4gUGxhaXREcmF3RWxlbWVudC5pc0RyYXdFbGVtZW50KGVsZW1lbnQpXG4gICAgfSkgYXMgUGxhaXRMaW5lW107XG59O1xuXG4vLyBxdWFkcmF0aWMgQmV6aWVyIHRvIGN1YmljIEJlemllclxuZXhwb3J0IGNvbnN0IFEyQyA9IChwb2ludHM6IFBvaW50W10pID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBjb25zdCBudW1TZWdtZW50cyA9IHBvaW50cy5sZW5ndGggLyAzO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtU2VnbWVudHM7IGkrKykge1xuICAgICAgICBjb25zdCBzdGFydCA9IHBvaW50c1tpXTtcbiAgICAgICAgY29uc3QgcUNvbnRyb2wgPSBwb2ludHNbaSArIDFdO1xuICAgICAgICBjb25zdCBlbmQgPSBwb2ludHNbaSArIDJdO1xuICAgICAgICBjb25zdCBzdGFydERpc3RhbmNlID0gZGlzdGFuY2VCZXR3ZWVuUG9pbnRBbmRQb2ludCguLi5zdGFydCwgLi4ucUNvbnRyb2wpO1xuICAgICAgICBjb25zdCBlbmREaXN0YW5jZSA9IGRpc3RhbmNlQmV0d2VlblBvaW50QW5kUG9pbnQoLi4uZW5kLCAuLi5xQ29udHJvbCk7XG4gICAgICAgIGNvbnN0IGNDb250cm9sMSA9IGdldEV4dGVuZFBvaW50KHN0YXJ0LCBxQ29udHJvbCwgKHN0YXJ0RGlzdGFuY2UgKiAyKSAvIDMpO1xuICAgICAgICBjb25zdCBjQ29udHJvbDIgPSBnZXRFeHRlbmRQb2ludChlbmQsIHFDb250cm9sLCAoZW5kRGlzdGFuY2UgKiAyKSAvIDMpO1xuICAgICAgICByZXN1bHQucHVzaChzdGFydCwgY0NvbnRyb2wxLCBjQ29udHJvbDIsIGVuZCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VmVjdG9yQnlDb25uZWN0aW9uID0gKGJvdW5kRWxlbWVudDogUGxhaXRHZW9tZXRyeSwgY29ubmVjdGlvbjogUG9pbnRPZlJlY3RhbmdsZSk6IFZlY3RvciA9PiB7XG4gICAgY29uc3QgcmVjdGFuZ2xlID0gZ2V0UmVjdGFuZ2xlQnlQb2ludHMoYm91bmRFbGVtZW50LnBvaW50cyk7XG4gICAgY29uc3Qgc2hhcGUgPSBnZXRTaGFwZShib3VuZEVsZW1lbnQpO1xuICAgIGNvbnN0IGVuZ2luZSA9IGdldEVuZ2luZShzaGFwZSk7XG4gICAgbGV0IHZlY3RvcjogVmVjdG9yID0gWzAsIDBdO1xuICAgIGNvbnN0IGRpcmVjdGlvbiA9IGdldERpcmVjdGlvbkJ5UG9pbnRPZlJlY3RhbmdsZShjb25uZWN0aW9uKTtcbiAgICBpZiAoZGlyZWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IGZhY3RvciA9IGdldERpcmVjdGlvbkZhY3RvcihkaXJlY3Rpb24pO1xuICAgICAgICByZXR1cm4gW2ZhY3Rvci54LCBmYWN0b3IueV07XG4gICAgfVxuICAgIGlmIChlbmdpbmUuZ2V0RWRnZUJ5Q29ubmVjdGlvblBvaW50KSB7XG4gICAgICAgIGNvbnN0IGVkZ2UgPSBlbmdpbmUuZ2V0RWRnZUJ5Q29ubmVjdGlvblBvaW50KHJlY3RhbmdsZSwgY29ubmVjdGlvbik7XG4gICAgICAgIGlmIChlZGdlKSB7XG4gICAgICAgICAgICBjb25zdCBsaW5lVmVjdG9yID0gW2VkZ2VbMV1bMF0gLSBlZGdlWzBdWzBdLCBlZGdlWzFdWzFdIC0gZWRnZVswXVsxXV0gYXMgVmVjdG9yO1xuICAgICAgICAgICAgcmV0dXJuIHJvdGF0ZVZlY3RvckFudGk5MChsaW5lVmVjdG9yKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoZW5naW5lLmdldFRhbmdlbnRWZWN0b3JCeUNvbm5lY3Rpb25Qb2ludCkge1xuICAgICAgICBjb25zdCBsaW5lVmVjdG9yID0gZW5naW5lLmdldFRhbmdlbnRWZWN0b3JCeUNvbm5lY3Rpb25Qb2ludChyZWN0YW5nbGUsIGNvbm5lY3Rpb24pO1xuICAgICAgICBpZiAobGluZVZlY3Rvcikge1xuICAgICAgICAgICAgcmV0dXJuIHJvdGF0ZVZlY3RvckFudGk5MChsaW5lVmVjdG9yKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmVjdG9yO1xufTtcblxuZXhwb3J0IGNvbnN0IGFsaWduUG9pbnRzID0gKGJhc2VQb2ludDogUG9pbnQsIG1vdmluZ1BvaW50OiBQb2ludCkgPT4ge1xuICAgIGNvbnN0IG9mZnNldCA9IDM7XG4gICAgY29uc3QgbmV3UG9pbnQ6IFBvaW50ID0gWy4uLm1vdmluZ1BvaW50XTtcbiAgICBpZiAoUG9pbnQuaXNWZXJ0aWNhbEFsaWduKG5ld1BvaW50LCBiYXNlUG9pbnQsIG9mZnNldCkpIHtcbiAgICAgICAgbmV3UG9pbnRbMF0gPSBiYXNlUG9pbnRbMF07XG4gICAgfVxuICAgIGlmIChQb2ludC5pc0hvcml6b250YWxBbGlnbihuZXdQb2ludCwgYmFzZVBvaW50LCBvZmZzZXQpKSB7XG4gICAgICAgIG5ld1BvaW50WzFdID0gYmFzZVBvaW50WzFdO1xuICAgIH1cbiAgICByZXR1cm4gbmV3UG9pbnQ7XG59O1xuXG5leHBvcnQgY29uc3QgaGFuZGxlTGluZUNyZWF0aW5nID0gKFxuICAgIGJvYXJkOiBQbGFpdEJvYXJkLFxuICAgIGxpbmVTaGFwZTogTGluZVNoYXBlLFxuICAgIHN0YXJ0UG9pbnQ6IFBvaW50LFxuICAgIG1vdmluZ1BvaW50OiBQb2ludCxcbiAgICBzb3VyY2VFbGVtZW50OiBQbGFpdFNoYXBlIHwgbnVsbCxcbiAgICBsaW5lU2hhcGVHOiBTVkdHRWxlbWVudFxuKSA9PiB7XG4gICAgY29uc3QgaGl0RWxlbWVudCA9IGdldEhpdE91dGxpbmVHZW9tZXRyeShib2FyZCwgbW92aW5nUG9pbnQsIFJFQUNUSU9OX01BUkdJTik7XG4gICAgY29uc3QgdGFyZ2V0Q29ubmVjdGlvbiA9IGhpdEVsZW1lbnQgPyB0cmFuc2Zvcm1Qb2ludFRvQ29ubmVjdGlvbihib2FyZCwgbW92aW5nUG9pbnQsIGhpdEVsZW1lbnQpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBzb3VyY2VFbGVtZW50ID8gdHJhbnNmb3JtUG9pbnRUb0Nvbm5lY3Rpb24oYm9hcmQsIHN0YXJ0UG9pbnQsIHNvdXJjZUVsZW1lbnQpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHRhcmdldEJvdW5kSWQgPSBoaXRFbGVtZW50ID8gaGl0RWxlbWVudC5pZCA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBsaW5lR2VuZXJhdG9yID0gbmV3IExpbmVTaGFwZUdlbmVyYXRvcihib2FyZCk7XG4gICAgY29uc3QgbWVtb3JpemVkTGF0ZXN0ID0gZ2V0TGluZU1lbW9yaXplZExhdGVzdCgpO1xuICAgIGxldCBzb3VyY2VNYXJrZXIsIHRhcmdldE1hcmtlcjtcbiAgICBzb3VyY2VNYXJrZXIgPSBtZW1vcml6ZWRMYXRlc3Quc291cmNlO1xuICAgIHRhcmdldE1hcmtlciA9IG1lbW9yaXplZExhdGVzdC50YXJnZXQ7XG4gICAgc291cmNlTWFya2VyICYmIGRlbGV0ZSBtZW1vcml6ZWRMYXRlc3Quc291cmNlO1xuICAgIHRhcmdldE1hcmtlciAmJiBkZWxldGUgbWVtb3JpemVkTGF0ZXN0LnRhcmdldDtcbiAgICBjb25zdCB0ZW1wb3JhcnlMaW5lRWxlbWVudCA9IGNyZWF0ZUxpbmVFbGVtZW50KFxuICAgICAgICBsaW5lU2hhcGUsXG4gICAgICAgIFtzdGFydFBvaW50LCBtb3ZpbmdQb2ludF0sXG4gICAgICAgIHsgbWFya2VyOiBzb3VyY2VNYXJrZXIgfHwgTGluZU1hcmtlclR5cGUubm9uZSwgY29ubmVjdGlvbjogY29ubmVjdGlvbiwgYm91bmRJZDogc291cmNlRWxlbWVudD8uaWQgfSxcbiAgICAgICAgeyBtYXJrZXI6IHRhcmdldE1hcmtlciB8fCBMaW5lTWFya2VyVHlwZS5hcnJvdywgY29ubmVjdGlvbjogdGFyZ2V0Q29ubmVjdGlvbiwgYm91bmRJZDogdGFyZ2V0Qm91bmRJZCB9LFxuICAgICAgICBbXSxcbiAgICAgICAge1xuICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IERlZmF1bHRMaW5lU3R5bGUuc3Ryb2tlV2lkdGgsXG4gICAgICAgICAgICAuLi5tZW1vcml6ZWRMYXRlc3RcbiAgICAgICAgfVxuICAgICk7XG4gICAgY29uc3QgbGluZVBvaW50cyA9IGdldExpbmVQb2ludHMoYm9hcmQsIHRlbXBvcmFyeUxpbmVFbGVtZW50KTtcbiAgICBjb25zdCBvdGhlclBvaW50ID0gbGluZVBvaW50c1swXTtcbiAgICB0ZW1wb3JhcnlMaW5lRWxlbWVudC5wb2ludHNbMV0gPSBhbGlnblBvaW50cyhvdGhlclBvaW50LCBtb3ZpbmdQb2ludCk7XG4gICAgbGluZUdlbmVyYXRvci5wcm9jZXNzRHJhd2luZyh0ZW1wb3JhcnlMaW5lRWxlbWVudCwgbGluZVNoYXBlRyk7XG4gICAgUGxhaXRCb2FyZC5nZXRFbGVtZW50QWN0aXZlSG9zdChib2FyZCkuYXBwZW5kKGxpbmVTaGFwZUcpO1xuICAgIHJldHVybiB0ZW1wb3JhcnlMaW5lRWxlbWVudDtcbn07XG4iXX0=
package/utils/line.d.ts DELETED
@@ -1,25 +0,0 @@
1
- import { Point, PlaitBoard, RectangleClient, PointOfRectangle, Direction, Vector } from '@plait/core';
2
- import { LineHandle, LineHandleRef, LineShape, LineText, PlaitGeometry, PlaitLine, PlaitShape } from '../interfaces';
3
- import { Op } from 'roughjs/bin/core';
4
- export declare const createLineElement: (shape: LineShape, points: [Point, Point], source: LineHandle, target: LineHandle, texts?: LineText[], options?: Pick<PlaitLine, 'strokeColor' | 'strokeWidth'>) => PlaitLine;
5
- export declare const getLinePoints: (board: PlaitBoard, element: PlaitLine) => Point[];
6
- export declare const getLineHandleRefPair: (board: PlaitBoard, element: PlaitLine) => {
7
- source: LineHandleRef;
8
- target: LineHandleRef;
9
- };
10
- export declare const getElbowPoints: (board: PlaitBoard, element: PlaitLine) => Point[];
11
- export declare const getCurvePoints: (board: PlaitBoard, element: PlaitLine) => Point[];
12
- export declare const transformOpsToPoints: (ops: Op[]) => number[][];
13
- export declare const isHitPolyLine: (pathPoints: Point[], point: Point, strokeWidth: number, expand?: number) => boolean;
14
- export declare const getHitLineTextIndex: (board: PlaitBoard, element: PlaitLine, point: Point) => number;
15
- export declare const isHitLineText: (board: PlaitBoard, element: PlaitLine, point: Point) => boolean;
16
- export declare const drawLine: (board: PlaitBoard, element: PlaitLine) => SVGGElement;
17
- export declare const getConnectionPoint: (geometry: PlaitGeometry, connection: Point, direction?: Direction, delta?: number) => Point;
18
- export declare const transformPointToConnection: (board: PlaitBoard, point: Point, hitElement: PlaitShape) => Point;
19
- export declare const getHitConnectorPoint: (movingPoint: Point, hitElement: PlaitShape, rectangle: RectangleClient) => Point | undefined;
20
- export declare const getLineTextRectangle: (board: PlaitBoard, element: PlaitLine, index: number) => RectangleClient;
21
- export declare const getBoardLines: (board: PlaitBoard) => PlaitLine[];
22
- export declare const Q2C: (points: Point[]) => Point[];
23
- export declare const getVectorByConnection: (boundElement: PlaitGeometry, connection: PointOfRectangle) => Vector;
24
- export declare const alignPoints: (basePoint: Point, movingPoint: Point) => Point;
25
- export declare const handleLineCreating: (board: PlaitBoard, lineShape: LineShape, startPoint: Point, movingPoint: Point, sourceElement: PlaitShape | null, lineShapeG: SVGGElement) => PlaitLine;