@plait/mind 0.2.0-next.0

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 (125) hide show
  1. package/README.md +24 -0
  2. package/constants/default.d.ts +12 -0
  3. package/constants/index.d.ts +2 -0
  4. package/constants/node.d.ts +17 -0
  5. package/draw/abstract.d.ts +4 -0
  6. package/draw/indented-link.d.ts +3 -0
  7. package/draw/link/abstract-link.d.ts +3 -0
  8. package/draw/link/logic-link.d.ts +3 -0
  9. package/draw/link.d.ts +3 -0
  10. package/draw/richtext.d.ts +14 -0
  11. package/draw/shape.d.ts +3 -0
  12. package/esm2020/constants/default.mjs +13 -0
  13. package/esm2020/constants/index.mjs +3 -0
  14. package/esm2020/constants/node.mjs +19 -0
  15. package/esm2020/draw/abstract.mjs +48 -0
  16. package/esm2020/draw/indented-link.mjs +44 -0
  17. package/esm2020/draw/link/abstract-link.mjs +42 -0
  18. package/esm2020/draw/link/logic-link.mjs +51 -0
  19. package/esm2020/draw/link.mjs +158 -0
  20. package/esm2020/draw/richtext.mjs +35 -0
  21. package/esm2020/draw/shape.mjs +18 -0
  22. package/esm2020/interfaces/abstract.mjs +6 -0
  23. package/esm2020/interfaces/element-data.mjs +2 -0
  24. package/esm2020/interfaces/element.mjs +59 -0
  25. package/esm2020/interfaces/index.mjs +6 -0
  26. package/esm2020/interfaces/layout.mjs +19 -0
  27. package/esm2020/interfaces/node.mjs +23 -0
  28. package/esm2020/interfaces/types.mjs +13 -0
  29. package/esm2020/layout-option.mjs +72 -0
  30. package/esm2020/mind.component.mjs +50 -0
  31. package/esm2020/mind.module.mjs +21 -0
  32. package/esm2020/node.component.mjs +742 -0
  33. package/esm2020/plait-mind.mjs +5 -0
  34. package/esm2020/plugins/emoji/emoji-base.component.mjs +21 -0
  35. package/esm2020/plugins/emoji/emoji.drawer.mjs +79 -0
  36. package/esm2020/plugins/emoji/emoji.mjs +15 -0
  37. package/esm2020/plugins/emoji/index.mjs +4 -0
  38. package/esm2020/plugins/emoji/with-mind-emoji.mjs +8 -0
  39. package/esm2020/plugins/with-abstract.mjs +92 -0
  40. package/esm2020/plugins/with-dnd.mjs +276 -0
  41. package/esm2020/plugins/with-mind.mjs +183 -0
  42. package/esm2020/public-api.mjs +14 -0
  43. package/esm2020/queries/get-available-sublayouts-by-element.mjs +29 -0
  44. package/esm2020/queries/get-branch-mindmap-layouts-by-element.mjs +18 -0
  45. package/esm2020/queries/get-correct-layout-by-element.mjs +50 -0
  46. package/esm2020/queries/get-layout-by-element.mjs +16 -0
  47. package/esm2020/queries/get-layout-parent-by-element.mjs +17 -0
  48. package/esm2020/queries/index.mjs +13 -0
  49. package/esm2020/transforms/index.mjs +10 -0
  50. package/esm2020/transforms/layout.mjs +23 -0
  51. package/esm2020/transforms/node.mjs +44 -0
  52. package/esm2020/utils/abstract/common.mjs +25 -0
  53. package/esm2020/utils/abstract/resize.mjs +169 -0
  54. package/esm2020/utils/clipboard.mjs +71 -0
  55. package/esm2020/utils/colors.mjs +41 -0
  56. package/esm2020/utils/direction-corrector.mjs +54 -0
  57. package/esm2020/utils/direction-detector.mjs +56 -0
  58. package/esm2020/utils/draw-placeholder.mjs +311 -0
  59. package/esm2020/utils/drop-target-corrector.mjs +86 -0
  60. package/esm2020/utils/graph.mjs +24 -0
  61. package/esm2020/utils/index.mjs +14 -0
  62. package/esm2020/utils/is-virtual-key.mjs +13 -0
  63. package/esm2020/utils/layout.mjs +105 -0
  64. package/esm2020/utils/mindmap.mjs +295 -0
  65. package/esm2020/utils/node-space.mjs +72 -0
  66. package/esm2020/utils/node.mjs +6 -0
  67. package/esm2020/utils/path.mjs +11 -0
  68. package/esm2020/utils/point-placement.mjs +99 -0
  69. package/esm2020/utils/shape.mjs +17 -0
  70. package/esm2020/utils/weak-maps.mjs +3 -0
  71. package/fesm2015/plait-mind.mjs +3583 -0
  72. package/fesm2015/plait-mind.mjs.map +1 -0
  73. package/fesm2020/plait-mind.mjs +3595 -0
  74. package/fesm2020/plait-mind.mjs.map +1 -0
  75. package/index.d.ts +5 -0
  76. package/interfaces/abstract.d.ts +4 -0
  77. package/interfaces/element-data.d.ts +11 -0
  78. package/interfaces/element.d.ts +39 -0
  79. package/interfaces/index.d.ts +5 -0
  80. package/interfaces/layout.d.ts +10 -0
  81. package/interfaces/node.d.ts +33 -0
  82. package/interfaces/types.d.ts +11 -0
  83. package/layout-option.d.ts +2 -0
  84. package/mind.component.d.ts +16 -0
  85. package/mind.module.d.ts +11 -0
  86. package/node.component.d.ts +60 -0
  87. package/package.json +31 -0
  88. package/plugins/emoji/emoji-base.component.d.ts +12 -0
  89. package/plugins/emoji/emoji.d.ts +6 -0
  90. package/plugins/emoji/emoji.drawer.d.ts +22 -0
  91. package/plugins/emoji/index.d.ts +3 -0
  92. package/plugins/emoji/with-mind-emoji.d.ts +8 -0
  93. package/plugins/with-abstract.d.ts +2 -0
  94. package/plugins/with-dnd.d.ts +11 -0
  95. package/plugins/with-mind.d.ts +2 -0
  96. package/public-api.d.ts +10 -0
  97. package/queries/get-available-sublayouts-by-element.d.ts +8 -0
  98. package/queries/get-branch-mindmap-layouts-by-element.d.ts +3 -0
  99. package/queries/get-correct-layout-by-element.d.ts +9 -0
  100. package/queries/get-layout-by-element.d.ts +3 -0
  101. package/queries/get-layout-parent-by-element.d.ts +8 -0
  102. package/queries/index.d.ts +7 -0
  103. package/styles/styles.scss +99 -0
  104. package/transforms/index.d.ts +7 -0
  105. package/transforms/layout.d.ts +3 -0
  106. package/transforms/node.d.ts +8 -0
  107. package/utils/abstract/common.d.ts +5 -0
  108. package/utils/abstract/resize.d.ts +21 -0
  109. package/utils/clipboard.d.ts +7 -0
  110. package/utils/colors.d.ts +4 -0
  111. package/utils/direction-corrector.d.ts +3 -0
  112. package/utils/direction-detector.d.ts +9 -0
  113. package/utils/draw-placeholder.d.ts +42 -0
  114. package/utils/drop-target-corrector.d.ts +8 -0
  115. package/utils/graph.d.ts +5 -0
  116. package/utils/index.d.ts +13 -0
  117. package/utils/is-virtual-key.d.ts +1 -0
  118. package/utils/layout.d.ts +12 -0
  119. package/utils/mindmap.d.ts +33 -0
  120. package/utils/node-space.d.ts +9 -0
  121. package/utils/node.d.ts +2 -0
  122. package/utils/path.d.ts +4 -0
  123. package/utils/point-placement.d.ts +8 -0
  124. package/utils/shape.d.ts +3 -0
  125. package/utils/weak-maps.d.ts +5 -0
@@ -0,0 +1,311 @@
1
+ import { BASE, PRIMARY_COLOR, STROKE_WIDTH } from '../constants';
2
+ import { drawLink } from '../draw/link';
3
+ import { getRectangleByNode } from './graph';
4
+ import { MINDMAP_ELEMENT_TO_COMPONENT } from './weak-maps';
5
+ import { drawRoundRectangle } from '@plait/core';
6
+ import { MindmapQueries } from '../queries';
7
+ import { isBottomLayout, isHorizontalLayout, isHorizontalLogicLayout, isIndentedLayout, isRightLayout, isVerticalLogicLayout } from '@plait/layouts';
8
+ import { drawIndentedLink } from '../draw/indented-link';
9
+ import { isLeftLayout, isTopLayout } from '@plait/layouts';
10
+ import { isStandardLayout } from '@plait/layouts';
11
+ import { isMixedLayout } from './layout';
12
+ export const drawPlaceholderDropNodeG = (dropTarget, roughSVG, fakeDropNodeG) => {
13
+ const targetComponent = MINDMAP_ELEMENT_TO_COMPONENT.get(dropTarget.target);
14
+ const targetRect = getRectangleByNode(targetComponent.node);
15
+ if (dropTarget.detectResult && ['right', 'left'].includes(dropTarget.detectResult)) {
16
+ drawStraightDropNodeG(targetRect, dropTarget.detectResult, targetComponent, roughSVG, fakeDropNodeG);
17
+ }
18
+ if (targetComponent.parent && dropTarget.detectResult && ['top', 'bottom'].includes(dropTarget.detectResult)) {
19
+ const parentComponent = MINDMAP_ELEMENT_TO_COMPONENT.get(targetComponent.parent.origin);
20
+ const targetIndex = parentComponent.node.origin.children.indexOf(targetComponent.node.origin);
21
+ drawCurvePlaceholderDropNodeG(targetRect, dropTarget.detectResult, targetIndex, targetComponent, roughSVG, parentComponent, fakeDropNodeG);
22
+ }
23
+ };
24
+ export const drawCurvePlaceholderDropNodeG = (targetRect, detectResult, targetIndex, targetComponent, roughSVG, parentComponent, fakeDropNodeG) => {
25
+ const parentNodeLayout = MindmapQueries.getCorrectLayoutByElement(parentComponent.node.origin);
26
+ const layout = MindmapQueries.getCorrectLayoutByElement(targetComponent.node.parent.origin);
27
+ const strokeWidth = targetComponent.node.origin.linkLineWidth ? targetComponent.node.origin.linkLineWidth : STROKE_WIDTH;
28
+ let fakeX = targetComponent.node.x, fakeY = targetRect.y - 30, fakeRectangleStartX = targetRect.x, fakeRectangleEndX = targetRect.x + 30, fakeRectangleStartY = fakeY, fakeRectangleEndY = fakeRectangleStartY + 12, width = 30;
29
+ if (isLeftLayout(layout)) {
30
+ fakeX = targetComponent.node.x + targetComponent.node.width - 30;
31
+ fakeRectangleStartX = targetRect.x + targetRect.width - 30;
32
+ fakeRectangleEndX = targetRect.x + targetRect.width;
33
+ }
34
+ if (isHorizontalLogicLayout(parentNodeLayout)) {
35
+ fakeY = getHorizontalFakeY(detectResult, targetIndex, parentComponent.node, targetRect, layout, fakeY);
36
+ if (isStandardLayout(parentNodeLayout)) {
37
+ const rightNodeCount = parentComponent.node.origin.rightNodeCount || 0;
38
+ const idx = parentComponent.node.children.findIndex(x => x === targetComponent.node);
39
+ const isLeft = idx >= rightNodeCount;
40
+ // 标准布局的左,需要调整 x
41
+ if (isLeft) {
42
+ fakeX = targetComponent.node.x + targetComponent.node.width - 30;
43
+ fakeRectangleStartX = targetRect.x + targetRect.width - 30;
44
+ fakeRectangleEndX = targetRect.x + targetRect.width;
45
+ }
46
+ const isLeftFirst = idx === rightNodeCount;
47
+ const isRightLast = idx === rightNodeCount - 1;
48
+ // 拖拽至左第一个节点的情况
49
+ if (detectResult === 'top' && isLeftFirst) {
50
+ fakeY = targetRect.y - targetRect.height;
51
+ }
52
+ if (detectResult === 'bottom' && isRightLast) {
53
+ fakeY = targetRect.y + targetRect.height + 30;
54
+ }
55
+ }
56
+ fakeRectangleStartY = fakeY;
57
+ fakeRectangleEndY = fakeRectangleStartY + 12;
58
+ }
59
+ if (isVerticalLogicLayout(layout)) {
60
+ parentComponent = targetComponent;
61
+ targetComponent = MINDMAP_ELEMENT_TO_COMPONENT.get(targetComponent.parent.origin);
62
+ fakeX = parentComponent.node.x;
63
+ width = parentComponent.node.width;
64
+ const vGap = BASE * 6 + strokeWidth;
65
+ if (isTopLayout(layout) && detectResult === 'top') {
66
+ fakeY = targetRect.y - vGap;
67
+ fakeRectangleStartY = fakeY - vGap + strokeWidth;
68
+ }
69
+ if (isBottomLayout(layout) && detectResult === 'bottom') {
70
+ fakeY = targetRect.y + targetRect.height + vGap;
71
+ fakeRectangleStartY = fakeY + vGap - strokeWidth;
72
+ }
73
+ fakeRectangleStartX = fakeX + Math.ceil(parentComponent.node.width / 2) - parentComponent.node.hGap - Math.ceil(strokeWidth / 2);
74
+ fakeRectangleEndX = fakeRectangleStartX + 30;
75
+ fakeRectangleEndY = fakeRectangleStartY + 12;
76
+ }
77
+ if (isIndentedLayout(layout)) {
78
+ // 偏移一个 Gap
79
+ if (isLeftLayout(layout)) {
80
+ fakeX -= BASE * 4;
81
+ }
82
+ if (isRightLayout(layout)) {
83
+ fakeX += BASE * 4;
84
+ }
85
+ if (isTopLayout(layout)) {
86
+ if (detectResult === 'top') {
87
+ const isLastNode = targetIndex === parentComponent.node.origin.children.length - 1;
88
+ if (isLastNode) {
89
+ fakeY = targetRect.y - targetRect.height - BASE;
90
+ }
91
+ else {
92
+ const nextComponent = MINDMAP_ELEMENT_TO_COMPONENT.get(parentComponent.node.origin.children[targetIndex + 1]);
93
+ const nextRect = getRectangleByNode(nextComponent.node);
94
+ fakeY = targetRect.y - Math.abs((nextRect.y + nextRect.height - targetRect.y) / 2);
95
+ }
96
+ }
97
+ if (detectResult === 'bottom') {
98
+ const isFirstNode = targetIndex === 0;
99
+ if (isFirstNode) {
100
+ const parentRect = getRectangleByNode(parentComponent.node);
101
+ fakeY = parentRect.y - parentRect.height / 2 - BASE;
102
+ }
103
+ else {
104
+ const previousComponent = MINDMAP_ELEMENT_TO_COMPONENT.get(parentComponent.node.origin.children[targetIndex - 1]);
105
+ const previousRect = getRectangleByNode(previousComponent.node);
106
+ fakeY = previousRect.y - Math.abs((targetRect.y + targetRect.height - previousRect.y) / 2);
107
+ }
108
+ }
109
+ }
110
+ fakeRectangleStartX = fakeX;
111
+ fakeRectangleEndX = fakeRectangleStartX + 30;
112
+ fakeRectangleStartY = fakeY;
113
+ fakeRectangleEndY = fakeRectangleStartY + 12;
114
+ }
115
+ // 构造一条曲线
116
+ const fakeNode = { ...targetComponent.node, x: fakeX, y: fakeY, width, height: 12 };
117
+ const linkSVGG = isIndentedLayout(layout)
118
+ ? drawIndentedLink(roughSVG, parentComponent.node, fakeNode, PRIMARY_COLOR, false)
119
+ : drawLink(roughSVG, parentComponent.node, fakeNode, PRIMARY_COLOR, isHorizontalLayout(layout), false);
120
+ // 构造一个矩形框坐标
121
+ const fakeRectangleG = drawRoundRectangle(roughSVG, fakeRectangleStartX, fakeRectangleStartY, fakeRectangleEndX, fakeRectangleEndY, {
122
+ stroke: PRIMARY_COLOR,
123
+ strokeWidth: 2,
124
+ fill: PRIMARY_COLOR,
125
+ fillStyle: 'solid'
126
+ });
127
+ fakeDropNodeG?.appendChild(linkSVGG);
128
+ fakeDropNodeG?.appendChild(fakeRectangleG);
129
+ };
130
+ export const drawStraightDropNodeG = (targetRect, detectResult, targetComponent, roughSVG, fakeDropNodeG) => {
131
+ const { x, y, width, height } = targetRect;
132
+ const lineLength = 40;
133
+ let startLinePoint = x + width;
134
+ let endLinePoint = x + width + lineLength;
135
+ let startRectanglePointX = x + width + lineLength;
136
+ let endRectanglePointX = x + lineLength + width + 30;
137
+ let startRectanglePointY = y + height / 2 - 6;
138
+ let endRectanglePointY = y + height / 2 - 6 + 12;
139
+ if (detectResult === 'left') {
140
+ startLinePoint = x - lineLength;
141
+ endLinePoint = x;
142
+ startRectanglePointX = x - lineLength - 30;
143
+ endRectanglePointX = x - lineLength;
144
+ }
145
+ let fakeY = targetComponent.node.y;
146
+ let fakeX = targetRect.x;
147
+ const strokeWidth = targetComponent.node.origin.linkLineWidth ? targetComponent.node.origin.linkLineWidth : STROKE_WIDTH;
148
+ const pointOptions = {
149
+ fakeX,
150
+ fakeY,
151
+ x,
152
+ y,
153
+ width,
154
+ height,
155
+ strokeWidth
156
+ };
157
+ const parentLayout = MindmapQueries.getCorrectLayoutByElement(targetComponent.node.origin.isRoot ? targetComponent.node.origin : targetComponent.node.parent.origin);
158
+ const layout = MindmapQueries.getCorrectLayoutByElement(targetComponent.node.origin);
159
+ if (!isMixedLayout(parentLayout, layout)) {
160
+ // 构造一条直线
161
+ let linePoints = [
162
+ [startLinePoint, y + height / 2],
163
+ [endLinePoint, y + height / 2]
164
+ ];
165
+ if (isIndentedLayout(parentLayout)) {
166
+ const fakePoint = getIndentedFakePoint(parentLayout, pointOptions);
167
+ drawIndentNodeG(fakeDropNodeG, roughSVG, fakePoint, targetComponent.node);
168
+ return;
169
+ }
170
+ else if (isVerticalLogicLayout(parentLayout)) {
171
+ if (!targetComponent.node.origin.isRoot) {
172
+ /**
173
+ * 计算逻辑:
174
+ * 1. 移动到左侧:当前节点 startX - 偏移值,偏移值计算如下:
175
+ * a. 第一个节点: 固定值(来源于 getMainAxle,第二级节点:BASE * 8,其他 BASE * 3 + strokeWidth / 2);
176
+ * b. 第二个节点到最后一个节点之间:上一个节点到当前节点间距的一半((当前节点 startX - 上一个节点的 endX) / 2),endX = 当前节点的 startX + width;
177
+ * 2. 移动到右侧:当前节点 x + width + 偏移值,偏移值计算如下:
178
+ * a. 第二个节点到最后一个节点之间的右侧:当前节点到下一个节点间距的一半((下一个节点 startX - 当前节点的 endX) / 2),endX = 当前节点的 startX + width;
179
+ * b. 最后一个节点的右侧:固定值(来源于 getMainAxle,第二级节点:BASE * 8,其他 BASE * 3 + strokeWidth / 2);
180
+ */
181
+ fakeY = targetComponent.node.y;
182
+ const parentComponent = MINDMAP_ELEMENT_TO_COMPONENT.get(targetComponent.parent.origin);
183
+ const targetIndex = parentComponent.node.origin.children.indexOf(targetComponent.node.origin);
184
+ if (detectResult === 'left') {
185
+ let offsetX = 0;
186
+ const isFirstNode = targetIndex === 0;
187
+ if (isFirstNode) {
188
+ offsetX = parentComponent.node.origin.isRoot ? BASE * 8 : BASE * 3 + strokeWidth / 2;
189
+ }
190
+ else {
191
+ const previousComponent = MINDMAP_ELEMENT_TO_COMPONENT.get(parentComponent.node.origin.children[targetIndex - 1]);
192
+ const previousRect = getRectangleByNode(previousComponent.node);
193
+ const space = targetRect.x - (previousRect.x + previousRect.width);
194
+ offsetX = space / 2;
195
+ }
196
+ fakeX = targetRect.x - offsetX - width / 2 - Math.ceil(strokeWidth / 2);
197
+ }
198
+ if (detectResult === 'right') {
199
+ let offsetX = 0;
200
+ const isLastNode = targetIndex === parentComponent.node.origin.children.length - 1;
201
+ if (isLastNode) {
202
+ offsetX = parentComponent.node.origin.isRoot ? BASE * 8 : BASE * 3 + strokeWidth / 2;
203
+ }
204
+ else {
205
+ const nextComponent = MINDMAP_ELEMENT_TO_COMPONENT.get(parentComponent.node.origin.children[targetIndex + 1]);
206
+ const nextRect = getRectangleByNode(nextComponent.node);
207
+ const space = nextRect.x - (targetRect.x + targetRect.width);
208
+ offsetX = space / 2;
209
+ }
210
+ fakeX = targetRect.x + width + offsetX - width / 2 - Math.ceil(strokeWidth / 2);
211
+ }
212
+ startRectanglePointX = fakeX;
213
+ if (isTopLayout(parentLayout)) {
214
+ // 因为矩形是从左上角为起点向下画的,所以需要向上偏移一个矩形的高度(-12)
215
+ startRectanglePointY = fakeY + height + targetComponent.node.vGap - 12;
216
+ }
217
+ if (isBottomLayout(parentLayout)) {
218
+ startRectanglePointY = fakeY + targetComponent.node.vGap;
219
+ }
220
+ endRectanglePointX = startRectanglePointX + 30;
221
+ endRectanglePointY = startRectanglePointY + 12;
222
+ const fakeNode = { ...targetComponent.node, x: fakeX, y: fakeY, width: 30 };
223
+ const linkSVGG = drawLink(roughSVG, parentComponent.node, fakeNode, PRIMARY_COLOR, false, false);
224
+ fakeDropNodeG?.appendChild(linkSVGG);
225
+ }
226
+ }
227
+ else {
228
+ let linkSVGG = roughSVG.linearPath(linePoints, { stroke: PRIMARY_COLOR, strokeWidth });
229
+ fakeDropNodeG?.appendChild(linkSVGG);
230
+ }
231
+ // 构造一个矩形框坐标
232
+ let fakeRectangleG = drawRoundRectangle(roughSVG, startRectanglePointX, startRectanglePointY, endRectanglePointX, endRectanglePointY, {
233
+ stroke: PRIMARY_COLOR,
234
+ strokeWidth: 2,
235
+ fill: PRIMARY_COLOR,
236
+ fillStyle: 'solid'
237
+ });
238
+ fakeDropNodeG?.appendChild(fakeRectangleG);
239
+ }
240
+ else {
241
+ // 混合布局画线逻辑
242
+ if (isHorizontalLogicLayout(parentLayout)) {
243
+ if (isIndentedLayout(layout)) {
244
+ const fakePoint = getIndentedFakePoint(layout, pointOptions);
245
+ drawIndentNodeG(fakeDropNodeG, roughSVG, fakePoint, targetComponent.node);
246
+ return;
247
+ }
248
+ }
249
+ }
250
+ };
251
+ export const getHorizontalFakeY = (detectResult, targetIndex, parentNode, targetRect, layout, fakeY) => {
252
+ if (detectResult === 'top') {
253
+ if (targetIndex === 0 && isTopLayout(layout)) {
254
+ fakeY = targetRect.y + targetRect.height;
255
+ }
256
+ if (targetIndex > 0) {
257
+ const previousComponent = MINDMAP_ELEMENT_TO_COMPONENT.get(parentNode.origin.children[targetIndex - 1]);
258
+ const previousRect = getRectangleByNode(previousComponent.node);
259
+ const topY = previousRect.y + previousRect.height;
260
+ fakeY = topY + (targetRect.y - topY) / 5;
261
+ }
262
+ }
263
+ if (detectResult === 'bottom') {
264
+ fakeY = targetRect.y + targetRect.height + 30;
265
+ if (targetIndex < parentNode.origin.children.length - 1) {
266
+ const nextComponent = MINDMAP_ELEMENT_TO_COMPONENT.get(parentNode.origin.children[targetIndex + 1]);
267
+ const nextRect = getRectangleByNode(nextComponent.node);
268
+ const topY = targetRect.y + targetRect.height;
269
+ fakeY = topY + (nextRect.y - topY) / 5;
270
+ }
271
+ if (targetIndex === parentNode.origin.children.length - 1) {
272
+ fakeY = targetRect.y + targetRect.height + 30;
273
+ }
274
+ }
275
+ return fakeY;
276
+ };
277
+ export const getIndentedFakePoint = (layout, pointOptions) => {
278
+ let { fakeX, fakeY, x, y, width, height, strokeWidth } = pointOptions;
279
+ const hGap = BASE * 4;
280
+ const vGap = BASE * 6;
281
+ const offsetX = hGap + width / 2 + strokeWidth;
282
+ const offsetY = vGap + height / 2 + strokeWidth;
283
+ if (isLeftLayout(layout)) {
284
+ fakeX = x - offsetX;
285
+ }
286
+ if (isRightLayout(layout)) {
287
+ fakeX = x + offsetX;
288
+ }
289
+ if (isTopLayout(layout)) {
290
+ fakeY = y - offsetY;
291
+ }
292
+ if (isBottomLayout(layout)) {
293
+ fakeY = y + height + offsetY;
294
+ }
295
+ return { fakeX, fakeY };
296
+ };
297
+ export const drawIndentNodeG = (fakeDropNodeG, roughSVG, fakePoint, node) => {
298
+ const { fakeX, fakeY } = fakePoint;
299
+ const fakeNode = { ...node, x: fakeX, y: fakeY, width: 30, height: 12 };
300
+ const linkSVGG = drawIndentedLink(roughSVG, node, fakeNode, PRIMARY_COLOR, false);
301
+ const startRectanglePointX = fakeX, startRectanglePointY = fakeY, endRectanglePointX = fakeX + 30, endRectanglePointY = fakeY + 12;
302
+ const fakeRectangleG = drawRoundRectangle(roughSVG, startRectanglePointX, startRectanglePointY, endRectanglePointX, endRectanglePointY, {
303
+ stroke: PRIMARY_COLOR,
304
+ strokeWidth: 2,
305
+ fill: PRIMARY_COLOR,
306
+ fillStyle: 'solid'
307
+ });
308
+ fakeDropNodeG?.appendChild(linkSVGG);
309
+ fakeDropNodeG?.appendChild(fakeRectangleG);
310
+ };
311
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhdy1wbGFjZWhvbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL21pbmQvc3JjL3V0aWxzL2RyYXctcGxhY2Vob2xkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFHeEMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzdDLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMzRCxPQUFPLEVBQVMsa0JBQWtCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDeEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM1QyxPQUFPLEVBQ0gsY0FBYyxFQUNkLGtCQUFrQixFQUNsQix1QkFBdUIsRUFDdkIsZ0JBQWdCLEVBQ2hCLGFBQWEsRUFDYixxQkFBcUIsRUFFeEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFekMsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUcsQ0FDcEMsVUFBK0QsRUFDL0QsUUFBa0IsRUFDbEIsYUFBc0MsRUFDeEMsRUFBRTtJQUNBLE1BQU0sZUFBZSxHQUFHLDRCQUE0QixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFzQixDQUFDO0lBQ2pHLE1BQU0sVUFBVSxHQUFHLGtCQUFrQixDQUFDLGVBQWUsQ0FB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O0lBQ25DLE1BQU0sUUFBUSxHQUFnQixFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUNyRixNQUFNLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFFbEYsTUFBTSxvQkFBb0IsR0FBRyxLQUFLLEVBQzlCLG9CQUFvQixHQUFHLEtBQUssRUFDNUIsa0JBQWtCLEdBQUcsS0FBSyxHQUFHLEVBQUUsRUFDL0Isa0JBQWtCLEdBQUcsS0FBSyxHQUFHLEVBQUUsQ0FBQztJQUNwQyxNQUFNLGNBQWMsR0FBRyxrQkFBa0IsQ0FDckMsUUFBUSxFQUNSLG9CQUFvQixFQUNwQixvQkFBb0IsRUFDcEIsa0JBQWtCLEVBQ2xCLGtCQUFrQixFQUNsQjtRQUNJLE1BQU0sRUFBRSxhQUFhO1FBQ3JCLFdBQVcsRUFBRSxDQUFDO1FBQ2QsSUFBSSxFQUFFLGFBQWE7UUFDbkIsU0FBUyxFQUFFLE9BQU87S0FDckIsQ0FDSixDQUFDO0lBQ0YsYUFBYSxFQUFFLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNyQyxhQUFhLEVBQUUsV0FBVyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBQy9DLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJvdWdoU1ZHIH0gZnJvbSAncm91Z2hqcy9iaW4vc3ZnJztcbmltcG9ydCB7IEJBU0UsIFBSSU1BUllfQ09MT1IsIFNUUk9LRV9XSURUSCB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBkcmF3TGluayB9IGZyb20gJy4uL2RyYXcvbGluayc7XG5pbXBvcnQgeyBEZXRlY3RSZXN1bHQsIE1pbmRFbGVtZW50LCBNaW5kbWFwTm9kZSB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgTWluZE5vZGVDb21wb25lbnQgfSBmcm9tICcuLi9ub2RlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBnZXRSZWN0YW5nbGVCeU5vZGUgfSBmcm9tICcuL2dyYXBoJztcbmltcG9ydCB7IE1JTkRNQVBfRUxFTUVOVF9UT19DT01QT05FTlQgfSBmcm9tICcuL3dlYWstbWFwcyc7XG5pbXBvcnQgeyBQb2ludCwgZHJhd1JvdW5kUmVjdGFuZ2xlIH0gZnJvbSAnQHBsYWl0L2NvcmUnO1xuaW1wb3J0IHsgTWluZG1hcFF1ZXJpZXMgfSBmcm9tICcuLi9xdWVyaWVzJztcbmltcG9ydCB7XG4gICAgaXNCb3R0b21MYXlvdXQsXG4gICAgaXNIb3Jpem9udGFsTGF5b3V0LFxuICAgIGlzSG9yaXpvbnRhbExvZ2ljTGF5b3V0LFxuICAgIGlzSW5kZW50ZWRMYXlvdXQsXG4gICAgaXNSaWdodExheW91dCxcbiAgICBpc1ZlcnRpY2FsTG9naWNMYXlvdXQsXG4gICAgTWluZG1hcExheW91dFR5cGVcbn0gZnJvbSAnQHBsYWl0L2xheW91dHMnO1xuaW1wb3J0IHsgZHJhd0luZGVudGVkTGluayB9IGZyb20gJy4uL2RyYXcvaW5kZW50ZWQtbGluayc7XG5pbXBvcnQgeyBpc0xlZnRMYXlvdXQsIGlzVG9wTGF5b3V0IH0gZnJvbSAnQHBsYWl0L2xheW91dHMnO1xuaW1wb3J0IHsgaXNTdGFuZGFyZExheW91dCB9IGZyb20gJ0BwbGFpdC9sYXlvdXRzJztcbmltcG9ydCB7IGlzTWl4ZWRMYXlvdXQgfSBmcm9tICcuL2xheW91dCc7XG5cbmV4cG9ydCBjb25zdCBkcmF3UGxhY2Vob2xkZXJEcm9wTm9kZUcgPSAoXG4gICAgZHJvcFRhcmdldDogeyB0YXJnZXQ6IE1pbmRFbGVtZW50OyBkZXRlY3RSZXN1bHQ6IERldGVjdFJlc3VsdCB9LFxuICAgIHJvdWdoU1ZHOiBSb3VnaFNWRyxcbiAgICBmYWtlRHJvcE5vZGVHOiBTVkdHRWxlbWVudCB8IHVuZGVmaW5lZFxuKSA9PiB7XG4gICAgY29uc3QgdGFyZ2V0Q29tcG9uZW50ID0gTUlORE1BUF9FTEVNRU5UX1RPX0NPTVBPTkVOVC5nZXQoZHJvcFRhcmdldC50YXJnZXQpIGFzIE1pbmROb2RlQ29tcG9uZW50O1xuICAgIGNvbnN0IHRhcmdldFJlY3QgPSBnZXRSZWN0YW5nbGVCeU5vZGUodGFyZ2V0Q29tcG9uZW50Lm5vZGUpO1xuICAgIGlmIChkcm9wVGFyZ2V0LmRldGVjdFJlc3VsdCAmJiBbJ3JpZ2h0JywgJ2xlZnQnXS5pbmNsdWRlcyhkcm9wVGFyZ2V0LmRldGVjdFJlc3VsdCkpIHtcbiAgICAgICAgZHJhd1N0cmFpZ2h0RHJvcE5vZGVHKHRhcmdldFJlY3QsIGRyb3BUYXJnZXQuZGV0ZWN0UmVzdWx0LCB0YXJnZXRDb21wb25lbnQsIHJvdWdoU1ZHLCBmYWtlRHJvcE5vZGVHKTtcbiAgICB9XG5cbiAgICBpZiAodGFyZ2V0Q29tcG9uZW50LnBhcmVudCAmJiBkcm9wVGFyZ2V0LmRldGVjdFJlc3VsdCAmJiBbJ3RvcCcsICdib3R0b20nXS5pbmNsdWRlcyhkcm9wVGFyZ2V0LmRldGVjdFJlc3VsdCkpIHtcbiAgICAgICAgY29uc3QgcGFyZW50Q29tcG9uZW50ID0gTUlORE1BUF9FTEVNRU5UX1RPX0NPTVBPTkVOVC5nZXQodGFyZ2V0Q29tcG9uZW50LnBhcmVudC5vcmlnaW4pIGFzIE1pbmROb2RlQ29tcG9uZW50O1xuICAgICAgICBjb25zdCB0YXJnZXRJbmRleCA9IHBhcmVudENvbXBvbmVudC5ub2RlLm9yaWdpbi5jaGlsZHJlbi5pbmRleE9mKHRhcmdldENvbXBvbmVudC5ub2RlLm9yaWdpbik7XG4gICAgICAgIGRyYXdDdXJ2ZVBsYWNlaG9sZGVyRHJvcE5vZGVHKFxuICAgICAgICAgICAgdGFyZ2V0UmVjdCxcbiAgICAgICAgICAgIGRyb3BUYXJnZXQuZGV0ZWN0UmVzdWx0LFxuICAgICAgICAgICAgdGFyZ2V0SW5kZXgsXG4gICAgICAgICAgICB0YXJnZXRDb21wb25lbnQsXG4gICAgICAgICAgICByb3VnaFNWRyxcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIGZha2VEcm9wTm9kZUdcbiAgICAgICAgKTtcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3QgZHJhd0N1cnZlUGxhY2Vob2xkZXJEcm9wTm9kZUcgPSAoXG4gICAgdGFyZ2V0UmVjdDoge1xuICAgICAgICB4OiBudW1iZXI7XG4gICAgICAgIHk6IG51bWJlcjtcbiAgICAgICAgd2lkdGg6IG51bWJlcjtcbiAgICAgICAgaGVpZ2h0OiBudW1iZXI7XG4gICAgfSxcbiAgICBkZXRlY3RSZXN1bHQ6IERldGVjdFJlc3VsdCxcbiAgICB0YXJnZXRJbmRleDogbnVtYmVyLFxuICAgIHRhcmdldENvbXBvbmVudDogTWluZE5vZGVDb21wb25lbnQsXG4gICAgcm91Z2hTVkc6IFJvdWdoU1ZHLFxuICAgIHBhcmVudENvbXBvbmVudDogTWluZE5vZGVDb21wb25lbnQsXG4gICAgZmFrZURyb3BOb2RlRzogU1ZHR0VsZW1lbnQgfCB1bmRlZmluZWRcbikgPT4ge1xuICAgIGNvbnN0IHBhcmVudE5vZGVMYXlvdXQgPSBNaW5kbWFwUXVlcmllcy5nZXRDb3JyZWN0TGF5b3V0QnlFbGVtZW50KHBhcmVudENvbXBvbmVudC5ub2RlLm9yaWdpbik7XG4gICAgY29uc3QgbGF5b3V0ID0gTWluZG1hcFF1ZXJpZXMuZ2V0Q29ycmVjdExheW91dEJ5RWxlbWVudCh0YXJnZXRDb21wb25lbnQubm9kZS5wYXJlbnQub3JpZ2luKTtcbiAgICBjb25zdCBzdHJva2VXaWR0aCA9IHRhcmdldENvbXBvbmVudC5ub2RlLm9yaWdpbi5saW5rTGluZVdpZHRoID8gdGFyZ2V0Q29tcG9uZW50Lm5vZGUub3JpZ2luLmxpbmtMaW5lV2lkdGggOiBTVFJPS0VfV0lEVEg7XG4gICAgbGV0IGZha2VYID0gdGFyZ2V0Q29tcG9uZW50Lm5vZGUueCxcbiAgICAgICAgZmFrZVkgPSB0YXJnZXRSZWN0LnkgLSAzMCxcbiAgICAgICAgZmFrZVJlY3RhbmdsZVN0YXJ0WCA9IHRhcmdldFJlY3QueCxcbiAgICAgICAgZmFrZVJlY3RhbmdsZUVuZFggPSB0YXJnZXRSZWN0LnggKyAzMCxcbiAgICAgICAgZmFrZVJlY3RhbmdsZVN0YXJ0WSA9IGZha2VZLFxuICAgICAgICBmYWtlUmVjdGFuZ2xlRW5kWSA9IGZha2VSZWN0YW5nbGVTdGFydFkgKyAxMixcbiAgICAgICAgd2lkdGggPSAzMDtcblxuICAgIGlmIChpc0xlZnRMYXlvdXQobGF5b3V0KSkge1xuICAgICAgICBmYWtlWCA9IHRhcmdldENvbXBvbmVudC5ub2RlLnggKyB0YXJnZXRDb21wb25lbnQubm9kZS53aWR0aCAtIDMwO1xuICAgICAgICBmYWtlUmVjdGFuZ2xlU3RhcnRYID0gdGFyZ2V0UmVjdC54ICsgdGFyZ2V0UmVjdC53aWR0aCAtIDMwO1xuICAgICAgICBmYWtlUmVjdGFuZ2xlRW5kWCA9IHRhcmdldFJlY3QueCArIHRhcmdldFJlY3Qud2lkdGg7XG4gICAgfVxuICAgIGlmIChpc0hvcml6b250YWxMb2dpY0xheW91dChwYXJlbnROb2RlTGF5b3V0KSkge1xuICAgICAgICBmYWtlWSA9IGdldEhvcml6b250YWxGYWtlWShkZXRlY3RSZXN1bHQgYXMgJ3RvcCcgfCAnYm90dG9tJywgdGFyZ2V0SW5kZXgsIHBhcmVudENvbXBvbmVudC5ub2RlLCB0YXJnZXRSZWN0LCBsYXlvdXQsIGZha2VZKTtcbiAgICAgICAgaWYgKGlzU3RhbmRhcmRMYXlvdXQocGFyZW50Tm9kZUxheW91dCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJpZ2h0Tm9kZUNvdW50ID0gcGFyZW50Q29tcG9uZW50Lm5vZGUub3JpZ2luLnJpZ2h0Tm9kZUNvdW50IHx8IDA7XG4gICAgICAgICAgICBjb25zdCBpZHggPSBwYXJlbnRDb21wb25lbnQubm9kZS5jaGlsZHJlbi5maW5kSW5kZXgoeCA9PiB4ID09PSB0YXJnZXRDb21wb25lbnQubm9kZSk7XG4gICAgICAgICAgICBjb25zdCBpc0xlZnQgPSBpZHggPj0gcmlnaHROb2RlQ291bnQ7XG4gICAgICAgICAgICAvLyDmoIflh4bluIPlsYDnmoTlt6bvvIzpnIDopoHosIPmlbQgeFxuICAgICAgICAgICAgaWYgKGlzTGVmdCkge1xuICAgICAgICAgICAgICAgIGZha2VYID0gdGFyZ2V0Q29tcG9uZW50Lm5vZGUueCArIHRhcmdldENvbXBvbmVudC5ub2RlLndpZHRoIC0gMzA7XG4gICAgICAgICAgICAgICAgZmFrZVJlY3RhbmdsZVN0YXJ0WCA9IHRhcmdldFJlY3QueCArIHRhcmdldFJlY3Qud2lkdGggLSAzMDtcbiAgICAgICAgICAgICAgICBmYWtlUmVjdGFuZ2xlRW5kWCA9IHRhcmdldFJlY3QueCArIHRhcmdldFJlY3Qud2lkdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpc0xlZnRGaXJzdCA9IGlkeCA9PT0gcmlnaHROb2RlQ291bnQ7XG4gICAgICAgICAgICBjb25zdCBpc1JpZ2h0TGFzdCA9IGlkeCA9PT0gcmlnaHROb2RlQ291bnQgLSAxO1xuICAgICAgICAgICAgLy8g5ouW5ou96Iez5bem56ys5LiA5Liq6IqC54K555qE5oOF5Ya1XG4gICAgICAgICAgICBpZiAoZGV0ZWN0UmVzdWx0ID09PSAndG9wJyAmJiBpc0xlZnRGaXJzdCkge1xuICAgICAgICAgICAgICAgIGZha2VZID0gdGFyZ2V0UmVjdC55IC0gdGFyZ2V0UmVjdC5oZWlnaHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGV0ZWN0UmVzdWx0ID09PSAnYm90dG9tJyAmJiBpc1JpZ2h0TGFzdCkge1xuICAgICAgICAgICAgICAgIGZha2VZID0gdGFyZ2V0UmVjdC55ICsgdGFyZ2V0UmVjdC5oZWlnaHQgKyAzMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmYWtlUmVjdGFuZ2xlU3RhcnRZID0gZmFrZVk7XG4gICAgICAgIGZha2VSZWN0YW5nbGVFbmRZID0gZmFrZVJlY3RhbmdsZVN0YXJ0WSArIDEyO1xuICAgIH1cblxuICAgIGlmIChpc1ZlcnRpY2FsTG9naWNMYXlvdXQobGF5b3V0KSkge1xuICAgICAgICBwYXJlbnRDb21wb25lbnQgPSB0YXJnZXRDb21wb25lbnQ7XG4gICAgICAgIHRhcmdldENvbXBvbmVudCA9IE1JTkRNQVBfRUxFTUVOVF9UT19DT01QT05FTlQuZ2V0KHRhcmdldENvbXBvbmVudC5wYXJlbnQub3JpZ2luKSBhcyBNaW5kTm9kZUNvbXBvbmVudDtcbiAgICAgICAgZmFrZVggPSBwYXJlbnRDb21wb25lbnQubm9kZS54O1xuICAgICAgICB3aWR0aCA9IHBhcmVudENvbXBvbmVudC5ub2RlLndpZHRoO1xuICAgICAgICBjb25zdCB2R2FwID0gQkFTRSAqIDYgKyBzdHJva2VXaWR0aDtcbiAgICAgICAgaWYgKGlzVG9wTGF5b3V0KGxheW91dCkgJiYgZGV0ZWN0UmVzdWx0ID09PSAndG9wJykge1xuICAgICAgICAgICAgZmFrZVkgPSB0YXJnZXRSZWN0LnkgLSB2R2FwO1xuICAgICAgICAgICAgZmFrZVJlY3RhbmdsZVN0YXJ0WSA9IGZha2VZIC0gdkdhcCArIHN0cm9rZVdpZHRoO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0JvdHRvbUxheW91dChsYXlvdXQpICYmIGRldGVjdFJlc3VsdCA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgICAgIGZha2VZID0gdGFyZ2V0UmVjdC55ICsgdGFyZ2V0UmVjdC5oZWlnaHQgKyB2R2FwO1xuICAgICAgICAgICAgZmFrZVJlY3RhbmdsZVN0YXJ0WSA9IGZha2VZICsgdkdhcCAtIHN0cm9rZVdpZHRoO1xuICAgICAgICB9XG4gICAgICAgIGZha2VSZWN0YW5nbGVTdGFydFggPSBmYWtlWCArIE1hdGguY2VpbChwYXJlbnRDb21wb25lbnQubm9kZS53aWR0aCAvIDIpIC0gcGFyZW50Q29tcG9uZW50Lm5vZGUuaEdhcCAtIE1hdGguY2VpbChzdHJva2VXaWR0aCAvIDIpO1xuICAgICAgICBmYWtlUmVjdGFuZ2xlRW5kWCA9IGZha2VSZWN0YW5nbGVTdGFydFggKyAzMDtcbiAgICAgICAgZmFrZVJlY3RhbmdsZUVuZFkgPSBmYWtlUmVjdGFuZ2xlU3RhcnRZICsgMTI7XG4gICAgfVxuICAgIGlmIChpc0luZGVudGVkTGF5b3V0KGxheW91dCkpIHtcbiAgICAgICAgLy8g5YGP56e75LiA5LiqIEdhcFxuICAgICAgICBpZiAoaXNMZWZ0TGF5b3V0KGxheW91dCkpIHtcbiAgICAgICAgICAgIGZha2VYIC09IEJBU0UgKiA0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1JpZ2h0TGF5b3V0KGxheW91dCkpIHtcbiAgICAgICAgICAgIGZha2VYICs9IEJBU0UgKiA0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1RvcExheW91dChsYXlvdXQpKSB7XG4gICAgICAgICAgICBpZiAoZGV0ZWN0UmVzdWx0ID09PSAndG9wJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzTGFzdE5vZGUgPSB0YXJnZXRJbmRleCA9PT0gcGFyZW50Q29tcG9uZW50Lm5vZGUub3JpZ2luLmNoaWxkcmVuLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgaWYgKGlzTGFzdE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZmFrZVkgPSB0YXJnZXRSZWN0LnkgLSB0YXJnZXRSZWN0LmhlaWdodCAtIEJBU0U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dENvbXBvbmVudCA9IE1JTkRNQVBfRUxFTUVOVF9UT19DT01QT05FTlQuZ2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50Lm5vZGUub3JpZ2luLmNoaWxkcmVuW3RhcmdldEluZGV4ICsgMV1cbiAgICAgICAgICAgICAgICAgICAgKSBhcyBNaW5kTm9kZUNvbXBvbmVudDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dFJlY3QgPSBnZXRSZWN0YW5nbGVCeU5vZGUobmV4dENvbXBvbmVudC5ub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgZmFrZVkgPSB0YXJnZXRSZWN0LnkgLSBNYXRoLmFicygobmV4dFJlY3QueSArIG5leHRSZWN0LmhlaWdodCAtIHRhcmdldFJlY3QueSkgLyAyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGV0ZWN0UmVzdWx0ID09PSAnYm90dG9tJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzRmlyc3ROb2RlID0gdGFyZ2V0SW5kZXggPT09IDA7XG4gICAgICAgICAgICAgICAgaWYgKGlzRmlyc3ROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudFJlY3QgPSBnZXRSZWN0YW5nbGVCeU5vZGUocGFyZW50Q29tcG9uZW50Lm5vZGUpO1xuICAgICAgICAgICAgICAgICAgICBmYWtlWSA9IHBhcmVudFJlY3QueSAtIHBhcmVudFJlY3QuaGVpZ2h0IC8gMiAtIEJBU0U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJldmlvdXNDb21wb25lbnQgPSBNSU5ETUFQX0VMRU1FTlRfVE9fQ09NUE9ORU5ULmdldChcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudENvbXBvbmVudC5ub2RlLm9yaWdpbi5jaGlsZHJlblt0YXJnZXRJbmRleCAtIDFdXG4gICAgICAgICAgICAgICAgICAgICkgYXMgTWluZE5vZGVDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzUmVjdCA9IGdldFJlY3RhbmdsZUJ5Tm9kZShwcmV2aW91c0NvbXBvbmVudC5ub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgZmFrZVkgPSBwcmV2aW91c1JlY3QueSAtIE1hdGguYWJzKCh0YXJnZXRSZWN0LnkgKyB0YXJnZXRSZWN0LmhlaWdodCAtIHByZXZpb3VzUmVjdC55KSAvIDIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmYWtlUmVjdGFuZ2xlU3RhcnRYID0gZmFrZVg7XG4gICAgICAgIGZha2VSZWN0YW5nbGVFbmRYID0gZmFrZVJlY3RhbmdsZVN0YXJ0WCArIDMwO1xuICAgICAgICBmYWtlUmVjdGFuZ2xlU3RhcnRZID0gZmFrZVk7XG4gICAgICAgIGZha2VSZWN0YW5nbGVFbmRZID0gZmFrZVJlY3RhbmdsZVN0YXJ0WSArIDEyO1xuICAgIH1cblxuICAgIC8vIOaehOmAoOS4gOadoeabsue6v1xuICAgIGNvbnN0IGZha2VOb2RlOiBNaW5kbWFwTm9kZSA9IHsgLi4udGFyZ2V0Q29tcG9uZW50Lm5vZGUsIHg6IGZha2VYLCB5OiBmYWtlWSwgd2lkdGgsIGhlaWdodDogMTIgfTtcbiAgICBjb25zdCBsaW5rU1ZHRyA9IGlzSW5kZW50ZWRMYXlvdXQobGF5b3V0KVxuICAgICAgICA/IGRyYXdJbmRlbnRlZExpbmsocm91Z2hTVkcsIHBhcmVudENvbXBvbmVudC5ub2RlLCBmYWtlTm9kZSwgUFJJTUFSWV9DT0xPUiwgZmFsc2UpXG4gICAgICAgIDogZHJhd0xpbmsocm91Z2hTVkcsIHBhcmVudENvbXBvbmVudC5ub2RlLCBmYWtlTm9kZSwgUFJJTUFSWV9DT0xPUiwgaXNIb3Jpem9udGFsTGF5b3V0KGxheW91dCksIGZhbHNlKTtcbiAgICAvLyDmnoTpgKDkuIDkuKrnn6nlvaLmoYblnZDmoIdcbiAgICBjb25zdCBmYWtlUmVjdGFuZ2xlRyA9IGRyYXdSb3VuZFJlY3RhbmdsZShyb3VnaFNWRywgZmFrZVJlY3RhbmdsZVN0YXJ0WCwgZmFrZVJlY3RhbmdsZVN0YXJ0WSwgZmFrZVJlY3RhbmdsZUVuZFgsIGZha2VSZWN0YW5nbGVFbmRZLCB7XG4gICAgICAgIHN0cm9rZTogUFJJTUFSWV9DT0xPUixcbiAgICAgICAgc3Ryb2tlV2lkdGg6IDIsXG4gICAgICAgIGZpbGw6IFBSSU1BUllfQ09MT1IsXG4gICAgICAgIGZpbGxTdHlsZTogJ3NvbGlkJ1xuICAgIH0pO1xuICAgIGZha2VEcm9wTm9kZUc/LmFwcGVuZENoaWxkKGxpbmtTVkdHKTtcbiAgICBmYWtlRHJvcE5vZGVHPy5hcHBlbmRDaGlsZChmYWtlUmVjdGFuZ2xlRyk7XG59O1xuZXhwb3J0IGNvbnN0IGRyYXdTdHJhaWdodERyb3BOb2RlRyA9IChcbiAgICB0YXJnZXRSZWN0OiB7XG4gICAgICAgIHg6IG51bWJlcjtcbiAgICAgICAgeTogbnVtYmVyO1xuICAgICAgICB3aWR0aDogbnVtYmVyO1xuICAgICAgICBoZWlnaHQ6IG51bWJlcjtcbiAgICB9LFxuICAgIGRldGVjdFJlc3VsdDogRGV0ZWN0UmVzdWx0LFxuICAgIHRhcmdldENvbXBvbmVudDogTWluZE5vZGVDb21wb25lbnQsXG4gICAgcm91Z2hTVkc6IFJvdWdoU1ZHLFxuICAgIGZha2VEcm9wTm9kZUc6IFNWR0dFbGVtZW50IHwgdW5kZWZpbmVkXG4pID0+IHtcbiAgICBjb25zdCB7IHgsIHksIHdpZHRoLCBoZWlnaHQgfSA9IHRhcmdldFJlY3Q7XG4gICAgY29uc3QgbGluZUxlbmd0aCA9IDQwO1xuICAgIGxldCBzdGFydExpbmVQb2ludCA9IHggKyB3aWR0aDtcbiAgICBsZXQgZW5kTGluZVBvaW50ID0geCArIHdpZHRoICsgbGluZUxlbmd0aDtcbiAgICBsZXQgc3RhcnRSZWN0YW5nbGVQb2ludFggPSB4ICsgd2lkdGggKyBsaW5lTGVuZ3RoO1xuICAgIGxldCBlbmRSZWN0YW5nbGVQb2ludFggPSB4ICsgbGluZUxlbmd0aCArIHdpZHRoICsgMzA7XG4gICAgbGV0IHN0YXJ0UmVjdGFuZ2xlUG9pbnRZID0geSArIGhlaWdodCAvIDIgLSA2O1xuICAgIGxldCBlbmRSZWN0YW5nbGVQb2ludFkgPSB5ICsgaGVpZ2h0IC8gMiAtIDYgKyAxMjtcblxuICAgIGlmIChkZXRlY3RSZXN1bHQgPT09ICdsZWZ0Jykge1xuICAgICAgICBzdGFydExpbmVQb2ludCA9IHggLSBsaW5lTGVuZ3RoO1xuICAgICAgICBlbmRMaW5lUG9pbnQgPSB4O1xuICAgICAgICBzdGFydFJlY3RhbmdsZVBvaW50WCA9IHggLSBsaW5lTGVuZ3RoIC0gMzA7XG4gICAgICAgIGVuZFJlY3RhbmdsZVBvaW50WCA9IHggLSBsaW5lTGVuZ3RoO1xuICAgIH1cbiAgICBsZXQgZmFrZVkgPSB0YXJnZXRDb21wb25lbnQubm9kZS55O1xuICAgIGxldCBmYWtlWCA9IHRhcmdldFJlY3QueDtcbiAgICBjb25zdCBzdHJva2VXaWR0aCA9IHRhcmdldENvbXBvbmVudC5ub2RlLm9yaWdpbi5saW5rTGluZVdpZHRoID8gdGFyZ2V0Q29tcG9uZW50Lm5vZGUub3JpZ2luLmxpbmtMaW5lV2lkdGggOiBTVFJPS0VfV0lEVEg7XG4gICAgY29uc3QgcG9pbnRPcHRpb25zID0ge1xuICAgICAgICBmYWtlWCxcbiAgICAgICAgZmFrZVksXG4gICAgICAgIHgsXG4gICAgICAgIHksXG4gICAgICAgIHdpZHRoLFxuICAgICAgICBoZWlnaHQsXG4gICAgICAgIHN0cm9rZVdpZHRoXG4gICAgfTtcbiAgICBjb25zdCBwYXJlbnRMYXlvdXQgPSBNaW5kbWFwUXVlcmllcy5nZXRDb3JyZWN0TGF5b3V0QnlFbGVtZW50KFxuICAgICAgICB0YXJnZXRDb21wb25lbnQubm9kZS5vcmlnaW4uaXNSb290ID8gdGFyZ2V0Q29tcG9uZW50Lm5vZGUub3JpZ2luIDogdGFyZ2V0Q29tcG9uZW50Lm5vZGUucGFyZW50Lm9yaWdpblxuICAgICk7XG4gICAgY29uc3QgbGF5b3V0ID0gTWluZG1hcFF1ZXJpZXMuZ2V0Q29ycmVjdExheW91dEJ5RWxlbWVudCh0YXJnZXRDb21wb25lbnQubm9kZS5vcmlnaW4pO1xuICAgIGlmICghaXNNaXhlZExheW91dChwYXJlbnRMYXlvdXQsIGxheW91dCkpIHtcbiAgICAgICAgLy8g5p6E6YCg5LiA5p2h55u057q/XG4gICAgICAgIGxldCBsaW5lUG9pbnRzID0gW1xuICAgICAgICAgICAgW3N0YXJ0TGluZVBvaW50LCB5ICsgaGVpZ2h0IC8gMl0sXG4gICAgICAgICAgICBbZW5kTGluZVBvaW50LCB5ICsgaGVpZ2h0IC8gMl1cbiAgICAgICAgXSBhcyBQb2ludFtdO1xuICAgICAgICBpZiAoaXNJbmRlbnRlZExheW91dChwYXJlbnRMYXlvdXQpKSB7XG4gICAgICAgICAgICBjb25zdCBmYWtlUG9pbnQgPSBnZXRJbmRlbnRlZEZha2VQb2ludChwYXJlbnRMYXlvdXQsIHBvaW50T3B0aW9ucyk7XG4gICAgICAgICAgICBkcmF3SW5kZW50Tm9kZUcoZmFrZURyb3BOb2RlRyBhcyBTVkdHRWxlbWVudCwgcm91Z2hTVkcsIGZha2VQb2ludCwgdGFyZ2V0Q29tcG9uZW50Lm5vZGUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2UgaWYgKGlzVmVydGljYWxMb2dpY0xheW91dChwYXJlbnRMYXlvdXQpKSB7XG4gICAgICAgICAgICBpZiAoIXRhcmdldENvbXBvbmVudC5ub2RlLm9yaWdpbi5pc1Jvb3QpIHtcbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiDorqHnrpfpgLvovpHvvJpcbiAgICAgICAgICAgICAgICAgKiAgMS4g56e75Yqo5Yiw5bem5L6n77ya5b2T5YmN6IqC54K5IHN0YXJ0WCAtIOWBj+enu+WAvO+8jOWBj+enu+WAvOiuoeeul+WmguS4i++8mlxuICAgICAgICAgICAgICAgICAqICAgICAgYS4g56ys5LiA5Liq6IqC54K577yaIOWbuuWumuWAvO+8iOadpea6kOS6jiBnZXRNYWluQXhsZe+8jOesrOS6jOe6p+iKgueCue+8mkJBU0UgKiA477yM5YW25LuWIEJBU0UgKiAzICsgc3Ryb2tlV2lkdGggLyAy77yJ77ybXG4gICAgICAgICAgICAgICAgICogICAgICBiLiDnrKzkuozkuKroioLngrnliLDmnIDlkI7kuIDkuKroioLngrnkuYvpl7TvvJrkuIrkuIDkuKroioLngrnliLDlvZPliY3oioLngrnpl7Tot53nmoTkuIDljYrvvIgo5b2T5YmN6IqC54K5IHN0YXJ0WCAtIOS4iuS4gOS4quiKgueCueeahCBlbmRYKSAvIDIp77yMZW5kWCA9IOW9k+WJjeiKgueCueeahCBzdGFydFggKyB3aWR0aDtcbiAgICAgICAgICAgICAgICAgKiAgMi4g56e75Yqo5Yiw5Y+z5L6n77ya5b2T5YmN6IqC54K5IHggKyB3aWR0aCArIOWBj+enu+WAvO+8jOWBj+enu+WAvOiuoeeul+WmguS4i++8mlxuICAgICAgICAgICAgICAgICAqICAgICAgYS4g56ys5LqM5Liq6IqC54K55Yiw5pyA5ZCO5LiA5Liq6IqC54K55LmL6Ze055qE5Y+z5L6n77ya5b2T5YmN6IqC54K55Yiw5LiL5LiA5Liq6IqC54K56Ze06Led55qE5LiA5Y2K77yIKOS4i+S4gOS4quiKgueCuSBzdGFydFggLSDlvZPliY3oioLngrnnmoQgZW5kWCkgLyAyKe+8jGVuZFggPSDlvZPliY3oioLngrnnmoQgc3RhcnRYICsgd2lkdGg7XG4gICAgICAgICAgICAgICAgICogICAgICBiLiDmnIDlkI7kuIDkuKroioLngrnnmoTlj7PkvqfvvJrlm7rlrprlgLzvvIjmnaXmupDkuo4gZ2V0TWFpbkF4bGXvvIznrKzkuoznuqfoioLngrnvvJpCQVNFICogOO+8jOWFtuS7liBCQVNFICogMyArIHN0cm9rZVdpZHRoIC8gMu+8ie+8m1xuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIGZha2VZID0gdGFyZ2V0Q29tcG9uZW50Lm5vZGUueTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRDb21wb25lbnQgPSBNSU5ETUFQX0VMRU1FTlRfVE9fQ09NUE9ORU5ULmdldCh0YXJnZXRDb21wb25lbnQucGFyZW50Lm9yaWdpbikgYXMgTWluZE5vZGVDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0SW5kZXggPSBwYXJlbnRDb21wb25lbnQubm9kZS5vcmlnaW4uY2hpbGRyZW4uaW5kZXhPZih0YXJnZXRDb21wb25lbnQubm9kZS5vcmlnaW4pO1xuXG4gICAgICAgICAgICAgICAgaWYgKGRldGVjdFJlc3VsdCA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvZmZzZXRYID0gMDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNGaXJzdE5vZGUgPSB0YXJnZXRJbmRleCA9PT0gMDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzRmlyc3ROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRYID0gcGFyZW50Q29tcG9uZW50Lm5vZGUub3JpZ2luLmlzUm9vdCA/IEJBU0UgKiA4IDogQkFTRSAqIDMgKyBzdHJva2VXaWR0aCAvIDI7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcmV2aW91c0NvbXBvbmVudCA9IE1JTkRNQVBfRUxFTUVOVF9UT19DT01QT05FTlQuZ2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudENvbXBvbmVudC5ub2RlLm9yaWdpbi5jaGlsZHJlblt0YXJnZXRJbmRleCAtIDFdXG4gICAgICAgICAgICAgICAgICAgICAgICApIGFzIE1pbmROb2RlQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJldmlvdXNSZWN0ID0gZ2V0UmVjdGFuZ2xlQnlOb2RlKHByZXZpb3VzQ29tcG9uZW50Lm5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3BhY2UgPSB0YXJnZXRSZWN0LnggLSAocHJldmlvdXNSZWN0LnggKyBwcmV2aW91c1JlY3Qud2lkdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0WCA9IHNwYWNlIC8gMjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmYWtlWCA9IHRhcmdldFJlY3QueCAtIG9mZnNldFggLSB3aWR0aCAvIDIgLSBNYXRoLmNlaWwoc3Ryb2tlV2lkdGggLyAyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGRldGVjdFJlc3VsdCA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb2Zmc2V0WCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzTGFzdE5vZGUgPSB0YXJnZXRJbmRleCA9PT0gcGFyZW50Q29tcG9uZW50Lm5vZGUub3JpZ2luLmNoaWxkcmVuLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0xhc3ROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRYID0gcGFyZW50Q29tcG9uZW50Lm5vZGUub3JpZ2luLmlzUm9vdCA/IEJBU0UgKiA4IDogQkFTRSAqIDMgKyBzdHJva2VXaWR0aCAvIDI7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0Q29tcG9uZW50ID0gTUlORE1BUF9FTEVNRU5UX1RPX0NPTVBPTkVOVC5nZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50Lm5vZGUub3JpZ2luLmNoaWxkcmVuW3RhcmdldEluZGV4ICsgMV1cbiAgICAgICAgICAgICAgICAgICAgICAgICkgYXMgTWluZE5vZGVDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0UmVjdCA9IGdldFJlY3RhbmdsZUJ5Tm9kZShuZXh0Q29tcG9uZW50Lm5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3BhY2UgPSBuZXh0UmVjdC54IC0gKHRhcmdldFJlY3QueCArIHRhcmdldFJlY3Qud2lkdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0WCA9IHNwYWNlIC8gMjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmYWtlWCA9IHRhcmdldFJlY3QueCArIHdpZHRoICsgb2Zmc2V0WCAtIHdpZHRoIC8gMiAtIE1hdGguY2VpbChzdHJva2VXaWR0aCAvIDIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzdGFydFJlY3RhbmdsZVBvaW50WCA9IGZha2VYO1xuICAgICAgICAgICAgICAgIGlmIChpc1RvcExheW91dChwYXJlbnRMYXlvdXQpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIOWboOS4uuefqeW9ouaYr+S7juW3puS4iuinkuS4uui1t+eCueWQkeS4i+eUu+eahO+8jOaJgOS7pemcgOimgeWQkeS4iuWBj+enu+S4gOS4quefqeW9oueahOmrmOW6pu+8iC0xMu+8iVxuICAgICAgICAgICAgICAgICAgICBzdGFydFJlY3RhbmdsZVBvaW50WSA9IGZha2VZICsgaGVpZ2h0ICsgdGFyZ2V0Q29tcG9uZW50Lm5vZGUudkdhcCAtIDEyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaXNCb3R0b21MYXlvdXQocGFyZW50TGF5b3V0KSkge1xuICAgICAgICAgICAgICAgICAgICBzdGFydFJlY3RhbmdsZVBvaW50WSA9IGZha2VZICsgdGFyZ2V0Q29tcG9uZW50Lm5vZGUudkdhcDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZW5kUmVjdGFuZ2xlUG9pbnRYID0gc3RhcnRSZWN0YW5nbGVQb2ludFggKyAzMDtcbiAgICAgICAgICAgICAgICBlbmRSZWN0YW5nbGVQb2ludFkgPSBzdGFydFJlY3RhbmdsZVBvaW50WSArIDEyO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZha2VOb2RlOiBNaW5kbWFwTm9kZSA9IHsgLi4udGFyZ2V0Q29tcG9uZW50Lm5vZGUsIHg6IGZha2VYLCB5OiBmYWtlWSwgd2lkdGg6IDMwIH07XG4gICAgICAgICAgICAgICAgY29uc3QgbGlua1NWR0cgPSBkcmF3TGluayhyb3VnaFNWRywgcGFyZW50Q29tcG9uZW50Lm5vZGUsIGZha2VOb2RlLCBQUklNQVJZX0NPTE9SLCBmYWxzZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGZha2VEcm9wTm9kZUc/LmFwcGVuZENoaWxkKGxpbmtTVkdHKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBsaW5rU1ZHRyA9IHJvdWdoU1ZHLmxpbmVhclBhdGgobGluZVBvaW50cywgeyBzdHJva2U6IFBSSU1BUllfQ09MT1IsIHN0cm9rZVdpZHRoIH0pO1xuICAgICAgICAgICAgZmFrZURyb3BOb2RlRz8uYXBwZW5kQ2hpbGQobGlua1NWR0cpO1xuICAgICAgICB9XG4gICAgICAgIC8vIOaehOmAoOS4gOS4quefqeW9ouahhuWdkOagh1xuICAgICAgICBsZXQgZmFrZVJlY3RhbmdsZUcgPSBkcmF3Um91bmRSZWN0YW5nbGUoXG4gICAgICAgICAgICByb3VnaFNWRyxcbiAgICAgICAgICAgIHN0YXJ0UmVjdGFuZ2xlUG9pbnRYLFxuICAgICAgICAgICAgc3RhcnRSZWN0YW5nbGVQb2ludFksXG4gICAgICAgICAgICBlbmRSZWN0YW5nbGVQb2ludFgsXG4gICAgICAgICAgICBlbmRSZWN0YW5nbGVQb2ludFksXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc3Ryb2tlOiBQUklNQVJZX0NPTE9SLFxuICAgICAgICAgICAgICAgIHN0cm9rZVdpZHRoOiAyLFxuICAgICAgICAgICAgICAgIGZpbGw6IFBSSU1BUllfQ09MT1IsXG4gICAgICAgICAgICAgICAgZmlsbFN0eWxlOiAnc29saWQnXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgICAgZmFrZURyb3BOb2RlRz8uYXBwZW5kQ2hpbGQoZmFrZVJlY3RhbmdsZUcpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOa3t+WQiOW4g+WxgOeUu+e6v+mAu+i+kVxuICAgICAgICBpZiAoaXNIb3Jpem9udGFsTG9naWNMYXlvdXQocGFyZW50TGF5b3V0KSkge1xuICAgICAgICAgICAgaWYgKGlzSW5kZW50ZWRMYXlvdXQobGF5b3V0KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZha2VQb2ludCA9IGdldEluZGVudGVkRmFrZVBvaW50KGxheW91dCwgcG9pbnRPcHRpb25zKTtcbiAgICAgICAgICAgICAgICBkcmF3SW5kZW50Tm9kZUcoZmFrZURyb3BOb2RlRyBhcyBTVkdHRWxlbWVudCwgcm91Z2hTVkcsIGZha2VQb2ludCwgdGFyZ2V0Q29tcG9uZW50Lm5vZGUpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5cbmV4cG9ydCBjb25zdCBnZXRIb3Jpem9udGFsRmFrZVkgPSAoXG4gICAgZGV0ZWN0UmVzdWx0OiAndG9wJyB8ICdib3R0b20nLFxuICAgIHRhcmdldEluZGV4OiBudW1iZXIsXG4gICAgcGFyZW50Tm9kZTogTWluZG1hcE5vZGUsXG4gICAgdGFyZ2V0UmVjdDoge1xuICAgICAgICB4OiBudW1iZXI7XG4gICAgICAgIHk6IG51bWJlcjtcbiAgICAgICAgd2lkdGg6IG51bWJlcjtcbiAgICAgICAgaGVpZ2h0OiBudW1iZXI7XG4gICAgfSxcbiAgICBsYXlvdXQ6IE1pbmRtYXBMYXlvdXRUeXBlLFxuICAgIGZha2VZOiBudW1iZXJcbikgPT4ge1xuICAgIGlmIChkZXRlY3RSZXN1bHQgPT09ICd0b3AnKSB7XG4gICAgICAgIGlmICh0YXJnZXRJbmRleCA9PT0gMCAmJiBpc1RvcExheW91dChsYXlvdXQpKSB7XG4gICAgICAgICAgICBmYWtlWSA9IHRhcmdldFJlY3QueSArIHRhcmdldFJlY3QuaGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0YXJnZXRJbmRleCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzQ29tcG9uZW50ID0gTUlORE1BUF9FTEVNRU5UX1RPX0NPTVBPTkVOVC5nZXQocGFyZW50Tm9kZS5vcmlnaW4uY2hpbGRyZW5bdGFyZ2V0SW5kZXggLSAxXSkgYXMgTWluZE5vZGVDb21wb25lbnQ7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91c1JlY3QgPSBnZXRSZWN0YW5nbGVCeU5vZGUocHJldmlvdXNDb21wb25lbnQubm9kZSk7XG4gICAgICAgICAgICBjb25zdCB0b3BZID0gcHJldmlvdXNSZWN0LnkgKyBwcmV2aW91c1JlY3QuaGVpZ2h0O1xuICAgICAgICAgICAgZmFrZVkgPSB0b3BZICsgKHRhcmdldFJlY3QueSAtIHRvcFkpIC8gNTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGV0ZWN0UmVzdWx0ID09PSAnYm90dG9tJykge1xuICAgICAgICBmYWtlWSA9IHRhcmdldFJlY3QueSArIHRhcmdldFJlY3QuaGVpZ2h0ICsgMzA7XG4gICAgICAgIGlmICh0YXJnZXRJbmRleCA8IHBhcmVudE5vZGUub3JpZ2luLmNoaWxkcmVuLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIGNvbnN0IG5leHRDb21wb25lbnQgPSBNSU5ETUFQX0VMRU1FTlRfVE9fQ09NUE9ORU5ULmdldChwYXJlbnROb2RlLm9yaWdpbi5jaGlsZHJlblt0YXJnZXRJbmRleCArIDFdKSBhcyBNaW5kTm9kZUNvbXBvbmVudDtcbiAgICAgICAgICAgIGNvbnN0IG5leHRSZWN0ID0gZ2V0UmVjdGFuZ2xlQnlOb2RlKG5leHRDb21wb25lbnQubm9kZSk7XG4gICAgICAgICAgICBjb25zdCB0b3BZID0gdGFyZ2V0UmVjdC55ICsgdGFyZ2V0UmVjdC5oZWlnaHQ7XG4gICAgICAgICAgICBmYWtlWSA9IHRvcFkgKyAobmV4dFJlY3QueSAtIHRvcFkpIC8gNTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGFyZ2V0SW5kZXggPT09IHBhcmVudE5vZGUub3JpZ2luLmNoaWxkcmVuLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIGZha2VZID0gdGFyZ2V0UmVjdC55ICsgdGFyZ2V0UmVjdC5oZWlnaHQgKyAzMDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFrZVk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0SW5kZW50ZWRGYWtlUG9pbnQgPSAoXG4gICAgbGF5b3V0OiBNaW5kbWFwTGF5b3V0VHlwZSxcbiAgICBwb2ludE9wdGlvbnM6IHtcbiAgICAgICAgZmFrZVg6IG51bWJlcjtcbiAgICAgICAgZmFrZVk6IG51bWJlcjtcbiAgICAgICAgeDogbnVtYmVyO1xuICAgICAgICB5OiBudW1iZXI7XG4gICAgICAgIHdpZHRoOiBudW1iZXI7XG4gICAgICAgIGhlaWdodDogbnVtYmVyO1xuICAgICAgICBzdHJva2VXaWR0aDogbnVtYmVyO1xuICAgIH1cbikgPT4ge1xuICAgIGxldCB7IGZha2VYLCBmYWtlWSwgeCwgeSwgd2lkdGgsIGhlaWdodCwgc3Ryb2tlV2lkdGggfSA9IHBvaW50T3B0aW9ucztcbiAgICBjb25zdCBoR2FwID0gQkFTRSAqIDQ7XG4gICAgY29uc3QgdkdhcCA9IEJBU0UgKiA2O1xuICAgIGNvbnN0IG9mZnNldFggPSBoR2FwICsgd2lkdGggLyAyICsgc3Ryb2tlV2lkdGg7XG4gICAgY29uc3Qgb2Zmc2V0WSA9IHZHYXAgKyBoZWlnaHQgLyAyICsgc3Ryb2tlV2lkdGg7XG4gICAgaWYgKGlzTGVmdExheW91dChsYXlvdXQpKSB7XG4gICAgICAgIGZha2VYID0geCAtIG9mZnNldFg7XG4gICAgfVxuICAgIGlmIChpc1JpZ2h0TGF5b3V0KGxheW91dCkpIHtcbiAgICAgICAgZmFrZVggPSB4ICsgb2Zmc2V0WDtcbiAgICB9XG4gICAgaWYgKGlzVG9wTGF5b3V0KGxheW91dCkpIHtcbiAgICAgICAgZmFrZVkgPSB5IC0gb2Zmc2V0WTtcbiAgICB9XG4gICAgaWYgKGlzQm90dG9tTGF5b3V0KGxheW91dCkpIHtcbiAgICAgICAgZmFrZVkgPSB5ICsgaGVpZ2h0ICsgb2Zmc2V0WTtcbiAgICB9XG4gICAgcmV0dXJuIHsgZmFrZVgsIGZha2VZIH07XG59O1xuXG5leHBvcnQgY29uc3QgZHJhd0luZGVudE5vZGVHID0gKFxuICAgIGZha2VEcm9wTm9kZUc6IFNWR0dFbGVtZW50LFxuICAgIHJvdWdoU1ZHOiBSb3VnaFNWRyxcbiAgICBmYWtlUG9pbnQ6IHsgZmFrZVg6IG51bWJlcjsgZmFrZVk6IG51bWJlciB9LFxuICAgIG5vZGU6IE1pbmRtYXBOb2RlXG4pID0+IHtcbiAgICBjb25zdCB7IGZha2VYLCBmYWtlWSB9ID0gZmFrZVBvaW50O1xuICAgIGNvbnN0IGZha2VOb2RlOiBNaW5kbWFwTm9kZSA9IHsgLi4ubm9kZSwgeDogZmFrZVgsIHk6IGZha2VZLCB3aWR0aDogMzAsIGhlaWdodDogMTIgfTtcbiAgICBjb25zdCBsaW5rU1ZHRyA9IGRyYXdJbmRlbnRlZExpbmsocm91Z2hTVkcsIG5vZGUsIGZha2VOb2RlLCBQUklNQVJZX0NPTE9SLCBmYWxzZSk7XG5cbiAgICBjb25zdCBzdGFydFJlY3RhbmdsZVBvaW50WCA9IGZha2VYLFxuICAgICAgICBzdGFydFJlY3RhbmdsZVBvaW50WSA9IGZha2VZLFxuICAgICAgICBlbmRSZWN0YW5nbGVQb2ludFggPSBmYWtlWCArIDMwLFxuICAgICAgICBlbmRSZWN0YW5nbGVQb2ludFkgPSBmYWtlWSArIDEyO1xuICAgIGNvbnN0IGZha2VSZWN0YW5nbGVHID0gZHJhd1JvdW5kUmVjdGFuZ2xlKFxuICAgICAgICByb3VnaFNWRyxcbiAgICAgICAgc3RhcnRSZWN0YW5nbGVQb2ludFgsXG4gICAgICAgIHN0YXJ0UmVjdGFuZ2xlUG9pbnRZLFxuICAgICAgICBlbmRSZWN0YW5nbGVQb2ludFgsXG4gICAgICAgIGVuZFJlY3RhbmdsZVBvaW50WSxcbiAgICAgICAge1xuICAgICAgICAgICAgc3Ryb2tlOiBQUklNQVJZX0NPTE9SLFxuICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IDIsXG4gICAgICAgICAgICBmaWxsOiBQUklNQVJZX0NPTE9SLFxuICAgICAgICAgICAgZmlsbFN0eWxlOiAnc29saWQnXG4gICAgICAgIH1cbiAgICApO1xuICAgIGZha2VEcm9wTm9kZUc/LmFwcGVuZENoaWxkKGxpbmtTVkdHKTtcbiAgICBmYWtlRHJvcE5vZGVHPy5hcHBlbmRDaGlsZChmYWtlUmVjdGFuZ2xlRyk7XG59O1xuIl19
@@ -0,0 +1,86 @@
1
+ import { isStandardLayout, isIndentedLayout, isVerticalLogicLayout, isTopLayout, MindmapLayoutType } from '@plait/layouts';
2
+ import { MINDMAP_ELEMENT_TO_COMPONENT } from './weak-maps';
3
+ import { MindmapQueries } from '../queries';
4
+ import { isMixedLayout } from './layout';
5
+ /* 根据布局调整 target 以及 direction */
6
+ export const readjustmentDropTarget = (dropTarget) => {
7
+ const { target, detectResult } = dropTarget;
8
+ const newDropTarget = { target, detectResult };
9
+ const targetComponent = MINDMAP_ELEMENT_TO_COMPONENT.get(target);
10
+ if (targetComponent.node.children.length > 0 && dropTarget.detectResult) {
11
+ const layout = MindmapQueries.getCorrectLayoutByElement(targetComponent.node.origin);
12
+ const parentLayout = MindmapQueries.getCorrectLayoutByElement(targetComponent.node.origin.isRoot ? targetComponent.node.origin : targetComponent.node.parent.origin);
13
+ if (['right', 'left'].includes(dropTarget.detectResult)) {
14
+ if (!isMixedLayout(parentLayout, layout)) {
15
+ if (targetComponent.node.origin.isRoot) {
16
+ const layout = MindmapQueries.getCorrectLayoutByElement(targetComponent.node.origin);
17
+ // 标准布局,根节点
18
+ if (isStandardLayout(layout)) {
19
+ const rightNodeCount = targetComponent.node.origin.rightNodeCount;
20
+ if (detectResult === 'left') {
21
+ // 作为左的第一个节点
22
+ if (targetComponent.node.children.length === rightNodeCount) {
23
+ return newDropTarget;
24
+ }
25
+ }
26
+ else {
27
+ // 作为右的第一个节点或最后一个节点
28
+ if (rightNodeCount === 0) {
29
+ newDropTarget.target = target;
30
+ }
31
+ else {
32
+ newDropTarget.target = targetComponent.node.children[rightNodeCount - 1].origin;
33
+ newDropTarget.detectResult = 'bottom';
34
+ }
35
+ return newDropTarget;
36
+ }
37
+ }
38
+ }
39
+ // 缩进布局探测到第一个子节点
40
+ if (isIndentedLayout(parentLayout)) {
41
+ newDropTarget.target = targetComponent.node.children[0].origin;
42
+ newDropTarget.detectResult = isTopLayout(parentLayout) ? 'bottom' : 'top';
43
+ return newDropTarget;
44
+ }
45
+ // 上下布局的根节点只可以探测到上或者下,子节点的左右探测不处理,跳过。
46
+ if (isVerticalLogicLayout(parentLayout)) {
47
+ return newDropTarget;
48
+ }
49
+ // 剩下是水平布局的默认情况:插入最后一个子节点的下方
50
+ const lastChildNodeIndex = targetComponent.node.children.length - 1;
51
+ newDropTarget.target = targetComponent.node.children[lastChildNodeIndex].origin;
52
+ newDropTarget.detectResult = 'bottom';
53
+ }
54
+ else {
55
+ // 处理左右布局下的混合布局
56
+ if ([MindmapLayoutType.left, MindmapLayoutType.right].includes(parentLayout)) {
57
+ const layout = MindmapQueries.getCorrectLayoutByElement(targetComponent.node.origin);
58
+ if (isIndentedLayout(layout)) {
59
+ newDropTarget.target = targetComponent.node.children[0].origin;
60
+ newDropTarget.detectResult = isTopLayout(layout) ? 'bottom' : 'top';
61
+ return newDropTarget;
62
+ }
63
+ }
64
+ }
65
+ }
66
+ if (['top', 'bottom'].includes(dropTarget.detectResult)) {
67
+ // 缩进布局移动至第一个节点
68
+ if (targetComponent.node.origin.isRoot && isIndentedLayout(layout)) {
69
+ newDropTarget.target = targetComponent.node.children[0].origin;
70
+ newDropTarget.detectResult = isTopLayout(layout) ? 'bottom' : 'top';
71
+ return newDropTarget;
72
+ }
73
+ // 上下布局,插到右边
74
+ const parentLayout = MindmapQueries.getCorrectLayoutByElement(targetComponent.node.origin.isRoot ? targetComponent.node.origin : targetComponent.node.parent.origin);
75
+ if (isVerticalLogicLayout(parentLayout)) {
76
+ const lastChildNodeIndex = targetComponent.node.children.length - 1;
77
+ newDropTarget.target = targetComponent.node.children[lastChildNodeIndex].origin;
78
+ newDropTarget.detectResult = 'right';
79
+ return newDropTarget;
80
+ }
81
+ }
82
+ return newDropTarget;
83
+ }
84
+ return dropTarget;
85
+ };
86
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcC10YXJnZXQtY29ycmVjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvbWluZC9zcmMvdXRpbHMvZHJvcC10YXJnZXQtY29ycmVjdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxxQkFBcUIsRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUczSCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDM0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM1QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXpDLGdDQUFnQztBQUNoQyxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLFVBR3RDLEVBQXVELEVBQUU7SUFDdEQsTUFBTSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsR0FBRyxVQUFVLENBQUM7SUFDNUMsTUFBTSxhQUFhLEdBQUcsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLENBQUM7SUFDL0MsTUFBTSxlQUFlLEdBQUcsNEJBQTRCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBc0IsQ0FBQztJQUN0RixJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksVUFBVSxDQUFDLFlBQVksRUFBRTtRQUNyRSxNQUFNLE1BQU0sR0FBRyxjQUFjLENBQUMseUJBQXlCLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyRixNQUFNLFlBQVksR0FBRyxjQUFjLENBQUMseUJBQXlCLENBQ3pELGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLGVB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Q0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzU3RhbmRhcmRMYXlvdXQsIGlzSW5kZW50ZWRMYXlvdXQsIGlzVmVydGljYWxMb2dpY0xheW91dCwgaXNUb3BMYXlvdXQsIE1pbmRtYXBMYXlvdXRUeXBlIH0gZnJvbSAnQHBsYWl0L2xheW91dHMnO1xuaW1wb3J0IHsgRGV0ZWN0UmVzdWx0LCBNaW5kRWxlbWVudCB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgTWluZE5vZGVDb21wb25lbnQgfSBmcm9tICcuLi9ub2RlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBNSU5ETUFQX0VMRU1FTlRfVE9fQ09NUE9ORU5UIH0gZnJvbSAnLi93ZWFrLW1hcHMnO1xuaW1wb3J0IHsgTWluZG1hcFF1ZXJpZXMgfSBmcm9tICcuLi9xdWVyaWVzJztcbmltcG9ydCB7IGlzTWl4ZWRMYXlvdXQgfSBmcm9tICcuL2xheW91dCc7XG5cbi8qIOagueaNruW4g+WxgOiwg+aVtCB0YXJnZXQg5Lul5Y+KIGRpcmVjdGlvbiAqL1xuZXhwb3J0IGNvbnN0IHJlYWRqdXN0bWVudERyb3BUYXJnZXQgPSAoZHJvcFRhcmdldDoge1xuICAgIHRhcmdldDogTWluZEVsZW1lbnQ7XG4gICAgZGV0ZWN0UmVzdWx0OiBEZXRlY3RSZXN1bHQ7XG59KTogeyB0YXJnZXQ6IE1pbmRFbGVtZW50OyBkZXRlY3RSZXN1bHQ6IERldGVjdFJlc3VsdCB9ID0+IHtcbiAgICBjb25zdCB7IHRhcmdldCwgZGV0ZWN0UmVzdWx0IH0gPSBkcm9wVGFyZ2V0O1xuICAgIGNvbnN0IG5ld0Ryb3BUYXJnZXQgPSB7IHRhcmdldCwgZGV0ZWN0UmVzdWx0IH07XG4gICAgY29uc3QgdGFyZ2V0Q29tcG9uZW50ID0gTUlORE1BUF9FTEVNRU5UX1RPX0NPTVBPTkVOVC5nZXQodGFyZ2V0KSBhcyBNaW5kTm9kZUNvbXBvbmVudDtcbiAgICBpZiAodGFyZ2V0Q29tcG9uZW50Lm5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCAmJiBkcm9wVGFyZ2V0LmRldGVjdFJlc3VsdCkge1xuICAgICAgICBjb25zdCBsYXlvdXQgPSBNaW5kbWFwUXVlcmllcy5nZXRDb3JyZWN0TGF5b3V0QnlFbGVtZW50KHRhcmdldENvbXBvbmVudC5ub2RlLm9yaWdpbik7XG4gICAgICAgIGNvbnN0IHBhcmVudExheW91dCA9IE1pbmRtYXBRdWVyaWVzLmdldENvcnJlY3RMYXlvdXRCeUVsZW1lbnQoXG4gICAgICAgICAgICB0YXJnZXRDb21wb25lbnQubm9kZS5vcmlnaW4uaXNSb290ID8gdGFyZ2V0Q29tcG9uZW50Lm5vZGUub3JpZ2luIDogdGFyZ2V0Q29tcG9uZW50Lm5vZGUucGFyZW50Lm9yaWdpblxuICAgICAgICApO1xuICAgICAgICBpZiAoWydyaWdodCcsICdsZWZ0J10uaW5jbHVkZXMoZHJvcFRhcmdldC5kZXRlY3RSZXN1bHQpKSB7XG4gICAgICAgICAgICBpZiAoIWlzTWl4ZWRMYXlvdXQocGFyZW50TGF5b3V0LCBsYXlvdXQpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldENvbXBvbmVudC5ub2RlLm9yaWdpbi5pc1Jvb3QpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGF5b3V0ID0gTWluZG1hcFF1ZXJpZXMuZ2V0Q29ycmVjdExheW91dEJ5RWxlbWVudCh0YXJnZXRDb21wb25lbnQubm9kZS5vcmlnaW4pO1xuICAgICAgICAgICAgICAgICAgICAvLyDmoIflh4bluIPlsYDvvIzmoLnoioLngrlcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzU3RhbmRhcmRMYXlvdXQobGF5b3V0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmlnaHROb2RlQ291bnQgPSB0YXJnZXRDb21wb25lbnQubm9kZS5vcmlnaW4ucmlnaHROb2RlQ291bnQgYXMgbnVtYmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRldGVjdFJlc3VsdCA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g5L2c5Li65bem55qE56ys5LiA5Liq6IqC54K5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldENvbXBvbmVudC5ub2RlLmNoaWxkcmVuLmxlbmd0aCA9PT0gcmlnaHROb2RlQ291bnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld0Ryb3BUYXJnZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDkvZzkuLrlj7PnmoTnrKzkuIDkuKroioLngrnmiJbmnIDlkI7kuIDkuKroioLngrlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmlnaHROb2RlQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RHJvcFRhcmdldC50YXJnZXQgPSB0YXJnZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RHJvcFRhcmdldC50YXJnZXQgPSB0YXJnZXRDb21wb25lbnQubm9kZS5jaGlsZHJlbltyaWdodE5vZGVDb3VudCAtIDFdLm9yaWdpbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RHJvcFRhcmdldC5kZXRlY3RSZXN1bHQgPSAnYm90dG9tJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld0Ryb3BUYXJnZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyDnvKnov5vluIPlsYDmjqLmtYvliLDnrKzkuIDkuKrlrZDoioLngrlcbiAgICAgICAgICAgICAgICBpZiAoaXNJbmRlbnRlZExheW91dChwYXJlbnRMYXlvdXQpKSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld0Ryb3BUYXJnZXQudGFyZ2V0ID0gdGFyZ2V0Q29tcG9uZW50Lm5vZGUuY2hpbGRyZW5bMF0ub3JpZ2luO1xuICAgICAgICAgICAgICAgICAgICBuZXdEcm9wVGFyZ2V0LmRldGVjdFJlc3VsdCA9IGlzVG9wTGF5b3V0KHBhcmVudExheW91dCkgPyAnYm90dG9tJyA6ICd0b3AnO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3RHJvcFRhcmdldDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8g5LiK5LiL5biD5bGA55qE5qC56IqC54K55Y+q5Y+v5Lul5o6i5rWL5Yiw5LiK5oiW6ICF5LiL77yM5a2Q6IqC54K555qE5bem5Y+z5o6i5rWL5LiN5aSE55CG77yM6Lez6L+H44CCXG4gICAgICAgICAgICAgICAgaWYgKGlzVmVydGljYWxMb2dpY0xheW91dChwYXJlbnRMYXlvdXQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdEcm9wVGFyZ2V0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyDliankuIvmmK/msLTlubPluIPlsYDnmoTpu5jorqTmg4XlhrXvvJrmj5LlhaXmnIDlkI7kuIDkuKrlrZDoioLngrnnmoTkuIvmlrlcbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0Q2hpbGROb2RlSW5kZXggPSB0YXJnZXRDb21wb25lbnQubm9kZS5jaGlsZHJlbi5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgIG5ld0Ryb3BUYXJnZXQudGFyZ2V0ID0gdGFyZ2V0Q29tcG9uZW50Lm5vZGUuY2hpbGRyZW5bbGFzdENoaWxkTm9kZUluZGV4XS5vcmlnaW47XG4gICAgICAgICAgICAgICAgbmV3RHJvcFRhcmdldC5kZXRlY3RSZXN1bHQgPSAnYm90dG9tJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8g5aSE55CG5bem5Y+z5biD5bGA5LiL55qE5re35ZCI5biD5bGAXG4gICAgICAgICAgICAgICAgaWYgKFtNaW5kbWFwTGF5b3V0VHlwZS5sZWZ0LCBNaW5kbWFwTGF5b3V0VHlwZS5yaWdodF0uaW5jbHVkZXMocGFyZW50TGF5b3V0KSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXlvdXQgPSBNaW5kbWFwUXVlcmllcy5nZXRDb3JyZWN0TGF5b3V0QnlFbGVtZW50KHRhcmdldENvbXBvbmVudC5ub2RlLm9yaWdpbik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0luZGVudGVkTGF5b3V0KGxheW91dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Ryb3BUYXJnZXQudGFyZ2V0ID0gdGFyZ2V0Q29tcG9uZW50Lm5vZGUuY2hpbGRyZW5bMF0ub3JpZ2luO1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3RHJvcFRhcmdldC5kZXRlY3RSZXN1bHQgPSBpc1RvcExheW91dChsYXlvdXQpID8gJ2JvdHRvbScgOiAndG9wJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdEcm9wVGFyZ2V0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChbJ3RvcCcsICdib3R0b20nXS5pbmNsdWRlcyhkcm9wVGFyZ2V0LmRldGVjdFJlc3VsdCkpIHtcbiAgICAgICAgICAgIC8vIOe8qei/m+W4g+WxgOenu+WKqOiHs+esrOS4gOS4quiKgueCuVxuICAgICAgICAgICAgaWYgKHRhcmdldENvbXBvbmVudC5ub2RlLm9yaWdpbi5pc1Jvb3QgJiYgaXNJbmRlbnRlZExheW91dChsYXlvdXQpKSB7XG4gICAgICAgICAgICAgICAgbmV3RHJvcFRhcmdldC50YXJnZXQgPSB0YXJnZXRDb21wb25lbnQubm9kZS5jaGlsZHJlblswXS5vcmlnaW47XG4gICAgICAgICAgICAgICAgbmV3RHJvcFRhcmdldC5kZXRlY3RSZXN1bHQgPSBpc1RvcExheW91dChsYXlvdXQpID8gJ2JvdHRvbScgOiAndG9wJztcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3RHJvcFRhcmdldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIOS4iuS4i+W4g+WxgO+8jOaPkuWIsOWPs+i+uVxuICAgICAgICAgICAgY29uc3QgcGFyZW50TGF5b3V0ID0gTWluZG1hcFF1ZXJpZXMuZ2V0Q29ycmVjdExheW91dEJ5RWxlbWVudChcbiAgICAgICAgICAgICAgICB0YXJnZXRDb21wb25lbnQubm9kZS5vcmlnaW4uaXNSb290ID8gdGFyZ2V0Q29tcG9uZW50Lm5vZGUub3JpZ2luIDogdGFyZ2V0Q29tcG9uZW50Lm5vZGUucGFyZW50Lm9yaWdpblxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChpc1ZlcnRpY2FsTG9naWNMYXlvdXQocGFyZW50TGF5b3V0KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RDaGlsZE5vZGVJbmRleCA9IHRhcmdldENvbXBvbmVudC5ub2RlLmNoaWxkcmVuLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgbmV3RHJvcFRhcmdldC50YXJnZXQgPSB0YXJnZXRDb21wb25lbnQubm9kZS5jaGlsZHJlbltsYXN0Q2hpbGROb2RlSW5kZXhdLm9yaWdpbjtcbiAgICAgICAgICAgICAgICBuZXdEcm9wVGFyZ2V0LmRldGVjdFJlc3VsdCA9ICdyaWdodCc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ld0Ryb3BUYXJnZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ld0Ryb3BUYXJnZXQ7XG4gICAgfVxuICAgIHJldHVybiBkcm9wVGFyZ2V0O1xufTtcbiJdfQ==
@@ -0,0 +1,24 @@
1
+ import { distanceBetweenPointAndRectangle } from '@plait/core';
2
+ import { ELEMENT_TO_NODE } from './weak-maps';
3
+ export function getRectangleByNode(node) {
4
+ const x = node.x + node.hGap;
5
+ let y = node.y + node.vGap;
6
+ const width = node.width - node.hGap * 2;
7
+ const height = node.height - node.vGap * 2;
8
+ return {
9
+ x,
10
+ y,
11
+ width,
12
+ height
13
+ };
14
+ }
15
+ export function hitMindmapElement(board, point, element) {
16
+ const node = ELEMENT_TO_NODE.get(element);
17
+ if (node && distanceBetweenPointAndRectangle(point[0], point[1], getRectangleByNode(node)) === 0) {
18
+ return true;
19
+ }
20
+ else {
21
+ return false;
22
+ }
23
+ }
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9taW5kL3NyYy91dGlscy9ncmFwaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQXNDLGdDQUFnQyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRW5HLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFOUMsTUFBTSxVQUFVLGtCQUFrQixDQUFDLElBQWlCO0lBQ2hELE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztJQUM3QixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDM0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUN6QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQzNDLE9BQU87UUFDSCxDQUFDO1FBQ0QsQ0FBQztRQUNELEtBQUs7UUFDTCxNQUFNO0tBQ1QsQ0FBQztBQUNOLENBQUM7QUFFRCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsS0FBaUIsRUFBRSxLQUFZLEVBQUUsT0FBb0I7SUFDbkYsTUFBTSxJQUFJLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMxQyxJQUFJLElBQUksSUFBSSxnQ0FBZ0MsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQzlGLE9BQU8sSUFBSSxDQUFDO0tBQ2Y7U0FBTTtRQUNILE9BQU8sS0FBSyxDQUFDO0tBQ2hCO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1pbmRtYXBOb2RlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9ub2RlJztcbmltcG9ydCB7IFBsYWl0Qm9hcmQsIFBvaW50LCBSZWN0YW5nbGVDbGllbnQsIGRpc3RhbmNlQmV0d2VlblBvaW50QW5kUmVjdGFuZ2xlIH0gZnJvbSAnQHBsYWl0L2NvcmUnO1xuaW1wb3J0IHsgTWluZEVsZW1lbnQgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEVMRU1FTlRfVE9fTk9ERSB9IGZyb20gJy4vd2Vhay1tYXBzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFJlY3RhbmdsZUJ5Tm9kZShub2RlOiBNaW5kbWFwTm9kZSk6IFJlY3RhbmdsZUNsaWVudCB7XG4gICAgY29uc3QgeCA9IG5vZGUueCArIG5vZGUuaEdhcDtcbiAgICBsZXQgeSA9IG5vZGUueSArIG5vZGUudkdhcDtcbiAgICBjb25zdCB3aWR0aCA9IG5vZGUud2lkdGggLSBub2RlLmhHYXAgKiAyO1xuICAgIGNvbnN0IGhlaWdodCA9IG5vZGUuaGVpZ2h0IC0gbm9kZS52R2FwICogMjtcbiAgICByZXR1cm4ge1xuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0XG4gICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhpdE1pbmRtYXBFbGVtZW50KGJvYXJkOiBQbGFpdEJvYXJkLCBwb2ludDogUG9pbnQsIGVsZW1lbnQ6IE1pbmRFbGVtZW50KSB7XG4gICAgY29uc3Qgbm9kZSA9IEVMRU1FTlRfVE9fTk9ERS5nZXQoZWxlbWVudCk7XG4gICAgaWYgKG5vZGUgJiYgZGlzdGFuY2VCZXR3ZWVuUG9pbnRBbmRSZWN0YW5nbGUocG9pbnRbMF0sIHBvaW50WzFdLCBnZXRSZWN0YW5nbGVCeU5vZGUobm9kZSkpID09PSAwKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG4iXX0=
@@ -0,0 +1,14 @@
1
+ export * from './graph';
2
+ export * from './weak-maps';
3
+ export * from './mindmap';
4
+ export * from './layout';
5
+ export * from './shape';
6
+ export * from './colors';
7
+ export * from './is-virtual-key';
8
+ export * from './draw-placeholder';
9
+ export * from './direction-detector';
10
+ export * from './direction-corrector';
11
+ export * from './drop-target-corrector';
12
+ export * from './abstract/common';
13
+ export * from './abstract/resize';
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9taW5kL3NyYy91dGlscy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLFNBQVMsQ0FBQztBQUN4QixjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLFdBQVcsQ0FBQztBQUMxQixjQUFjLFVBQVUsQ0FBQztBQUN6QixjQUFjLFNBQVMsQ0FBQztBQUN4QixjQUFjLFVBQVUsQ0FBQztBQUN6QixjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLG1CQUFtQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9ncmFwaCc7XG5leHBvcnQgKiBmcm9tICcuL3dlYWstbWFwcyc7XG5leHBvcnQgKiBmcm9tICcuL21pbmRtYXAnO1xuZXhwb3J0ICogZnJvbSAnLi9sYXlvdXQnO1xuZXhwb3J0ICogZnJvbSAnLi9zaGFwZSc7XG5leHBvcnQgKiBmcm9tICcuL2NvbG9ycyc7XG5leHBvcnQgKiBmcm9tICcuL2lzLXZpcnR1YWwta2V5JztcbmV4cG9ydCAqIGZyb20gJy4vZHJhdy1wbGFjZWhvbGRlcic7XG5leHBvcnQgKiBmcm9tICcuL2RpcmVjdGlvbi1kZXRlY3Rvcic7XG5leHBvcnQgKiBmcm9tICcuL2RpcmVjdGlvbi1jb3JyZWN0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9kcm9wLXRhcmdldC1jb3JyZWN0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9hYnN0cmFjdC9jb21tb24nO1xuZXhwb3J0ICogZnJvbSAnLi9hYnN0cmFjdC9yZXNpemUnO1xuIl19
@@ -0,0 +1,13 @@
1
+ import { isKeyHotkey } from 'is-hotkey';
2
+ export function isVirtualKey(e) {
3
+ const isMod = e.ctrlKey || e.metaKey;
4
+ const isAlt = isKeyHotkey('alt', e);
5
+ const isShift = isKeyHotkey('shift', e);
6
+ const isCapsLock = e.key.includes('CapsLock');
7
+ const isTab = e.key.includes('Tab');
8
+ const isEsc = e.key.includes('Escape');
9
+ const isF = e.key.startsWith('F');
10
+ const isArrow = e.key.includes('Arrow') ? true : false;
11
+ return isCapsLock || isMod || isAlt || isArrow || isShift || isTab || isEsc || isF;
12
+ }
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXMtdmlydHVhbC1rZXkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9taW5kL3NyYy91dGlscy9pcy12aXJ0dWFsLWtleS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXhDLE1BQU0sVUFBVSxZQUFZLENBQUMsQ0FBZ0I7SUFDekMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDO0lBQ3JDLE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDcEMsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4QyxNQUFNLFVBQVUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM5QyxNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwQyxNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN2QyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsQyxNQUFNLE9BQU8sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDdkQsT0FBTyxVQUFVLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxPQUFPLElBQUksT0FBTyxJQUFJLEtBQUssSUFBSSxLQUFLLElBQUksR0FBRyxDQUFDO0FBQ3ZGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc0tleUhvdGtleSB9IGZyb20gJ2lzLWhvdGtleSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ZpcnR1YWxLZXkoZTogS2V5Ym9hcmRFdmVudCkge1xuICAgIGNvbnN0IGlzTW9kID0gZS5jdHJsS2V5IHx8IGUubWV0YUtleTtcbiAgICBjb25zdCBpc0FsdCA9IGlzS2V5SG90a2V5KCdhbHQnLCBlKTtcbiAgICBjb25zdCBpc1NoaWZ0ID0gaXNLZXlIb3RrZXkoJ3NoaWZ0JywgZSk7XG4gICAgY29uc3QgaXNDYXBzTG9jayA9IGUua2V5LmluY2x1ZGVzKCdDYXBzTG9jaycpO1xuICAgIGNvbnN0IGlzVGFiID0gZS5rZXkuaW5jbHVkZXMoJ1RhYicpO1xuICAgIGNvbnN0IGlzRXNjID0gZS5rZXkuaW5jbHVkZXMoJ0VzY2FwZScpO1xuICAgIGNvbnN0IGlzRiA9IGUua2V5LnN0YXJ0c1dpdGgoJ0YnKTtcbiAgICBjb25zdCBpc0Fycm93ID0gZS5rZXkuaW5jbHVkZXMoJ0Fycm93JykgPyB0cnVlIDogZmFsc2U7XG4gICAgcmV0dXJuIGlzQ2Fwc0xvY2sgfHwgaXNNb2QgfHwgaXNBbHQgfHwgaXNBcnJvdyB8fCBpc1NoaWZ0IHx8IGlzVGFiIHx8IGlzRXNjIHx8IGlzRjtcbn1cbiJdfQ==