@plait/common 0.52.0 → 0.53.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.
@@ -1,4 +1,4 @@
1
- import { PlaitBoard, RectangleClient, ResizeCursorClass, setDragging } from '@plait/core';
1
+ import { PlaitBoard, RectangleClient, ResizeCursorClass, setDragging, RESIZE_CURSORS, rotatePoints } from '@plait/core';
2
2
  export const getResizeHandleByIndex = (index) => {
3
3
  return `${index}`;
4
4
  };
@@ -31,7 +31,15 @@ const getResizeCursorClassByIndex = (index) => {
31
31
  return null;
32
32
  }
33
33
  };
34
- export const getRectangleResizeHandleRefs = (rectangle, diameter) => {
34
+ export const getRotatedResizeCursorClassByAngle = (cursor, angle) => {
35
+ const index = RESIZE_CURSORS.indexOf(cursor);
36
+ if (index >= 0) {
37
+ const temp = Math.round(angle / (Math.PI / 4));
38
+ cursor = RESIZE_CURSORS[(index + temp) % RESIZE_CURSORS.length];
39
+ }
40
+ return cursor;
41
+ };
42
+ export const getRectangleResizeHandleRefs = (rectangle, diameter, angle = 0) => {
35
43
  const corners = RectangleClient.getCornerPoints(rectangle);
36
44
  const refs = corners.map((corner, index) => {
37
45
  return {
@@ -42,7 +50,7 @@ export const getRectangleResizeHandleRefs = (rectangle, diameter) => {
42
50
  height: diameter
43
51
  },
44
52
  handle: getResizeHandleByIndex(index),
45
- cursorClass: getResizeCursorClassByIndex(index)
53
+ cursorClass: getRotatedResizeCursorClassByAngle(getResizeCursorClassByIndex(index), angle)
46
54
  };
47
55
  });
48
56
  const rectangles = getResizeSideRectangles(corners, diameter / 2);
@@ -50,7 +58,7 @@ export const getRectangleResizeHandleRefs = (rectangle, diameter) => {
50
58
  return {
51
59
  rectangle,
52
60
  handle: getResizeHandleByIndex(index + 4),
53
- cursorClass: getResizeCursorClassByIndex(index + 4)
61
+ cursorClass: getRotatedResizeCursorClassByAngle(getResizeCursorClassByIndex(index + 4), angle)
54
62
  };
55
63
  }));
56
64
  return refs;
@@ -105,4 +113,14 @@ export const isEdgeHandle = (board, handle) => {
105
113
  export const isCornerHandle = (board, handle) => {
106
114
  return !isEdgeHandle(board, handle);
107
115
  };
108
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tbW9uL3NyYy91dGlscy9yZXNpemUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBUyxlQUFlLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBSWpHLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLENBQUMsS0FBYSxFQUFFLEVBQUU7SUFDcEQsT0FBTyxHQUFHLEtBQUssRUFBa0IsQ0FBQztBQUN0QyxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLFlBQTBCLEVBQUUsRUFBRTtJQUNqRSxPQUFPLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUNoQyxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLEtBQWlCLEVBQUUsS0FBYSxFQUFFLEVBQUU7SUFDeEUsTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDLEtBQUssRUFBRSxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDM0YsSUFBSSwwQkFBMEIsR0FBRyxXQUFXLEdBQUcsQ0FBQyxDQUFDO0lBQ2pELElBQUksMEJBQTBCLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDbEMsMEJBQTBCLEdBQUcsMEJBQTBCLEdBQUcsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFDRCxPQUFPLFlBQVksQ0FBQyxLQUFLLEVBQUUsc0JBQXNCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsMEJBQTBCLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQywwQkFBMEIsQ0FBQztBQUM1SCxDQUFDLENBQUM7QUFFRixNQUFNLDJCQUEyQixHQUFHLENBQUMsS0FBYSxFQUFFLEVB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Q0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDbEMsV0FBVyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztBQUM3QixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxLQUFpQixFQUFFLEdBQVcsRUFBRSxFQUFFO0lBQzdELFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxXQUFXLENBQUMsQ0FBQztJQUN4RSxXQUFXLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFCLFdBQVcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDOUIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLENBQUMsS0FBaUIsRUFBRSxNQUFvQixFQUFFLEVBQUU7SUFDcEUsTUFBTSxLQUFLLEdBQUcsc0JBQXNCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDN0MsSUFBSSxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDYixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO1NBQU0sQ0FBQztRQUNKLE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7QUFDTCxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxLQUFpQixFQUFFLE1BQW9CLEVBQUUsRUFBRTtJQUN0RSxPQUFPLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztBQUN4QyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQbGFpdEJvYXJkLCBQb2ludCwgUmVjdGFuZ2xlQ2xpZW50LCBSZXNpemVDdXJzb3JDbGFzcywgc2V0RHJhZ2dpbmcgfSBmcm9tICdAcGxhaXQvY29yZSc7XG5pbXBvcnQgeyBSZXNpemVIYW5kbGUgfSBmcm9tICcuLi9jb25zdGFudHMvcmVzaXplJztcbmltcG9ydCB7IFBsYWl0RWxlbWVudE9yQXJyYXksIFJlc2l6ZVJlZiB9IGZyb20gJy4uL3R5cGVzL3Jlc2l6ZSc7XG5cbmV4cG9ydCBjb25zdCBnZXRSZXNpemVIYW5kbGVCeUluZGV4ID0gKGluZGV4OiBudW1iZXIpID0+IHtcbiAgICByZXR1cm4gYCR7aW5kZXh9YCBhcyBSZXNpemVIYW5kbGU7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0SW5kZXhCeVJlc2l6ZUhhbmRsZSA9IChyZXNpemVIYW5kbGU6IFJlc2l6ZUhhbmRsZSkgPT4ge1xuICAgIHJldHVybiBOdW1iZXIocmVzaXplSGFuZGxlKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRTeW1tZXRyaWNIYW5kbGVJbmRleCA9IChib2FyZDogUGxhaXRCb2FyZCwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IG9yaWdpbkluZGV4ID0gaXNFZGdlSGFuZGxlKGJvYXJkLCBnZXRSZXNpemVIYW5kbGVCeUluZGV4KGluZGV4KSkgPyBpbmRleCAtIDQgOiBpbmRleDtcbiAgICBsZXQgb3JpZ2luU3ltbWV0cmljSGFuZGxlSW5kZXggPSBvcmlnaW5JbmRleCArIDI7XG4gICAgaWYgKG9yaWdpblN5bW1ldHJpY0hhbmRsZUluZGV4ID49IDQpIHtcbiAgICAgICAgb3JpZ2luU3ltbWV0cmljSGFuZGxlSW5kZXggPSBvcmlnaW5TeW1tZXRyaWNIYW5kbGVJbmRleCAtIDQ7XG4gICAgfVxuICAgIHJldHVybiBpc0VkZ2VIYW5kbGUoYm9hcmQsIGdldFJlc2l6ZUhhbmRsZUJ5SW5kZXgoaW5kZXgpKSA/IG9yaWdpblN5bW1ldHJpY0hhbmRsZUluZGV4ICsgNCA6IG9yaWdpblN5bW1ldHJpY0hhbmRsZUluZGV4O1xufTtcblxuY29uc3QgZ2V0UmVzaXplQ3Vyc29yQ2xhc3NCeUluZGV4ID0gKGluZGV4OiBudW1iZXIpID0+IHtcbiAgICBzd2l0Y2ggKGluZGV4KSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgcmV0dXJuIFJlc2l6ZUN1cnNvckNsYXNzLm53c2U7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgcmV0dXJuIFJlc2l6ZUN1cnNvckNsYXNzLm5lc3c7XG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgcmV0dXJuIFJlc2l6ZUN1cnNvckNsYXNzLm5zO1xuICAgICAgICBjYXNlIDU6XG4gICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgIHJldHVybiBSZXNpemVDdXJzb3JDbGFzcy5ldztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn07XG5cbmV4cG9ydCBjb25zdCBnZXRSZWN0YW5nbGVSZXNpemVIYW5kbGVSZWZzID0gKHJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50LCBkaWFtZXRlcjogbnVtYmVyKSA9PiB7XG4gICAgY29uc3QgY29ybmVycyA9IFJlY3RhbmdsZUNsaWVudC5nZXRDb3JuZXJQb2ludHMocmVjdGFuZ2xlKTtcbiAgICBjb25zdCByZWZzID0gY29ybmVycy5tYXAoKGNvcm5lciwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmVjdGFuZ2xlOiB7XG4gICAgICAgICAgICAgICAgeDogY29ybmVyWzBdIC0gZGlhbWV0ZXIgLyAyLFxuICAgICAgICAgICAgICAgIHk6IGNvcm5lclsxXSAtIGRpYW1ldGVyIC8gMixcbiAgICAgICAgICAgICAgICB3aWR0aDogZGlhbWV0ZXIsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBkaWFtZXRlclxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhhbmRsZTogZ2V0UmVzaXplSGFuZGxlQnlJbmRleChpbmRleCkgYXMgUmVzaXplSGFuZGxlLFxuICAgICAgICAgICAgY3Vyc29yQ2xhc3M6IGdldFJlc2l6ZUN1cnNvckNsYXNzQnlJbmRleChpbmRleCkgYXMgUmVzaXplQ3Vyc29yQ2xhc3NcbiAgICAgICAgfTtcbiAgICB9KTtcbiAgICBjb25zdCByZWN0YW5nbGVzID0gZ2V0UmVzaXplU2lkZVJlY3RhbmdsZXMoY29ybmVycywgZGlhbWV0ZXIgLyAyKTtcbiAgICByZWZzLnB1c2goXG4gICAgICAgIC4uLnJlY3RhbmdsZXMubWFwKChyZWN0YW5nbGUsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHJlY3RhbmdsZSxcbiAgICAgICAgICAgICAgICBoYW5kbGU6IGdldFJlc2l6ZUhhbmRsZUJ5SW5kZXgoaW5kZXggKyA0KSBhcyBSZXNpemVIYW5kbGUsXG4gICAgICAgICAgICAgICAgY3Vyc29yQ2xhc3M6IGdldFJlc2l6ZUN1cnNvckNsYXNzQnlJbmRleChpbmRleCArIDQpIGFzIFJlc2l6ZUN1cnNvckNsYXNzXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KVxuICAgICk7XG4gICAgcmV0dXJuIHJlZnM7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UmVzaXplSGFuZGxlUG9pbnRCeUluZGV4ID0gKHJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgaWYgKGluZGV4IDw9IDMpIHtcbiAgICAgICAgY29uc3QgY29ybmVycyA9IFJlY3RhbmdsZUNsaWVudC5nZXRDb3JuZXJQb2ludHMocmVjdGFuZ2xlKTtcbiAgICAgICAgcmV0dXJuIGNvcm5lcnNbaW5kZXhdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGVkZ2VDZW50ZXJQb2ludHMgPSBSZWN0YW5nbGVDbGllbnQuZ2V0RWRnZUNlbnRlclBvaW50cyhyZWN0YW5nbGUpO1xuICAgICAgICByZXR1cm4gZWRnZUNlbnRlclBvaW50c1tpbmRleCAtIDRdO1xuICAgIH1cbn07XG5cbmNvbnN0IGdldFJlc2l6ZVNpZGVSZWN0YW5nbGVzID0gKGNvcm5lclBvaW50czogUG9pbnRbXSwgb2Zmc2V0OiBudW1iZXIpOiBSZWN0YW5nbGVDbGllbnRbXSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3JuZXJQb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IHJlY3RhbmdsZSA9IFJlY3RhbmdsZUNsaWVudC5nZXRSZWN0YW5nbGVCeVBvaW50cyhbY29ybmVyUG9pbnRzW2ldLCBjb3JuZXJQb2ludHNbKGkgKyAxKSAlIDRdXSk7XG4gICAgICAgIGNvbnN0IGFyciA9IG5ldyBBcnJheSgyKS5maWxsKDApO1xuICAgICAgICBhcnJbKGkgKyAxKSAlIDJdID0gb2Zmc2V0IC8gMjtcbiAgICAgICAgcmVjdGFuZ2xlID0gUmVjdGFuZ2xlQ2xpZW50LmV4cGFuZChyZWN0YW5nbGUsIGFyclswXSwgYXJyWzFdKTtcbiAgICAgICAgcmVzdWx0LnB1c2gocmVjdGFuZ2xlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmV4cG9ydCBjb25zdCBJU19SRVNJWklORyA9IG5ldyBXZWFrTWFwPFBsYWl0Qm9hcmQsIFJlc2l6ZVJlZjxhbnksIGFueT4+KCk7XG5cbmV4cG9ydCBjb25zdCBpc1Jlc2l6aW5nID0gKGJvYXJkOiBQbGFpdEJvYXJkKSA9PiB7XG4gICAgcmV0dXJuICEhSVNfUkVTSVpJTkcuZ2V0KGJvYXJkKTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc1Jlc2l6aW5nQnlDb25kaXRpb24gPSA8VCBleHRlbmRzIFBsYWl0RWxlbWVudE9yQXJyYXksIEs+KGJvYXJkOiBQbGFpdEJvYXJkLCBtYXRjaDogKHJlc2l6ZVJlZjogUmVzaXplUmVmPFQsIEs+KSA9PiBib29sZWFuKSA9PiB7XG4gICAgcmV0dXJuIGlzUmVzaXppbmcoYm9hcmQpICYmIG1hdGNoKElTX1JFU0laSU5HLmdldChib2FyZCkhKTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRSZXNpemluZyA9IDxUIGV4dGVuZHMgUGxhaXRFbGVtZW50T3JBcnJheSwgSz4oYm9hcmQ6IFBsYWl0Qm9hcmQsIHJlc2l6ZVJlZjogUmVzaXplUmVmPFQsIEs+LCBrZXk6IHN0cmluZykgPT4ge1xuICAgIFBsYWl0Qm9hcmQuZ2V0Qm9hcmRDb250YWluZXIoYm9hcmQpLmNsYXNzTGlzdC5hZGQoYCR7a2V5fS1yZXNpemluZ2ApO1xuICAgIElTX1JFU0laSU5HLnNldChib2FyZCwgcmVzaXplUmVmKTtcbiAgICBzZXREcmFnZ2luZyhib2FyZCwgdHJ1ZSk7XG59O1xuXG5leHBvcnQgY29uc3QgcmVtb3ZlUmVzaXppbmcgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgUGxhaXRCb2FyZC5nZXRCb2FyZENvbnRhaW5lcihib2FyZCkuY2xhc3NMaXN0LnJlbW92ZShgJHtrZXl9LXJlc2l6aW5nYCk7XG4gICAgSVNfUkVTSVpJTkcuZGVsZXRlKGJvYXJkKTtcbiAgICBzZXREcmFnZ2luZyhib2FyZCwgZmFsc2UpO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzRWRnZUhhbmRsZSA9IChib2FyZDogUGxhaXRCb2FyZCwgaGFuZGxlOiBSZXNpemVIYW5kbGUpID0+IHtcbiAgICBjb25zdCBpbmRleCA9IGdldEluZGV4QnlSZXNpemVIYW5kbGUoaGFuZGxlKTtcbiAgICBpZiAoaW5kZXggPj0gNCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGlzQ29ybmVySGFuZGxlID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBoYW5kbGU6IFJlc2l6ZUhhbmRsZSkgPT4ge1xuICAgIHJldHVybiAhaXNFZGdlSGFuZGxlKGJvYXJkLCBoYW5kbGUpO1xufTtcbiJdfQ==
116
+ // 处理元素先旋转后resize导致的位置偏移
117
+ export const resetPointsAfterResize = (originRectangle, currentRectangle, originSelectionCenterPoint, currentSelectionCenterPoint, angle) => {
118
+ const correctSelectionCenterPoint = rotatePoints([currentSelectionCenterPoint], originSelectionCenterPoint, angle)[0];
119
+ const rotatedElementCenterPoint = rotatePoints([RectangleClient.getCenterPoint(currentRectangle)], originSelectionCenterPoint, angle)[0];
120
+ const currentPoints = RectangleClient.getPoints(currentRectangle);
121
+ const originRectangleCenterPoint = RectangleClient.getCenterPoint(originRectangle);
122
+ const correctElementCenterPoint = rotatePoints([rotatedElementCenterPoint], correctSelectionCenterPoint, -angle)[0];
123
+ const rotatedPoints = rotatePoints(currentPoints, originRectangleCenterPoint, angle);
124
+ return rotatePoints(rotatedPoints, correctElementCenterPoint, -angle);
125
+ };
126
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tbW9uL3NyYy91dGlscy9yZXNpemUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBUyxlQUFlLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFJL0gsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxLQUFhLEVBQUUsRUFBRTtJQUNwRCxPQUFPLEdBQUcsS0FBSyxFQUFrQixDQUFDO0FBQ3RDLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLENBQUMsWUFBMEIsRUFBRSxFQUFFO0lBQ2pFLE9BQU8sTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQ2hDLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLENBQUMsS0FBaUIsRUFBRSxLQUFhLEVBQUUsRUFBRTtJQUN4RSxNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUMsS0FBSyxFQUFFLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUMzRixJQUFJLDBCQUEwQixHQUFHLFdBQVcsR0FBRyxDQUFDLENBQUM7SUFDakQsSUFBSSwwQkFBMEIsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNsQywwQkFBMEIsR0FBRywwQkFBMEIsR0FBRyxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUNELE9BQU8sWUFBWSxDQUFDLEtBQUssRUFBRSxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQywwQkFBMEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLDBCQUEwQixDQUFDO0FBQzVILENBQUMsQ0FBQztBQUVGLE1BQU0sMkJBQTJCLEdBQUcsQ0FBQyxLQUFhLEVBQUUsRUFBRTtJQUNsRCxRQUFRLEtBQUssRUFBRSxDQUFDO1FBQ1osS0FBSyxDQUFDLENBQUM7UUFDUCxLQUFLLENBQUM7WUFDRixPQUFPLGlCQUFpQixDQUFDLElBQUksQ0FBQztRQUNsQyxLQUFLLENBQUMsQ0FBQztRQUNQLEtBQUssQ0FBQztZQUNGLE9BQU8saUJBQWlCLENBQUMsSUFBSSxDQUFDO1FBQ2xDLEtBQUssQ0FBQyxDQUFDO1FBQ1AsS0FBSyxDQUFDO1lBQ0YsT0FBTyxpQkFBaUIsQ0FBQyxFQUFFLENBQUM7UUFDaEMsS0FBSyxDQUFDLENBQUM7UUFDUCxLQUFLLENBQUM7WUFDRixPQUFPLGlCQUFpQixDQUFDLEVBQUUsQ0FBQztRQUNoQztZQUNJLE9BQU8sSUFBSSxDQUFDO0lBQ3BCLENBQUM7QUFDTCxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxrQ0FBa0MsR0FBRyxDQUFDLE1BQXlCLEVBQUUsS0FBYSxFQUFFLEVBQUU7SUFDM0YsTUFBTSxLQUFLLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM3QyxJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNiLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9DLE1BQU0sR0FBRyxjQUFjLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBc0IsQ0FBQztJQUN6RixDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDbEIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQUcsQ0FBQyxTQUEwQixFQUFFLFFBQWdCLEVBQUUsUUFBZ0IsQ0FBQyxFQUFFLEVBQUU7SUFDNUcsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMzRCxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEtBQWEsRUFBRSxFQUFFO1FBQy9DLE9BQU87WUFDSCxTQUFTLEVBQUU7Z0JBQ1AsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLEdBQUcsQ0FBQztnQkFDM0IsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLEdBQUcsQ0FBQztnQkFDM0IsS0FBSyxFQUFFLFFBQVE7Z0JBQ2YsTUFBTSxFQUFFLFFBQVE7YUFDbkI7WUFDRCxNQUFNLEVBQUUsc0JBQXNCLENBQUMsS0FBSyxDQUFpQjtZQUNyRCxXQUFXLEVBQUUsa0NBQWtDLENBQUMsMkJBQTJCLENBQUMsS0FBSyxDQUFzQixFQUFFLEtBQUssQ0FBQztTQUNsSCxDQUFDO0lBQ04sQ0FBQyxDQUFDLENBQUM7SUFDSCxNQUFNLFVBQVUsR0FBRyx1QkFBdUIsQ0FBQyxPQUFPLEVBQUUsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLElBQUksQ0FBQyxJQUFJLENBQ0wsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxFQUFFO1FBQ25DLE9BQU87WUFDSCxTQUFTO1lBQ1QsTUFBTSxFQUFFLHNCQUFzQixDQUFDLEtBQUssR0FBRyxDQUFDLENBQWlCO1lBQ3pELFdBQVcsRUFBRSxrQ0FBa0MsQ0FBQywyQkFBMkIsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFzQixFQUFFLEtBQUssQ0FBQztTQUN0SCxDQUFDO0lBQ04sQ0FBQyxDQUFDLENBQ0wsQ0FBQztJQUNGLE9BQU8sSUFBSSxDQUFDO0FBQ2hCLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLENBQUMsU0FBMEIsRUFBRSxLQUFhLEVBQUUsRUFBRTtJQUNyRixJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNiLE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDM0QsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUIsQ0FBQztTQUFNLENBQUM7UUFDSixNQUFNLGdCQUFnQixHQUFHLGVBQWUsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN4RSxPQUFPLGdCQUFnQixDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN2QyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBRUYsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLFlBQXFCLEVBQUUsTUFBYyxFQUFxQixFQUFFO0lBQ3pGLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztJQUNsQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQzNDLElBQUksU0FBUyxHQUFHLGVBQWUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25HLE1BQU0sR0FBRyxHQUFHLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUM5QixTQUFTLEdBQUcsZUFBZSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlELE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2xCLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxJQUFJLE9BQU8sRUFBbUMsQ0FBQztBQUUxRSxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxLQUFpQixFQUFFLEVBQUU7SUFDNUMsT0FBTyxDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNwQyxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxDQUNqQyxLQUFpQixFQUNqQixLQUE4QyxFQUNoRCxFQUFFO0lBQ0EsT0FBTyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFFLENBQUMsQ0FBQztBQUMvRCxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsQ0FBbUMsS0FBaUIsRUFBRSxTQUEwQixFQUFFLEdBQVcsRUFBRSxFQUFFO0lBQ3hILFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxXQUFXLENBQUMsQ0FBQztJQUNyRSxXQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNsQyxXQUFXLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzdCLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQWlCLEVBQUUsR0FBVyxFQUFFLEVBQUU7SUFDN0QsVUFBVSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLFdBQVcsQ0FBQyxDQUFDO0lBQ3hFLFdBQVcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUIsV0FBVyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztBQUM5QixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsQ0FBQyxLQUFpQixFQUFFLE1BQW9CLEVBQUUsRUFBRTtJQUNwRSxNQUFNLEtBQUssR0FBRyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM3QyxJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNiLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7U0FBTSxDQUFDO1FBQ0osT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztBQUNMLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQWlCLEVBQUUsTUFBb0IsRUFBRSxFQUFFO0lBQ3RFLE9BQU8sQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3hDLENBQUMsQ0FBQztBQUVGLHdCQUF3QjtBQUN4QixNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxDQUNsQyxlQUFnQyxFQUNoQyxnQkFBaUMsRUFDakMsMEJBQWlDLEVBQ2pDLDJCQUFrQyxFQUNsQyxLQUFhLEVBQ0MsRUFBRTtJQUNoQixNQUFNLDJCQUEyQixHQUFHLFlBQVksQ0FBQyxDQUFDLDJCQUEyQixDQUFDLEVBQUUsMEJBQTBCLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEgsTUFBTSx5QkFBeUIsR0FBRyxZQUFZLENBQzFDLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBVSxDQUFDLEVBQzNELDBCQUEwQixFQUMxQixLQUFLLENBQ1IsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVMLE1BQU0sYUFBYSxHQUFHLGVBQWUsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNsRSxNQUFNLDBCQUEwQixHQUFHLGVBQWUsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLENBQUM7SUFFbkYsTUFBTSx5QkFBeUIsR0FBRyxZQUFZLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQyxFQUFFLDJCQUEyQixFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFcEgsTUFBTSxhQUFhLEdBQUcsWUFBWSxDQUFDLGFBQWEsRUFBRSwwQkFBMEIsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNyRixPQUFPLFlBQVksQ0FBQyxhQUFhLEVBQUUseUJBQXlCLEVBQUUsQ0FBQyxLQUFLLENBQW1CLENBQUM7QUFDNUYsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGxhaXRCb2FyZCwgUG9pbnQsIFJlY3RhbmdsZUNsaWVudCwgUmVzaXplQ3Vyc29yQ2xhc3MsIHNldERyYWdnaW5nLCBSRVNJWkVfQ1VSU09SUywgcm90YXRlUG9pbnRzIH0gZnJvbSAnQHBsYWl0L2NvcmUnO1xuaW1wb3J0IHsgUmVzaXplSGFuZGxlIH0gZnJvbSAnLi4vY29uc3RhbnRzL3Jlc2l6ZSc7XG5pbXBvcnQgeyBQbGFpdEVsZW1lbnRPckFycmF5LCBSZXNpemVSZWYgfSBmcm9tICcuLi90eXBlcy9yZXNpemUnO1xuXG5leHBvcnQgY29uc3QgZ2V0UmVzaXplSGFuZGxlQnlJbmRleCA9IChpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgcmV0dXJuIGAke2luZGV4fWAgYXMgUmVzaXplSGFuZGxlO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEluZGV4QnlSZXNpemVIYW5kbGUgPSAocmVzaXplSGFuZGxlOiBSZXNpemVIYW5kbGUpID0+IHtcbiAgICByZXR1cm4gTnVtYmVyKHJlc2l6ZUhhbmRsZSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0U3ltbWV0cmljSGFuZGxlSW5kZXggPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICBjb25zdCBvcmlnaW5JbmRleCA9IGlzRWRnZUhhbmRsZShib2FyZCwgZ2V0UmVzaXplSGFuZGxlQnlJbmRleChpbmRleCkpID8gaW5kZXggLSA0IDogaW5kZXg7XG4gICAgbGV0IG9yaWdpblN5bW1ldHJpY0hhbmRsZUluZGV4ID0gb3JpZ2luSW5kZXggKyAyO1xuICAgIGlmIChvcmlnaW5TeW1tZXRyaWNIYW5kbGVJbmRleCA+PSA0KSB7XG4gICAgICAgIG9yaWdpblN5bW1ldHJpY0hhbmRsZUluZGV4ID0gb3JpZ2luU3ltbWV0cmljSGFuZGxlSW5kZXggLSA0O1xuICAgIH1cbiAgICByZXR1cm4gaXNFZGdlSGFuZGxlKGJvYXJkLCBnZXRSZXNpemVIYW5kbGVCeUluZGV4KGluZGV4KSkgPyBvcmlnaW5TeW1tZXRyaWNIYW5kbGVJbmRleCArIDQgOiBvcmlnaW5TeW1tZXRyaWNIYW5kbGVJbmRleDtcbn07XG5cbmNvbnN0IGdldFJlc2l6ZUN1cnNvckNsYXNzQnlJbmRleCA9IChpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgc3dpdGNoIChpbmRleCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIHJldHVybiBSZXNpemVDdXJzb3JDbGFzcy5ud3NlO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIHJldHVybiBSZXNpemVDdXJzb3JDbGFzcy5uZXN3O1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgIHJldHVybiBSZXNpemVDdXJzb3JDbGFzcy5ucztcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICByZXR1cm4gUmVzaXplQ3Vyc29yQ2xhc3MuZXc7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Um90YXRlZFJlc2l6ZUN1cnNvckNsYXNzQnlBbmdsZSA9IChjdXJzb3I6IFJlc2l6ZUN1cnNvckNsYXNzLCBhbmdsZTogbnVtYmVyKSA9PiB7XG4gICAgY29uc3QgaW5kZXggPSBSRVNJWkVfQ1VSU09SUy5pbmRleE9mKGN1cnNvcik7XG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgY29uc3QgdGVtcCA9IE1hdGgucm91bmQoYW5nbGUgLyAoTWF0aC5QSSAvIDQpKTtcbiAgICAgICAgY3Vyc29yID0gUkVTSVpFX0NVUlNPUlNbKGluZGV4ICsgdGVtcCkgJSBSRVNJWkVfQ1VSU09SUy5sZW5ndGhdIGFzIFJlc2l6ZUN1cnNvckNsYXNzO1xuICAgIH1cbiAgICByZXR1cm4gY3Vyc29yO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFJlY3RhbmdsZVJlc2l6ZUhhbmRsZVJlZnMgPSAocmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnQsIGRpYW1ldGVyOiBudW1iZXIsIGFuZ2xlOiBudW1iZXIgPSAwKSA9PiB7XG4gICAgY29uc3QgY29ybmVycyA9IFJlY3RhbmdsZUNsaWVudC5nZXRDb3JuZXJQb2ludHMocmVjdGFuZ2xlKTtcbiAgICBjb25zdCByZWZzID0gY29ybmVycy5tYXAoKGNvcm5lciwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmVjdGFuZ2xlOiB7XG4gICAgICAgICAgICAgICAgeDogY29ybmVyWzBdIC0gZGlhbWV0ZXIgLyAyLFxuICAgICAgICAgICAgICAgIHk6IGNvcm5lclsxXSAtIGRpYW1ldGVyIC8gMixcbiAgICAgICAgICAgICAgICB3aWR0aDogZGlhbWV0ZXIsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBkaWFtZXRlclxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhhbmRsZTogZ2V0UmVzaXplSGFuZGxlQnlJbmRleChpbmRleCkgYXMgUmVzaXplSGFuZGxlLFxuICAgICAgICAgICAgY3Vyc29yQ2xhc3M6IGdldFJvdGF0ZWRSZXNpemVDdXJzb3JDbGFzc0J5QW5nbGUoZ2V0UmVzaXplQ3Vyc29yQ2xhc3NCeUluZGV4KGluZGV4KSBhcyBSZXNpemVDdXJzb3JDbGFzcywgYW5nbGUpXG4gICAgICAgIH07XG4gICAgfSk7XG4gICAgY29uc3QgcmVjdGFuZ2xlcyA9IGdldFJlc2l6ZVNpZGVSZWN0YW5nbGVzKGNvcm5lcnMsIGRpYW1ldGVyIC8gMik7XG4gICAgcmVmcy5wdXNoKFxuICAgICAgICAuLi5yZWN0YW5nbGVzLm1hcCgocmVjdGFuZ2xlLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICByZWN0YW5nbGUsXG4gICAgICAgICAgICAgICAgaGFuZGxlOiBnZXRSZXNpemVIYW5kbGVCeUluZGV4KGluZGV4ICsgNCkgYXMgUmVzaXplSGFuZGxlLFxuICAgICAgICAgICAgICAgIGN1cnNvckNsYXNzOiBnZXRSb3RhdGVkUmVzaXplQ3Vyc29yQ2xhc3NCeUFuZ2xlKGdldFJlc2l6ZUN1cnNvckNsYXNzQnlJbmRleChpbmRleCArIDQpIGFzIFJlc2l6ZUN1cnNvckNsYXNzLCBhbmdsZSlcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pXG4gICAgKTtcbiAgICByZXR1cm4gcmVmcztcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRSZXNpemVIYW5kbGVQb2ludEJ5SW5kZXggPSAocmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnQsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICBpZiAoaW5kZXggPD0gMykge1xuICAgICAgICBjb25zdCBjb3JuZXJzID0gUmVjdGFuZ2xlQ2xpZW50LmdldENvcm5lclBvaW50cyhyZWN0YW5nbGUpO1xuICAgICAgICByZXR1cm4gY29ybmVyc1tpbmRleF07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZWRnZUNlbnRlclBvaW50cyA9IFJlY3RhbmdsZUNsaWVudC5nZXRFZGdlQ2VudGVyUG9pbnRzKHJlY3RhbmdsZSk7XG4gICAgICAgIHJldHVybiBlZGdlQ2VudGVyUG9pbnRzW2luZGV4IC0gNF07XG4gICAgfVxufTtcblxuY29uc3QgZ2V0UmVzaXplU2lkZVJlY3RhbmdsZXMgPSAoY29ybmVyUG9pbnRzOiBQb2ludFtdLCBvZmZzZXQ6IG51bWJlcik6IFJlY3RhbmdsZUNsaWVudFtdID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvcm5lclBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgcmVjdGFuZ2xlID0gUmVjdGFuZ2xlQ2xpZW50LmdldFJlY3RhbmdsZUJ5UG9pbnRzKFtjb3JuZXJQb2ludHNbaV0sIGNvcm5lclBvaW50c1soaSArIDEpICUgNF1dKTtcbiAgICAgICAgY29uc3QgYXJyID0gbmV3IEFycmF5KDIpLmZpbGwoMCk7XG4gICAgICAgIGFyclsoaSArIDEpICUgMl0gPSBvZmZzZXQgLyAyO1xuICAgICAgICByZWN0YW5nbGUgPSBSZWN0YW5nbGVDbGllbnQuZXhwYW5kKHJlY3RhbmdsZSwgYXJyWzBdLCBhcnJbMV0pO1xuICAgICAgICByZXN1bHQucHVzaChyZWN0YW5nbGUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufTtcblxuZXhwb3J0IGNvbnN0IElTX1JFU0laSU5HID0gbmV3IFdlYWtNYXA8UGxhaXRCb2FyZCwgUmVzaXplUmVmPGFueSwgYW55Pj4oKTtcblxuZXhwb3J0IGNvbnN0IGlzUmVzaXppbmcgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQpID0+IHtcbiAgICByZXR1cm4gISFJU19SRVNJWklORy5nZXQoYm9hcmQpO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzUmVzaXppbmdCeUNvbmRpdGlvbiA9IDxUIGV4dGVuZHMgUGxhaXRFbGVtZW50T3JBcnJheSwgSz4oXG4gICAgYm9hcmQ6IFBsYWl0Qm9hcmQsXG4gICAgbWF0Y2g6IChyZXNpemVSZWY6IFJlc2l6ZVJlZjxULCBLPikgPT4gYm9vbGVhblxuKSA9PiB7XG4gICAgcmV0dXJuIGlzUmVzaXppbmcoYm9hcmQpICYmIG1hdGNoKElTX1JFU0laSU5HLmdldChib2FyZCkhKTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRSZXNpemluZyA9IDxUIGV4dGVuZHMgUGxhaXRFbGVtZW50T3JBcnJheSwgSz4oYm9hcmQ6IFBsYWl0Qm9hcmQsIHJlc2l6ZVJlZjogUmVzaXplUmVmPFQsIEs+LCBrZXk6IHN0cmluZykgPT4ge1xuICAgIFBsYWl0Qm9hcmQuZ2V0Qm9hcmRDb250YWluZXIoYm9hcmQpLmNsYXNzTGlzdC5hZGQoYCR7a2V5fS1yZXNpemluZ2ApO1xuICAgIElTX1JFU0laSU5HLnNldChib2FyZCwgcmVzaXplUmVmKTtcbiAgICBzZXREcmFnZ2luZyhib2FyZCwgdHJ1ZSk7XG59O1xuXG5leHBvcnQgY29uc3QgcmVtb3ZlUmVzaXppbmcgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgUGxhaXRCb2FyZC5nZXRCb2FyZENvbnRhaW5lcihib2FyZCkuY2xhc3NMaXN0LnJlbW92ZShgJHtrZXl9LXJlc2l6aW5nYCk7XG4gICAgSVNfUkVTSVpJTkcuZGVsZXRlKGJvYXJkKTtcbiAgICBzZXREcmFnZ2luZyhib2FyZCwgZmFsc2UpO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzRWRnZUhhbmRsZSA9IChib2FyZDogUGxhaXRCb2FyZCwgaGFuZGxlOiBSZXNpemVIYW5kbGUpID0+IHtcbiAgICBjb25zdCBpbmRleCA9IGdldEluZGV4QnlSZXNpemVIYW5kbGUoaGFuZGxlKTtcbiAgICBpZiAoaW5kZXggPj0gNCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGlzQ29ybmVySGFuZGxlID0gKGJvYXJkOiBQbGFpdEJvYXJkLCBoYW5kbGU6IFJlc2l6ZUhhbmRsZSkgPT4ge1xuICAgIHJldHVybiAhaXNFZGdlSGFuZGxlKGJvYXJkLCBoYW5kbGUpO1xufTtcblxuLy8g5aSE55CG5YWD57Sg5YWI5peL6L2s5ZCOcmVzaXpl5a+86Ie055qE5L2N572u5YGP56e7XG5leHBvcnQgY29uc3QgcmVzZXRQb2ludHNBZnRlclJlc2l6ZSA9IChcbiAgICBvcmlnaW5SZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCxcbiAgICBjdXJyZW50UmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnQsXG4gICAgb3JpZ2luU2VsZWN0aW9uQ2VudGVyUG9pbnQ6IFBvaW50LFxuICAgIGN1cnJlbnRTZWxlY3Rpb25DZW50ZXJQb2ludDogUG9pbnQsXG4gICAgYW5nbGU6IG51bWJlclxuKTogW1BvaW50LCBQb2ludF0gPT4ge1xuICAgIGNvbnN0IGNvcnJlY3RTZWxlY3Rpb25DZW50ZXJQb2ludCA9IHJvdGF0ZVBvaW50cyhbY3VycmVudFNlbGVjdGlvbkNlbnRlclBvaW50XSwgb3JpZ2luU2VsZWN0aW9uQ2VudGVyUG9pbnQsIGFuZ2xlKVswXTtcbiAgICBjb25zdCByb3RhdGVkRWxlbWVudENlbnRlclBvaW50ID0gcm90YXRlUG9pbnRzKFxuICAgICAgICBbUmVjdGFuZ2xlQ2xpZW50LmdldENlbnRlclBvaW50KGN1cnJlbnRSZWN0YW5nbGUpIGFzIFBvaW50XSxcbiAgICAgICAgb3JpZ2luU2VsZWN0aW9uQ2VudGVyUG9pbnQsXG4gICAgICAgIGFuZ2xlXG4gICAgKVswXTtcblxuICAgIGNvbnN0IGN1cnJlbnRQb2ludHMgPSBSZWN0YW5nbGVDbGllbnQuZ2V0UG9pbnRzKGN1cnJlbnRSZWN0YW5nbGUpO1xuICAgIGNvbnN0IG9yaWdpblJlY3RhbmdsZUNlbnRlclBvaW50ID0gUmVjdGFuZ2xlQ2xpZW50LmdldENlbnRlclBvaW50KG9yaWdpblJlY3RhbmdsZSk7XG5cbiAgICBjb25zdCBjb3JyZWN0RWxlbWVudENlbnRlclBvaW50ID0gcm90YXRlUG9pbnRzKFtyb3RhdGVkRWxlbWVudENlbnRlclBvaW50XSwgY29ycmVjdFNlbGVjdGlvbkNlbnRlclBvaW50LCAtYW5nbGUpWzBdO1xuXG4gICAgY29uc3Qgcm90YXRlZFBvaW50cyA9IHJvdGF0ZVBvaW50cyhjdXJyZW50UG9pbnRzLCBvcmlnaW5SZWN0YW5nbGVDZW50ZXJQb2ludCwgYW5nbGUpO1xuICAgIHJldHVybiByb3RhdGVQb2ludHMocm90YXRlZFBvaW50cywgY29ycmVjdEVsZW1lbnRDZW50ZXJQb2ludCwgLWFuZ2xlKSBhcyBbUG9pbnQsIFBvaW50XTtcbn07XG4iXX0=
@@ -30,4 +30,14 @@ export function rotateVectorAnti90(vector) {
30
30
  const rotatedY = -x;
31
31
  return [rotatedX, rotatedY];
32
32
  }
33
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tbW9uL3NyYy91dGlscy92ZWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxVQUFVLDRCQUE0QixDQUFDLE1BQWEsRUFBRSxNQUFhO0lBQ3JFLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDO0lBQzlELG9EQUFvRDtJQUNwRCxJQUFJLFFBQVEsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLDREQUE0RCxDQUFDLENBQUM7SUFDbEYsQ0FBQztJQUNELHVDQUF1QztJQUN2QyxNQUFNLEtBQUssR0FBRyxNQUFNLEdBQUcsUUFBUSxDQUFDO0lBQ2hDLE1BQU0sS0FBSyxHQUFHLE1BQU0sR0FBRyxRQUFRLENBQUM7SUFFaEMsT0FBTyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztBQUMxQixDQUFDO0FBRUQsTUFBTSxVQUFVLHlCQUF5QixDQUFDLEtBQVksRUFBRSxNQUFjLEVBQUUsU0FBaUI7SUFDckYsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEQsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsR0FBRyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDO0FBQzFHLENBQUM7QUFFRCxNQUFNLFVBQVUsa0NBQWtDLENBQzlDLEtBQVksRUFDWixVQUFrQixFQUNsQixrQkFBMEIsRUFDMUIsWUFBcUI7SUFFckIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFVLENBQUM7SUFDckgsQ0FBQztTQUFNLENBQUM7UUFDSixPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxrQkFBa0IsQ0FBVSxDQUFDO0lBQ3JILENBQUM7QUFDTCxDQUFDO0FBRUQsTUFBTSxVQUFVLGtCQUFrQixDQUFDLE1BQWM7SUFDN0MsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BCLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwQixNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFDbkIsTUFBTSxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDcEIsT0FBTyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUNoQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUG9pbnQsIFZlY3RvciB9IGZyb20gJ0BwbGFpdC9jb3JlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFVuaXRWZWN0b3JCeVBvaW50QW5kUG9pbnQocG9pbnQxOiBQb2ludCwgcG9pbnQyOiBQb2ludCk6IFBvaW50IHtcbiAgICBjb25zdCBkZWx0YVggPSBwb2ludDJbMF0gLSBwb2ludDFbMF07XG4gICAgY29uc3QgZGVsdGFZID0gcG9pbnQyWzFdIC0gcG9pbnQxWzFdO1xuICAgIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5zcXJ0KGRlbHRhWCAqIGRlbHRhWCArIGRlbHRhWSAqIGRlbHRhWSk7XG4gICAgLy8gQXZvaWQgZGl2aXNpb24gYnkgemVybyBpZiB0aGUgcG9pbnRzIGFyZSB0aGUgc2FtZVxuICAgIGlmIChkaXN0YW5jZSA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BvaW50cyBtdXN0IG5vdCBiZSB0aGUgc2FtZSBmb3IgYSB1bml0IHZlY3RvciBjYWxjdWxhdGlvbi4nKTtcbiAgICB9XG4gICAgLy8gQ2FsY3VsYXRlIHRoZSB1bml0IHZlY3RvciBjb21wb25lbnRzXG4gICAgY29uc3QgdW5pdFggPSBkZWx0YVggLyBkaXN0YW5jZTtcbiAgICBjb25zdCB1bml0WSA9IGRlbHRhWSAvIGRpc3RhbmNlO1xuXG4gICAgcmV0dXJuIFt1bml0WCwgdW5pdFldO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UG9pbnRCeVZlY3RvckNvbXBvbmVudChwb2ludDogUG9pbnQsIHZlY3RvcjogVmVjdG9yLCBjb21wb25lbnQ6IG51bWJlcik6IFBvaW50IHtcbiAgICBjb25zdCBkaXN0YW5jZSA9IE1hdGguaHlwb3QodmVjdG9yWzBdLCB2ZWN0b3JbMV0pO1xuICAgIHJldHVybiBbcG9pbnRbMF0gKyAodmVjdG9yWzBdIC8gZGlzdGFuY2UpICogY29tcG9uZW50LCBwb2ludFsxXSArICh2ZWN0b3JbMV0gLyBkaXN0YW5jZSkgKiBjb21wb25lbnRdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UG9pbnRCeVZlY3RvckRpcmVjdGlvbkNvbXBvbmVudChcbiAgICBwb2ludDogUG9pbnQsXG4gICAgdW5pdFZlY3RvcjogVmVjdG9yLFxuICAgIGRpcmVjdGlvbkNvbXBvbmVudDogbnVtYmVyLFxuICAgIGlzSG9yaXpvbnRhbDogYm9vbGVhblxuKSB7XG4gICAgaWYgKGlzSG9yaXpvbnRhbCkge1xuICAgICAgICByZXR1cm4gW3BvaW50WzBdICsgZGlyZWN0aW9uQ29tcG9uZW50LCBwb2ludFsxXSArIChkaXJlY3Rpb25Db21wb25lbnQgLyB1bml0VmVjdG9yWzBdKSAqIHVuaXRWZWN0b3JbMV1dIGFzIFBvaW50O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBbcG9pbnRbMF0gKyAoZGlyZWN0aW9uQ29tcG9uZW50IC8gdW5pdFZlY3RvclsxXSkgKiB1bml0VmVjdG9yWzBdLCBwb2ludFsxXSArIGRpcmVjdGlvbkNvbXBvbmVudF0gYXMgUG9pbnQ7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlVmVjdG9yQW50aTkwKHZlY3RvcjogVmVjdG9yKTogVmVjdG9yIHtcbiAgICBjb25zdCB4ID0gdmVjdG9yWzBdO1xuICAgIGNvbnN0IHkgPSB2ZWN0b3JbMV07XG4gICAgY29uc3Qgcm90YXRlZFggPSB5O1xuICAgIGNvbnN0IHJvdGF0ZWRZID0gLXg7XG4gICAgcmV0dXJuIFtyb3RhdGVkWCwgcm90YXRlZFldO1xufVxuIl19
33
+ export function rotateVector(vector, angle) {
34
+ if (!angle) {
35
+ return vector;
36
+ }
37
+ const x = vector[0];
38
+ const y = vector[1];
39
+ const rotatedX = x * Math.cos(angle) - y * Math.sin(angle);
40
+ const rotatedY = x * Math.sin(angle) + y * Math.cos(angle);
41
+ return [rotatedX, rotatedY];
42
+ }
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tbW9uL3NyYy91dGlscy92ZWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxVQUFVLDRCQUE0QixDQUFDLE1BQWEsRUFBRSxNQUFhO0lBQ3JFLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDO0lBQzlELG9EQUFvRDtJQUNwRCxJQUFJLFFBQVEsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLDREQUE0RCxDQUFDLENBQUM7SUFDbEYsQ0FBQztJQUNELHVDQUF1QztJQUN2QyxNQUFNLEtBQUssR0FBRyxNQUFNLEdBQUcsUUFBUSxDQUFDO0lBQ2hDLE1BQU0sS0FBSyxHQUFHLE1BQU0sR0FBRyxRQUFRLENBQUM7SUFFaEMsT0FBTyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztBQUMxQixDQUFDO0FBRUQsTUFBTSxVQUFVLHlCQUF5QixDQUFDLEtBQVksRUFBRSxNQUFjLEVBQUUsU0FBaUI7SUFDckYsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEQsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsR0FBRyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDO0FBQzFHLENBQUM7QUFFRCxNQUFNLFVBQVUsa0NBQWtDLENBQUMsS0FBWSxFQUFFLFVBQWtCLEVBQUUsa0JBQTBCLEVBQUUsWUFBcUI7SUFDbEksSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFVLENBQUM7SUFDckgsQ0FBQztTQUFNLENBQUM7UUFDSixPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxrQkFBa0IsQ0FBVSxDQUFDO0lBQ3JILENBQUM7QUFDTCxDQUFDO0FBRUQsTUFBTSxVQUFVLGtCQUFrQixDQUFDLE1BQWM7SUFDN0MsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BCLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwQixNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFDbkIsTUFBTSxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDcEIsT0FBTyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUNoQyxDQUFDO0FBRUQsTUFBTSxVQUFVLFlBQVksQ0FBQyxNQUFjLEVBQUUsS0FBYTtJQUN0RCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDVCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBQ0QsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BCLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwQixNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzRCxNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzRCxPQUFPLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ2hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQb2ludCwgVmVjdG9yIH0gZnJvbSAnQHBsYWl0L2NvcmUnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VW5pdFZlY3RvckJ5UG9pbnRBbmRQb2ludChwb2ludDE6IFBvaW50LCBwb2ludDI6IFBvaW50KTogUG9pbnQge1xuICAgIGNvbnN0IGRlbHRhWCA9IHBvaW50MlswXSAtIHBvaW50MVswXTtcbiAgICBjb25zdCBkZWx0YVkgPSBwb2ludDJbMV0gLSBwb2ludDFbMV07XG4gICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZGVsdGFYICogZGVsdGFYICsgZGVsdGFZICogZGVsdGFZKTtcbiAgICAvLyBBdm9pZCBkaXZpc2lvbiBieSB6ZXJvIGlmIHRoZSBwb2ludHMgYXJlIHRoZSBzYW1lXG4gICAgaWYgKGRpc3RhbmNlID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUG9pbnRzIG11c3Qgbm90IGJlIHRoZSBzYW1lIGZvciBhIHVuaXQgdmVjdG9yIGNhbGN1bGF0aW9uLicpO1xuICAgIH1cbiAgICAvLyBDYWxjdWxhdGUgdGhlIHVuaXQgdmVjdG9yIGNvbXBvbmVudHNcbiAgICBjb25zdCB1bml0WCA9IGRlbHRhWCAvIGRpc3RhbmNlO1xuICAgIGNvbnN0IHVuaXRZID0gZGVsdGFZIC8gZGlzdGFuY2U7XG5cbiAgICByZXR1cm4gW3VuaXRYLCB1bml0WV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQb2ludEJ5VmVjdG9yQ29tcG9uZW50KHBvaW50OiBQb2ludCwgdmVjdG9yOiBWZWN0b3IsIGNvbXBvbmVudDogbnVtYmVyKTogUG9pbnQge1xuICAgIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5oeXBvdCh2ZWN0b3JbMF0sIHZlY3RvclsxXSk7XG4gICAgcmV0dXJuIFtwb2ludFswXSArICh2ZWN0b3JbMF0gLyBkaXN0YW5jZSkgKiBjb21wb25lbnQsIHBvaW50WzFdICsgKHZlY3RvclsxXSAvIGRpc3RhbmNlKSAqIGNvbXBvbmVudF07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQb2ludEJ5VmVjdG9yRGlyZWN0aW9uQ29tcG9uZW50KHBvaW50OiBQb2ludCwgdW5pdFZlY3RvcjogVmVjdG9yLCBkaXJlY3Rpb25Db21wb25lbnQ6IG51bWJlciwgaXNIb3Jpem9udGFsOiBib29sZWFuKSB7XG4gICAgaWYgKGlzSG9yaXpvbnRhbCkge1xuICAgICAgICByZXR1cm4gW3BvaW50WzBdICsgZGlyZWN0aW9uQ29tcG9uZW50LCBwb2ludFsxXSArIChkaXJlY3Rpb25Db21wb25lbnQgLyB1bml0VmVjdG9yWzBdKSAqIHVuaXRWZWN0b3JbMV1dIGFzIFBvaW50O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBbcG9pbnRbMF0gKyAoZGlyZWN0aW9uQ29tcG9uZW50IC8gdW5pdFZlY3RvclsxXSkgKiB1bml0VmVjdG9yWzBdLCBwb2ludFsxXSArIGRpcmVjdGlvbkNvbXBvbmVudF0gYXMgUG9pbnQ7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlVmVjdG9yQW50aTkwKHZlY3RvcjogVmVjdG9yKTogVmVjdG9yIHtcbiAgICBjb25zdCB4ID0gdmVjdG9yWzBdO1xuICAgIGNvbnN0IHkgPSB2ZWN0b3JbMV07XG4gICAgY29uc3Qgcm90YXRlZFggPSB5O1xuICAgIGNvbnN0IHJvdGF0ZWRZID0gLXg7XG4gICAgcmV0dXJuIFtyb3RhdGVkWCwgcm90YXRlZFldO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlVmVjdG9yKHZlY3RvcjogVmVjdG9yLCBhbmdsZTogbnVtYmVyKTogVmVjdG9yIHtcbiAgICBpZiAoIWFuZ2xlKSB7XG4gICAgICAgIHJldHVybiB2ZWN0b3I7XG4gICAgfVxuICAgIGNvbnN0IHggPSB2ZWN0b3JbMF07XG4gICAgY29uc3QgeSA9IHZlY3RvclsxXTtcbiAgICBjb25zdCByb3RhdGVkWCA9IHggKiBNYXRoLmNvcyhhbmdsZSkgLSB5ICogTWF0aC5zaW4oYW5nbGUpO1xuICAgIGNvbnN0IHJvdGF0ZWRZID0geCAqIE1hdGguc2luKGFuZ2xlKSArIHkgKiBNYXRoLmNvcyhhbmdsZSk7XG4gICAgcmV0dXJuIFtyb3RhdGVkWCwgcm90YXRlZFldO1xufVxuIl19
@@ -1,9 +1,9 @@
1
- import { setAngleForG, RectangleClient, drawCircle, PlaitBoard, createG, drawRectangle, createForeignObject, updateForeignObject, ResizeCursorClass, setDragging, distanceBetweenPointAndPoint, Point, Direction, hotkeys, PlaitElement, PlaitContextService, rotate, getSelectedElements, Transforms, getRectangleByElements, MERGING, PlaitPointerType, isMainPointer, toViewBoxPoint, toHostPoint, preventTouchMove, PRESS_AND_MOVE_BUFFER, isDragging, throttleRAF, handleTouchTarget, PlaitPluginElementComponent, isSelectionMoving, ACTIVE_STROKE_WIDTH } from '@plait/core';
1
+ import { setAngleForG, RectangleClient, drawCircle, PlaitBoard, createG, drawRectangle, createForeignObject, updateForeignObject, ResizeCursorClass, RESIZE_CURSORS, setDragging, rotatePoints, distanceBetweenPointAndPoint, Point, Direction, hotkeys, PlaitElement, PlaitContextService, getSelectedElements, Transforms, getHighestSelectedElements, getRectangleByElements, PlaitGroupElement, getElementsInGroup, MERGING, PlaitPointerType, isMainPointer, toViewBoxPoint, toHostPoint, preventTouchMove, PRESS_AND_MOVE_BUFFER, isDragging, throttleRAF, handleTouchTarget, ACTIVE_STROKE_WIDTH, getRectangleByGroup, PlaitPluginElementComponent, isSelectionMoving, isSelectedElementOrGroup, Selection, getHitElementsBySelection, createGroupRectangleG, getSelectedGroups, getHighestSelectedGroups, getSelectedIsolatedElements, idCreator, GroupTransforms, getSelectedIsolatedElementsCanAddToGroup, getGroupByElement } from '@plait/core';
2
2
  import { isKeyHotkey } from 'is-hotkey';
3
3
  import { PlaitMarkEditor, MarkTypes, AlignEditor } from '@plait/text';
4
4
  import { Node, Transforms as Transforms$1, Editor } from 'slate';
5
5
  import * as i0 from '@angular/core';
6
- import { Directive, Input } from '@angular/core';
6
+ import { Component, ChangeDetectionStrategy, Directive, Input } from '@angular/core';
7
7
 
8
8
  const BASE = 4;
9
9
  const PRIMARY_COLOR = '#6698FF';
@@ -178,12 +178,16 @@ class ImageGenerator extends Generator {
178
178
  updateImage(nodeG, previous, current) {
179
179
  if (previous !== current && this.componentRef) {
180
180
  this.componentRef.instance.imageItem = this.options.getImageItem(current);
181
+ this.componentRef.instance.element = current;
181
182
  this.componentRef.instance.getRectangle = () => {
182
183
  return this.options.getRectangle(current);
183
184
  };
184
185
  }
185
186
  const currentForeignObject = this.options.getRectangle(current);
186
187
  updateForeignObject(this.g, currentForeignObject.width, currentForeignObject.height, currentForeignObject.x, currentForeignObject.y);
188
+ if (currentForeignObject && current.angle) {
189
+ setAngleForG(this.g, RectangleClient.getCenterPoint(currentForeignObject), current.angle);
190
+ }
187
191
  // solve image lose on move node
188
192
  if (this.foreignObject.children.length === 0) {
189
193
  this.foreignObject.append(this.componentRef.instance.nativeElement);
@@ -228,7 +232,15 @@ const getResizeCursorClassByIndex = (index) => {
228
232
  return null;
229
233
  }
230
234
  };
231
- const getRectangleResizeHandleRefs = (rectangle, diameter) => {
235
+ const getRotatedResizeCursorClassByAngle = (cursor, angle) => {
236
+ const index = RESIZE_CURSORS.indexOf(cursor);
237
+ if (index >= 0) {
238
+ const temp = Math.round(angle / (Math.PI / 4));
239
+ cursor = RESIZE_CURSORS[(index + temp) % RESIZE_CURSORS.length];
240
+ }
241
+ return cursor;
242
+ };
243
+ const getRectangleResizeHandleRefs = (rectangle, diameter, angle = 0) => {
232
244
  const corners = RectangleClient.getCornerPoints(rectangle);
233
245
  const refs = corners.map((corner, index) => {
234
246
  return {
@@ -239,7 +251,7 @@ const getRectangleResizeHandleRefs = (rectangle, diameter) => {
239
251
  height: diameter
240
252
  },
241
253
  handle: getResizeHandleByIndex(index),
242
- cursorClass: getResizeCursorClassByIndex(index)
254
+ cursorClass: getRotatedResizeCursorClassByAngle(getResizeCursorClassByIndex(index), angle)
243
255
  };
244
256
  });
245
257
  const rectangles = getResizeSideRectangles(corners, diameter / 2);
@@ -247,7 +259,7 @@ const getRectangleResizeHandleRefs = (rectangle, diameter) => {
247
259
  return {
248
260
  rectangle,
249
261
  handle: getResizeHandleByIndex(index + 4),
250
- cursorClass: getResizeCursorClassByIndex(index + 4)
262
+ cursorClass: getRotatedResizeCursorClassByAngle(getResizeCursorClassByIndex(index + 4), angle)
251
263
  };
252
264
  }));
253
265
  return refs;
@@ -302,6 +314,16 @@ const isEdgeHandle = (board, handle) => {
302
314
  const isCornerHandle = (board, handle) => {
303
315
  return !isEdgeHandle(board, handle);
304
316
  };
317
+ // 处理元素先旋转后resize导致的位置偏移
318
+ const resetPointsAfterResize = (originRectangle, currentRectangle, originSelectionCenterPoint, currentSelectionCenterPoint, angle) => {
319
+ const correctSelectionCenterPoint = rotatePoints([currentSelectionCenterPoint], originSelectionCenterPoint, angle)[0];
320
+ const rotatedElementCenterPoint = rotatePoints([RectangleClient.getCenterPoint(currentRectangle)], originSelectionCenterPoint, angle)[0];
321
+ const currentPoints = RectangleClient.getPoints(currentRectangle);
322
+ const originRectangleCenterPoint = RectangleClient.getCenterPoint(originRectangle);
323
+ const correctElementCenterPoint = rotatePoints([rotatedElementCenterPoint], correctSelectionCenterPoint, -angle)[0];
324
+ const rotatedPoints = rotatePoints(currentPoints, originRectangleCenterPoint, angle);
325
+ return rotatePoints(rotatedPoints, correctElementCenterPoint, -angle);
326
+ };
305
327
 
306
328
  function getUnitVectorByPointAndPoint(point1, point2) {
307
329
  const deltaX = point2[0] - point1[0];
@@ -335,6 +357,16 @@ function rotateVectorAnti90(vector) {
335
357
  const rotatedY = -x;
336
358
  return [rotatedX, rotatedY];
337
359
  }
360
+ function rotateVector(vector, angle) {
361
+ if (!angle) {
362
+ return vector;
363
+ }
364
+ const x = vector[0];
365
+ const y = vector[1];
366
+ const rotatedX = x * Math.cos(angle) - y * Math.sin(angle);
367
+ const rotatedY = x * Math.sin(angle) + y * Math.cos(angle);
368
+ return [rotatedX, rotatedY];
369
+ }
338
370
 
339
371
  function isPointOnSegment(point, startPoint, endPoint) {
340
372
  const distanceToStart = distanceBetweenPointAndPoint(point[0], point[1], startPoint[0], startPoint[1]);
@@ -1136,12 +1168,6 @@ const getMemorizedLatest = (memorizedKey) => {
1136
1168
  return map.get(memorizedKey);
1137
1169
  };
1138
1170
 
1139
- const rotatePoints = (points, centerPoint, angle) => {
1140
- return points.map(point => {
1141
- return rotate(point[0], point[1], centerPoint[0], centerPoint[1], angle);
1142
- });
1143
- };
1144
-
1145
1171
  const setProperty = (board, properties, options) => {
1146
1172
  const selectedElements = getSelectedElements(board);
1147
1173
  selectedElements.forEach(element => {
@@ -1221,19 +1247,27 @@ const alignRight = (board) => {
1221
1247
  setOffset(board, getOffset);
1222
1248
  };
1223
1249
  function setOffset(board, getOffset) {
1224
- let elements = getSelectedElements(board);
1225
- elements = elements.filter(element => board.children.includes(element));
1250
+ const elements = getHighestSelectedElements(board);
1226
1251
  const outerRectangle = getRectangleByElements(board, elements, false);
1227
1252
  elements.forEach(element => {
1228
- if (!element.points)
1253
+ if (!element.points && !PlaitGroupElement.isGroup(element))
1229
1254
  return;
1230
- const path = PlaitBoard.findPath(board, element);
1231
1255
  const rectangle = board.getRectangle(element);
1232
1256
  const offset = getOffset(outerRectangle, rectangle);
1233
- const newPoints = element.points.map(p => [p[0] + offset[0], p[1] + offset[1]]);
1234
- Transforms.setNode(board, {
1235
- points: newPoints
1236
- }, path);
1257
+ let updateElements = [];
1258
+ if (PlaitGroupElement.isGroup(element)) {
1259
+ updateElements = getElementsInGroup(board, element, true, false);
1260
+ }
1261
+ else if (element.points) {
1262
+ updateElements = [element];
1263
+ }
1264
+ updateElements.forEach(item => {
1265
+ const newPoints = item.points.map(p => [p[0] + offset[0], p[1] + offset[1]]);
1266
+ const path = PlaitBoard.findPath(board, item);
1267
+ Transforms.setNode(board, {
1268
+ points: newPoints
1269
+ }, path);
1270
+ });
1237
1271
  MERGING.set(board, true);
1238
1272
  });
1239
1273
  MERGING.set(board, false);
@@ -1247,11 +1281,11 @@ const distributeVertical = (board) => {
1247
1281
  const distribute = (board, isHorizontal) => {
1248
1282
  const axis = isHorizontal ? 'x' : 'y';
1249
1283
  const side = isHorizontal ? 'width' : 'height';
1250
- const selectedElements = getSelectedElements(board).filter(element => board.children.includes(element));
1251
- const refs = selectedElements.map(element => {
1284
+ const highestSelectedElements = getHighestSelectedElements(board);
1285
+ const refs = highestSelectedElements.map(element => {
1252
1286
  return { element, rectangle: board.getRectangle(element) };
1253
1287
  });
1254
- const outerRectangle = getRectangleByElements(board, selectedElements, false);
1288
+ const outerRectangle = getRectangleByElements(board, highestSelectedElements, false);
1255
1289
  const minRectangleRef = refs.sort((a, b) => a.rectangle[axis] - b.rectangle[axis])[0];
1256
1290
  const maxRectangleRef = refs.sort((a, b) => b.rectangle[axis] + b.rectangle[side] - (a.rectangle[axis] + a.rectangle[side]))[0];
1257
1291
  const minIndex = refs.findIndex(ref => ref === minRectangleRef);
@@ -1470,6 +1504,25 @@ const withResize = (board, options) => {
1470
1504
  return board;
1471
1505
  };
1472
1506
 
1507
+ class GroupGenerator extends Generator {
1508
+ canDraw(element) {
1509
+ return true;
1510
+ }
1511
+ draw(element, partialSelected) {
1512
+ const options = {
1513
+ stroke: '',
1514
+ strokeWidth: ACTIVE_STROKE_WIDTH,
1515
+ strokeLineDash: [5]
1516
+ };
1517
+ let rectangle = { x: 0, y: 0, width: 0, height: 0 };
1518
+ if (partialSelected) {
1519
+ options.stroke = '#999';
1520
+ rectangle = getRectangleByGroup(this.board, element, true);
1521
+ }
1522
+ return drawRectangle(this.board, rectangle, options);
1523
+ }
1524
+ }
1525
+
1473
1526
  class CommonPluginElement extends PlaitPluginElementComponent {
1474
1527
  constructor() {
1475
1528
  super(...arguments);
@@ -1492,6 +1545,234 @@ class CommonPluginElement extends PlaitPluginElementComponent {
1492
1545
  }
1493
1546
  }
1494
1547
 
1548
+ class GroupComponent extends CommonPluginElement {
1549
+ constructor(viewContainerRef, cdr) {
1550
+ super(cdr);
1551
+ this.viewContainerRef = viewContainerRef;
1552
+ this.cdr = cdr;
1553
+ }
1554
+ initializeGenerator() {
1555
+ this.activeGenerator = new ActiveGenerator(this.board, {
1556
+ getRectangle: (element) => {
1557
+ return getRectangleByGroup(this.board, element);
1558
+ },
1559
+ getStrokeWidth: () => 0,
1560
+ getStrokeOpacity: () => 0,
1561
+ hasResizeHandle: () => {
1562
+ return !isSelectionMoving(this.board);
1563
+ }
1564
+ });
1565
+ this.groupGenerator = new GroupGenerator(this.board);
1566
+ }
1567
+ ngOnInit() {
1568
+ super.ngOnInit();
1569
+ this.initializeGenerator();
1570
+ }
1571
+ onContextChanged(value, previous) {
1572
+ const elementsInGroup = getElementsInGroup(this.board, value.element, false, true);
1573
+ const isPartialSelectGroup = elementsInGroup.some(item => isSelectedElementOrGroup(this.board, item)) &&
1574
+ !elementsInGroup.every(item => isSelectedElementOrGroup(this.board, item));
1575
+ this.groupGenerator.processDrawing(value.element, this.g, isPartialSelectGroup);
1576
+ }
1577
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: GroupComponent, deps: [{ token: i0.ViewContainerRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
1578
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.2.4", type: GroupComponent, isStandalone: true, selector: "plait-group", usesInheritance: true, ngImport: i0, template: ``, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1579
+ }
1580
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: GroupComponent, decorators: [{
1581
+ type: Component,
1582
+ args: [{
1583
+ selector: 'plait-group',
1584
+ template: ``,
1585
+ changeDetection: ChangeDetectionStrategy.OnPush,
1586
+ standalone: true
1587
+ }]
1588
+ }], ctorParameters: () => [{ type: i0.ViewContainerRef }, { type: i0.ChangeDetectorRef }] });
1589
+
1590
+ function withGroup(board) {
1591
+ let groupRectangleG;
1592
+ let removeGroups;
1593
+ const { drawElement, pointerMove, globalPointerUp, insertFragment, getDeletedFragment, deleteFragment, getRelatedFragment, getRectangle, keyDown } = board;
1594
+ board.drawElement = (context) => {
1595
+ if (PlaitGroupElement.isGroup(context.element)) {
1596
+ return GroupComponent;
1597
+ }
1598
+ return drawElement(context);
1599
+ };
1600
+ board.pointerMove = (event) => {
1601
+ groupRectangleG?.remove();
1602
+ const point = toViewBoxPoint(board, toHostPoint(board, event.x, event.y));
1603
+ let selection = { anchor: point, focus: point };
1604
+ if (board.selection && !Selection.isCollapsed(board.selection)) {
1605
+ selection = board.selection;
1606
+ }
1607
+ const hitElements = getHitElementsBySelection(board, selection);
1608
+ if (hitElements.length) {
1609
+ groupRectangleG = createGroupRectangleG(board, hitElements);
1610
+ groupRectangleG && PlaitBoard.getElementActiveHost(board).append(groupRectangleG);
1611
+ }
1612
+ pointerMove(event);
1613
+ };
1614
+ board.globalPointerUp = (event) => {
1615
+ groupRectangleG?.remove();
1616
+ groupRectangleG = null;
1617
+ globalPointerUp(event);
1618
+ };
1619
+ board.getRelatedFragment = (elements) => {
1620
+ const groups = getSelectedGroups(board);
1621
+ return getRelatedFragment([...elements, ...groups]);
1622
+ };
1623
+ board.insertFragment = (data, clipboardData, targetPoint) => {
1624
+ const elements = [];
1625
+ if (clipboardData?.elements?.length) {
1626
+ const groups = getHighestSelectedGroups(board, clipboardData?.elements);
1627
+ const selectedIsolatedElements = getSelectedIsolatedElements(board, clipboardData?.elements);
1628
+ selectedIsolatedElements.forEach(item => {
1629
+ elements.push(!item.groupId ? item : updateGroupId(item, undefined));
1630
+ });
1631
+ if (groups.length) {
1632
+ groups.forEach(item => {
1633
+ const newGroup = { ...updateGroupId(item, undefined), id: idCreator() };
1634
+ elements.push(newGroup);
1635
+ elements.push(...updateElementsGroupId(item, clipboardData.elements, newGroup.id));
1636
+ });
1637
+ }
1638
+ clipboardData.elements = elements;
1639
+ }
1640
+ insertFragment(data, clipboardData, targetPoint);
1641
+ const groupElements = elements?.filter(value => PlaitGroupElement.isGroup(value));
1642
+ groupElements.forEach(element => {
1643
+ Transforms.insertNode(board, element, [board.children.length]);
1644
+ });
1645
+ };
1646
+ board.getDeletedFragment = (data) => {
1647
+ if (removeGroups && removeGroups.length) {
1648
+ data.push(...removeGroups);
1649
+ }
1650
+ return getDeletedFragment(data);
1651
+ };
1652
+ board.deleteFragment = (data) => {
1653
+ removeGroups = getRemoveGroups(board);
1654
+ if (removeGroups?.length) {
1655
+ updateSiblingElementGroupId(board, removeGroups);
1656
+ }
1657
+ deleteFragment(data);
1658
+ removeGroups = null;
1659
+ };
1660
+ board.getRectangle = (element) => {
1661
+ if (PlaitGroupElement.isGroup(element)) {
1662
+ return getRectangleByGroup(board, element);
1663
+ }
1664
+ return getRectangle(element);
1665
+ };
1666
+ board.keyDown = (event) => {
1667
+ if (!PlaitBoard.isReadonly(board)) {
1668
+ if (isKeyHotkey('mod+g', event)) {
1669
+ event.preventDefault();
1670
+ GroupTransforms.addGroup(board);
1671
+ return;
1672
+ }
1673
+ if (isKeyHotkey('mod+shift+g', event)) {
1674
+ event.preventDefault();
1675
+ GroupTransforms.removeGroup(board);
1676
+ return;
1677
+ }
1678
+ }
1679
+ keyDown(event);
1680
+ };
1681
+ return board;
1682
+ }
1683
+ const updateGroupId = (element, groupId) => {
1684
+ return {
1685
+ ...element,
1686
+ groupId: groupId
1687
+ };
1688
+ };
1689
+ const updateElementsGroupId = (group, clipboardDataElements, newGroupId) => {
1690
+ const elements = [];
1691
+ const elementsInGroup = clipboardDataElements.filter(item => item.groupId === group.id);
1692
+ if (elementsInGroup.length) {
1693
+ elementsInGroup.forEach(item => {
1694
+ if (PlaitGroupElement.isGroup(item)) {
1695
+ const newGroup = { ...updateGroupId(item, newGroupId), id: idCreator() };
1696
+ elements.push(newGroup);
1697
+ elements.push(...updateElementsGroupId(item, clipboardDataElements, newGroup.id));
1698
+ }
1699
+ else {
1700
+ elements.push(updateGroupId(item, newGroupId));
1701
+ }
1702
+ });
1703
+ }
1704
+ return elements;
1705
+ };
1706
+ const getRemoveGroups = (board) => {
1707
+ const selectedGroups = board.getRelatedFragment([]);
1708
+ const removeGroups = [...selectedGroups];
1709
+ const highestSelectedGroups = getHighestSelectedGroups(board);
1710
+ const selectedIsolatedElements = getSelectedIsolatedElementsCanAddToGroup(board);
1711
+ const removeNodes = [...highestSelectedGroups, ...selectedIsolatedElements];
1712
+ removeNodes.forEach(item => {
1713
+ const hitElementGroups = getGroupByElement(board, item, true);
1714
+ if (hitElementGroups.length) {
1715
+ const elementsInGroup = getElementsInGroup(board, hitElementGroups[0], false, true);
1716
+ const siblingElements = elementsInGroup.filter(element => ![...removeNodes, ...removeGroups].map(item => item.id).includes(element.id));
1717
+ if (siblingElements.length === 1 || siblingElements.length === 0) {
1718
+ if (!removeGroups.includes(hitElementGroups[0])) {
1719
+ removeGroups.push(hitElementGroups[0]);
1720
+ }
1721
+ if (siblingElements.length === 1) {
1722
+ if (hitElementGroups.length > 1) {
1723
+ const aboveGroup = findAboveGroupWithAnotherElement(board, hitElementGroups.slice(1, hitElementGroups.length), [
1724
+ ...removeNodes,
1725
+ ...removeGroups
1726
+ ]);
1727
+ let index = hitElementGroups.length;
1728
+ if (aboveGroup) {
1729
+ index = hitElementGroups.findIndex(item => item.id === aboveGroup.id);
1730
+ }
1731
+ [...hitElementGroups.slice(1, index)].forEach(item => {
1732
+ if (!removeGroups.includes(item)) {
1733
+ removeGroups.push(item);
1734
+ }
1735
+ });
1736
+ }
1737
+ }
1738
+ }
1739
+ }
1740
+ });
1741
+ return removeGroups;
1742
+ };
1743
+ const findAboveGroupWithAnotherElement = (board, groups, excludeNodes) => {
1744
+ let group = null;
1745
+ for (let i = 0; i < groups.length; i++) {
1746
+ const elementsInGroup = getElementsInGroup(board, groups[i], false, true);
1747
+ const siblingElements = elementsInGroup.filter(element => !excludeNodes.map(item => item.id).includes(element.id));
1748
+ if (siblingElements.length > 0) {
1749
+ group = groups[i];
1750
+ break;
1751
+ }
1752
+ }
1753
+ return group;
1754
+ };
1755
+ const updateSiblingElementGroupId = (board, removeGroups) => {
1756
+ const selectedIsolatedElements = getSelectedIsolatedElementsCanAddToGroup(board);
1757
+ const highestSelectedGroups = getHighestSelectedGroups(board);
1758
+ const isolatedElementsInGroup = selectedIsolatedElements.filter(item => item.groupId);
1759
+ [...highestSelectedGroups, ...isolatedElementsInGroup].forEach(item => {
1760
+ const hitElementGroups = getGroupByElement(board, item, true);
1761
+ if (hitElementGroups.length) {
1762
+ const elementsInGroup = getElementsInGroup(board, hitElementGroups[0], false, true);
1763
+ const siblingElements = elementsInGroup.filter(element => element.id !== item.id);
1764
+ if (siblingElements.length === 1) {
1765
+ const removeGroupIds = removeGroups.map(item => item.id);
1766
+ if (hitElementGroups.some(group => removeGroupIds.includes(group.id))) {
1767
+ const group = hitElementGroups.find(group => !removeGroupIds.includes(group.id));
1768
+ const path = PlaitBoard.findPath(board, siblingElements[0]);
1769
+ Transforms.setNode(board, { groupId: group?.id || undefined }, path);
1770
+ }
1771
+ }
1772
+ }
1773
+ });
1774
+ };
1775
+
1495
1776
  class ImageBaseComponent {
1496
1777
  set imageItem(value) {
1497
1778
  this.afterImageItemChange(this._imageItem, value);
@@ -1549,7 +1830,7 @@ class ImageBaseComponent {
1549
1830
  drawFocus() {
1550
1831
  if (this.initialized) {
1551
1832
  const activeG = PlaitBoard.getElementActiveHost(this.board);
1552
- this.activeGenerator.processDrawing({}, activeG, { selected: this._isFocus });
1833
+ this.activeGenerator.processDrawing(this.element, activeG, { selected: this._isFocus });
1553
1834
  }
1554
1835
  }
1555
1836
  ngOnDestroy() {
@@ -1589,5 +1870,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImpor
1589
1870
  * Generated bundle index. Do not edit.
1590
1871
  */
1591
1872
 
1592
- export { AStar, ActiveGenerator, AlignTransform, BASE, BoardCreationMode, CommonPluginElement, DEFAULT_ROUTE_MARGIN, Generator, IS_RESIZING, ImageBaseComponent, ImageGenerator, MediaKeys, PICTURE_ACCEPTED_UPLOAD_SIZE, PRIMARY_COLOR, PointGraph, PointNode, PriorityQueue, PropertyTransforms, RESIZE_HANDLE_DIAMETER, ResizeHandle, TRANSPARENT, TextTransforms, WithCommonPluginKey, WithTextPluginKey, acceptImageTypes, addElementOfFocusedImage, addResizing, alignBottom, alignHorizontalCenter, alignLeft, alignRight, alignTop, alignVerticalCenter, buildImage, calculatePolylineLength, createGraph, distributeHorizontal, distributeVertical, drawFillPrimaryHandle, drawHandle, drawPrimaryHandle, generateElbowLineRoute, getCreationMode, getCrossingPointsBetweenPointAndSegment, getDirectionBetweenPointAndPoint, getDirectionByPointOfRectangle, getDirectionByVector, getDirectionFactor, getDirectionFactorByDirectionComponent, getElementOfFocusedImage, getElementsText, getExtendPoint, getFirstTextEditor, getFirstTextManage, getGraphPoints, getIndexByResizeHandle, getMemorizedLatest, getNextPoint, getOppositeDirection, getPointByVectorComponent, getPointByVectorDirectionComponent, getPointOnPolyline, getPoints, getRatioByPoint, getRectangleResizeHandleRefs, getResizeHandleByIndex, getResizeHandlePointByIndex, getSourceAndTargetOuterRectangle, getSymmetricHandleIndex, getTextEditors, getTextManages, getTextMarksByElement, getUnitVectorByPointAndPoint, hasAfterDraw, isCornerHandle, isDelete, isDndMode, isDrawingMode, isEdgeHandle, isEnterHotkey, isExpandHotkey, isPointOnSegment, isResizing, isResizingByCondition, isSourceAndTargetIntersect, isSpaceHotkey, isTabHotkey, isVirtualKey, memorizeLatest, normalizeShapePoints, reduceRouteMargin, removeDuplicatePoints, removeElementOfFocusedImage, removeResizing, rotatePoints, rotateVectorAnti90, routeAdjust, selectImage, setCreationMode, setProperty, simplifyOrthogonalPoints, withResize };
1873
+ export { AStar, ActiveGenerator, AlignTransform, BASE, BoardCreationMode, CommonPluginElement, DEFAULT_ROUTE_MARGIN, Generator, IS_RESIZING, ImageBaseComponent, ImageGenerator, MediaKeys, PICTURE_ACCEPTED_UPLOAD_SIZE, PRIMARY_COLOR, PointGraph, PointNode, PriorityQueue, PropertyTransforms, RESIZE_HANDLE_DIAMETER, ResizeHandle, TRANSPARENT, TextTransforms, WithCommonPluginKey, WithTextPluginKey, acceptImageTypes, addElementOfFocusedImage, addResizing, alignBottom, alignHorizontalCenter, alignLeft, alignRight, alignTop, alignVerticalCenter, buildImage, calculatePolylineLength, createGraph, distributeHorizontal, distributeVertical, drawFillPrimaryHandle, drawHandle, drawPrimaryHandle, generateElbowLineRoute, getCreationMode, getCrossingPointsBetweenPointAndSegment, getDirectionBetweenPointAndPoint, getDirectionByPointOfRectangle, getDirectionByVector, getDirectionFactor, getDirectionFactorByDirectionComponent, getElementOfFocusedImage, getElementsText, getExtendPoint, getFirstTextEditor, getFirstTextManage, getGraphPoints, getIndexByResizeHandle, getMemorizedLatest, getNextPoint, getOppositeDirection, getPointByVectorComponent, getPointByVectorDirectionComponent, getPointOnPolyline, getPoints, getRatioByPoint, getRectangleResizeHandleRefs, getResizeHandleByIndex, getResizeHandlePointByIndex, getRotatedResizeCursorClassByAngle, getSourceAndTargetOuterRectangle, getSymmetricHandleIndex, getTextEditors, getTextManages, getTextMarksByElement, getUnitVectorByPointAndPoint, hasAfterDraw, isCornerHandle, isDelete, isDndMode, isDrawingMode, isEdgeHandle, isEnterHotkey, isExpandHotkey, isPointOnSegment, isResizing, isResizingByCondition, isSourceAndTargetIntersect, isSpaceHotkey, isTabHotkey, isVirtualKey, memorizeLatest, normalizeShapePoints, reduceRouteMargin, removeDuplicatePoints, removeElementOfFocusedImage, removeResizing, resetPointsAfterResize, rotateVector, rotateVectorAnti90, routeAdjust, selectImage, setCreationMode, setProperty, simplifyOrthogonalPoints, withGroup, withResize };
1593
1874
  //# sourceMappingURL=plait-common.mjs.map