@plait/core 0.77.3 → 0.78.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.
- package/fesm2022/plait-core.mjs.map +1 -1
- package/package.json +1 -3
- package/esm2022/constants/cursor.mjs +0 -13
- package/esm2022/constants/index.mjs +0 -20
- package/esm2022/constants/keycodes.mjs +0 -127
- package/esm2022/constants/selection.mjs +0 -6
- package/esm2022/constants/zoom.mjs +0 -4
- package/esm2022/context.mjs +0 -23
- package/esm2022/core/element/context-change.mjs +0 -13
- package/esm2022/core/element/context.mjs +0 -2
- package/esm2022/core/element/element-flavour.mjs +0 -140
- package/esm2022/core/element/element-ref.mjs +0 -2
- package/esm2022/core/list-render.mjs +0 -217
- package/esm2022/differs/default_iterable_differ.mjs +0 -614
- package/esm2022/differs/iterable_differs.mjs +0 -9
- package/esm2022/interfaces/board.mjs +0 -108
- package/esm2022/interfaces/custom-types.mjs +0 -5
- package/esm2022/interfaces/direction.mjs +0 -8
- package/esm2022/interfaces/element.mjs +0 -43
- package/esm2022/interfaces/group.mjs +0 -6
- package/esm2022/interfaces/history.mjs +0 -5
- package/esm2022/interfaces/index.mjs +0 -19
- package/esm2022/interfaces/node.mjs +0 -57
- package/esm2022/interfaces/operation.mjs +0 -96
- package/esm2022/interfaces/path-ref.mjs +0 -15
- package/esm2022/interfaces/path.mjs +0 -183
- package/esm2022/interfaces/plugin.mjs +0 -6
- package/esm2022/interfaces/point.mjs +0 -27
- package/esm2022/interfaces/pointer.mjs +0 -6
- package/esm2022/interfaces/rectangle-client.mjs +0 -171
- package/esm2022/interfaces/selection.mjs +0 -13
- package/esm2022/interfaces/svg-arc-command.mjs +0 -2
- package/esm2022/interfaces/theme.mjs +0 -49
- package/esm2022/interfaces/viewport.mjs +0 -7
- package/esm2022/plait-core.mjs +0 -5
- package/esm2022/plugins/create-board.mjs +0 -122
- package/esm2022/plugins/index.mjs +0 -11
- package/esm2022/plugins/with-board.mjs +0 -20
- package/esm2022/plugins/with-hand.mjs +0 -113
- package/esm2022/plugins/with-history.mjs +0 -91
- package/esm2022/plugins/with-hotkey.mjs +0 -96
- package/esm2022/plugins/with-i18n.mjs +0 -13
- package/esm2022/plugins/with-moving.mjs +0 -282
- package/esm2022/plugins/with-options.mjs +0 -13
- package/esm2022/plugins/with-related-fragment.mjs +0 -23
- package/esm2022/plugins/with-selection.mjs +0 -230
- package/esm2022/public-api.mjs +0 -16
- package/esm2022/testing/core/create-board.mjs +0 -15
- package/esm2022/testing/core/fake-weak-map.mjs +0 -18
- package/esm2022/testing/core/index.mjs +0 -3
- package/esm2022/testing/fake-events/event-objects.mjs +0 -131
- package/esm2022/testing/fake-events/index.mjs +0 -2
- package/esm2022/testing/index.mjs +0 -3
- package/esm2022/testing/test-element.mjs +0 -9
- package/esm2022/transforms/board.mjs +0 -137
- package/esm2022/transforms/element.mjs +0 -22
- package/esm2022/transforms/general.mjs +0 -146
- package/esm2022/transforms/group.mjs +0 -64
- package/esm2022/transforms/index.mjs +0 -17
- package/esm2022/transforms/node.mjs +0 -37
- package/esm2022/transforms/selection.mjs +0 -26
- package/esm2022/transforms/theme.mjs +0 -8
- package/esm2022/transforms/viewport.mjs +0 -8
- package/esm2022/transforms/z-index.mjs +0 -20
- package/esm2022/utils/angle.mjs +0 -164
- package/esm2022/utils/board.mjs +0 -18
- package/esm2022/utils/clipboard/clipboard.mjs +0 -40
- package/esm2022/utils/clipboard/common.mjs +0 -82
- package/esm2022/utils/clipboard/data-transfer.mjs +0 -33
- package/esm2022/utils/clipboard/index.mjs +0 -3
- package/esm2022/utils/clipboard/navigator-clipboard.mjs +0 -71
- package/esm2022/utils/clipboard/types.mjs +0 -13
- package/esm2022/utils/common.mjs +0 -79
- package/esm2022/utils/debug.mjs +0 -91
- package/esm2022/utils/dnd.mjs +0 -8
- package/esm2022/utils/dom/common.mjs +0 -75
- package/esm2022/utils/dom/environment.mjs +0 -2
- package/esm2022/utils/dom/foreign.mjs +0 -26
- package/esm2022/utils/dom/index.mjs +0 -4
- package/esm2022/utils/drawing/arrow.mjs +0 -23
- package/esm2022/utils/drawing/circle.mjs +0 -4
- package/esm2022/utils/drawing/line.mjs +0 -47
- package/esm2022/utils/drawing/rectangle.mjs +0 -36
- package/esm2022/utils/element.mjs +0 -90
- package/esm2022/utils/environment.mjs +0 -14
- package/esm2022/utils/fragment.mjs +0 -27
- package/esm2022/utils/group.mjs +0 -239
- package/esm2022/utils/helper.mjs +0 -68
- package/esm2022/utils/history.mjs +0 -96
- package/esm2022/utils/hotkeys.mjs +0 -109
- package/esm2022/utils/id-creator.mjs +0 -11
- package/esm2022/utils/index.mjs +0 -35
- package/esm2022/utils/iterable.mjs +0 -32
- package/esm2022/utils/math.mjs +0 -480
- package/esm2022/utils/mobile.mjs +0 -6
- package/esm2022/utils/moving-element.mjs +0 -17
- package/esm2022/utils/pointer.mjs +0 -13
- package/esm2022/utils/position.mjs +0 -9
- package/esm2022/utils/selected-element.mjs +0 -145
- package/esm2022/utils/selection.mjs +0 -151
- package/esm2022/utils/snap/snap-moving.mjs +0 -199
- package/esm2022/utils/snap/snap.mjs +0 -211
- package/esm2022/utils/to-image.mjs +0 -204
- package/esm2022/utils/to-point.mjs +0 -74
- package/esm2022/utils/tree.mjs +0 -22
- package/esm2022/utils/viewport.mjs +0 -227
- package/esm2022/utils/weak-maps.mjs +0 -27
- package/esm2022/utils/z-index.mjs +0 -166
|
@@ -1,211 +0,0 @@
|
|
|
1
|
-
import { PlaitBoard, RectangleClient, SELECTION_BORDER_COLOR } from '../../interfaces';
|
|
2
|
-
import { getRectangleByAngle } from '../angle';
|
|
3
|
-
import { createG } from '../dom';
|
|
4
|
-
import { findElements } from '../element';
|
|
5
|
-
export const SNAP_TOLERANCE = 2;
|
|
6
|
-
const SNAP_SPACING = 24;
|
|
7
|
-
export function getSnapRectangles(board, activeElements) {
|
|
8
|
-
const elements = findElements(board, {
|
|
9
|
-
match: element => board.isAlign(element) && !activeElements.some(item => item.id === element.id),
|
|
10
|
-
recursion: () => true,
|
|
11
|
-
isReverse: false
|
|
12
|
-
});
|
|
13
|
-
return elements.map(item => {
|
|
14
|
-
const rectangle = board.getRectangle(item);
|
|
15
|
-
return getRectangleByAngle(rectangle, item.angle || 0);
|
|
16
|
-
});
|
|
17
|
-
}
|
|
18
|
-
export function getBarPoint(point, isHorizontal) {
|
|
19
|
-
return isHorizontal
|
|
20
|
-
? [
|
|
21
|
-
[point[0], point[1] - 4],
|
|
22
|
-
[point[0], point[1] + 4]
|
|
23
|
-
]
|
|
24
|
-
: [
|
|
25
|
-
[point[0] - 4, point[1]],
|
|
26
|
-
[point[0] + 4, point[1]]
|
|
27
|
-
];
|
|
28
|
-
}
|
|
29
|
-
export function getMinPointDelta(pointRectangles, axis, isHorizontal) {
|
|
30
|
-
let delta = SNAP_TOLERANCE;
|
|
31
|
-
pointRectangles.forEach(item => {
|
|
32
|
-
const distance = getNearestDelta(axis, item, isHorizontal);
|
|
33
|
-
if (Math.abs(distance) < Math.abs(delta)) {
|
|
34
|
-
delta = distance;
|
|
35
|
-
}
|
|
36
|
-
});
|
|
37
|
-
return delta;
|
|
38
|
-
}
|
|
39
|
-
export const getNearestDelta = (axis, rectangle, isHorizontal) => {
|
|
40
|
-
const pointAxis = getTripleAxis(rectangle, isHorizontal);
|
|
41
|
-
const deltas = pointAxis.map(item => item - axis);
|
|
42
|
-
const absDeltas = deltas.map(item => Math.abs(item));
|
|
43
|
-
const index = absDeltas.indexOf(Math.min(...absDeltas));
|
|
44
|
-
return deltas[index];
|
|
45
|
-
};
|
|
46
|
-
export const getTripleAxis = (rectangle, isHorizontal) => {
|
|
47
|
-
const axis = isHorizontal ? 'x' : 'y';
|
|
48
|
-
const side = isHorizontal ? 'width' : 'height';
|
|
49
|
-
return [rectangle[axis], rectangle[axis] + rectangle[side] / 2, rectangle[axis] + rectangle[side]];
|
|
50
|
-
};
|
|
51
|
-
export function getNearestPointRectangle(snapRectangles, activeRectangle) {
|
|
52
|
-
let minDistance = Infinity;
|
|
53
|
-
let nearestRectangle = snapRectangles[0];
|
|
54
|
-
snapRectangles.forEach(item => {
|
|
55
|
-
const distance = Math.sqrt(Math.pow(activeRectangle.x - item.x, 2) + Math.pow(activeRectangle.y - item.y, 2));
|
|
56
|
-
if (distance < minDistance) {
|
|
57
|
-
minDistance = distance;
|
|
58
|
-
nearestRectangle = item;
|
|
59
|
-
}
|
|
60
|
-
});
|
|
61
|
-
return nearestRectangle;
|
|
62
|
-
}
|
|
63
|
-
export const isSnapPoint = (axis, rectangle, isHorizontal) => {
|
|
64
|
-
const pointAxis = getTripleAxis(rectangle, isHorizontal);
|
|
65
|
-
return pointAxis.includes(axis);
|
|
66
|
-
};
|
|
67
|
-
export function drawPointSnapLines(board, activeRectangle, snapRectangles, drawHorizontal = true, drawVertical = true, snapMiddle = false) {
|
|
68
|
-
let pointLinePoints = [];
|
|
69
|
-
const pointAxisX = getTripleAxis(activeRectangle, true);
|
|
70
|
-
const pointAxisY = getTripleAxis(activeRectangle, false);
|
|
71
|
-
const pointLineRefs = [
|
|
72
|
-
{
|
|
73
|
-
axis: pointAxisX[0],
|
|
74
|
-
isHorizontal: true,
|
|
75
|
-
pointRectangles: []
|
|
76
|
-
},
|
|
77
|
-
{
|
|
78
|
-
axis: pointAxisX[1],
|
|
79
|
-
isHorizontal: true,
|
|
80
|
-
pointRectangles: []
|
|
81
|
-
},
|
|
82
|
-
{
|
|
83
|
-
axis: pointAxisX[2],
|
|
84
|
-
isHorizontal: true,
|
|
85
|
-
pointRectangles: []
|
|
86
|
-
},
|
|
87
|
-
{
|
|
88
|
-
axis: pointAxisY[0],
|
|
89
|
-
isHorizontal: false,
|
|
90
|
-
pointRectangles: []
|
|
91
|
-
},
|
|
92
|
-
{
|
|
93
|
-
axis: pointAxisY[1],
|
|
94
|
-
isHorizontal: false,
|
|
95
|
-
pointRectangles: []
|
|
96
|
-
},
|
|
97
|
-
{
|
|
98
|
-
axis: pointAxisY[2],
|
|
99
|
-
isHorizontal: false,
|
|
100
|
-
pointRectangles: []
|
|
101
|
-
}
|
|
102
|
-
];
|
|
103
|
-
for (let index = 0; index < snapRectangles.length; index++) {
|
|
104
|
-
const element = snapRectangles[index];
|
|
105
|
-
if (isSnapPoint(pointLineRefs[0].axis, element, pointLineRefs[0].isHorizontal)) {
|
|
106
|
-
pointLineRefs[0].pointRectangles.push(element);
|
|
107
|
-
}
|
|
108
|
-
if (isSnapPoint(pointLineRefs[1].axis, element, pointLineRefs[1].isHorizontal)) {
|
|
109
|
-
pointLineRefs[1].pointRectangles.push(element);
|
|
110
|
-
}
|
|
111
|
-
if (isSnapPoint(pointLineRefs[2].axis, element, pointLineRefs[2].isHorizontal)) {
|
|
112
|
-
pointLineRefs[2].pointRectangles.push(element);
|
|
113
|
-
}
|
|
114
|
-
if (isSnapPoint(pointLineRefs[3].axis, element, pointLineRefs[3].isHorizontal)) {
|
|
115
|
-
pointLineRefs[3].pointRectangles.push(element);
|
|
116
|
-
}
|
|
117
|
-
if (isSnapPoint(pointLineRefs[4].axis, element, pointLineRefs[4].isHorizontal)) {
|
|
118
|
-
pointLineRefs[4].pointRectangles.push(element);
|
|
119
|
-
}
|
|
120
|
-
if (isSnapPoint(pointLineRefs[5].axis, element, pointLineRefs[5].isHorizontal)) {
|
|
121
|
-
pointLineRefs[5].pointRectangles.push(element);
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
const setResizePointSnapLine = (axis, pointRectangle, isHorizontal) => {
|
|
125
|
-
const boundingRectangle = RectangleClient.inflate(RectangleClient.getBoundingRectangle([activeRectangle, pointRectangle]), SNAP_SPACING);
|
|
126
|
-
if (isHorizontal) {
|
|
127
|
-
const pointStart = [axis, boundingRectangle.y];
|
|
128
|
-
const pointEnd = [axis, boundingRectangle.y + boundingRectangle.height];
|
|
129
|
-
pointLinePoints.push([pointStart, pointEnd]);
|
|
130
|
-
}
|
|
131
|
-
else {
|
|
132
|
-
const pointStart = [boundingRectangle.x, axis];
|
|
133
|
-
const pointEnd = [boundingRectangle.x + boundingRectangle.width, axis];
|
|
134
|
-
pointLinePoints.push([pointStart, pointEnd]);
|
|
135
|
-
}
|
|
136
|
-
};
|
|
137
|
-
if (drawHorizontal && pointLineRefs[0].pointRectangles.length) {
|
|
138
|
-
const leftRectangle = pointLineRefs[0].pointRectangles.length === 1
|
|
139
|
-
? pointLineRefs[0].pointRectangles[0]
|
|
140
|
-
: getNearestPointRectangle(pointLineRefs[0].pointRectangles, activeRectangle);
|
|
141
|
-
setResizePointSnapLine(pointLineRefs[0].axis, leftRectangle, pointLineRefs[0].isHorizontal);
|
|
142
|
-
}
|
|
143
|
-
if (drawHorizontal && snapMiddle && pointLineRefs[1].pointRectangles.length) {
|
|
144
|
-
const middleRectangle = pointLineRefs[1].pointRectangles.length === 1
|
|
145
|
-
? pointLineRefs[1].pointRectangles[0]
|
|
146
|
-
: getNearestPointRectangle(pointLineRefs[1].pointRectangles, activeRectangle);
|
|
147
|
-
setResizePointSnapLine(pointLineRefs[1].axis, middleRectangle, pointLineRefs[1].isHorizontal);
|
|
148
|
-
}
|
|
149
|
-
if (drawHorizontal && pointLineRefs[2].pointRectangles.length) {
|
|
150
|
-
const rightRectangle = pointLineRefs[2].pointRectangles.length === 1
|
|
151
|
-
? pointLineRefs[2].pointRectangles[0]
|
|
152
|
-
: getNearestPointRectangle(pointLineRefs[2].pointRectangles, activeRectangle);
|
|
153
|
-
setResizePointSnapLine(pointLineRefs[2].axis, rightRectangle, pointLineRefs[2].isHorizontal);
|
|
154
|
-
}
|
|
155
|
-
if (drawVertical && pointLineRefs[3].pointRectangles.length) {
|
|
156
|
-
const topRectangle = pointLineRefs[3].pointRectangles.length === 1
|
|
157
|
-
? pointLineRefs[3].pointRectangles[0]
|
|
158
|
-
: getNearestPointRectangle(pointLineRefs[3].pointRectangles, activeRectangle);
|
|
159
|
-
setResizePointSnapLine(pointLineRefs[3].axis, topRectangle, pointLineRefs[3].isHorizontal);
|
|
160
|
-
}
|
|
161
|
-
if (drawVertical && snapMiddle && pointLineRefs[4].pointRectangles.length) {
|
|
162
|
-
const middleRectangle = pointLineRefs[4].pointRectangles.length === 1
|
|
163
|
-
? pointLineRefs[4].pointRectangles[0]
|
|
164
|
-
: getNearestPointRectangle(pointLineRefs[4].pointRectangles, activeRectangle);
|
|
165
|
-
setResizePointSnapLine(pointLineRefs[4].axis, middleRectangle, pointLineRefs[4].isHorizontal);
|
|
166
|
-
}
|
|
167
|
-
if (drawVertical && pointLineRefs[5].pointRectangles.length) {
|
|
168
|
-
const rightRectangle = pointLineRefs[5].pointRectangles.length === 1
|
|
169
|
-
? pointLineRefs[5].pointRectangles[0]
|
|
170
|
-
: getNearestPointRectangle(pointLineRefs[5].pointRectangles, activeRectangle);
|
|
171
|
-
setResizePointSnapLine(pointLineRefs[5].axis, rightRectangle, pointLineRefs[5].isHorizontal);
|
|
172
|
-
}
|
|
173
|
-
return drawDashedLines(board, pointLinePoints);
|
|
174
|
-
}
|
|
175
|
-
export function drawDashedLines(board, lines) {
|
|
176
|
-
const g = createG();
|
|
177
|
-
lines.forEach(points => {
|
|
178
|
-
if (!points.length)
|
|
179
|
-
return;
|
|
180
|
-
const line = PlaitBoard.getRoughSVG(board).line(points[0][0], points[0][1], points[1][0], points[1][1], {
|
|
181
|
-
stroke: SELECTION_BORDER_COLOR,
|
|
182
|
-
strokeWidth: 1,
|
|
183
|
-
strokeLineDash: [4, 4]
|
|
184
|
-
});
|
|
185
|
-
g.appendChild(line);
|
|
186
|
-
});
|
|
187
|
-
return g;
|
|
188
|
-
}
|
|
189
|
-
export function drawSolidLines(board, lines) {
|
|
190
|
-
const g = createG();
|
|
191
|
-
lines.forEach(points => {
|
|
192
|
-
if (!points.length)
|
|
193
|
-
return;
|
|
194
|
-
let isHorizontal = points[0][1] === points[1][1];
|
|
195
|
-
const line = PlaitBoard.getRoughSVG(board).line(points[0][0], points[0][1], points[1][0], points[1][1], {
|
|
196
|
-
stroke: SELECTION_BORDER_COLOR,
|
|
197
|
-
strokeWidth: 1
|
|
198
|
-
});
|
|
199
|
-
g.appendChild(line);
|
|
200
|
-
points.forEach(point => {
|
|
201
|
-
const barPoint = getBarPoint(point, isHorizontal);
|
|
202
|
-
const bar = PlaitBoard.getRoughSVG(board).line(barPoint[0][0], barPoint[0][1], barPoint[1][0], barPoint[1][1], {
|
|
203
|
-
stroke: SELECTION_BORDER_COLOR,
|
|
204
|
-
strokeWidth: 1
|
|
205
|
-
});
|
|
206
|
-
g.appendChild(bar);
|
|
207
|
-
});
|
|
208
|
-
});
|
|
209
|
-
return g;
|
|
210
|
-
}
|
|
211
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic25hcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvcmUvc3JjL3V0aWxzL3NuYXAvc25hcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUF1QixlQUFlLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM1RyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDL0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNqQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBd0IxQyxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxDQUFDO0FBRWhDLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQztBQUV4QixNQUFNLFVBQVUsaUJBQWlCLENBQUMsS0FBaUIsRUFBRSxjQUE4QjtJQUMvRSxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsS0FBSyxFQUFFO1FBQ2pDLEtBQUssRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ2hHLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJO1FBQ3JCLFNBQVMsRUFBRSxLQUFLO0tBQ25CLENBQUMsQ0FBQztJQUNILE9BQU8sUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUN2QixNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBRSxDQUFDO1FBQzVDLE9BQU8sbUJBQW1CLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDM0QsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDO0FBRUQsTUFBTSxVQUFVLFdBQVcsQ0FBQyxLQUFZLEVBQUUsWUFBcUI7SUFDM0QsT0FBTyxZQUFZO1FBQ2YsQ0FBQyxDQUFDO1lBQ0ksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN4QixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQzNCO1FBQ0gsQ0FBQyxDQUFDO1lBQ0ksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4QixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzNCLENBQUM7QUFDWixDQUFDO0FBRUQsTUFBTSxVQUFVLGdCQUFnQixDQUFDLGVBQWtDLEVBQUUsSUFBWSxFQUFFLFlBQXFCO0lBQ3BHLElBQUksS0FBSyxHQUFHLGNBQWMsQ0FBQztJQUMzQixlQUFlLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQzNCLE1BQU0sUUFBUSxHQUFHLGVBQWUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQzNELElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdkMsS0FBSyxHQUFHLFFBQVEsQ0FBQztRQUNyQixDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPLEtBQUssQ0FBQztBQUNqQixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLENBQUMsSUFBWSxFQUFFLFNBQTBCLEVBQUUsWUFBcUIsRUFBRSxFQUFFO0lBQy9GLE1BQU0sU0FBUyxHQUFHLGFBQWEsQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDekQsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQztJQUNsRCxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3JELE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDeEQsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDekIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLENBQUMsU0FBMEIsRUFBRSxZQUFxQixFQUFrQixFQUFFO0lBQy9GLE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDdEMsTUFBTSxJQUFJLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztJQUMvQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUN2RyxDQUFDLENBQUM7QUFFRixNQUFNLFVBQVUsd0JBQXdCLENBQUMsY0FBaUMsRUFBRSxlQUFnQztJQUN4RyxJQUFJLFdBQVcsR0FBRyxRQUFRLENBQUM7SUFDM0IsSUFBSSxnQkFBZ0IsR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFekMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUMxQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUcsSUFBSSxRQUFRLEdBQUcsV0FBVyxFQUFFLENBQUM7WUFDekIsV0FBVyxHQUFHLFFBQVEsQ0FBQztZQUN2QixnQkFBZ0IsR0FBRyxJQUFJLENBQUM7UUFDNUIsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxnQkFBZ0IsQ0FBQztBQUM1QixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLENBQUMsSUFBWSxFQUFFLFNBQTBCLEVBQUUsWUFBcUIsRUFBRSxFQUFFO0lBQzNGLE1BQU0sU0FBUyxHQUFHLGFBQWEsQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDekQsT0FBTyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3BDLENBQUMsQ0FBQztBQUVGLE1BQU0sVUFBVSxrQkFBa0IsQ0FDOUIsS0FBaUIsRUFDakIsZUFBZ0MsRUFDaEMsY0FBaUMsRUFDakMsY0FBYyxHQUFHLElBQUksRUFDckIsWUFBWSxHQUFHLElBQUksRUFDbkIsVUFBVSxHQUFHLEtBQUs7SUFFbEIsSUFBSSxlQUFlLEdBQXFCLEVBQUUsQ0FBQztJQUMzQyxNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3hELE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxlQUFlLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDekQsTUFBTSxhQUFhLEdBQXVCO1FBQ3RDO1lBQ0ksSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDbkIsWUFBWSxFQUFFLElBQUk7WUFDbEIsZUFBZSxFQUFFLEVBQUU7U0FDdEI7UUFDRDtZQUNJLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQ25CLFlBQVksRUFBRSxJQUFJO1lBQ2xCLGVBQWUsRUFBRSxFQUFFO1NBQ3RCO1FBQ0Q7WUFDSSxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUNuQixZQUFZLEVBQUUsSUFBSTtZQUNsQixlQUFlLEVBQUUsRUFBRTtTQUN0QjtRQUNEO1lBQ0ksSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDbkIsWUFBWSxFQUFFLEtBQUs7WUFDbkIsZUFBZSxFQUFFLEVBQUU7U0FDdEI7UUFDRDtZQUNJLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQ25CLFlBQVksRUFBRSxLQUFLO1lBQ25CLGVBQWUsRUFBRSxFQUFFO1NBQ3RCO1FBQ0Q7WUFDSSxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUNuQixZQUFZLEVBQUUsS0FBSztZQUNuQixlQUFlLEVBQUUsRUFBRTtTQUN0QjtLQUNKLENBQUM7SUFDRixLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsY0FBYyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO1FBQ3pELE1BQU0sT0FBTyxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QyxJQUFJLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztZQUM3RSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNuRCxDQUFDO1FBQ0QsSUFBSSxXQUFXLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDN0UsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbkQsQ0FBQztRQUNELElBQUksV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1lBQzdFLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ25ELENBQUM7UUFDRCxJQUFJLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztZQUM3RSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNuRCxDQUFDO1FBQ0QsSUFBSSxXQUFXLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDN0UsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbkQsQ0FBQztRQUNELElBQUksV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1lBQzdFLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ25ELENBQUM7SUFDTCxDQUFDO0lBRUQsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLElBQVksRUFBRSxjQUErQixFQUFFLFlBQXFCLEVBQUUsRUFBRTtRQUNwRyxNQUFNLGlCQUFpQixHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQzdDLGVBQWUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLGVBQWUsRUFBRSxjQUFjLENBQUMsQ0FBQyxFQUN2RSxZQUFZLENBQ2YsQ0FBQztRQUNGLElBQUksWUFBWSxFQUFFLENBQUM7WUFDZixNQUFNLFVBQVUsR0FBRyxDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLENBQVUsQ0FBQztZQUN4RCxNQUFNLFFBQVEsR0FBRyxDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFVLENBQUM7WUFDakYsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ2pELENBQUM7YUFBTSxDQUFDO1lBQ0osTUFBTSxVQUFVLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFVLENBQUM7WUFDeEQsTUFBTSxRQUFRLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEdBQUcsaUJBQWlCLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBVSxDQUFDO1lBQ2hGLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNqRCxDQUFDO0lBQ0wsQ0FBQyxDQUFDO0lBQ0YsSUFBSSxjQUFjLElBQUksYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM1RCxNQUFNLGFBQWEsR0FDZixhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQ3pDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztZQUNyQyxDQUFDLENBQUMsd0JBQXdCLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUN0RixzQkFBc0IsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDaEcsQ0FBQztJQUNELElBQUksY0FBYyxJQUFJLFVBQVUsSUFBSSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzFFLE1BQU0sZUFBZSxHQUNqQixhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQ3pDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztZQUNyQyxDQUFDLENBQUMsd0JBQXdCLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUN0RixzQkFBc0IsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLGVBQWUsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDbEcsQ0FBQztJQUVELElBQUksY0FBYyxJQUFJLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDNUQsTUFBTSxjQUFjLEdBQ2hCLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsTUFBTSxLQUFLLENBQUM7WUFDekMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO1lBQ3JDLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQ3RGLHNCQUFzQixDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsY0FBYyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNqRyxDQUFDO0lBRUQsSUFBSSxZQUFZLElBQUksYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMxRCxNQUFNLFlBQVksR0FDZCxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQ3pDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztZQUNyQyxDQUFDLENBQUMsd0JBQXdCLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUN0RixzQkFBc0IsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDL0YsQ0FBQztJQUVELElBQUksWUFBWSxJQUFJLFVBQVUsSUFBSSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3hFLE1BQU0sZUFBZSxHQUNqQixhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQ3pDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztZQUNyQyxDQUFDLENBQUMsd0JBQXdCLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUN0RixzQkFBc0IsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLGVBQWUsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDbEcsQ0FBQztJQUVELElBQUksWUFBWSxJQUFJLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDMUQsTUFBTSxjQUFjLEdBQ2hCLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsTUFBTSxLQUFLLENBQUM7WUFDekMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO1lBQ3JDLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQ3RGLHNCQUFzQixDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsY0FBYyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNqRyxDQUFDO0lBRUQsT0FBTyxlQUFlLENBQUMsS0FBSyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0FBQ25ELENBQUM7QUFFRCxNQUFNLFVBQVUsZUFBZSxDQUFDLEtBQWlCLEVBQUUsS0FBdUI7SUFDdEUsTUFBTSxDQUFDLEdBQUcsT0FBTyxFQUFFLENBQUM7SUFDcEIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUNuQixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU07WUFBRSxPQUFPO1FBQzNCLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNwRyxNQUFNLEVBQUUsc0JBQXNCO1lBQzlCLFdBQVcsRUFBRSxDQUFDO1lBQ2QsY0FBYyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUN6QixDQUFDLENBQUM7UUFDSCxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hCLENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxDQUFDLENBQUM7QUFDYixDQUFDO0FBRUQsTUFBTSxVQUFVLGNBQWMsQ0FBQyxLQUFpQixFQUFFLEtBQWdCO0lBQzlELE1BQU0sQ0FBQyxHQUFHLE9BQU8sRUFBRSxDQUFDO0lBQ3BCLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7UUFDbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNO1lBQUUsT0FBTztRQUMzQixJQUFJLFlBQVksR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNwRyxNQUFNLEVBQUUsc0JBQXNCO1lBQzlCLFdBQVcsRUFBRSxDQUFDO1NBQ2pCLENBQUMsQ0FBQztRQUNILENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFcEIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNuQixNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQ2xELE1BQU0sR0FBRyxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDM0csTUFBTSxFQUFFLHNCQUFzQjtnQkFDOUIsV0FBVyxFQUFFLENBQUM7YUFDakIsQ0FBQyxDQUFDO1lBQ0gsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxDQUFDLENBQUM7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGxhaXRCb2FyZCwgUGxhaXRFbGVtZW50LCBQb2ludCwgUmVjdGFuZ2xlQ2xpZW50LCBTRUxFQ1RJT05fQk9SREVSX0NPTE9SIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBnZXRSZWN0YW5nbGVCeUFuZ2xlIH0gZnJvbSAnLi4vYW5nbGUnO1xuaW1wb3J0IHsgY3JlYXRlRyB9IGZyb20gJy4uL2RvbSc7XG5pbXBvcnQgeyBmaW5kRWxlbWVudHMgfSBmcm9tICcuLi9lbGVtZW50JztcblxuZXhwb3J0IGludGVyZmFjZSBTbmFwRGVsdGEge1xuICAgIGRlbHRhWDogbnVtYmVyO1xuICAgIGRlbHRhWTogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNuYXBSZWYgZXh0ZW5kcyBTbmFwRGVsdGEge1xuICAgIHNuYXBHOiBTVkdHRWxlbWVudDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHYXBTbmFwUmVmIHtcbiAgICBiZWZvcmU6IHsgZGlzdGFuY2U6IG51bWJlcjsgaW5kZXg6IG51bWJlciB9W107XG4gICAgYWZ0ZXI6IHsgZGlzdGFuY2U6IG51bWJlcjsgaW5kZXg6IG51bWJlciB9W107XG59XG5cbnR5cGUgUG9pbnRTbmFwTGluZVJlZiA9IHtcbiAgICBheGlzOiBudW1iZXI7XG4gICAgaXNIb3Jpem9udGFsOiBib29sZWFuO1xuICAgIHBvaW50UmVjdGFuZ2xlczogUmVjdGFuZ2xlQ2xpZW50W107XG59O1xuXG50eXBlIFRyaXBsZVNuYXBBeGlzID0gW251bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuXG5leHBvcnQgY29uc3QgU05BUF9UT0xFUkFOQ0UgPSAyO1xuXG5jb25zdCBTTkFQX1NQQUNJTkcgPSAyNDtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNuYXBSZWN0YW5nbGVzKGJvYXJkOiBQbGFpdEJvYXJkLCBhY3RpdmVFbGVtZW50czogUGxhaXRFbGVtZW50W10pIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IGZpbmRFbGVtZW50cyhib2FyZCwge1xuICAgICAgICBtYXRjaDogZWxlbWVudCA9PiBib2FyZC5pc0FsaWduKGVsZW1lbnQpICYmICFhY3RpdmVFbGVtZW50cy5zb21lKGl0ZW0gPT4gaXRlbS5pZCA9PT0gZWxlbWVudC5pZCksXG4gICAgICAgIHJlY3Vyc2lvbjogKCkgPT4gdHJ1ZSxcbiAgICAgICAgaXNSZXZlcnNlOiBmYWxzZVxuICAgIH0pO1xuICAgIHJldHVybiBlbGVtZW50cy5tYXAoaXRlbSA9PiB7XG4gICAgICAgIGNvbnN0IHJlY3RhbmdsZSA9IGJvYXJkLmdldFJlY3RhbmdsZShpdGVtKSE7XG4gICAgICAgIHJldHVybiBnZXRSZWN0YW5nbGVCeUFuZ2xlKHJlY3RhbmdsZSwgaXRlbS5hbmdsZSB8fCAwKTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJhclBvaW50KHBvaW50OiBQb2ludCwgaXNIb3Jpem9udGFsOiBib29sZWFuKSB7XG4gICAgcmV0dXJuIGlzSG9yaXpvbnRhbFxuICAgICAgICA/IFtcbiAgICAgICAgICAgICAgW3BvaW50WzBdLCBwb2ludFsxXSAtIDRdLFxuICAgICAgICAgICAgICBbcG9pbnRbMF0sIHBvaW50WzFdICsgNF1cbiAgICAgICAgICBdXG4gICAgICAgIDogW1xuICAgICAgICAgICAgICBbcG9pbnRbMF0gLSA0LCBwb2ludFsxXV0sXG4gICAgICAgICAgICAgIFtwb2ludFswXSArIDQsIHBvaW50WzFdXVxuICAgICAgICAgIF07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNaW5Qb2ludERlbHRhKHBvaW50UmVjdGFuZ2xlczogUmVjdGFuZ2xlQ2xpZW50W10sIGF4aXM6IG51bWJlciwgaXNIb3Jpem9udGFsOiBib29sZWFuKSB7XG4gICAgbGV0IGRlbHRhID0gU05BUF9UT0xFUkFOQ0U7XG4gICAgcG9pbnRSZWN0YW5nbGVzLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlID0gZ2V0TmVhcmVzdERlbHRhKGF4aXMsIGl0ZW0sIGlzSG9yaXpvbnRhbCk7XG4gICAgICAgIGlmIChNYXRoLmFicyhkaXN0YW5jZSkgPCBNYXRoLmFicyhkZWx0YSkpIHtcbiAgICAgICAgICAgIGRlbHRhID0gZGlzdGFuY2U7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZGVsdGE7XG59XG5cbmV4cG9ydCBjb25zdCBnZXROZWFyZXN0RGVsdGEgPSAoYXhpczogbnVtYmVyLCByZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCwgaXNIb3Jpem9udGFsOiBib29sZWFuKSA9PiB7XG4gICAgY29uc3QgcG9pbnRBeGlzID0gZ2V0VHJpcGxlQXhpcyhyZWN0YW5nbGUsIGlzSG9yaXpvbnRhbCk7XG4gICAgY29uc3QgZGVsdGFzID0gcG9pbnRBeGlzLm1hcChpdGVtID0+IGl0ZW0gLSBheGlzKTtcbiAgICBjb25zdCBhYnNEZWx0YXMgPSBkZWx0YXMubWFwKGl0ZW0gPT4gTWF0aC5hYnMoaXRlbSkpO1xuICAgIGNvbnN0IGluZGV4ID0gYWJzRGVsdGFzLmluZGV4T2YoTWF0aC5taW4oLi4uYWJzRGVsdGFzKSk7XG4gICAgcmV0dXJuIGRlbHRhc1tpbmRleF07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VHJpcGxlQXhpcyA9IChyZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCwgaXNIb3Jpem9udGFsOiBib29sZWFuKTogVHJpcGxlU25hcEF4aXMgPT4ge1xuICAgIGNvbnN0IGF4aXMgPSBpc0hvcml6b250YWwgPyAneCcgOiAneSc7XG4gICAgY29uc3Qgc2lkZSA9IGlzSG9yaXpvbnRhbCA/ICd3aWR0aCcgOiAnaGVpZ2h0JztcbiAgICByZXR1cm4gW3JlY3RhbmdsZVtheGlzXSwgcmVjdGFuZ2xlW2F4aXNdICsgcmVjdGFuZ2xlW3NpZGVdIC8gMiwgcmVjdGFuZ2xlW2F4aXNdICsgcmVjdGFuZ2xlW3NpZGVdXTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXROZWFyZXN0UG9pbnRSZWN0YW5nbGUoc25hcFJlY3RhbmdsZXM6IFJlY3RhbmdsZUNsaWVudFtdLCBhY3RpdmVSZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCkge1xuICAgIGxldCBtaW5EaXN0YW5jZSA9IEluZmluaXR5O1xuICAgIGxldCBuZWFyZXN0UmVjdGFuZ2xlID0gc25hcFJlY3RhbmdsZXNbMF07XG5cbiAgICBzbmFwUmVjdGFuZ2xlcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICBjb25zdCBkaXN0YW5jZSA9IE1hdGguc3FydChNYXRoLnBvdyhhY3RpdmVSZWN0YW5nbGUueCAtIGl0ZW0ueCwgMikgKyBNYXRoLnBvdyhhY3RpdmVSZWN0YW5nbGUueSAtIGl0ZW0ueSwgMikpO1xuICAgICAgICBpZiAoZGlzdGFuY2UgPCBtaW5EaXN0YW5jZSkge1xuICAgICAgICAgICAgbWluRGlzdGFuY2UgPSBkaXN0YW5jZTtcbiAgICAgICAgICAgIG5lYXJlc3RSZWN0YW5nbGUgPSBpdGVtO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG5lYXJlc3RSZWN0YW5nbGU7XG59XG5cbmV4cG9ydCBjb25zdCBpc1NuYXBQb2ludCA9IChheGlzOiBudW1iZXIsIHJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50LCBpc0hvcml6b250YWw6IGJvb2xlYW4pID0+IHtcbiAgICBjb25zdCBwb2ludEF4aXMgPSBnZXRUcmlwbGVBeGlzKHJlY3RhbmdsZSwgaXNIb3Jpem9udGFsKTtcbiAgICByZXR1cm4gcG9pbnRBeGlzLmluY2x1ZGVzKGF4aXMpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGRyYXdQb2ludFNuYXBMaW5lcyhcbiAgICBib2FyZDogUGxhaXRCb2FyZCxcbiAgICBhY3RpdmVSZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCxcbiAgICBzbmFwUmVjdGFuZ2xlczogUmVjdGFuZ2xlQ2xpZW50W10sXG4gICAgZHJhd0hvcml6b250YWwgPSB0cnVlLFxuICAgIGRyYXdWZXJ0aWNhbCA9IHRydWUsXG4gICAgc25hcE1pZGRsZSA9IGZhbHNlXG4pIHtcbiAgICBsZXQgcG9pbnRMaW5lUG9pbnRzOiBbUG9pbnQsIFBvaW50XVtdID0gW107XG4gICAgY29uc3QgcG9pbnRBeGlzWCA9IGdldFRyaXBsZUF4aXMoYWN0aXZlUmVjdGFuZ2xlLCB0cnVlKTtcbiAgICBjb25zdCBwb2ludEF4aXNZID0gZ2V0VHJpcGxlQXhpcyhhY3RpdmVSZWN0YW5nbGUsIGZhbHNlKTtcbiAgICBjb25zdCBwb2ludExpbmVSZWZzOiBQb2ludFNuYXBMaW5lUmVmW10gPSBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIGF4aXM6IHBvaW50QXhpc1hbMF0sXG4gICAgICAgICAgICBpc0hvcml6b250YWw6IHRydWUsXG4gICAgICAgICAgICBwb2ludFJlY3RhbmdsZXM6IFtdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGF4aXM6IHBvaW50QXhpc1hbMV0sXG4gICAgICAgICAgICBpc0hvcml6b250YWw6IHRydWUsXG4gICAgICAgICAgICBwb2ludFJlY3RhbmdsZXM6IFtdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGF4aXM6IHBvaW50QXhpc1hbMl0sXG4gICAgICAgICAgICBpc0hvcml6b250YWw6IHRydWUsXG4gICAgICAgICAgICBwb2ludFJlY3RhbmdsZXM6IFtdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGF4aXM6IHBvaW50QXhpc1lbMF0sXG4gICAgICAgICAgICBpc0hvcml6b250YWw6IGZhbHNlLFxuICAgICAgICAgICAgcG9pbnRSZWN0YW5nbGVzOiBbXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBheGlzOiBwb2ludEF4aXNZWzFdLFxuICAgICAgICAgICAgaXNIb3Jpem9udGFsOiBmYWxzZSxcbiAgICAgICAgICAgIHBvaW50UmVjdGFuZ2xlczogW11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgYXhpczogcG9pbnRBeGlzWVsyXSxcbiAgICAgICAgICAgIGlzSG9yaXpvbnRhbDogZmFsc2UsXG4gICAgICAgICAgICBwb2ludFJlY3RhbmdsZXM6IFtdXG4gICAgICAgIH1cbiAgICBdO1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBzbmFwUmVjdGFuZ2xlcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHNuYXBSZWN0YW5nbGVzW2luZGV4XTtcbiAgICAgICAgaWYgKGlzU25hcFBvaW50KHBvaW50TGluZVJlZnNbMF0uYXhpcywgZWxlbWVudCwgcG9pbnRMaW5lUmVmc1swXS5pc0hvcml6b250YWwpKSB7XG4gICAgICAgICAgICBwb2ludExpbmVSZWZzWzBdLnBvaW50UmVjdGFuZ2xlcy5wdXNoKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1NuYXBQb2ludChwb2ludExpbmVSZWZzWzFdLmF4aXMsIGVsZW1lbnQsIHBvaW50TGluZVJlZnNbMV0uaXNIb3Jpem9udGFsKSkge1xuICAgICAgICAgICAgcG9pbnRMaW5lUmVmc1sxXS5wb2ludFJlY3RhbmdsZXMucHVzaChlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNTbmFwUG9pbnQocG9pbnRMaW5lUmVmc1syXS5heGlzLCBlbGVtZW50LCBwb2ludExpbmVSZWZzWzJdLmlzSG9yaXpvbnRhbCkpIHtcbiAgICAgICAgICAgIHBvaW50TGluZVJlZnNbMl0ucG9pbnRSZWN0YW5nbGVzLnB1c2goZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzU25hcFBvaW50KHBvaW50TGluZVJlZnNbM10uYXhpcywgZWxlbWVudCwgcG9pbnRMaW5lUmVmc1szXS5pc0hvcml6b250YWwpKSB7XG4gICAgICAgICAgICBwb2ludExpbmVSZWZzWzNdLnBvaW50UmVjdGFuZ2xlcy5wdXNoKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1NuYXBQb2ludChwb2ludExpbmVSZWZzWzRdLmF4aXMsIGVsZW1lbnQsIHBvaW50TGluZVJlZnNbNF0uaXNIb3Jpem9udGFsKSkge1xuICAgICAgICAgICAgcG9pbnRMaW5lUmVmc1s0XS5wb2ludFJlY3RhbmdsZXMucHVzaChlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNTbmFwUG9pbnQocG9pbnRMaW5lUmVmc1s1XS5heGlzLCBlbGVtZW50LCBwb2ludExpbmVSZWZzWzVdLmlzSG9yaXpvbnRhbCkpIHtcbiAgICAgICAgICAgIHBvaW50TGluZVJlZnNbNV0ucG9pbnRSZWN0YW5nbGVzLnB1c2goZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBzZXRSZXNpemVQb2ludFNuYXBMaW5lID0gKGF4aXM6IG51bWJlciwgcG9pbnRSZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCwgaXNIb3Jpem9udGFsOiBib29sZWFuKSA9PiB7XG4gICAgICAgIGNvbnN0IGJvdW5kaW5nUmVjdGFuZ2xlID0gUmVjdGFuZ2xlQ2xpZW50LmluZmxhdGUoXG4gICAgICAgICAgICBSZWN0YW5nbGVDbGllbnQuZ2V0Qm91bmRpbmdSZWN0YW5nbGUoW2FjdGl2ZVJlY3RhbmdsZSwgcG9pbnRSZWN0YW5nbGVdKSxcbiAgICAgICAgICAgIFNOQVBfU1BBQ0lOR1xuICAgICAgICApO1xuICAgICAgICBpZiAoaXNIb3Jpem9udGFsKSB7XG4gICAgICAgICAgICBjb25zdCBwb2ludFN0YXJ0ID0gW2F4aXMsIGJvdW5kaW5nUmVjdGFuZ2xlLnldIGFzIFBvaW50O1xuICAgICAgICAgICAgY29uc3QgcG9pbnRFbmQgPSBbYXhpcywgYm91bmRpbmdSZWN0YW5nbGUueSArIGJvdW5kaW5nUmVjdGFuZ2xlLmhlaWdodF0gYXMgUG9pbnQ7XG4gICAgICAgICAgICBwb2ludExpbmVQb2ludHMucHVzaChbcG9pbnRTdGFydCwgcG9pbnRFbmRdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHBvaW50U3RhcnQgPSBbYm91bmRpbmdSZWN0YW5nbGUueCwgYXhpc10gYXMgUG9pbnQ7XG4gICAgICAgICAgICBjb25zdCBwb2ludEVuZCA9IFtib3VuZGluZ1JlY3RhbmdsZS54ICsgYm91bmRpbmdSZWN0YW5nbGUud2lkdGgsIGF4aXNdIGFzIFBvaW50O1xuICAgICAgICAgICAgcG9pbnRMaW5lUG9pbnRzLnB1c2goW3BvaW50U3RhcnQsIHBvaW50RW5kXSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGlmIChkcmF3SG9yaXpvbnRhbCAmJiBwb2ludExpbmVSZWZzWzBdLnBvaW50UmVjdGFuZ2xlcy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgbGVmdFJlY3RhbmdsZSA9XG4gICAgICAgICAgICBwb2ludExpbmVSZWZzWzBdLnBvaW50UmVjdGFuZ2xlcy5sZW5ndGggPT09IDFcbiAgICAgICAgICAgICAgICA/IHBvaW50TGluZVJlZnNbMF0ucG9pbnRSZWN0YW5nbGVzWzBdXG4gICAgICAgICAgICAgICAgOiBnZXROZWFyZXN0UG9pbnRSZWN0YW5nbGUocG9pbnRMaW5lUmVmc1swXS5wb2ludFJlY3RhbmdsZXMsIGFjdGl2ZVJlY3RhbmdsZSk7XG4gICAgICAgIHNldFJlc2l6ZVBvaW50U25hcExpbmUocG9pbnRMaW5lUmVmc1swXS5heGlzLCBsZWZ0UmVjdGFuZ2xlLCBwb2ludExpbmVSZWZzWzBdLmlzSG9yaXpvbnRhbCk7XG4gICAgfVxuICAgIGlmIChkcmF3SG9yaXpvbnRhbCAmJiBzbmFwTWlkZGxlICYmIHBvaW50TGluZVJlZnNbMV0ucG9pbnRSZWN0YW5nbGVzLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBtaWRkbGVSZWN0YW5nbGUgPVxuICAgICAgICAgICAgcG9pbnRMaW5lUmVmc1sxXS5wb2ludFJlY3RhbmdsZXMubGVuZ3RoID09PSAxXG4gICAgICAgICAgICAgICAgPyBwb2ludExpbmVSZWZzWzFdLnBvaW50UmVjdGFuZ2xlc1swXVxuICAgICAgICAgICAgICAgIDogZ2V0TmVhcmVzdFBvaW50UmVjdGFuZ2xlKHBvaW50TGluZVJlZnNbMV0ucG9pbnRSZWN0YW5nbGVzLCBhY3RpdmVSZWN0YW5nbGUpO1xuICAgICAgICBzZXRSZXNpemVQb2ludFNuYXBMaW5lKHBvaW50TGluZVJlZnNbMV0uYXhpcywgbWlkZGxlUmVjdGFuZ2xlLCBwb2ludExpbmVSZWZzWzFdLmlzSG9yaXpvbnRhbCk7XG4gICAgfVxuXG4gICAgaWYgKGRyYXdIb3Jpem9udGFsICYmIHBvaW50TGluZVJlZnNbMl0ucG9pbnRSZWN0YW5nbGVzLmxlbmd0aCkge1xuICAgICAgICBjb25zdCByaWdodFJlY3RhbmdsZSA9XG4gICAgICAgICAgICBwb2ludExpbmVSZWZzWzJdLnBvaW50UmVjdGFuZ2xlcy5sZW5ndGggPT09IDFcbiAgICAgICAgICAgICAgICA/IHBvaW50TGluZVJlZnNbMl0ucG9pbnRSZWN0YW5nbGVzWzBdXG4gICAgICAgICAgICAgICAgOiBnZXROZWFyZXN0UG9pbnRSZWN0YW5nbGUocG9pbnRMaW5lUmVmc1syXS5wb2ludFJlY3RhbmdsZXMsIGFjdGl2ZVJlY3RhbmdsZSk7XG4gICAgICAgIHNldFJlc2l6ZVBvaW50U25hcExpbmUocG9pbnRMaW5lUmVmc1syXS5heGlzLCByaWdodFJlY3RhbmdsZSwgcG9pbnRMaW5lUmVmc1syXS5pc0hvcml6b250YWwpO1xuICAgIH1cblxuICAgIGlmIChkcmF3VmVydGljYWwgJiYgcG9pbnRMaW5lUmVmc1szXS5wb2ludFJlY3RhbmdsZXMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHRvcFJlY3RhbmdsZSA9XG4gICAgICAgICAgICBwb2ludExpbmVSZWZzWzNdLnBvaW50UmVjdGFuZ2xlcy5sZW5ndGggPT09IDFcbiAgICAgICAgICAgICAgICA/IHBvaW50TGluZVJlZnNbM10ucG9pbnRSZWN0YW5nbGVzWzBdXG4gICAgICAgICAgICAgICAgOiBnZXROZWFyZXN0UG9pbnRSZWN0YW5nbGUocG9pbnRMaW5lUmVmc1szXS5wb2ludFJlY3RhbmdsZXMsIGFjdGl2ZVJlY3RhbmdsZSk7XG4gICAgICAgIHNldFJlc2l6ZVBvaW50U25hcExpbmUocG9pbnRMaW5lUmVmc1szXS5heGlzLCB0b3BSZWN0YW5nbGUsIHBvaW50TGluZVJlZnNbM10uaXNIb3Jpem9udGFsKTtcbiAgICB9XG5cbiAgICBpZiAoZHJhd1ZlcnRpY2FsICYmIHNuYXBNaWRkbGUgJiYgcG9pbnRMaW5lUmVmc1s0XS5wb2ludFJlY3RhbmdsZXMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IG1pZGRsZVJlY3RhbmdsZSA9XG4gICAgICAgICAgICBwb2ludExpbmVSZWZzWzRdLnBvaW50UmVjdGFuZ2xlcy5sZW5ndGggPT09IDFcbiAgICAgICAgICAgICAgICA/IHBvaW50TGluZVJlZnNbNF0ucG9pbnRSZWN0YW5nbGVzWzBdXG4gICAgICAgICAgICAgICAgOiBnZXROZWFyZXN0UG9pbnRSZWN0YW5nbGUocG9pbnRMaW5lUmVmc1s0XS5wb2ludFJlY3RhbmdsZXMsIGFjdGl2ZVJlY3RhbmdsZSk7XG4gICAgICAgIHNldFJlc2l6ZVBvaW50U25hcExpbmUocG9pbnRMaW5lUmVmc1s0XS5heGlzLCBtaWRkbGVSZWN0YW5nbGUsIHBvaW50TGluZVJlZnNbNF0uaXNIb3Jpem9udGFsKTtcbiAgICB9XG5cbiAgICBpZiAoZHJhd1ZlcnRpY2FsICYmIHBvaW50TGluZVJlZnNbNV0ucG9pbnRSZWN0YW5nbGVzLmxlbmd0aCkge1xuICAgICAgICBjb25zdCByaWdodFJlY3RhbmdsZSA9XG4gICAgICAgICAgICBwb2ludExpbmVSZWZzWzVdLnBvaW50UmVjdGFuZ2xlcy5sZW5ndGggPT09IDFcbiAgICAgICAgICAgICAgICA/IHBvaW50TGluZVJlZnNbNV0ucG9pbnRSZWN0YW5nbGVzWzBdXG4gICAgICAgICAgICAgICAgOiBnZXROZWFyZXN0UG9pbnRSZWN0YW5nbGUocG9pbnRMaW5lUmVmc1s1XS5wb2ludFJlY3RhbmdsZXMsIGFjdGl2ZVJlY3RhbmdsZSk7XG4gICAgICAgIHNldFJlc2l6ZVBvaW50U25hcExpbmUocG9pbnRMaW5lUmVmc1s1XS5heGlzLCByaWdodFJlY3RhbmdsZSwgcG9pbnRMaW5lUmVmc1s1XS5pc0hvcml6b250YWwpO1xuICAgIH1cblxuICAgIHJldHVybiBkcmF3RGFzaGVkTGluZXMoYm9hcmQsIHBvaW50TGluZVBvaW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkcmF3RGFzaGVkTGluZXMoYm9hcmQ6IFBsYWl0Qm9hcmQsIGxpbmVzOiBbUG9pbnQsIFBvaW50XVtdKSB7XG4gICAgY29uc3QgZyA9IGNyZWF0ZUcoKTtcbiAgICBsaW5lcy5mb3JFYWNoKHBvaW50cyA9PiB7XG4gICAgICAgIGlmICghcG9pbnRzLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICBjb25zdCBsaW5lID0gUGxhaXRCb2FyZC5nZXRSb3VnaFNWRyhib2FyZCkubGluZShwb2ludHNbMF1bMF0sIHBvaW50c1swXVsxXSwgcG9pbnRzWzFdWzBdLCBwb2ludHNbMV1bMV0sIHtcbiAgICAgICAgICAgIHN0cm9rZTogU0VMRUNUSU9OX0JPUkRFUl9DT0xPUixcbiAgICAgICAgICAgIHN0cm9rZVdpZHRoOiAxLFxuICAgICAgICAgICAgc3Ryb2tlTGluZURhc2g6IFs0LCA0XVxuICAgICAgICB9KTtcbiAgICAgICAgZy5hcHBlbmRDaGlsZChsaW5lKTtcbiAgICB9KTtcbiAgICByZXR1cm4gZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRyYXdTb2xpZExpbmVzKGJvYXJkOiBQbGFpdEJvYXJkLCBsaW5lczogUG9pbnRbXVtdKSB7XG4gICAgY29uc3QgZyA9IGNyZWF0ZUcoKTtcbiAgICBsaW5lcy5mb3JFYWNoKHBvaW50cyA9PiB7XG4gICAgICAgIGlmICghcG9pbnRzLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICBsZXQgaXNIb3Jpem9udGFsID0gcG9pbnRzWzBdWzFdID09PSBwb2ludHNbMV1bMV07XG4gICAgICAgIGNvbnN0IGxpbmUgPSBQbGFpdEJvYXJkLmdldFJvdWdoU1ZHKGJvYXJkKS5saW5lKHBvaW50c1swXVswXSwgcG9pbnRzWzBdWzFdLCBwb2ludHNbMV1bMF0sIHBvaW50c1sxXVsxXSwge1xuICAgICAgICAgICAgc3Ryb2tlOiBTRUxFQ1RJT05fQk9SREVSX0NPTE9SLFxuICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IDFcbiAgICAgICAgfSk7XG4gICAgICAgIGcuYXBwZW5kQ2hpbGQobGluZSk7XG5cbiAgICAgICAgcG9pbnRzLmZvckVhY2gocG9pbnQgPT4ge1xuICAgICAgICAgICAgY29uc3QgYmFyUG9pbnQgPSBnZXRCYXJQb2ludChwb2ludCwgaXNIb3Jpem9udGFsKTtcbiAgICAgICAgICAgIGNvbnN0IGJhciA9IFBsYWl0Qm9hcmQuZ2V0Um91Z2hTVkcoYm9hcmQpLmxpbmUoYmFyUG9pbnRbMF1bMF0sIGJhclBvaW50WzBdWzFdLCBiYXJQb2ludFsxXVswXSwgYmFyUG9pbnRbMV1bMV0sIHtcbiAgICAgICAgICAgICAgICBzdHJva2U6IFNFTEVDVElPTl9CT1JERVJfQ09MT1IsXG4gICAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IDFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZy5hcHBlbmRDaGlsZChiYXIpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gZztcbn1cbiJdfQ==
|
|
@@ -1,204 +0,0 @@
|
|
|
1
|
-
import { PlaitBoard, PlaitElement } from '../interfaces';
|
|
2
|
-
import { findElements, getRectangleByElements } from './element';
|
|
3
|
-
const FOREIGN_OBJECT_EXPRESSION = `foreignObject[class^='foreign-object']`;
|
|
4
|
-
/**
|
|
5
|
-
* Is element node
|
|
6
|
-
* @param node
|
|
7
|
-
* @returns
|
|
8
|
-
*/
|
|
9
|
-
function isElementNode(node) {
|
|
10
|
-
return node.nodeType === Node.ELEMENT_NODE;
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* load image resources
|
|
14
|
-
* @param url image url
|
|
15
|
-
* @returns image element
|
|
16
|
-
*/
|
|
17
|
-
function loadImage(src) {
|
|
18
|
-
return new Promise((resolve, reject) => {
|
|
19
|
-
const img = new Image();
|
|
20
|
-
img.crossOrigin = 'Anonymous';
|
|
21
|
-
img.onload = () => resolve(img);
|
|
22
|
-
img.onerror = () => reject(new Error('Failed to load image'));
|
|
23
|
-
img.src = src;
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* create and return canvas and context
|
|
28
|
-
* @param width canvas width
|
|
29
|
-
* @param height canvas height
|
|
30
|
-
* @param fillStyle fill style
|
|
31
|
-
* @returns canvas and context
|
|
32
|
-
*/
|
|
33
|
-
function createCanvas(width, height, fillStyle = 'transparent') {
|
|
34
|
-
const canvas = document.createElement('canvas');
|
|
35
|
-
const ctx = canvas.getContext('2d');
|
|
36
|
-
canvas.width = width;
|
|
37
|
-
canvas.height = height;
|
|
38
|
-
canvas.style.width = `${width}px`;
|
|
39
|
-
canvas.style.height = `${height}px`;
|
|
40
|
-
ctx.strokeStyle = '#ffffff';
|
|
41
|
-
ctx.fillStyle = fillStyle;
|
|
42
|
-
ctx.fillRect(0, 0, width, height);
|
|
43
|
-
return {
|
|
44
|
-
canvas,
|
|
45
|
-
ctx
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* convert image to base64
|
|
50
|
-
* @param url image url
|
|
51
|
-
* @returns image base64
|
|
52
|
-
*/
|
|
53
|
-
async function convertImageToBase64(url) {
|
|
54
|
-
const response = await fetch(url);
|
|
55
|
-
const blob = await response.blob();
|
|
56
|
-
return new Promise((resolve, reject) => {
|
|
57
|
-
const reader = new FileReader();
|
|
58
|
-
reader.onloadend = () => resolve(reader.result);
|
|
59
|
-
reader.onerror = reject;
|
|
60
|
-
reader.readAsDataURL(blob);
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* clone node style
|
|
65
|
-
* @param nativeNode source node
|
|
66
|
-
* @param clonedNode clone node
|
|
67
|
-
*/
|
|
68
|
-
function cloneCSSStyle(nativeNode, clonedNode) {
|
|
69
|
-
const targetStyle = clonedNode?.style;
|
|
70
|
-
if (!targetStyle) {
|
|
71
|
-
return;
|
|
72
|
-
}
|
|
73
|
-
const sourceStyle = window.getComputedStyle(nativeNode);
|
|
74
|
-
if (sourceStyle.cssText) {
|
|
75
|
-
targetStyle.cssText = sourceStyle.cssText;
|
|
76
|
-
targetStyle.transformOrigin = sourceStyle.transformOrigin;
|
|
77
|
-
}
|
|
78
|
-
else {
|
|
79
|
-
Array.from(sourceStyle).forEach(name => {
|
|
80
|
-
let value = sourceStyle.getPropertyValue(name);
|
|
81
|
-
targetStyle.setProperty(name, value, sourceStyle.getPropertyPriority(name));
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* batch clone target styles
|
|
87
|
-
* @param sourceNode
|
|
88
|
-
* @param cloneNode
|
|
89
|
-
* @param inlineStyleClassNames
|
|
90
|
-
*/
|
|
91
|
-
function batchCloneCSSStyle(sourceNode, cloneNode, inlineStyleClassNames) {
|
|
92
|
-
if (inlineStyleClassNames) {
|
|
93
|
-
const classNames = inlineStyleClassNames + `, ${FOREIGN_OBJECT_EXPRESSION}`;
|
|
94
|
-
const sourceNodes = Array.from(sourceNode.querySelectorAll(classNames));
|
|
95
|
-
const cloneNodes = Array.from(cloneNode.querySelectorAll(classNames));
|
|
96
|
-
sourceNodes.forEach((node, index) => {
|
|
97
|
-
const childElements = Array.from(node.querySelectorAll('*')).filter(isElementNode);
|
|
98
|
-
const cloneChildElements = Array.from(cloneNodes[index].querySelectorAll('*')).filter(isElementNode);
|
|
99
|
-
sourceNodes.push(...childElements);
|
|
100
|
-
cloneNodes.push(...cloneChildElements);
|
|
101
|
-
});
|
|
102
|
-
// processing styles
|
|
103
|
-
sourceNodes.map((node, index) => {
|
|
104
|
-
cloneCSSStyle(node, cloneNodes[index]);
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* convert images in target nodes in batches
|
|
110
|
-
* @param sourceNode
|
|
111
|
-
* @param cloneNode
|
|
112
|
-
*/
|
|
113
|
-
async function batchConvertImage(sourceNode, cloneNode) {
|
|
114
|
-
const sourceImageNodes = Array.from(sourceNode.querySelectorAll(`${FOREIGN_OBJECT_EXPRESSION}`));
|
|
115
|
-
const cloneImageNodes = Array.from(cloneNode.querySelectorAll(`${FOREIGN_OBJECT_EXPRESSION}`));
|
|
116
|
-
await Promise.all(sourceImageNodes.map((_, index) => {
|
|
117
|
-
return new Promise(resolve => {
|
|
118
|
-
const cloneImageNode = cloneImageNodes[index];
|
|
119
|
-
// processing image
|
|
120
|
-
const image = cloneImageNode.querySelector('img');
|
|
121
|
-
const url = image?.getAttribute('src');
|
|
122
|
-
if (!url) {
|
|
123
|
-
return resolve(true);
|
|
124
|
-
}
|
|
125
|
-
convertImageToBase64(url).then(base64Image => {
|
|
126
|
-
image?.setAttribute('src', base64Image);
|
|
127
|
-
resolve(true);
|
|
128
|
-
});
|
|
129
|
-
});
|
|
130
|
-
}));
|
|
131
|
-
}
|
|
132
|
-
/**
|
|
133
|
-
* clone svg element
|
|
134
|
-
* @param board board
|
|
135
|
-
* @param options parameter configuration
|
|
136
|
-
* @returns clone svg element
|
|
137
|
-
*/
|
|
138
|
-
async function cloneSvg(board, elements, rectangle, options) {
|
|
139
|
-
const { width, height, x, y } = rectangle;
|
|
140
|
-
const { padding = 4, inlineStyleClassNames } = options;
|
|
141
|
-
const sourceSvg = PlaitBoard.getHost(board);
|
|
142
|
-
const selectedGElements = elements.map(value => PlaitElement.getElementG(value));
|
|
143
|
-
const cloneSvgElement = sourceSvg.cloneNode();
|
|
144
|
-
const newHostElement = PlaitBoard.getElementHost(board).cloneNode();
|
|
145
|
-
cloneSvgElement.style.width = `${width}px`;
|
|
146
|
-
cloneSvgElement.style.height = `${height}px`;
|
|
147
|
-
cloneSvgElement.style.backgroundColor = '';
|
|
148
|
-
cloneSvgElement.setAttribute('width', `${width}`);
|
|
149
|
-
cloneSvgElement.setAttribute('height', `${height}`);
|
|
150
|
-
cloneSvgElement.setAttribute('viewBox', [x - padding, y - padding, width + 2 * padding, height + 2 * padding].join(','));
|
|
151
|
-
const promiseArray = new Array(selectedGElements.length);
|
|
152
|
-
await Promise.all(selectedGElements.map(async (child, i) => {
|
|
153
|
-
const cloneChild = child.cloneNode(true);
|
|
154
|
-
batchCloneCSSStyle(child, cloneChild, inlineStyleClassNames);
|
|
155
|
-
await batchConvertImage(child, cloneChild);
|
|
156
|
-
promiseArray[i] = cloneChild;
|
|
157
|
-
}));
|
|
158
|
-
newHostElement.append(...promiseArray);
|
|
159
|
-
cloneSvgElement.appendChild(newHostElement);
|
|
160
|
-
return cloneSvgElement;
|
|
161
|
-
}
|
|
162
|
-
/**
|
|
163
|
-
* current board transfer pictures
|
|
164
|
-
* @param board board
|
|
165
|
-
* @param options parameter configuration
|
|
166
|
-
* @returns images in the specified format base64
|
|
167
|
-
*/
|
|
168
|
-
export async function toImage(board, options) {
|
|
169
|
-
if (!board) {
|
|
170
|
-
return undefined;
|
|
171
|
-
}
|
|
172
|
-
const elements = options.elements || findElements(board, { match: () => true, recursion: () => true, isReverse: false });
|
|
173
|
-
const targetRectangle = getRectangleByElements(board, elements, false);
|
|
174
|
-
const { ratio = 2, fillStyle = 'transparent' } = options;
|
|
175
|
-
const { width, height } = targetRectangle;
|
|
176
|
-
const ratioWidth = width * ratio;
|
|
177
|
-
const ratioHeight = height * ratio;
|
|
178
|
-
const cloneSvgElement = await cloneSvg(board, elements, targetRectangle, options);
|
|
179
|
-
const { canvas, ctx } = createCanvas(ratioWidth, ratioHeight, fillStyle);
|
|
180
|
-
const svgStr = new XMLSerializer().serializeToString(cloneSvgElement);
|
|
181
|
-
const imgSrc = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svgStr)}`;
|
|
182
|
-
try {
|
|
183
|
-
const img = await loadImage(imgSrc);
|
|
184
|
-
ctx.drawImage(img, 0, 0, ratioWidth, ratioHeight);
|
|
185
|
-
return canvas.toDataURL('image/png');
|
|
186
|
-
}
|
|
187
|
-
catch (error) {
|
|
188
|
-
console.error('Error converting SVG to image:', error);
|
|
189
|
-
return undefined;
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
/**
|
|
193
|
-
* download the file with the specified name
|
|
194
|
-
* @param url download url
|
|
195
|
-
* @param name file name
|
|
196
|
-
*/
|
|
197
|
-
export function downloadImage(url, name) {
|
|
198
|
-
const a = document.createElement('a');
|
|
199
|
-
a.href = url;
|
|
200
|
-
a.download = name;
|
|
201
|
-
a.click();
|
|
202
|
-
a.remove();
|
|
203
|
-
}
|
|
204
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG8taW1hZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy91dGlscy90by1pbWFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBbUIsTUFBTSxlQUFlLENBQUM7QUFDMUUsT0FBTyxFQUFFLFlBQVksRUFBRSxzQkFBc0IsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUVqRSxNQUFNLHlCQUF5QixHQUFHLHdDQUF3QyxDQUFDO0FBWTNFOzs7O0dBSUc7QUFDSCxTQUFTLGFBQWEsQ0FBQyxJQUFVO0lBQzdCLE9BQU8sSUFBSSxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsWUFBWSxDQUFDO0FBQy9DLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxTQUFTLENBQUMsR0FBVztJQUMxQixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQ25DLE1BQU0sR0FBRyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7UUFDeEIsR0FBRyxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDOUIsR0FBRyxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEMsR0FBRyxDQUFDLE9BQU8sR0FBRyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDO1FBQzlELEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBQ2xCLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsWUFBWSxDQUFDLEtBQWEsRUFBRSxNQUFjLEVBQUUsU0FBUyxHQUFHLGFBQWE7SUFDMUUsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNoRCxN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QWlCLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDdEUsTUFBTSxNQUFNLEdBQUcsb0NBQW9DLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7SUFFaEYsSUFBSSxDQUFDO1FBQ0QsTUFBTSxHQUFHLEdBQUcsTUFBTSxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDbEQsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2IsT0FBTyxDQUFDLEtBQUssQ0FBQyxnQ0FBZ0MsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN2RCxPQUFPLFNBQVMsQ0FBQztJQUNyQixDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLEdBQVcsRUFBRSxJQUFZO0lBQ25ELE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdEMsQ0FBQyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7SUFDYixDQUFDLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztJQUNsQixDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDVixDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGxhaXRCb2FyZCwgUGxhaXRFbGVtZW50LCBSZWN0YW5nbGVDbGllbnQgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGZpbmRFbGVtZW50cywgZ2V0UmVjdGFuZ2xlQnlFbGVtZW50cyB9IGZyb20gJy4vZWxlbWVudCc7XG5cbmNvbnN0IEZPUkVJR05fT0JKRUNUX0VYUFJFU1NJT04gPSBgZm9yZWlnbk9iamVjdFtjbGFzc149J2ZvcmVpZ24tb2JqZWN0J11gO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRvSW1hZ2VPcHRpb25zIHtcbiAgICBlbGVtZW50cz86IFBsYWl0RWxlbWVudFtdO1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgcmF0aW8/OiBudW1iZXI7XG4gICAgcGFkZGluZz86IG51bWJlcjtcbiAgICBmaWxsU3R5bGU/OiBzdHJpbmc7XG4gICAgLy8gTGlzdCBvZiBjbGFzcyBuYW1lcy4gVGhlIGxpc3QgbXVzdCBiZSBpbiB0aGUgZm9ybSBjbGFzczEsY2xhc3MyLC4uLlxuICAgIGlubGluZVN0eWxlQ2xhc3NOYW1lcz86IHN0cmluZztcbn1cblxuLyoqXG4gKiBJcyBlbGVtZW50IG5vZGVcbiAqIEBwYXJhbSBub2RlXG4gKiBAcmV0dXJuc1xuICovXG5mdW5jdGlvbiBpc0VsZW1lbnROb2RlKG5vZGU6IE5vZGUpOiBub2RlIGlzIEhUTUxFbGVtZW50IHtcbiAgICByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREU7XG59XG5cbi8qKlxuICogbG9hZCBpbWFnZSByZXNvdXJjZXNcbiAqIEBwYXJhbSB1cmwgaW1hZ2UgdXJsXG4gKiBAcmV0dXJucyBpbWFnZSBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIGxvYWRJbWFnZShzcmM6IHN0cmluZyk6IFByb21pc2U8SFRNTEltYWdlRWxlbWVudD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpO1xuICAgICAgICBpbWcuY3Jvc3NPcmlnaW4gPSAnQW5vbnltb3VzJztcbiAgICAgICAgaW1nLm9ubG9hZCA9ICgpID0+IHJlc29sdmUoaW1nKTtcbiAgICAgICAgaW1nLm9uZXJyb3IgPSAoKSA9PiByZWplY3QobmV3IEVycm9yKCdGYWlsZWQgdG8gbG9hZCBpbWFnZScpKTtcbiAgICAgICAgaW1nLnNyYyA9IHNyYztcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBjcmVhdGUgYW5kIHJldHVybiBjYW52YXMgYW5kIGNvbnRleHRcbiAqIEBwYXJhbSB3aWR0aCBjYW52YXMgd2lkdGhcbiAqIEBwYXJhbSBoZWlnaHQgY2FudmFzIGhlaWdodFxuICogQHBhcmFtIGZpbGxTdHlsZSBmaWxsIHN0eWxlXG4gKiBAcmV0dXJucyBjYW52YXMgYW5kIGNvbnRleHRcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ2FudmFzKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBmaWxsU3R5bGUgPSAndHJhbnNwYXJlbnQnKSB7XG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJykhO1xuXG4gICAgY2FudmFzLndpZHRoID0gd2lkdGg7XG4gICAgY2FudmFzLmhlaWdodCA9IGhlaWdodDtcbiAgICBjYW52YXMuc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGA7XG4gICAgY2FudmFzLnN0eWxlLmhlaWdodCA9IGAke2hlaWdodH1weGA7XG4gICAgY3R4LnN0cm9rZVN0eWxlID0gJyNmZmZmZmYnO1xuICAgIGN0eC5maWxsU3R5bGUgPSBmaWxsU3R5bGU7XG4gICAgY3R4LmZpbGxSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgY2FudmFzLFxuICAgICAgICBjdHhcbiAgICB9O1xufVxuXG4vKipcbiAqIGNvbnZlcnQgaW1hZ2UgdG8gYmFzZTY0XG4gKiBAcGFyYW0gdXJsIGltYWdlIHVybFxuICogQHJldHVybnMgaW1hZ2UgYmFzZTY0XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvbnZlcnRJbWFnZVRvQmFzZTY0KHVybDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgY29uc3QgYmxvYiA9IGF3YWl0IHJlc3BvbnNlLmJsb2IoKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgICByZWFkZXIub25sb2FkZW5kID0gKCkgPT4gcmVzb2x2ZShyZWFkZXIucmVzdWx0IGFzIHN0cmluZyk7XG4gICAgICAgIHJlYWRlci5vbmVycm9yID0gcmVqZWN0O1xuICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChibG9iKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBjbG9uZSBub2RlIHN0eWxlXG4gKiBAcGFyYW0gbmF0aXZlTm9kZSBzb3VyY2Ugbm9kZVxuICogQHBhcmFtIGNsb25lZE5vZGUgY2xvbmUgbm9kZVxuICovXG5mdW5jdGlvbiBjbG9uZUNTU1N0eWxlPFQgZXh0ZW5kcyBIVE1MRWxlbWVudD4obmF0aXZlTm9kZTogVCwgY2xvbmVkTm9kZTogVCkge1xuICAgIGNvbnN0IHRhcmdldFN0eWxlID0gY2xvbmVkTm9kZT8uc3R5bGU7XG4gICAgaWYgKCF0YXJnZXRTdHlsZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc291cmNlU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShuYXRpdmVOb2RlKTtcbiAgICBpZiAoc291cmNlU3R5bGUuY3NzVGV4dCkge1xuICAgICAgICB0YXJnZXRTdHlsZS5jc3NUZXh0ID0gc291cmNlU3R5bGUuY3NzVGV4dDtcbiAgICAgICAgdGFyZ2V0U3R5bGUudHJhbnNmb3JtT3JpZ2luID0gc291cmNlU3R5bGUudHJhbnNmb3JtT3JpZ2luO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIEFycmF5LmZyb20oc291cmNlU3R5bGUpLmZvckVhY2gobmFtZSA9PiB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBzb3VyY2VTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpO1xuICAgICAgICAgICAgdGFyZ2V0U3R5bGUuc2V0UHJvcGVydHkobmFtZSwgdmFsdWUsIHNvdXJjZVN0eWxlLmdldFByb3BlcnR5UHJpb3JpdHkobmFtZSkpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbi8qKlxuICogYmF0Y2ggY2xvbmUgdGFyZ2V0IHN0eWxlc1xuICogQHBhcmFtIHNvdXJjZU5vZGVcbiAqIEBwYXJhbSBjbG9uZU5vZGVcbiAqIEBwYXJhbSBpbmxpbmVTdHlsZUNsYXNzTmFtZXNcbiAqL1xuZnVuY3Rpb24gYmF0Y2hDbG9uZUNTU1N0eWxlKHNvdXJjZU5vZGU6IFNWR0dFbGVtZW50LCBjbG9uZU5vZGU6IFNWR0dFbGVtZW50LCBpbmxpbmVTdHlsZUNsYXNzTmFtZXM6IHN0cmluZykge1xuICAgIGlmIChpbmxpbmVTdHlsZUNsYXNzTmFtZXMpIHtcbiAgICAgICAgY29uc3QgY2xhc3NOYW1lcyA9IGlubGluZVN0eWxlQ2xhc3NOYW1lcyArIGAsICR7Rk9SRUlHTl9PQkpFQ1RfRVhQUkVTU0lPTn1gO1xuICAgICAgICBjb25zdCBzb3VyY2VOb2RlcyA9IEFycmF5LmZyb20oc291cmNlTm9kZS5xdWVyeVNlbGVjdG9yQWxsKGNsYXNzTmFtZXMpKTtcbiAgICAgICAgY29uc3QgY2xvbmVOb2RlcyA9IEFycmF5LmZyb20oY2xvbmVOb2RlLnF1ZXJ5U2VsZWN0b3JBbGwoY2xhc3NOYW1lcykpO1xuXG4gICAgICAgIHNvdXJjZU5vZGVzLmZvckVhY2goKG5vZGUsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjaGlsZEVsZW1lbnRzID0gQXJyYXkuZnJvbShub2RlLnF1ZXJ5U2VsZWN0b3JBbGwoJyonKSkuZmlsdGVyKGlzRWxlbWVudE5vZGUpIGFzIEhUTUxFbGVtZW50W107XG4gICAgICAgICAgICBjb25zdCBjbG9uZUNoaWxkRWxlbWVudHMgPSBBcnJheS5mcm9tKGNsb25lTm9kZXNbaW5kZXhdLnF1ZXJ5U2VsZWN0b3JBbGwoJyonKSkuZmlsdGVyKGlzRWxlbWVudE5vZGUpIGFzIEhUTUxFbGVtZW50W107XG4gICAgICAgICAgICBzb3VyY2VOb2Rlcy5wdXNoKC4uLmNoaWxkRWxlbWVudHMpO1xuICAgICAgICAgICAgY2xvbmVOb2Rlcy5wdXNoKC4uLmNsb25lQ2hpbGRFbGVtZW50cyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIHByb2Nlc3Npbmcgc3R5bGVzXG4gICAgICAgIHNvdXJjZU5vZGVzLm1hcCgobm9kZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNsb25lQ1NTU3R5bGUobm9kZSBhcyBIVE1MRWxlbWVudCwgY2xvbmVOb2Rlc1tpbmRleF0gYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbi8qKlxuICogY29udmVydCBpbWFnZXMgaW4gdGFyZ2V0IG5vZGVzIGluIGJhdGNoZXNcbiAqIEBwYXJhbSBzb3VyY2VOb2RlXG4gKiBAcGFyYW0gY2xvbmVOb2RlXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGJhdGNoQ29udmVydEltYWdlKHNvdXJjZU5vZGU6IFNWR0dFbGVtZW50LCBjbG9uZU5vZGU6IFNWR0dFbGVtZW50KSB7XG4gICAgY29uc3Qgc291cmNlSW1hZ2VOb2RlcyA9IEFycmF5LmZyb20oc291cmNlTm9kZS5xdWVyeVNlbGVjdG9yQWxsKGAke0ZPUkVJR05fT0JKRUNUX0VYUFJFU1NJT059YCkpO1xuICAgIGNvbnN0IGNsb25lSW1hZ2VOb2RlcyA9IEFycmF5LmZyb20oY2xvbmVOb2RlLnF1ZXJ5U2VsZWN0b3JBbGwoYCR7Rk9SRUlHTl9PQkpFQ1RfRVhQUkVTU0lPTn1gKSk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIHNvdXJjZUltYWdlTm9kZXMubWFwKChfLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNsb25lSW1hZ2VOb2RlID0gY2xvbmVJbWFnZU5vZGVzW2luZGV4XTtcbiAgICAgICAgICAgICAgICAvLyBwcm9jZXNzaW5nIGltYWdlXG4gICAgICAgICAgICAgICAgY29uc3QgaW1hZ2UgPSAoY2xvbmVJbWFnZU5vZGUgYXMgSFRNTEVsZW1lbnQpLnF1ZXJ5U2VsZWN0b3IoJ2ltZycpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IGltYWdlPy5nZXRBdHRyaWJ1dGUoJ3NyYycpO1xuICAgICAgICAgICAgICAgIGlmICghdXJsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb252ZXJ0SW1hZ2VUb0Jhc2U2NCh1cmwpLnRoZW4oYmFzZTY0SW1hZ2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpbWFnZT8uc2V0QXR0cmlidXRlKCdzcmMnLCBiYXNlNjRJbWFnZSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICApO1xufVxuXG4vKipcbiAqIGNsb25lIHN2ZyBlbGVtZW50XG4gKiBAcGFyYW0gYm9hcmQgYm9hcmRcbiAqIEBwYXJhbSBvcHRpb25zIHBhcmFtZXRlciBjb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyBjbG9uZSBzdmcgZWxlbWVudFxuICovXG5hc3luYyBmdW5jdGlvbiBjbG9uZVN2Zyhib2FyZDogUGxhaXRCb2FyZCwgZWxlbWVudHM6IFBsYWl0RWxlbWVudFtdLCByZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCwgb3B0aW9uczogVG9JbWFnZU9wdGlvbnMpIHtcbiAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQsIHgsIHkgfSA9IHJlY3RhbmdsZTtcbiAgICBjb25zdCB7IHBhZGRpbmcgPSA0LCBpbmxpbmVTdHlsZUNsYXNzTmFtZXMgfSA9IG9wdGlvbnM7XG4gICAgY29uc3Qgc291cmNlU3ZnID0gUGxhaXRCb2FyZC5nZXRIb3N0KGJvYXJkKTtcbiAgICBjb25zdCBzZWxlY3RlZEdFbGVtZW50cyA9IGVsZW1lbnRzLm1hcCh2YWx1ZSA9PiBQbGFpdEVsZW1lbnQuZ2V0RWxlbWVudEcodmFsdWUpKTtcbiAgICBjb25zdCBjbG9uZVN2Z0VsZW1lbnQgPSBzb3VyY2VTdmcuY2xvbmVOb2RlKCkgYXMgU1ZHRWxlbWVudDtcbiAgICBjb25zdCBuZXdIb3N0RWxlbWVudCA9IFBsYWl0Qm9hcmQuZ2V0RWxlbWVudEhvc3QoYm9hcmQpLmNsb25lTm9kZSgpIGFzIFNWR0dFbGVtZW50O1xuXG4gICAgY2xvbmVTdmdFbGVtZW50LnN0eWxlLndpZHRoID0gYCR7d2lkdGh9cHhgO1xuICAgIGNsb25lU3ZnRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBgJHtoZWlnaHR9cHhgO1xuICAgIGNsb25lU3ZnRWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnJztcbiAgICBjbG9uZVN2Z0VsZW1lbnQuc2V0QXR0cmlidXRlKCd3aWR0aCcsIGAke3dpZHRofWApO1xuICAgIGNsb25lU3ZnRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIGAke2hlaWdodH1gKTtcbiAgICBjbG9uZVN2Z0VsZW1lbnQuc2V0QXR0cmlidXRlKCd2aWV3Qm94JywgW3ggLSBwYWRkaW5nLCB5IC0gcGFkZGluZywgd2lkdGggKyAyICogcGFkZGluZywgaGVpZ2h0ICsgMiAqIHBhZGRpbmddLmpvaW4oJywnKSk7XG5cbiAgICBjb25zdCBwcm9taXNlQXJyYXkgPSBuZXcgQXJyYXkoc2VsZWN0ZWRHRWxlbWVudHMubGVuZ3RoKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgc2VsZWN0ZWRHRWxlbWVudHMubWFwKGFzeW5jIChjaGlsZCwgaSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY2xvbmVDaGlsZCA9IGNoaWxkLmNsb25lTm9kZSh0cnVlKSBhcyBTVkdHRWxlbWVudDtcbiAgICAgICAgICAgIGJhdGNoQ2xvbmVDU1NTdHlsZShjaGlsZCwgY2xvbmVDaGlsZCwgaW5saW5lU3R5bGVDbGFzc05hbWVzIGFzIHN0cmluZyk7XG4gICAgICAgICAgICBhd2FpdCBiYXRjaENvbnZlcnRJbWFnZShjaGlsZCwgY2xvbmVDaGlsZCk7XG4gICAgICAgICAgICBwcm9taXNlQXJyYXlbaV0gPSBjbG9uZUNoaWxkO1xuICAgICAgICB9KVxuICAgICk7XG4gICAgbmV3SG9zdEVsZW1lbnQuYXBwZW5kKC4uLnByb21pc2VBcnJheSk7XG4gICAgY2xvbmVTdmdFbGVtZW50LmFwcGVuZENoaWxkKG5ld0hvc3RFbGVtZW50KTtcbiAgICByZXR1cm4gY2xvbmVTdmdFbGVtZW50O1xufVxuXG4vKipcbiAqIGN1cnJlbnQgYm9hcmQgdHJhbnNmZXIgcGljdHVyZXNcbiAqIEBwYXJhbSBib2FyZCBib2FyZFxuICogQHBhcmFtIG9wdGlvbnMgcGFyYW1ldGVyIGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIGltYWdlcyBpbiB0aGUgc3BlY2lmaWVkIGZvcm1hdCBiYXNlNjRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRvSW1hZ2UoYm9hcmQ6IFBsYWl0Qm9hcmQsIG9wdGlvbnM6IFRvSW1hZ2VPcHRpb25zKSB7XG4gICAgaWYgKCFib2FyZCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBlbGVtZW50cyA9IG9wdGlvbnMuZWxlbWVudHMgfHwgZmluZEVsZW1lbnRzKGJvYXJkLCB7IG1hdGNoOiAoKSA9PiB0cnVlLCByZWN1cnNpb246ICgpID0+IHRydWUsIGlzUmV2ZXJzZTogZmFsc2UgfSk7XG4gICAgY29uc3QgdGFyZ2V0UmVjdGFuZ2xlID0gZ2V0UmVjdGFuZ2xlQnlFbGVtZW50cyhib2FyZCwgZWxlbWVudHMsIGZhbHNlKTtcbiAgICBjb25zdCB7IHJhdGlvID0gMiwgZmlsbFN0eWxlID0gJ3RyYW5zcGFyZW50JyB9ID0gb3B0aW9ucztcbiAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IHRhcmdldFJlY3RhbmdsZTtcbiAgICBjb25zdCByYXRpb1dpZHRoID0gd2lkdGggKiByYXRpbztcbiAgICBjb25zdCByYXRpb0hlaWdodCA9IGhlaWdodCAqIHJhdGlvO1xuXG4gICAgY29uc3QgY2xvbmVTdmdFbGVtZW50ID0gYXdhaXQgY2xvbmVTdmcoYm9hcmQsIGVsZW1lbnRzLCB0YXJnZXRSZWN0YW5nbGUsIG9wdGlvbnMpO1xuICAgIGNvbnN0IHsgY2FudmFzLCBjdHggfSA9IGNyZWF0ZUNhbnZhcyhyYXRpb1dpZHRoLCByYXRpb0hlaWdodCwgZmlsbFN0eWxlKTtcblxuICAgIGNvbnN0IHN2Z1N0ciA9IG5ldyBYTUxTZXJpYWxpemVyKCkuc2VyaWFsaXplVG9TdHJpbmcoY2xvbmVTdmdFbGVtZW50KTtcbiAgICBjb25zdCBpbWdTcmMgPSBgZGF0YTppbWFnZS9zdmcreG1sO2NoYXJzZXQ9dXRmLTgsJHtlbmNvZGVVUklDb21wb25lbnQoc3ZnU3RyKX1gO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaW1nID0gYXdhaXQgbG9hZEltYWdlKGltZ1NyYyk7XG4gICAgICAgIGN0eC5kcmF3SW1hZ2UoaW1nLCAwLCAwLCByYXRpb1dpZHRoLCByYXRpb0hlaWdodCk7XG4gICAgICAgIHJldHVybiBjYW52YXMudG9EYXRhVVJMKCdpbWFnZS9wbmcnKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBjb252ZXJ0aW5nIFNWRyB0byBpbWFnZTonLCBlcnJvcik7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxufVxuXG4vKipcbiAqIGRvd25sb2FkIHRoZSBmaWxlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lXG4gKiBAcGFyYW0gdXJsIGRvd25sb2FkIHVybFxuICogQHBhcmFtIG5hbWUgZmlsZSBuYW1lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkb3dubG9hZEltYWdlKHVybDogc3RyaW5nLCBuYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgIGEuaHJlZiA9IHVybDtcbiAgICBhLmRvd25sb2FkID0gbmFtZTtcbiAgICBhLmNsaWNrKCk7XG4gICAgYS5yZW1vdmUoKTtcbn1cbiJdfQ==
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import { RectangleClient } from '../interfaces';
|
|
2
|
-
import { PlaitBoard } from '../interfaces/board';
|
|
3
|
-
export const getViewBox = (board) => {
|
|
4
|
-
return PlaitBoard.getHost(board).viewBox.baseVal;
|
|
5
|
-
};
|
|
6
|
-
/**
|
|
7
|
-
* Get the screen point starting from the upper left corner of the svg element (based on the svg screen coordinate system)
|
|
8
|
-
*/
|
|
9
|
-
export function toHostPoint(board, x, y) {
|
|
10
|
-
const host = PlaitBoard.getHost(board);
|
|
11
|
-
const rect = host.getBoundingClientRect();
|
|
12
|
-
return [x - rect.x, y - rect.y];
|
|
13
|
-
}
|
|
14
|
-
export function toActiveRectangleFromViewBoxRectangle(board, rectangle) {
|
|
15
|
-
const leftTop = [rectangle.x, rectangle.y];
|
|
16
|
-
const rightBottom = [rectangle.x + rectangle.width, rectangle.y + rectangle.height];
|
|
17
|
-
const leftTopOfActive = toActivePointFromViewBoxPoint(board, leftTop);
|
|
18
|
-
const rightBottomOfActive = toActivePointFromViewBoxPoint(board, rightBottom);
|
|
19
|
-
return RectangleClient.getRectangleByPoints([leftTopOfActive, rightBottomOfActive]);
|
|
20
|
-
}
|
|
21
|
-
export function toActivePointFromViewBoxPoint(board, point) {
|
|
22
|
-
const screenPoint = toScreenPointFromHostPoint(board, toHostPointFromViewBoxPoint(board, point));
|
|
23
|
-
return toActivePoint(board, screenPoint[0], screenPoint[1]);
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Get the screen point starting from the upper left corner of the svg element (based on the svg screen coordinate system)
|
|
27
|
-
*/
|
|
28
|
-
export function toActivePoint(board, x, y) {
|
|
29
|
-
const boardContainer = PlaitBoard.getBoardContainer(board);
|
|
30
|
-
const rect = boardContainer.getBoundingClientRect();
|
|
31
|
-
return [x - rect.x, y - rect.y];
|
|
32
|
-
}
|
|
33
|
-
export function toScreenPointFromActivePoint(board, activePoint) {
|
|
34
|
-
const boardContainer = PlaitBoard.getBoardContainer(board);
|
|
35
|
-
const rect = boardContainer.getBoundingClientRect();
|
|
36
|
-
return [rect.x + activePoint[0], rect.y + activePoint[1]];
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Get the point in the coordinate system of the svg viewBox
|
|
40
|
-
*/
|
|
41
|
-
export function toViewBoxPoint(board, hostPoint) {
|
|
42
|
-
const viewBox = getViewBox(board);
|
|
43
|
-
const { zoom } = board.viewport;
|
|
44
|
-
const x = hostPoint[0] / zoom + viewBox.x;
|
|
45
|
-
const y = hostPoint[1] / zoom + viewBox.y;
|
|
46
|
-
const newPoint = [x, y];
|
|
47
|
-
return newPoint;
|
|
48
|
-
}
|
|
49
|
-
export function toViewBoxPoints(board, hostPoints) {
|
|
50
|
-
const newPoints = hostPoints.map((point) => {
|
|
51
|
-
return toViewBoxPoint(board, point);
|
|
52
|
-
});
|
|
53
|
-
return newPoints;
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* `toHostPoint` reverse processing
|
|
57
|
-
* Get the screen point starting from the upper left corner of the browser window or the viewport (based on the screen coordinate system)
|
|
58
|
-
*/
|
|
59
|
-
export function toScreenPointFromHostPoint(board, hostPoint) {
|
|
60
|
-
const host = PlaitBoard.getHost(board);
|
|
61
|
-
const rect = host.getBoundingClientRect();
|
|
62
|
-
return [hostPoint[0] + rect.x, hostPoint[1] + rect.y];
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* `toViewBoxPoint` reverse processing
|
|
66
|
-
*/
|
|
67
|
-
export function toHostPointFromViewBoxPoint(board, viewBoxPoint) {
|
|
68
|
-
const { zoom } = board.viewport;
|
|
69
|
-
const viewBox = getViewBox(board);
|
|
70
|
-
const x = (viewBoxPoint[0] - viewBox.x) * zoom;
|
|
71
|
-
const y = (viewBoxPoint[1] - viewBox.y) * zoom;
|
|
72
|
-
return [x, y];
|
|
73
|
-
}
|
|
74
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG8tcG9pbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy91dGlscy90by1wb2ludC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUdqRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxLQUFpQixFQUFFLEVBQUU7SUFDNUMsT0FBTyxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7QUFDckQsQ0FBQyxDQUFDO0FBRUY7O0dBRUc7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUFDLEtBQWlCLEVBQUUsQ0FBUyxFQUFFLENBQVM7SUFDL0QsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztJQUMxQyxPQUFPLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwQyxDQUFDO0FBRUQsTUFBTSxVQUFVLHFDQUFxQyxDQUFDLEtBQWlCLEVBQUUsU0FBMEI7SUFDL0YsTUFBTSxPQUFPLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQVUsQ0FBQztJQUNwRCxNQUFNLFdBQVcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQVUsQ0FBQztJQUM3RixNQUFNLGVBQWUsR0FBRyw2QkFBNkIsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDdEUs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QWlCLEVBQUUsWUFBbUI7SUFDOUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7SUFDaEMsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2xDLE1BQU0sQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDL0MsTUFBTSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztJQUMvQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBVSxDQUFDO0FBQzNCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZWN0YW5nbGVDbGllbnQgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IFBsYWl0Qm9hcmQgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2JvYXJkJztcbmltcG9ydCB7IFBvaW50IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9wb2ludCc7XG5cbmV4cG9ydCBjb25zdCBnZXRWaWV3Qm94ID0gKGJvYXJkOiBQbGFpdEJvYXJkKSA9PiB7XG4gICAgcmV0dXJuIFBsYWl0Qm9hcmQuZ2V0SG9zdChib2FyZCkudmlld0JveC5iYXNlVmFsO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIHNjcmVlbiBwb2ludCBzdGFydGluZyBmcm9tIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgc3ZnIGVsZW1lbnQgKGJhc2VkIG9uIHRoZSBzdmcgc2NyZWVuIGNvb3JkaW5hdGUgc3lzdGVtKVxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9Ib3N0UG9pbnQoYm9hcmQ6IFBsYWl0Qm9hcmQsIHg6IG51bWJlciwgeTogbnVtYmVyKTogUG9pbnQge1xuICAgIGNvbnN0IGhvc3QgPSBQbGFpdEJvYXJkLmdldEhvc3QoYm9hcmQpO1xuICAgIGNvbnN0IHJlY3QgPSBob3N0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHJldHVybiBbeCAtIHJlY3QueCwgeSAtIHJlY3QueV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b0FjdGl2ZVJlY3RhbmdsZUZyb21WaWV3Qm94UmVjdGFuZ2xlKGJvYXJkOiBQbGFpdEJvYXJkLCByZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCkge1xuICAgIGNvbnN0IGxlZnRUb3AgPSBbcmVjdGFuZ2xlLngsIHJlY3RhbmdsZS55XSBhcyBQb2ludDtcbiAgICBjb25zdCByaWdodEJvdHRvbSA9IFtyZWN0YW5nbGUueCArIHJlY3RhbmdsZS53aWR0aCwgcmVjdGFuZ2xlLnkgKyByZWN0YW5nbGUuaGVpZ2h0XSBhcyBQb2ludDtcbiAgICBjb25zdCBsZWZ0VG9wT2ZBY3RpdmUgPSB0b0FjdGl2ZVBvaW50RnJvbVZpZXdCb3hQb2ludChib2FyZCwgbGVmdFRvcCk7XG4gICAgY29uc3QgcmlnaHRCb3R0b21PZkFjdGl2ZSA9IHRvQWN0aXZlUG9pbnRGcm9tVmlld0JveFBvaW50KGJvYXJkLCByaWdodEJvdHRvbSk7XG4gICAgcmV0dXJuIFJlY3RhbmdsZUNsaWVudC5nZXRSZWN0YW5nbGVCeVBvaW50cyhbbGVmdFRvcE9mQWN0aXZlLCByaWdodEJvdHRvbU9mQWN0aXZlXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b0FjdGl2ZVBvaW50RnJvbVZpZXdCb3hQb2ludChib2FyZDogUGxhaXRCb2FyZCwgcG9pbnQ6IFBvaW50KSB7XG4gICAgY29uc3Qgc2NyZWVuUG9pbnQgPSB0b1NjcmVlblBvaW50RnJvbUhvc3RQb2ludChib2FyZCwgdG9Ib3N0UG9pbnRGcm9tVmlld0JveFBvaW50KGJvYXJkLCBwb2ludCkpO1xuICAgIHJldHVybiB0b0FjdGl2ZVBvaW50KGJvYXJkLCBzY3JlZW5Qb2ludFswXSwgc2NyZWVuUG9pbnRbMV0pO1xufVxuXG4vKipcbiAqIEdldCB0aGUgc2NyZWVuIHBvaW50IHN0YXJ0aW5nIGZyb20gdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSBzdmcgZWxlbWVudCAoYmFzZWQgb24gdGhlIHN2ZyBzY3JlZW4gY29vcmRpbmF0ZSBzeXN0ZW0pXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0FjdGl2ZVBvaW50KGJvYXJkOiBQbGFpdEJvYXJkLCB4OiBudW1iZXIsIHk6IG51bWJlcik6IFBvaW50IHtcbiAgICBjb25zdCBib2FyZENvbnRhaW5lciA9IFBsYWl0Qm9hcmQuZ2V0Qm9hcmRDb250YWluZXIoYm9hcmQpO1xuICAgIGNvbnN0IHJlY3QgPSBib2FyZENvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICByZXR1cm4gW3ggLSByZWN0LngsIHkgLSByZWN0LnldO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9TY3JlZW5Qb2ludEZyb21BY3RpdmVQb2ludChib2FyZDogUGxhaXRCb2FyZCwgYWN0aXZlUG9pbnQ6IFBvaW50KTogUG9pbnQge1xuICAgIGNvbnN0IGJvYXJkQ29udGFpbmVyID0gUGxhaXRCb2FyZC5nZXRCb2FyZENvbnRhaW5lcihib2FyZCk7XG4gICAgY29uc3QgcmVjdCA9IGJvYXJkQ29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHJldHVybiBbcmVjdC54ICsgYWN0aXZlUG9pbnRbMF0sIHJlY3QueSArIGFjdGl2ZVBvaW50WzFdXTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHBvaW50IGluIHRoZSBjb29yZGluYXRlIHN5c3RlbSBvZiB0aGUgc3ZnIHZpZXdCb3hcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvVmlld0JveFBvaW50KGJvYXJkOiBQbGFpdEJvYXJkLCBob3N0UG9pbnQ6IFBvaW50KSB7XG4gICAgY29uc3Qgdmlld0JveCA9IGdldFZpZXdCb3goYm9hcmQpO1xuICAgIGNvbnN0IHsgem9vbSB9ID0gYm9hcmQudmlld3BvcnQ7XG4gICAgY29uc3QgeCA9IGhvc3RQb2ludFswXSAvIHpvb20gKyB2aWV3Qm94Lng7XG4gICAgY29uc3QgeSA9IGhvc3RQb2ludFsxXSAvIHpvb20gKyB2aWV3Qm94Lnk7XG4gICAgY29uc3QgbmV3UG9pbnQgPSBbeCwgeV0gYXMgUG9pbnQ7XG4gICAgcmV0dXJuIG5ld1BvaW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9WaWV3Qm94UG9pbnRzKGJvYXJkOiBQbGFpdEJvYXJkLCBob3N0UG9pbnRzOiBQb2ludFtdKSB7XG4gICAgY29uc3QgbmV3UG9pbnRzID0gaG9zdFBvaW50cy5tYXAoKHBvaW50KSA9PiB7XG4gICAgICAgIHJldHVybiB0b1ZpZXdCb3hQb2ludChib2FyZCwgcG9pbnQpO1xuICAgIH0pO1xuICAgIHJldHVybiBuZXdQb2ludHM7XG59XG5cbi8qKlxuICogYHRvSG9zdFBvaW50YCByZXZlcnNlIHByb2Nlc3NpbmdcbiAqIEdldCB0aGUgc2NyZWVuIHBvaW50IHN0YXJ0aW5nIGZyb20gdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSBicm93c2VyIHdpbmRvdyBvciB0aGUgdmlld3BvcnQgKGJhc2VkIG9uIHRoZSBzY3JlZW4gY29vcmRpbmF0ZSBzeXN0ZW0pXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1NjcmVlblBvaW50RnJvbUhvc3RQb2ludChib2FyZDogUGxhaXRCb2FyZCwgaG9zdFBvaW50OiBQb2ludCkge1xuICAgIGNvbnN0IGhvc3QgPSBQbGFpdEJvYXJkLmdldEhvc3QoYm9hcmQpO1xuICAgIGNvbnN0IHJlY3QgPSBob3N0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHJldHVybiBbaG9zdFBvaW50WzBdICsgcmVjdC54LCBob3N0UG9pbnRbMV0gKyByZWN0LnldIGFzIFBvaW50O1xufVxuXG4vKipcbiAqIGB0b1ZpZXdCb3hQb2ludGAgcmV2ZXJzZSBwcm9jZXNzaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0hvc3RQb2ludEZyb21WaWV3Qm94UG9pbnQoYm9hcmQ6IFBsYWl0Qm9hcmQsIHZpZXdCb3hQb2ludDogUG9pbnQpIHtcbiAgICBjb25zdCB7IHpvb20gfSA9IGJvYXJkLnZpZXdwb3J0O1xuICAgIGNvbnN0IHZpZXdCb3ggPSBnZXRWaWV3Qm94KGJvYXJkKTtcbiAgICBjb25zdCB4ID0gKHZpZXdCb3hQb2ludFswXSAtIHZpZXdCb3gueCkgKiB6b29tO1xuICAgIGNvbnN0IHkgPSAodmlld0JveFBvaW50WzFdIC0gdmlld0JveC55KSAqIHpvb207XG4gICAgcmV0dXJuIFt4LCB5XSBhcyBQb2ludDtcbn1cbiJdfQ==
|
package/esm2022/utils/tree.mjs
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { PlaitBoard } from '../interfaces/board';
|
|
2
|
-
export function depthFirstRecursion(node, callback, recursion, isReverse) {
|
|
3
|
-
if (node.children && (!recursion || recursion(node))) {
|
|
4
|
-
let children = [...node.children];
|
|
5
|
-
children = isReverse ? children.reverse() : children;
|
|
6
|
-
children.forEach(child => {
|
|
7
|
-
depthFirstRecursion(child, callback, recursion);
|
|
8
|
-
});
|
|
9
|
-
}
|
|
10
|
-
callback(node);
|
|
11
|
-
}
|
|
12
|
-
export const getIsRecursionFunc = (board) => {
|
|
13
|
-
return (element) => {
|
|
14
|
-
if (PlaitBoard.isBoard(element) || board.isRecursion(element)) {
|
|
15
|
-
return true;
|
|
16
|
-
}
|
|
17
|
-
else {
|
|
18
|
-
return false;
|
|
19
|
-
}
|
|
20
|
-
};
|
|
21
|
-
};
|
|
22
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvcmUvc3JjL3V0aWxzL3RyZWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBR2pELE1BQU0sVUFBVSxtQkFBbUIsQ0FDL0IsSUFBTyxFQUNQLFFBQTJCLEVBQzNCLFNBQWdDLEVBQ2hDLFNBQW1CO0lBRW5CLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUMsU0FBUyxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDbkQsSUFBSSxRQUFRLEdBQWUsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM5QyxRQUFRLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztRQUNyRCxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3JCLG1CQUFtQixDQUFDLEtBQVUsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDekQsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBQ0QsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25CLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLEtBQWlCLEVBQUUsRUFBRTtJQUNwRCxPQUFPLENBQUMsT0FBa0MsRUFBRSxFQUFFO1FBQzFDLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDNUQsT0FBTyxJQUFJLENBQUM7UUFDaEIsQ0FBQzthQUFNLENBQUM7WUFDSixPQUFPLEtBQUssQ0FBQztRQUNqQixDQUFDO0lBQ0wsQ0FBQyxDQUFDO0FBQ04sQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGxhaXRCb2FyZCB9IGZyb20gJy4uL2ludGVyZmFjZXMvYm9hcmQnO1xuaW1wb3J0IHsgUGxhaXRFbGVtZW50IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9lbGVtZW50JztcblxuZXhwb3J0IGZ1bmN0aW9uIGRlcHRoRmlyc3RSZWN1cnNpb248VCBleHRlbmRzIFRyZWVOb2RlID0gVHJlZU5vZGU+KFxuICAgIG5vZGU6IFQsXG4gICAgY2FsbGJhY2s6IChub2RlOiBUKSA9PiB2b2lkLFxuICAgIHJlY3Vyc2lvbj86IChub2RlOiBUKSA9PiBib29sZWFuLFxuICAgIGlzUmV2ZXJzZT86IGJvb2xlYW5cbikge1xuICAgIGlmIChub2RlLmNoaWxkcmVuICYmICghcmVjdXJzaW9uIHx8IHJlY3Vyc2lvbihub2RlKSkpIHtcbiAgICAgICAgbGV0IGNoaWxkcmVuOiBUcmVlTm9kZVtdID0gWy4uLm5vZGUuY2hpbGRyZW5dO1xuICAgICAgICBjaGlsZHJlbiA9IGlzUmV2ZXJzZSA/IGNoaWxkcmVuLnJldmVyc2UoKSA6IGNoaWxkcmVuO1xuICAgICAgICBjaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IHtcbiAgICAgICAgICAgIGRlcHRoRmlyc3RSZWN1cnNpb24oY2hpbGQgYXMgVCwgY2FsbGJhY2ssIHJlY3Vyc2lvbik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjYWxsYmFjayhub2RlKTtcbn1cblxuZXhwb3J0IGNvbnN0IGdldElzUmVjdXJzaW9uRnVuYyA9IChib2FyZDogUGxhaXRCb2FyZCkgPT4ge1xuICAgIHJldHVybiAoZWxlbWVudDogUGxhaXRFbGVtZW50IHwgUGxhaXRCb2FyZCkgPT4ge1xuICAgICAgICBpZiAoUGxhaXRCb2FyZC5pc0JvYXJkKGVsZW1lbnQpIHx8IGJvYXJkLmlzUmVjdXJzaW9uKGVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH07XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFRyZWVOb2RlIHtcbiAgICBjaGlsZHJlbj86IFRyZWVOb2RlW107XG59XG4iXX0=
|