ngx-vflow 1.4.0 → 1.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -63,10 +63,9 @@ export class ResizableComponent {
|
|
|
63
63
|
resize(event) {
|
|
64
64
|
if (!this.resizeSide)
|
|
65
65
|
return;
|
|
66
|
-
if (this.isResizeConstrained(event))
|
|
67
|
-
return;
|
|
68
66
|
const offset = calcOffset(event.movementX, event.movementY, this.zoom());
|
|
69
|
-
const
|
|
67
|
+
const resized = applyResize(this.resizeSide, this.model, offset, this.getDistanceToEdge(event));
|
|
68
|
+
const { x, y, width, height } = constrainRect(resized, this.model, this.resizeSide, this.minWidth, this.minHeight);
|
|
70
69
|
this.model.setPoint({ x, y });
|
|
71
70
|
this.model.width.set(width);
|
|
72
71
|
this.model.height.set(height);
|
|
@@ -75,41 +74,15 @@ export class ResizableComponent {
|
|
|
75
74
|
this.resizeSide = null;
|
|
76
75
|
this.model.resizing.set(false);
|
|
77
76
|
}
|
|
78
|
-
|
|
79
|
-
const flowPoint = this.spacePointContext.documentPointToFlowPoint({ x, y });
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
}
|
|
88
|
-
if (this.resizeSide?.includes('left')) {
|
|
89
|
-
if (movementX < 0 && flowPoint.x > this.model.point().x) {
|
|
90
|
-
return true;
|
|
91
|
-
}
|
|
92
|
-
if (movementX > 0 && flowPoint.x < this.model.point().x) {
|
|
93
|
-
return true;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
if (this.resizeSide?.includes('bottom')) {
|
|
97
|
-
if (movementY > 0 && flowPoint.y < this.model.point().y + this.model.size().height) {
|
|
98
|
-
return true;
|
|
99
|
-
}
|
|
100
|
-
if (movementY < 0 && flowPoint.y > this.model.point().y + this.model.size().height) {
|
|
101
|
-
return true;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
if (this.resizeSide?.includes('top')) {
|
|
105
|
-
if (movementY < 0 && flowPoint.y > this.model.point().y) {
|
|
106
|
-
return true;
|
|
107
|
-
}
|
|
108
|
-
if (movementY > 0 && flowPoint.y < this.model.point().y) {
|
|
109
|
-
return true;
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
return false;
|
|
77
|
+
getDistanceToEdge(event) {
|
|
78
|
+
const flowPoint = this.spacePointContext.documentPointToFlowPoint({ x: event.x, y: event.y });
|
|
79
|
+
const { x, y } = this.model.globalPoint();
|
|
80
|
+
return {
|
|
81
|
+
left: flowPoint.x - x,
|
|
82
|
+
right: flowPoint.x - (x + this.model.width()),
|
|
83
|
+
top: flowPoint.y - y,
|
|
84
|
+
bottom: flowPoint.y - (y + this.model.height()),
|
|
85
|
+
};
|
|
113
86
|
}
|
|
114
87
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ResizableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
115
88
|
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "17.3.12", type: ResizableComponent, isStandalone: true, selector: "[resizable]", inputs: { resizable: { classPropertyName: "resizable", publicName: "resizable", isSignal: true, isRequired: false, transformFunction: null }, resizerColor: { classPropertyName: "resizerColor", publicName: "resizerColor", isSignal: true, isRequired: false, transformFunction: null }, gap: { classPropertyName: "gap", publicName: "gap", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "resizer", first: true, predicate: ["resizer"], descendants: true, isSignal: true }], ngImport: i0, template: "<ng-template #resizer>\n <svg:g>\n <!-- top line -->\n <svg:line\n class=\"top\"\n stroke-width=\"2\"\n [attr.x1]=\"lineGap\"\n [attr.y1]=\"-gap()\"\n [attr.x2]=\"model.size().width - lineGap\"\n [attr.y2]=\"-gap()\"\n [attr.stroke]=\"resizerColor()\"\n (pointerStart)=\"startResize('top', $event)\" />\n <!-- Left line -->\n <svg:line\n class=\"left\"\n stroke-width=\"2\"\n [attr.x1]=\"-gap()\"\n [attr.y1]=\"lineGap\"\n [attr.x2]=\"-gap()\"\n [attr.y2]=\"model.size().height - lineGap\"\n [attr.stroke]=\"resizerColor()\"\n (pointerStart)=\"startResize('left', $event)\" />\n <!-- Bottom line -->\n <svg:line\n class=\"bottom\"\n stroke-width=\"2\"\n [attr.x1]=\"lineGap\"\n [attr.y1]=\"model.size().height + gap()\"\n [attr.x2]=\"model.size().width - lineGap\"\n [attr.y2]=\"model.size().height + gap()\"\n [attr.stroke]=\"resizerColor()\"\n (pointerStart)=\"startResize('bottom', $event)\" />\n <!-- Right line -->\n <svg:line\n class=\"right\"\n stroke-width=\"2\"\n [attr.x1]=\"model.size().width + gap()\"\n [attr.y1]=\"lineGap\"\n [attr.x2]=\"model.size().width + gap()\"\n [attr.y2]=\"model.size().height - lineGap\"\n [attr.stroke]=\"resizerColor()\"\n (pointerStart)=\"startResize('right', $event)\" />\n\n <!-- Top Left -->\n <svg:rect\n class=\"top-left\"\n [attr.x]=\"-(handleSize / 2) - gap()\"\n [attr.y]=\"-(handleSize / 2) - gap()\"\n [attr.width]=\"handleSize\"\n [attr.height]=\"handleSize\"\n [attr.fill]=\"resizerColor()\"\n (pointerStart)=\"startResize('top-left', $event)\" />\n\n <!-- Top right -->\n <svg:rect\n class=\"top-right\"\n [attr.x]=\"model.size().width - handleSize / 2 + gap()\"\n [attr.y]=\"-(handleSize / 2) - gap()\"\n [attr.width]=\"handleSize\"\n [attr.height]=\"handleSize\"\n [attr.fill]=\"resizerColor()\"\n (pointerStart)=\"startResize('top-right', $event)\" />\n\n <!-- Bottom left -->\n <svg:rect\n class=\"bottom-left\"\n [attr.x]=\"-(handleSize / 2) - gap()\"\n [attr.y]=\"model.size().height - handleSize / 2 + gap()\"\n [attr.width]=\"handleSize\"\n [attr.height]=\"handleSize\"\n [attr.fill]=\"resizerColor()\"\n (pointerStart)=\"startResize('bottom-left', $event)\" />\n\n <!-- Bottom right -->\n <svg:rect\n class=\"bottom-right\"\n [attr.x]=\"model.size().width - handleSize / 2 + gap()\"\n [attr.y]=\"model.size().height - handleSize / 2 + gap()\"\n [attr.width]=\"handleSize\"\n [attr.height]=\"handleSize\"\n [attr.fill]=\"resizerColor()\"\n (pointerStart)=\"startResize('bottom-right', $event)\" />\n </svg:g>\n</ng-template>\n\n<ng-content />\n", styles: [".top{cursor:n-resize}.left{cursor:w-resize}.right{cursor:e-resize}.bottom{cursor:s-resize}.top-left{cursor:nw-resize}.top-right{cursor:ne-resize}.bottom-left{cursor:sw-resize}.bottom-right{cursor:se-resize}\n"], dependencies: [{ kind: "directive", type: PointerDirective, selector: "[pointerStart], [pointerEnd], [pointerOver], [pointerOut]", outputs: ["pointerOver", "pointerOut", "pointerStart", "pointerEnd"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
@@ -127,43 +100,44 @@ function calcOffset(movementX, movementY, zoom) {
|
|
|
127
100
|
offsetY: round(movementY / zoom),
|
|
128
101
|
};
|
|
129
102
|
}
|
|
130
|
-
function applyResize(side, model, offset) {
|
|
103
|
+
function applyResize(side, model, offset, distanceToEdge) {
|
|
131
104
|
const { offsetX, offsetY } = offset;
|
|
132
105
|
const { x, y } = model.point();
|
|
133
|
-
const
|
|
106
|
+
const width = model.width();
|
|
107
|
+
const height = model.height();
|
|
134
108
|
// Handle each case of resizing (top, bottom, left, right, corners)
|
|
135
109
|
switch (side) {
|
|
136
110
|
case 'left':
|
|
137
|
-
return { x: x + offsetX, y, width: width - offsetX, height };
|
|
111
|
+
return { x: x + offsetX + distanceToEdge.left, y, width: width - offsetX - distanceToEdge.left, height };
|
|
138
112
|
case 'right':
|
|
139
|
-
return { x, y, width: width + offsetX, height };
|
|
113
|
+
return { x, y, width: width + offsetX + distanceToEdge.right, height };
|
|
140
114
|
case 'top':
|
|
141
|
-
return { x, y: y + offsetY, width, height: height - offsetY };
|
|
115
|
+
return { x, y: y + offsetY + distanceToEdge.top, width, height: height - offsetY - distanceToEdge.top };
|
|
142
116
|
case 'bottom':
|
|
143
|
-
return { x, y, width, height: height + offsetY };
|
|
117
|
+
return { x, y, width, height: height + offsetY + distanceToEdge.bottom };
|
|
144
118
|
case 'top-left':
|
|
145
119
|
return {
|
|
146
|
-
x: x + offsetX,
|
|
147
|
-
y: y + offsetY,
|
|
148
|
-
width: width - offsetX,
|
|
149
|
-
height: height - offsetY,
|
|
120
|
+
x: x + offsetX + distanceToEdge.left,
|
|
121
|
+
y: y + offsetY + distanceToEdge.top,
|
|
122
|
+
width: width - offsetX - distanceToEdge.left,
|
|
123
|
+
height: height - offsetY - distanceToEdge.top,
|
|
150
124
|
};
|
|
151
125
|
case 'top-right':
|
|
152
126
|
return {
|
|
153
127
|
x,
|
|
154
|
-
y: y + offsetY,
|
|
155
|
-
width: width + offsetX,
|
|
156
|
-
height: height - offsetY,
|
|
128
|
+
y: y + offsetY + distanceToEdge.top,
|
|
129
|
+
width: width + offsetX + distanceToEdge.right,
|
|
130
|
+
height: height - offsetY - distanceToEdge.top,
|
|
157
131
|
};
|
|
158
132
|
case 'bottom-left':
|
|
159
133
|
return {
|
|
160
|
-
x: x + offsetX,
|
|
134
|
+
x: x + offsetX + distanceToEdge.left,
|
|
161
135
|
y,
|
|
162
|
-
width: width - offsetX,
|
|
163
|
-
height: height + offsetY,
|
|
136
|
+
width: width - offsetX - distanceToEdge.left,
|
|
137
|
+
height: height + offsetY + distanceToEdge.bottom,
|
|
164
138
|
};
|
|
165
139
|
case 'bottom-right':
|
|
166
|
-
return { x, y, width: width + offsetX, height: height + offsetY };
|
|
140
|
+
return { x, y, width: width + offsetX + distanceToEdge.right, height: height + offsetY + distanceToEdge.bottom };
|
|
167
141
|
}
|
|
168
142
|
}
|
|
169
143
|
function constrainRect(rect, model, side, minWidth, minHeight) {
|
|
@@ -175,27 +149,33 @@ function constrainRect(rect, model, side, minWidth, minHeight) {
|
|
|
175
149
|
width = Math.max(minWidth, width);
|
|
176
150
|
height = Math.max(minHeight, height);
|
|
177
151
|
// Apply left/top constraints based on minimum size
|
|
178
|
-
x = Math.min(x, model.point().x + model.
|
|
179
|
-
y = Math.min(y, model.point().y + model.
|
|
152
|
+
x = Math.min(x, model.point().x + model.width() - minWidth);
|
|
153
|
+
y = Math.min(y, model.point().y + model.height() - minHeight);
|
|
180
154
|
const parent = model.parent();
|
|
181
155
|
// 3. Apply maximum size constraints based on parent size (if exists)
|
|
182
156
|
if (parent) {
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
157
|
+
const parentWidth = parent.width();
|
|
158
|
+
const parentHeight = parent.height();
|
|
159
|
+
const modelX = model.point().x;
|
|
160
|
+
const modelY = model.point().y;
|
|
161
|
+
x = Math.max(x, 0);
|
|
162
|
+
y = Math.max(y, 0);
|
|
163
|
+
// Stop resizing when hitting left or top boundary
|
|
164
|
+
if (side.includes('left') && x === 0) {
|
|
165
|
+
width = Math.min(width, modelX + model.width());
|
|
187
166
|
}
|
|
188
|
-
if (y === 0) {
|
|
189
|
-
height =
|
|
167
|
+
if (side.includes('top') && y === 0) {
|
|
168
|
+
height = Math.min(height, modelY + model.height());
|
|
190
169
|
}
|
|
191
|
-
|
|
192
|
-
|
|
170
|
+
// Allow right/bottom resizing without being blocked
|
|
171
|
+
width = Math.min(width, parentWidth - x);
|
|
172
|
+
height = Math.min(height, parentHeight - y);
|
|
193
173
|
}
|
|
194
174
|
const bounds = getNodesBounds(model.children());
|
|
195
175
|
// 4. Apply child node constraints (if children exist)
|
|
196
176
|
if (bounds) {
|
|
197
177
|
if (side.includes('left')) {
|
|
198
|
-
x = Math.min(x, model.point().x + model.
|
|
178
|
+
x = Math.min(x, model.point().x + model.width() - (bounds.x + bounds.width));
|
|
199
179
|
width = Math.max(width, bounds.x + bounds.width);
|
|
200
180
|
}
|
|
201
181
|
if (side.includes('right')) {
|
|
@@ -205,7 +185,7 @@ function constrainRect(rect, model, side, minWidth, minHeight) {
|
|
|
205
185
|
height = Math.max(height, bounds.y + bounds.height);
|
|
206
186
|
}
|
|
207
187
|
if (side.includes('top')) {
|
|
208
|
-
y = Math.min(y, model.point().y + model.
|
|
188
|
+
y = Math.min(y, model.point().y + model.height() - (bounds.y + bounds.height));
|
|
209
189
|
height = Math.max(height, bounds.y + bounds.height);
|
|
210
190
|
}
|
|
211
191
|
}
|
|
@@ -216,4 +196,4 @@ function constrainRect(rect, model, side, minWidth, minHeight) {
|
|
|
216
196
|
height,
|
|
217
197
|
};
|
|
218
198
|
}
|
|
219
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXphYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC12Zmxvdy1saWIvc3JjL2xpYi92Zmxvdy9wdWJsaWMtY29tcG9uZW50cy9yZXNpemFibGUvcmVzaXphYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC12Zmxvdy1saWIvc3JjL2xpYi92Zmxvdy9wdWJsaWMtY29tcG9uZW50cy9yZXNpemFibGUvcmVzaXphYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBRUwsU0FBUyxFQUNULFFBQVEsRUFDUixVQUFVLEVBQ1YsTUFBTSxFQUdOLEtBQUssRUFDTCxTQUFTLEVBQ1QsTUFBTSxFQUNOLHVCQUF1QixHQUN4QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNuQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbEUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFJM0UsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDNUYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7O0FBWXRFLE1BQU0sT0FBTyxrQkFBa0I7SUFlN0IsSUFBYyxLQUFLO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUcsQ0FBQztJQUNwQyxDQUFDO0lBNkJEO1FBN0NRLGlCQUFZLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDM0MsZ0JBQVcsR0FBRyxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUMzQyxvQkFBZSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUMxQyxzQkFBaUIsR0FBRyxNQUFNLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUN2RCxZQUFPLEdBQUcsTUFBTSxDQUFzQixVQUFVLENBQUMsQ0FBQztRQUVuRCxjQUFTLEdBQUcsS0FBSyxFQUFnQixDQUFDO1FBRWxDLGlCQUFZLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRWhDLFFBQUcsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFaEIsWUFBTyxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQXVCLFNBQVMsQ0FBQyxDQUFDO1FBTTVELFlBQU8sR0FBRyxDQUFDLENBQUM7UUFDWixlQUFVLEdBQUcsQ0FBQyxDQUFDO1FBRWpCLGVBQVUsR0FBZ0IsSUFBSSxDQUFDO1FBRS9CLFNBQUksR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztRQUV6RSxhQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsY0FBUyxHQUFHLENBQUMsQ0FBQztRQUV0QixxQ0FBcUM7UUFDM0IsNEJBQXVCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0I7YUFDbEUsSUFBSSxDQUNILE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxLQUFLLElBQUksQ0FBQyxFQUN0QyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxTQUFTLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxTQUFTLEtBQUssQ0FBQyxDQUFDLEVBQ2pFLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUNsQyxrQkFBa0IsRUFBRSxDQUNyQjthQUNBLFNBQVMsRUFBRSxDQUFDO1FBRUwsNkJBQXdCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUI7YUFDdEUsSUFBSSxDQUNILEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsRUFDM0Isa0JBQWtCLEVBQUUsQ0FDckI7YUFDQSxTQUFTLEVBQUUsQ0FBQztRQUdiLE1BQU0sQ0FDSixHQUFHLEVBQUU7WUFDSCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFFbkMsSUFBSSxPQUFPLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDbkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3RDLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakMsQ0FBQztRQUNILENBQUMsRUFDRCxFQUFFLGlCQUFpQixFQUFFLElBQUksRUFBRSxDQUM1QixDQUFDO0lBQ0osQ0FBQztJQUVNLFFBQVE7UUFDYixJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUdNLGVBQWU7UUFDcEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlGLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsRyxDQUFDO0lBRVMsV0FBVyxDQUFDLElBQVUsRUFBRSxLQUFZO1FBQzVDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUN2QixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVTLE1BQU0sQ0FBQyxLQUFtQjtRQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVU7WUFBRSxPQUFPO1FBQzdCLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU87UUFFNUMsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN6RSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsYUFBYSxDQUMzQyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxFQUNoRCxJQUFJLENBQUMsS0FBSyxFQUNWLElBQUksQ0FBQyxVQUFVLEVBQ2YsSUFBSSxDQUFDLFFBQVEsRUFDYixJQUFJLENBQUMsU0FBUyxDQUNmLENBQUM7UUFFRixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVTLFNBQVM7UUFDakIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDdkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFTyxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBZ0I7UUFDdEUsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLHdCQUF3QixDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFNUUsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3ZDLElBQUksU0FBUyxHQUFHLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ2xGLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztZQUVELElBQUksU0FBUyxHQUFHLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ2xGLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDdEMsSUFBSSxTQUFTLEdBQUcsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDeEQsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1lBRUQsSUFBSSxTQUFTLEdBQUcsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDeEQsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUN4QyxJQUFJLFNBQVMsR0FBRyxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNuRixPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7WUFFRCxJQUFJLFNBQVMsR0FBRyxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNuRixPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3JDLElBQUksU0FBUyxHQUFHLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3hELE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztZQUVELElBQUksU0FBUyxHQUFHLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3hELE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7K0dBaEpVLGtCQUFrQjttR0FBbEIsa0JBQWtCLDBrQkNyQy9CLDJ5RkFzRkEsMFFEcERZLGdCQUFnQjs7QUFxRW5CO0lBRE4sU0FBUzt5REFJVDs0RkFyRVUsa0JBQWtCO2tCQVI5QixTQUFTO2lDQUNJLElBQUksWUFDTixhQUFhLFdBR2QsQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFDVix1QkFBdUIsQ0FBQyxNQUFNO3dEQW9FeEMsZUFBZTtBQWlGeEIsU0FBUyxVQUFVLENBQUMsU0FBaUIsRUFBRSxTQUFpQixFQUFFLElBQVk7SUFDcEUsT0FBTztRQUNMLE9BQU8sRUFBRSxLQUFLLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUNoQyxPQUFPLEVBQUUsS0FBSyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7S0FDakMsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxJQUFVLEVBQUUsS0FBZ0IsRUFBRSxNQUE0QztJQUM3RixNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLE1BQU0sQ0FBQztJQUNwQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUMvQixNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUV2QyxtRUFBbUU7SUFDbkUsUUFBUSxJQUFJLEVBQUUsQ0FBQztRQUNiLEtBQUssTUFBTTtZQUNULE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssR0FBRyxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUM7UUFDL0QsS0FBSyxPQUFPO1lBQ1YsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssR0FBRyxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUM7UUFDbEQsS0FBSyxLQUFLO1lBQ1IsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sR0FBRyxPQUFPLEVBQUUsQ0FBQztRQUNoRSxLQUFLLFFBQVE7WUFDWCxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sR0FBRyxPQUFPLEVBQUUsQ0FBQztRQUNuRCxLQUFLLFVBQVU7WUFDYixPQUFPO2dCQUNMLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTztnQkFDZCxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU87Z0JBQ2QsS0FBSyxFQUFFLEtBQUssR0FBRyxPQUFPO2dCQUN0QixNQUFNLEVBQUUsTUFBTSxHQUFHLE9BQU87YUFDekIsQ0FBQztRQUNKLEtBQUssV0FBVztZQUNkLE9BQU87Z0JBQ0wsQ0FBQztnQkFDRCxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU87Z0JBQ2QsS0FBSyxFQUFFLEtBQUssR0FBRyxPQUFPO2dCQUN0QixNQUFNLEVBQUUsTUFBTSxHQUFHLE9BQU87YUFDekIsQ0FBQztRQUNKLEtBQUssYUFBYTtZQUNoQixPQUFPO2dCQUNMLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTztnQkFDZCxDQUFDO2dCQUNELEtBQUssRUFBRSxLQUFLLEdBQUcsT0FBTztnQkFDdEIsTUFBTSxFQUFFLE1BQU0sR0FBRyxPQUFPO2FBQ3pCLENBQUM7UUFDSixLQUFLLGNBQWM7WUFDakIsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssR0FBRyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sR0FBRyxPQUFPLEVBQUUsQ0FBQztJQUN0RSxDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsYUFBYSxDQUFDLElBQVUsRUFBRSxLQUFnQixFQUFFLElBQVUsRUFBRSxRQUFnQixFQUFFLFNBQWlCO0lBQ2xHLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUM7SUFFbkMsaUNBQWlDO0lBQ2pDLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMzQixNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFN0Isb0NBQW9DO0lBQ3BDLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNsQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFFckMsbURBQW1EO0lBQ25ELENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLENBQUM7SUFDakUsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsQ0FBQztJQUVuRSxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDOUIscUVBQXFFO0lBQ3JFLElBQUksTUFBTSxFQUFFLENBQUM7UUFDWCxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyw4QkFBOEI7UUFDbEQsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsNkJBQTZCO1FBRWpELElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ1osS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQztRQUMvQyxDQUFDO1FBRUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDWixNQUFNLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxDQUFDO1FBQ2pELENBQUM7UUFFRCxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0QsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFRCxNQUFNLE1BQU0sR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDaEQsc0RBQXNEO0lBQ3RELElBQUksTUFBTSxFQUFFLENBQUM7UUFDWCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUMxQixDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNsRixLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkQsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQzNCLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuRCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDNUIsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RELENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN6QixDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNwRixNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEQsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPO1FBQ0wsQ0FBQztRQUNELENBQUM7UUFDRCxLQUFLO1FBQ0wsTUFBTTtLQUNQLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29tcG9uZW50LFxuICBjb21wdXRlZCxcbiAgRWxlbWVudFJlZixcbiAgaW5qZWN0LFxuICBPbkluaXQsXG4gIFRlbXBsYXRlUmVmLFxuICBpbnB1dCxcbiAgdmlld0NoaWxkLFxuICBlZmZlY3QsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvb3RQb2ludGVyRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9yb290LXBvaW50ZXIuZGlyZWN0aXZlJztcbmltcG9ydCB7IGZpbHRlciwgdGFwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBWaWV3cG9ydFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy92aWV3cG9ydC5zZXJ2aWNlJztcbmltcG9ydCB7IHJvdW5kIH0gZnJvbSAnLi4vLi4vdXRpbHMvcm91bmQnO1xuaW1wb3J0IHsgTWljcm90YXNrIH0gZnJvbSAnLi4vLi4vZGVjb3JhdG9ycy9taWNyb3Rhc2suZGVjb3JhdG9yJztcbmltcG9ydCB7IGdldE5vZGVzQm91bmRzIH0gZnJvbSAnLi4vLi4vdXRpbHMvbm9kZXMnO1xuaW1wb3J0IHsgTm9kZUFjY2Vzc29yU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL25vZGUtYWNjZXNzb3Iuc2VydmljZSc7XG5pbXBvcnQgeyBOb2RlTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvbm9kZS5tb2RlbCc7XG5pbXBvcnQgeyBSZWN0IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZWN0JztcbmltcG9ydCB7IFBvaW50ZXJFdmVudCB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvcm9vdC1wb2ludGVyLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBTcGFjZVBvaW50Q29udGV4dERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvc3BhY2UtcG9pbnQtY29udGV4dC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgUG9pbnRlckRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvcG9pbnRlci5kaXJlY3RpdmUnO1xuXG50eXBlIFNpZGUgPSAndG9wJyB8ICdyaWdodCcgfCAnYm90dG9tJyB8ICdsZWZ0JyB8ICd0b3AtcmlnaHQnIHwgJ3RvcC1sZWZ0JyB8ICdib3R0b20tcmlnaHQnIHwgJ2JvdHRvbS1sZWZ0JztcblxuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHNlbGVjdG9yOiAnW3Jlc2l6YWJsZV0nLFxuICB0ZW1wbGF0ZVVybDogJy4vcmVzaXphYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcmVzaXphYmxlLmNvbXBvbmVudC5zY3NzJ10sXG4gIGltcG9ydHM6IFtQb2ludGVyRGlyZWN0aXZlXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFJlc2l6YWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XG4gIHByaXZhdGUgbm9kZUFjY2Vzc29yID0gaW5qZWN0KE5vZGVBY2Nlc3NvclNlcnZpY2UpO1xuICBwcml2YXRlIHJvb3RQb2ludGVyID0gaW5qZWN0KFJvb3RQb2ludGVyRGlyZWN0aXZlKTtcbiAgcHJpdmF0ZSB2aWV3cG9ydFNlcnZpY2UgPSBpbmplY3QoVmlld3BvcnRTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBzcGFjZVBvaW50Q29udGV4dCA9IGluamVjdChTcGFjZVBvaW50Q29udGV4dERpcmVjdGl2ZSk7XG4gIHByaXZhdGUgaG9zdFJlZiA9IGluamVjdDxFbGVtZW50UmVmPEVsZW1lbnQ+PihFbGVtZW50UmVmKTtcblxuICBwdWJsaWMgcmVzaXphYmxlID0gaW5wdXQ8Ym9vbGVhbiB8ICcnPigpO1xuXG4gIHB1YmxpYyByZXNpemVyQ29sb3IgPSBpbnB1dCgnIzJlNDE0YycpO1xuXG4gIHB1YmxpYyBnYXAgPSBpbnB1dCgxLjUpO1xuXG4gIHByaXZhdGUgcmVzaXplciA9IHZpZXdDaGlsZC5yZXF1aXJlZDxUZW1wbGF0ZVJlZjx1bmtub3duPj4oJ3Jlc2l6ZXInKTtcblxuICBwcm90ZWN0ZWQgZ2V0IG1vZGVsKCkge1xuICAgIHJldHVybiB0aGlzLm5vZGVBY2Nlc3Nvci5tb2RlbCgpITtcbiAgfVxuXG4gIHByb3RlY3RlZCBsaW5lR2FwID0gMztcbiAgcHJvdGVjdGVkIGhhbmRsZVNpemUgPSA2O1xuXG4gIHByaXZhdGUgcmVzaXplU2lkZTogU2lkZSB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgem9vbSA9IGNvbXB1dGVkKCgpID0+IHRoaXMudmlld3BvcnRTZXJ2aWNlLnJlYWRhYmxlVmlld3BvcnQoKS56b29tID8/IDApO1xuXG4gIHByaXZhdGUgbWluV2lkdGggPSAwO1xuICBwcml2YXRlIG1pbkhlaWdodCA9IDA7XG5cbiAgLy8gVE9ETzogYWxsb3cgcmVzemllIGJlc2lkZSB0aGUgZmxvd1xuICBwcm90ZWN0ZWQgcmVzaXplT25HbG9iYWxNb3VzZU1vdmUgPSB0aGlzLnJvb3RQb2ludGVyLnBvaW50ZXJNb3ZlbWVudCRcbiAgICAucGlwZShcbiAgICAgIGZpbHRlcigoKSA9PiB0aGlzLnJlc2l6ZVNpZGUgIT09IG51bGwpLFxuICAgICAgZmlsdGVyKChldmVudCkgPT4gZXZlbnQubW92ZW1lbnRYICE9PSAwIHx8IGV2ZW50Lm1vdmVtZW50WSAhPT0gMCksXG4gICAgICB0YXAoKGV2ZW50KSA9PiB0aGlzLnJlc2l6ZShldmVudCkpLFxuICAgICAgdGFrZVVudGlsRGVzdHJveWVkKCksXG4gICAgKVxuICAgIC5zdWJzY3JpYmUoKTtcblxuICBwcm90ZWN0ZWQgZW5kUmVzaXplT25HbG9iYWxNb3VzZVVwID0gdGhpcy5yb290UG9pbnRlci5kb2N1bWVudFBvaW50ZXJFbmQkXG4gICAgLnBpcGUoXG4gICAgICB0YXAoKCkgPT4gdGhpcy5lbmRSZXNpemUoKSksXG4gICAgICB0YWtlVW50aWxEZXN0cm95ZWQoKSxcbiAgICApXG4gICAgLnN1YnNjcmliZSgpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGVmZmVjdChcbiAgICAgICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzaXphYmxlID0gdGhpcy5yZXNpemFibGUoKTtcblxuICAgICAgICBpZiAodHlwZW9mIHJlc2l6YWJsZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgdGhpcy5tb2RlbC5yZXNpemFibGUuc2V0KHJlc2l6YWJsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5tb2RlbC5yZXNpemFibGUuc2V0KHRydWUpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9LFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5tb2RlbC5yZXNpemVyVGVtcGxhdGUuc2V0KHRoaXMucmVzaXplcigpKTtcbiAgfVxuXG4gIEBNaWNyb3Rhc2tcbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLm1pbldpZHRoID0gK2dldENvbXB1dGVkU3R5bGUodGhpcy5ob3N0UmVmLm5hdGl2ZUVsZW1lbnQpLm1pbldpZHRoLnJlcGxhY2UoJ3B4JywgJycpIHx8IDA7XG4gICAgdGhpcy5taW5IZWlnaHQgPSArZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmhvc3RSZWYubmF0aXZlRWxlbWVudCkubWluSGVpZ2h0LnJlcGxhY2UoJ3B4JywgJycpIHx8IDA7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhcnRSZXNpemUoc2lkZTogU2lkZSwgZXZlbnQ6IEV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5yZXNpemVTaWRlID0gc2lkZTtcbiAgICB0aGlzLm1vZGVsLnJlc2l6aW5nLnNldCh0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNpemUoZXZlbnQ6IFBvaW50ZXJFdmVudCkge1xuICAgIGlmICghdGhpcy5yZXNpemVTaWRlKSByZXR1cm47XG4gICAgaWYgKHRoaXMuaXNSZXNpemVDb25zdHJhaW5lZChldmVudCkpIHJldHVybjtcblxuICAgIGNvbnN0IG9mZnNldCA9IGNhbGNPZmZzZXQoZXZlbnQubW92ZW1lbnRYLCBldmVudC5tb3ZlbWVudFksIHRoaXMuem9vbSgpKTtcbiAgICBjb25zdCB7IHgsIHksIHdpZHRoLCBoZWlnaHQgfSA9IGNvbnN0cmFpblJlY3QoXG4gICAgICBhcHBseVJlc2l6ZSh0aGlzLnJlc2l6ZVNpZGUsIHRoaXMubW9kZWwsIG9mZnNldCksXG4gICAgICB0aGlzLm1vZGVsLFxuICAgICAgdGhpcy5yZXNpemVTaWRlLFxuICAgICAgdGhpcy5taW5XaWR0aCxcbiAgICAgIHRoaXMubWluSGVpZ2h0LFxuICAgICk7XG5cbiAgICB0aGlzLm1vZGVsLnNldFBvaW50KHsgeCwgeSB9KTtcbiAgICB0aGlzLm1vZGVsLndpZHRoLnNldCh3aWR0aCk7XG4gICAgdGhpcy5tb2RlbC5oZWlnaHQuc2V0KGhlaWdodCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZW5kUmVzaXplKCkge1xuICAgIHRoaXMucmVzaXplU2lkZSA9IG51bGw7XG4gICAgdGhpcy5tb2RlbC5yZXNpemluZy5zZXQoZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1Jlc2l6ZUNvbnN0cmFpbmVkKHsgeCwgeSwgbW92ZW1lbnRYLCBtb3ZlbWVudFkgfTogUG9pbnRlckV2ZW50KTogYm9vbGVhbiB7XG4gICAgY29uc3QgZmxvd1BvaW50ID0gdGhpcy5zcGFjZVBvaW50Q29udGV4dC5kb2N1bWVudFBvaW50VG9GbG93UG9pbnQoeyB4LCB5IH0pO1xuXG4gICAgaWYgKHRoaXMucmVzaXplU2lkZT8uaW5jbHVkZXMoJ3JpZ2h0JykpIHtcbiAgICAgIGlmIChtb3ZlbWVudFggPiAwICYmIGZsb3dQb2ludC54IDwgdGhpcy5tb2RlbC5wb2ludCgpLnggKyB0aGlzLm1vZGVsLnNpemUoKS53aWR0aCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1vdmVtZW50WCA8IDAgJiYgZmxvd1BvaW50LnggPiB0aGlzLm1vZGVsLnBvaW50KCkueCArIHRoaXMubW9kZWwuc2l6ZSgpLndpZHRoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLnJlc2l6ZVNpZGU/LmluY2x1ZGVzKCdsZWZ0JykpIHtcbiAgICAgIGlmIChtb3ZlbWVudFggPCAwICYmIGZsb3dQb2ludC54ID4gdGhpcy5tb2RlbC5wb2ludCgpLngpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChtb3ZlbWVudFggPiAwICYmIGZsb3dQb2ludC54IDwgdGhpcy5tb2RlbC5wb2ludCgpLngpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVzaXplU2lkZT8uaW5jbHVkZXMoJ2JvdHRvbScpKSB7XG4gICAgICBpZiAobW92ZW1lbnRZID4gMCAmJiBmbG93UG9pbnQueSA8IHRoaXMubW9kZWwucG9pbnQoKS55ICsgdGhpcy5tb2RlbC5zaXplKCkuaGVpZ2h0KSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAobW92ZW1lbnRZIDwgMCAmJiBmbG93UG9pbnQueSA+IHRoaXMubW9kZWwucG9pbnQoKS55ICsgdGhpcy5tb2RlbC5zaXplKCkuaGVpZ2h0KSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLnJlc2l6ZVNpZGU/LmluY2x1ZGVzKCd0b3AnKSkge1xuICAgICAgaWYgKG1vdmVtZW50WSA8IDAgJiYgZmxvd1BvaW50LnkgPiB0aGlzLm1vZGVsLnBvaW50KCkueSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1vdmVtZW50WSA+IDAgJiYgZmxvd1BvaW50LnkgPCB0aGlzLm1vZGVsLnBvaW50KCkueSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2FsY09mZnNldChtb3ZlbWVudFg6IG51bWJlciwgbW92ZW1lbnRZOiBudW1iZXIsIHpvb206IG51bWJlcikge1xuICByZXR1cm4ge1xuICAgIG9mZnNldFg6IHJvdW5kKG1vdmVtZW50WCAvIHpvb20pLFxuICAgIG9mZnNldFk6IHJvdW5kKG1vdmVtZW50WSAvIHpvb20pLFxuICB9O1xufVxuXG5mdW5jdGlvbiBhcHBseVJlc2l6ZShzaWRlOiBTaWRlLCBtb2RlbDogTm9kZU1vZGVsLCBvZmZzZXQ6IHsgb2Zmc2V0WDogbnVtYmVyOyBvZmZzZXRZOiBudW1iZXIgfSk6IFJlY3Qge1xuICBjb25zdCB7IG9mZnNldFgsIG9mZnNldFkgfSA9IG9mZnNldDtcbiAgY29uc3QgeyB4LCB5IH0gPSBtb2RlbC5wb2ludCgpO1xuICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IG1vZGVsLnNpemUoKTtcblxuICAvLyBIYW5kbGUgZWFjaCBjYXNlIG9mIHJlc2l6aW5nICh0b3AsIGJvdHRvbSwgbGVmdCwgcmlnaHQsIGNvcm5lcnMpXG4gIHN3aXRjaCAoc2lkZSkge1xuICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgcmV0dXJuIHsgeDogeCArIG9mZnNldFgsIHksIHdpZHRoOiB3aWR0aCAtIG9mZnNldFgsIGhlaWdodCB9O1xuICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgIHJldHVybiB7IHgsIHksIHdpZHRoOiB3aWR0aCArIG9mZnNldFgsIGhlaWdodCB9O1xuICAgIGNhc2UgJ3RvcCc6XG4gICAgICByZXR1cm4geyB4LCB5OiB5ICsgb2Zmc2V0WSwgd2lkdGgsIGhlaWdodDogaGVpZ2h0IC0gb2Zmc2V0WSB9O1xuICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICByZXR1cm4geyB4LCB5LCB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQgKyBvZmZzZXRZIH07XG4gICAgY2FzZSAndG9wLWxlZnQnOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogeCArIG9mZnNldFgsXG4gICAgICAgIHk6IHkgKyBvZmZzZXRZLFxuICAgICAgICB3aWR0aDogd2lkdGggLSBvZmZzZXRYLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodCAtIG9mZnNldFksXG4gICAgICB9O1xuICAgIGNhc2UgJ3RvcC1yaWdodCc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4LFxuICAgICAgICB5OiB5ICsgb2Zmc2V0WSxcbiAgICAgICAgd2lkdGg6IHdpZHRoICsgb2Zmc2V0WCxcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHQgLSBvZmZzZXRZLFxuICAgICAgfTtcbiAgICBjYXNlICdib3R0b20tbGVmdCc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4OiB4ICsgb2Zmc2V0WCxcbiAgICAgICAgeSxcbiAgICAgICAgd2lkdGg6IHdpZHRoIC0gb2Zmc2V0WCxcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHQgKyBvZmZzZXRZLFxuICAgICAgfTtcbiAgICBjYXNlICdib3R0b20tcmlnaHQnOlxuICAgICAgcmV0dXJuIHsgeCwgeSwgd2lkdGg6IHdpZHRoICsgb2Zmc2V0WCwgaGVpZ2h0OiBoZWlnaHQgKyBvZmZzZXRZIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gY29uc3RyYWluUmVjdChyZWN0OiBSZWN0LCBtb2RlbDogTm9kZU1vZGVsLCBzaWRlOiBTaWRlLCBtaW5XaWR0aDogbnVtYmVyLCBtaW5IZWlnaHQ6IG51bWJlcikge1xuICBsZXQgeyB4LCB5LCB3aWR0aCwgaGVpZ2h0IH0gPSByZWN0O1xuXG4gIC8vIDEuIFByZXZlbnQgbmVnYXRpdmUgZGltZW5zaW9uc1xuICB3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCAwKTtcbiAgaGVpZ2h0ID0gTWF0aC5tYXgoaGVpZ2h0LCAwKTtcblxuICAvLyAyLiBBcHBseSBtaW5pbXVtIHNpemUgY29uc3RyYWludHNcbiAgd2lkdGggPSBNYXRoLm1heChtaW5XaWR0aCwgd2lkdGgpO1xuICBoZWlnaHQgPSBNYXRoLm1heChtaW5IZWlnaHQsIGhlaWdodCk7XG5cbiAgLy8gQXBwbHkgbGVmdC90b3AgY29uc3RyYWludHMgYmFzZWQgb24gbWluaW11bSBzaXplXG4gIHggPSBNYXRoLm1pbih4LCBtb2RlbC5wb2ludCgpLnggKyBtb2RlbC5zaXplKCkud2lkdGggLSBtaW5XaWR0aCk7XG4gIHkgPSBNYXRoLm1pbih5LCBtb2RlbC5wb2ludCgpLnkgKyBtb2RlbC5zaXplKCkuaGVpZ2h0IC0gbWluSGVpZ2h0KTtcblxuICBjb25zdCBwYXJlbnQgPSBtb2RlbC5wYXJlbnQoKTtcbiAgLy8gMy4gQXBwbHkgbWF4aW11bSBzaXplIGNvbnN0cmFpbnRzIGJhc2VkIG9uIHBhcmVudCBzaXplIChpZiBleGlzdHMpXG4gIGlmIChwYXJlbnQpIHtcbiAgICB4ID0gTWF0aC5tYXgoeCwgMCk7IC8vIExlZnQgYm91bmRhcnkgb2YgdGhlIHBhcmVudFxuICAgIHkgPSBNYXRoLm1heCh5LCAwKTsgLy8gVG9wIGJvdW5kYXJ5IG9mIHRoZSBwYXJlbnRcblxuICAgIGlmICh4ID09PSAwKSB7XG4gICAgICB3aWR0aCA9IG1vZGVsLnBvaW50KCkueCArIG1vZGVsLnNpemUoKS53aWR0aDtcbiAgICB9XG5cbiAgICBpZiAoeSA9PT0gMCkge1xuICAgICAgaGVpZ2h0ID0gbW9kZWwucG9pbnQoKS55ICsgbW9kZWwuc2l6ZSgpLmhlaWdodDtcbiAgICB9XG5cbiAgICB3aWR0aCA9IE1hdGgubWluKHdpZHRoLCBwYXJlbnQuc2l6ZSgpLndpZHRoIC0gbW9kZWwucG9pbnQoKS54KTtcbiAgICBoZWlnaHQgPSBNYXRoLm1pbihoZWlnaHQsIHBhcmVudC5zaXplKCkuaGVpZ2h0IC0gbW9kZWwucG9pbnQoKS55KTtcbiAgfVxuXG4gIGNvbnN0IGJvdW5kcyA9IGdldE5vZGVzQm91bmRzKG1vZGVsLmNoaWxkcmVuKCkpO1xuICAvLyA0LiBBcHBseSBjaGlsZCBub2RlIGNvbnN0cmFpbnRzIChpZiBjaGlsZHJlbiBleGlzdClcbiAgaWYgKGJvdW5kcykge1xuICAgIGlmIChzaWRlLmluY2x1ZGVzKCdsZWZ0JykpIHtcbiAgICAgIHggPSBNYXRoLm1pbih4LCBtb2RlbC5wb2ludCgpLnggKyBtb2RlbC5zaXplKCkud2lkdGggLSAoYm91bmRzLnggKyBib3VuZHMud2lkdGgpKTtcbiAgICAgIHdpZHRoID0gTWF0aC5tYXgod2lkdGgsIGJvdW5kcy54ICsgYm91bmRzLndpZHRoKTtcbiAgICB9XG5cbiAgICBpZiAoc2lkZS5pbmNsdWRlcygncmlnaHQnKSkge1xuICAgICAgd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgYm91bmRzLnggKyBib3VuZHMud2lkdGgpO1xuICAgIH1cblxuICAgIGlmIChzaWRlLmluY2x1ZGVzKCdib3R0b20nKSkge1xuICAgICAgaGVpZ2h0ID0gTWF0aC5tYXgoaGVpZ2h0LCBib3VuZHMueSArIGJvdW5kcy5oZWlnaHQpO1xuICAgIH1cblxuICAgIGlmIChzaWRlLmluY2x1ZGVzKCd0b3AnKSkge1xuICAgICAgeSA9IE1hdGgubWluKHksIG1vZGVsLnBvaW50KCkueSArIG1vZGVsLnNpemUoKS5oZWlnaHQgLSAoYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0KSk7XG4gICAgICBoZWlnaHQgPSBNYXRoLm1heChoZWlnaHQsIGJvdW5kcy55ICsgYm91bmRzLmhlaWdodCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB4LFxuICAgIHksXG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICB9O1xufVxuIiwiPG5nLXRlbXBsYXRlICNyZXNpemVyPlxuICA8c3ZnOmc+XG4gICAgPCEtLSB0b3AgbGluZSAtLT5cbiAgICA8c3ZnOmxpbmVcbiAgICAgIGNsYXNzPVwidG9wXCJcbiAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxuICAgICAgW2F0dHIueDFdPVwibGluZUdhcFwiXG4gICAgICBbYXR0ci55MV09XCItZ2FwKClcIlxuICAgICAgW2F0dHIueDJdPVwibW9kZWwuc2l6ZSgpLndpZHRoIC0gbGluZUdhcFwiXG4gICAgICBbYXR0ci55Ml09XCItZ2FwKClcIlxuICAgICAgW2F0dHIuc3Ryb2tlXT1cInJlc2l6ZXJDb2xvcigpXCJcbiAgICAgIChwb2ludGVyU3RhcnQpPVwic3RhcnRSZXNpemUoJ3RvcCcsICRldmVudClcIiAvPlxuICAgIDwhLS0gTGVmdCBsaW5lIC0tPlxuICAgIDxzdmc6bGluZVxuICAgICAgY2xhc3M9XCJsZWZ0XCJcbiAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxuICAgICAgW2F0dHIueDFdPVwiLWdhcCgpXCJcbiAgICAgIFthdHRyLnkxXT1cImxpbmVHYXBcIlxuICAgICAgW2F0dHIueDJdPVwiLWdhcCgpXCJcbiAgICAgIFthdHRyLnkyXT1cIm1vZGVsLnNpemUoKS5oZWlnaHQgLSBsaW5lR2FwXCJcbiAgICAgIFthdHRyLnN0cm9rZV09XCJyZXNpemVyQ29sb3IoKVwiXG4gICAgICAocG9pbnRlclN0YXJ0KT1cInN0YXJ0UmVzaXplKCdsZWZ0JywgJGV2ZW50KVwiIC8+XG4gICAgPCEtLSBCb3R0b20gbGluZSAtLT5cbiAgICA8c3ZnOmxpbmVcbiAgICAgIGNsYXNzPVwiYm90dG9tXCJcbiAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxuICAgICAgW2F0dHIueDFdPVwibGluZUdhcFwiXG4gICAgICBbYXR0ci55MV09XCJtb2RlbC5zaXplKCkuaGVpZ2h0ICsgZ2FwKClcIlxuICAgICAgW2F0dHIueDJdPVwibW9kZWwuc2l6ZSgpLndpZHRoIC0gbGluZUdhcFwiXG4gICAgICBbYXR0ci55Ml09XCJtb2RlbC5zaXplKCkuaGVpZ2h0ICsgZ2FwKClcIlxuICAgICAgW2F0dHIuc3Ryb2tlXT1cInJlc2l6ZXJDb2xvcigpXCJcbiAgICAgIChwb2ludGVyU3RhcnQpPVwic3RhcnRSZXNpemUoJ2JvdHRvbScsICRldmVudClcIiAvPlxuICAgIDwhLS0gUmlnaHQgbGluZSAtLT5cbiAgICA8c3ZnOmxpbmVcbiAgICAgIGNsYXNzPVwicmlnaHRcIlxuICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXG4gICAgICBbYXR0ci54MV09XCJtb2RlbC5zaXplKCkud2lkdGggKyBnYXAoKVwiXG4gICAgICBbYXR0ci55MV09XCJsaW5lR2FwXCJcbiAgICAgIFthdHRyLngyXT1cIm1vZGVsLnNpemUoKS53aWR0aCArIGdhcCgpXCJcbiAgICAgIFthdHRyLnkyXT1cIm1vZGVsLnNpemUoKS5oZWlnaHQgLSBsaW5lR2FwXCJcbiAgICAgIFthdHRyLnN0cm9rZV09XCJyZXNpemVyQ29sb3IoKVwiXG4gICAgICAocG9pbnRlclN0YXJ0KT1cInN0YXJ0UmVzaXplKCdyaWdodCcsICRldmVudClcIiAvPlxuXG4gICAgPCEtLSBUb3AgTGVmdCAtLT5cbiAgICA8c3ZnOnJlY3RcbiAgICAgIGNsYXNzPVwidG9wLWxlZnRcIlxuICAgICAgW2F0dHIueF09XCItKGhhbmRsZVNpemUgLyAyKSAtIGdhcCgpXCJcbiAgICAgIFthdHRyLnldPVwiLShoYW5kbGVTaXplIC8gMikgLSBnYXAoKVwiXG4gICAgICBbYXR0ci53aWR0aF09XCJoYW5kbGVTaXplXCJcbiAgICAgIFthdHRyLmhlaWdodF09XCJoYW5kbGVTaXplXCJcbiAgICAgIFthdHRyLmZpbGxdPVwicmVzaXplckNvbG9yKClcIlxuICAgICAgKHBvaW50ZXJTdGFydCk9XCJzdGFydFJlc2l6ZSgndG9wLWxlZnQnLCAkZXZlbnQpXCIgLz5cblxuICAgIDwhLS0gVG9wIHJpZ2h0IC0tPlxuICAgIDxzdmc6cmVjdFxuICAgICAgY2xhc3M9XCJ0b3AtcmlnaHRcIlxuICAgICAgW2F0dHIueF09XCJtb2RlbC5zaXplKCkud2lkdGggLSBoYW5kbGVTaXplIC8gMiArIGdhcCgpXCJcbiAgICAgIFthdHRyLnldPVwiLShoYW5kbGVTaXplIC8gMikgLSBnYXAoKVwiXG4gICAgICBbYXR0ci53aWR0aF09XCJoYW5kbGVTaXplXCJcbiAgICAgIFthdHRyLmhlaWdodF09XCJoYW5kbGVTaXplXCJcbiAgICAgIFthdHRyLmZpbGxdPVwicmVzaXplckNvbG9yKClcIlxuICAgICAgKHBvaW50ZXJTdGFydCk9XCJzdGFydFJlc2l6ZSgndG9wLXJpZ2h0JywgJGV2ZW50KVwiIC8+XG5cbiAgICA8IS0tIEJvdHRvbSBsZWZ0IC0tPlxuICAgIDxzdmc6cmVjdFxuICAgICAgY2xhc3M9XCJib3R0b20tbGVmdFwiXG4gICAgICBbYXR0ci54XT1cIi0oaGFuZGxlU2l6ZSAvIDIpIC0gZ2FwKClcIlxuICAgICAgW2F0dHIueV09XCJtb2RlbC5zaXplKCkuaGVpZ2h0IC0gaGFuZGxlU2l6ZSAvIDIgKyBnYXAoKVwiXG4gICAgICBbYXR0ci53aWR0aF09XCJoYW5kbGVTaXplXCJcbiAgICAgIFthdHRyLmhlaWdodF09XCJoYW5kbGVTaXplXCJcbiAgICAgIFthdHRyLmZpbGxdPVwicmVzaXplckNvbG9yKClcIlxuICAgICAgKHBvaW50ZXJTdGFydCk9XCJzdGFydFJlc2l6ZSgnYm90dG9tLWxlZnQnLCAkZXZlbnQpXCIgLz5cblxuICAgIDwhLS0gQm90dG9tIHJpZ2h0IC0tPlxuICAgIDxzdmc6cmVjdFxuICAgICAgY2xhc3M9XCJib3R0b20tcmlnaHRcIlxuICAgICAgW2F0dHIueF09XCJtb2RlbC5zaXplKCkud2lkdGggLSBoYW5kbGVTaXplIC8gMiArIGdhcCgpXCJcbiAgICAgIFthdHRyLnldPVwibW9kZWwuc2l6ZSgpLmhlaWdodCAtIGhhbmRsZVNpemUgLyAyICsgZ2FwKClcIlxuICAgICAgW2F0dHIud2lkdGhdPVwiaGFuZGxlU2l6ZVwiXG4gICAgICBbYXR0ci5oZWlnaHRdPVwiaGFuZGxlU2l6ZVwiXG4gICAgICBbYXR0ci5maWxsXT1cInJlc2l6ZXJDb2xvcigpXCJcbiAgICAgIChwb2ludGVyU3RhcnQpPVwic3RhcnRSZXNpemUoJ2JvdHRvbS1yaWdodCcsICRldmVudClcIiAvPlxuICA8L3N2ZzpnPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLWNvbnRlbnQgLz5cbiJdfQ==
|
|
199
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXphYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC12Zmxvdy1saWIvc3JjL2xpYi92Zmxvdy9wdWJsaWMtY29tcG9uZW50cy9yZXNpemFibGUvcmVzaXphYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC12Zmxvdy1saWIvc3JjL2xpYi92Zmxvdy9wdWJsaWMtY29tcG9uZW50cy9yZXNpemFibGUvcmVzaXphYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBRUwsU0FBUyxFQUNULFFBQVEsRUFDUixVQUFVLEVBQ1YsTUFBTSxFQUdOLEtBQUssRUFDTCxTQUFTLEVBQ1QsTUFBTSxFQUNOLHVCQUF1QixHQUN4QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNuQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbEUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFJM0UsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDNUYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7O0FBbUJ0RSxNQUFNLE9BQU8s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QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29tcG9uZW50LFxuICBjb21wdXRlZCxcbiAgRWxlbWVudFJlZixcbiAgaW5qZWN0LFxuICBPbkluaXQsXG4gIFRlbXBsYXRlUmVmLFxuICBpbnB1dCxcbiAgdmlld0NoaWxkLFxuICBlZmZlY3QsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvb3RQb2ludGVyRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9yb290LXBvaW50ZXIuZGlyZWN0aXZlJztcbmltcG9ydCB7IGZpbHRlciwgdGFwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBWaWV3cG9ydFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy92aWV3cG9ydC5zZXJ2aWNlJztcbmltcG9ydCB7IHJvdW5kIH0gZnJvbSAnLi4vLi4vdXRpbHMvcm91bmQnO1xuaW1wb3J0IHsgTWljcm90YXNrIH0gZnJvbSAnLi4vLi4vZGVjb3JhdG9ycy9taWNyb3Rhc2suZGVjb3JhdG9yJztcbmltcG9ydCB7IGdldE5vZGVzQm91bmRzIH0gZnJvbSAnLi4vLi4vdXRpbHMvbm9kZXMnO1xuaW1wb3J0IHsgTm9kZUFjY2Vzc29yU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL25vZGUtYWNjZXNzb3Iuc2VydmljZSc7XG5pbXBvcnQgeyBOb2RlTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvbm9kZS5tb2RlbCc7XG5pbXBvcnQgeyBSZWN0IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZWN0JztcbmltcG9ydCB7IFBvaW50ZXJFdmVudCB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvcm9vdC1wb2ludGVyLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBTcGFjZVBvaW50Q29udGV4dERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvc3BhY2UtcG9pbnQtY29udGV4dC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgUG9pbnRlckRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvcG9pbnRlci5kaXJlY3RpdmUnO1xuXG50eXBlIFNpZGUgPSAndG9wJyB8ICdyaWdodCcgfCAnYm90dG9tJyB8ICdsZWZ0JyB8ICd0b3AtcmlnaHQnIHwgJ3RvcC1sZWZ0JyB8ICdib3R0b20tcmlnaHQnIHwgJ2JvdHRvbS1sZWZ0JztcblxuaW50ZXJmYWNlIERpc3RhbmNlVG9FZGdlIHtcbiAgbGVmdDogbnVtYmVyO1xuICByaWdodDogbnVtYmVyO1xuICB0b3A6IG51bWJlcjtcbiAgYm90dG9tOiBudW1iZXI7XG59XG5cbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzZWxlY3RvcjogJ1tyZXNpemFibGVdJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3Jlc2l6YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3Jlc2l6YWJsZS5jb21wb25lbnQuc2NzcyddLFxuICBpbXBvcnRzOiBbUG9pbnRlckRpcmVjdGl2ZV0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBSZXNpemFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQge1xuICBwcml2YXRlIG5vZGVBY2Nlc3NvciA9IGluamVjdChOb2RlQWNjZXNzb3JTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByb290UG9pbnRlciA9IGluamVjdChSb290UG9pbnRlckRpcmVjdGl2ZSk7XG4gIHByaXZhdGUgdmlld3BvcnRTZXJ2aWNlID0gaW5qZWN0KFZpZXdwb3J0U2VydmljZSk7XG4gIHByaXZhdGUgc3BhY2VQb2ludENvbnRleHQgPSBpbmplY3QoU3BhY2VQb2ludENvbnRleHREaXJlY3RpdmUpO1xuICBwcml2YXRlIGhvc3RSZWYgPSBpbmplY3Q8RWxlbWVudFJlZjxFbGVtZW50Pj4oRWxlbWVudFJlZik7XG5cbiAgcHVibGljIHJlc2l6YWJsZSA9IGlucHV0PGJvb2xlYW4gfCAnJz4oKTtcblxuICBwdWJsaWMgcmVzaXplckNvbG9yID0gaW5wdXQoJyMyZTQxNGMnKTtcblxuICBwdWJsaWMgZ2FwID0gaW5wdXQoMS41KTtcblxuICBwcml2YXRlIHJlc2l6ZXIgPSB2aWV3Q2hpbGQucmVxdWlyZWQ8VGVtcGxhdGVSZWY8dW5rbm93bj4+KCdyZXNpemVyJyk7XG5cbiAgcHJvdGVjdGVkIGdldCBtb2RlbCgpIHtcbiAgICByZXR1cm4gdGhpcy5ub2RlQWNjZXNzb3IubW9kZWwoKSE7XG4gIH1cblxuICBwcm90ZWN0ZWQgbGluZUdhcCA9IDM7XG4gIHByb3RlY3RlZCBoYW5kbGVTaXplID0gNjtcblxuICBwcml2YXRlIHJlc2l6ZVNpZGU6IFNpZGUgfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIHpvb20gPSBjb21wdXRlZCgoKSA9PiB0aGlzLnZpZXdwb3J0U2VydmljZS5yZWFkYWJsZVZpZXdwb3J0KCkuem9vbSA/PyAwKTtcblxuICBwcml2YXRlIG1pbldpZHRoID0gMDtcbiAgcHJpdmF0ZSBtaW5IZWlnaHQgPSAwO1xuXG4gIC8vIFRPRE86IGFsbG93IHJlc3ppZSBiZXNpZGUgdGhlIGZsb3dcbiAgcHJvdGVjdGVkIHJlc2l6ZU9uR2xvYmFsTW91c2VNb3ZlID0gdGhpcy5yb290UG9pbnRlci5wb2ludGVyTW92ZW1lbnQkXG4gICAgLnBpcGUoXG4gICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5yZXNpemVTaWRlICE9PSBudWxsKSxcbiAgICAgIGZpbHRlcigoZXZlbnQpID0+IGV2ZW50Lm1vdmVtZW50WCAhPT0gMCB8fCBldmVudC5tb3ZlbWVudFkgIT09IDApLFxuICAgICAgdGFwKChldmVudCkgPT4gdGhpcy5yZXNpemUoZXZlbnQpKSxcbiAgICAgIHRha2VVbnRpbERlc3Ryb3llZCgpLFxuICAgIClcbiAgICAuc3Vic2NyaWJlKCk7XG5cbiAgcHJvdGVjdGVkIGVuZFJlc2l6ZU9uR2xvYmFsTW91c2VVcCA9IHRoaXMucm9vdFBvaW50ZXIuZG9jdW1lbnRQb2ludGVyRW5kJFxuICAgIC5waXBlKFxuICAgICAgdGFwKCgpID0+IHRoaXMuZW5kUmVzaXplKCkpLFxuICAgICAgdGFrZVVudGlsRGVzdHJveWVkKCksXG4gICAgKVxuICAgIC5zdWJzY3JpYmUoKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBlZmZlY3QoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc2l6YWJsZSA9IHRoaXMucmVzaXphYmxlKCk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiByZXNpemFibGUgPT09ICdib29sZWFuJykge1xuICAgICAgICAgIHRoaXMubW9kZWwucmVzaXphYmxlLnNldChyZXNpemFibGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMubW9kZWwucmVzaXphYmxlLnNldCh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMubW9kZWwucmVzaXplclRlbXBsYXRlLnNldCh0aGlzLnJlc2l6ZXIoKSk7XG4gIH1cblxuICBATWljcm90YXNrXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5taW5XaWR0aCA9ICtnZXRDb21wdXRlZFN0eWxlKHRoaXMuaG9zdFJlZi5uYXRpdmVFbGVtZW50KS5taW5XaWR0aC5yZXBsYWNlKCdweCcsICcnKSB8fCAwO1xuICAgIHRoaXMubWluSGVpZ2h0ID0gK2dldENvbXB1dGVkU3R5bGUodGhpcy5ob3N0UmVmLm5hdGl2ZUVsZW1lbnQpLm1pbkhlaWdodC5yZXBsYWNlKCdweCcsICcnKSB8fCAwO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXJ0UmVzaXplKHNpZGU6IFNpZGUsIGV2ZW50OiBFdmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMucmVzaXplU2lkZSA9IHNpZGU7XG4gICAgdGhpcy5tb2RlbC5yZXNpemluZy5zZXQodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVzaXplKGV2ZW50OiBQb2ludGVyRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMucmVzaXplU2lkZSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2Zmc2V0ID0gY2FsY09mZnNldChldmVudC5tb3ZlbWVudFgsIGV2ZW50Lm1vdmVtZW50WSwgdGhpcy56b29tKCkpO1xuXG4gICAgY29uc3QgcmVzaXplZCA9IGFwcGx5UmVzaXplKHRoaXMucmVzaXplU2lkZSwgdGhpcy5tb2RlbCwgb2Zmc2V0LCB0aGlzLmdldERpc3RhbmNlVG9FZGdlKGV2ZW50KSk7XG5cbiAgICBjb25zdCB7IHgsIHksIHdpZHRoLCBoZWlnaHQgfSA9IGNvbnN0cmFpblJlY3QocmVzaXplZCwgdGhpcy5tb2RlbCwgdGhpcy5yZXNpemVTaWRlLCB0aGlzLm1pbldpZHRoLCB0aGlzLm1pbkhlaWdodCk7XG5cbiAgICB0aGlzLm1vZGVsLnNldFBvaW50KHsgeCwgeSB9KTtcbiAgICB0aGlzLm1vZGVsLndpZHRoLnNldCh3aWR0aCk7XG4gICAgdGhpcy5tb2RlbC5oZWlnaHQuc2V0KGhlaWdodCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZW5kUmVzaXplKCkge1xuICAgIHRoaXMucmVzaXplU2lkZSA9IG51bGw7XG4gICAgdGhpcy5tb2RlbC5yZXNpemluZy5zZXQoZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREaXN0YW5jZVRvRWRnZShldmVudDogUG9pbnRlckV2ZW50KTogRGlzdGFuY2VUb0VkZ2Uge1xuICAgIGNvbnN0IGZsb3dQb2ludCA9IHRoaXMuc3BhY2VQb2ludENvbnRleHQuZG9jdW1lbnRQb2ludFRvRmxvd1BvaW50KHsgeDogZXZlbnQueCwgeTogZXZlbnQueSB9KTtcbiAgICBjb25zdCB7IHgsIHkgfSA9IHRoaXMubW9kZWwuZ2xvYmFsUG9pbnQoKTtcblxuICAgIHJldHVybiB7XG4gICAgICBsZWZ0OiBmbG93UG9pbnQueCAtIHgsXG4gICAgICByaWdodDogZmxvd1BvaW50LnggLSAoeCArIHRoaXMubW9kZWwud2lkdGgoKSksXG4gICAgICB0b3A6IGZsb3dQb2ludC55IC0geSxcbiAgICAgIGJvdHRvbTogZmxvd1BvaW50LnkgLSAoeSArIHRoaXMubW9kZWwuaGVpZ2h0KCkpLFxuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gY2FsY09mZnNldChtb3ZlbWVudFg6IG51bWJlciwgbW92ZW1lbnRZOiBudW1iZXIsIHpvb206IG51bWJlcikge1xuICByZXR1cm4ge1xuICAgIG9mZnNldFg6IHJvdW5kKG1vdmVtZW50WCAvIHpvb20pLFxuICAgIG9mZnNldFk6IHJvdW5kKG1vdmVtZW50WSAvIHpvb20pLFxuICB9O1xufVxuXG5mdW5jdGlvbiBhcHBseVJlc2l6ZShcbiAgc2lkZTogU2lkZSxcbiAgbW9kZWw6IE5vZGVNb2RlbCxcbiAgb2Zmc2V0OiB7IG9mZnNldFg6IG51bWJlcjsgb2Zmc2V0WTogbnVtYmVyIH0sXG4gIGRpc3RhbmNlVG9FZGdlOiBEaXN0YW5jZVRvRWRnZSxcbik6IFJlY3Qge1xuICBjb25zdCB7IG9mZnNldFgsIG9mZnNldFkgfSA9IG9mZnNldDtcbiAgY29uc3QgeyB4LCB5IH0gPSBtb2RlbC5wb2ludCgpO1xuICBjb25zdCB3aWR0aCA9IG1vZGVsLndpZHRoKCk7XG4gIGNvbnN0IGhlaWdodCA9IG1vZGVsLmhlaWdodCgpO1xuXG4gIC8vIEhhbmRsZSBlYWNoIGNhc2Ugb2YgcmVzaXppbmcgKHRvcCwgYm90dG9tLCBsZWZ0LCByaWdodCwgY29ybmVycylcbiAgc3dpdGNoIChzaWRlKSB7XG4gICAgY2FzZSAnbGVmdCc6XG4gICAgICByZXR1cm4geyB4OiB4ICsgb2Zmc2V0WCArIGRpc3RhbmNlVG9FZGdlLmxlZnQsIHksIHdpZHRoOiB3aWR0aCAtIG9mZnNldFggLSBkaXN0YW5jZVRvRWRnZS5sZWZ0LCBoZWlnaHQgfTtcbiAgICBjYXNlICdyaWdodCc6XG4gICAgICByZXR1cm4geyB4LCB5LCB3aWR0aDogd2lkdGggKyBvZmZzZXRYICsgZGlzdGFuY2VUb0VkZ2UucmlnaHQsIGhlaWdodCB9O1xuICAgIGNhc2UgJ3RvcCc6XG4gICAgICByZXR1cm4geyB4LCB5OiB5ICsgb2Zmc2V0WSArIGRpc3RhbmNlVG9FZGdlLnRvcCwgd2lkdGgsIGhlaWdodDogaGVpZ2h0IC0gb2Zmc2V0WSAtIGRpc3RhbmNlVG9FZGdlLnRvcCB9O1xuICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICByZXR1cm4geyB4LCB5LCB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQgKyBvZmZzZXRZICsgZGlzdGFuY2VUb0VkZ2UuYm90dG9tIH07XG4gICAgY2FzZSAndG9wLWxlZnQnOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogeCArIG9mZnNldFggKyBkaXN0YW5jZVRvRWRnZS5sZWZ0LFxuICAgICAgICB5OiB5ICsgb2Zmc2V0WSArIGRpc3RhbmNlVG9FZGdlLnRvcCxcbiAgICAgICAgd2lkdGg6IHdpZHRoIC0gb2Zmc2V0WCAtIGRpc3RhbmNlVG9FZGdlLmxlZnQsXG4gICAgICAgIGhlaWdodDogaGVpZ2h0IC0gb2Zmc2V0WSAtIGRpc3RhbmNlVG9FZGdlLnRvcCxcbiAgICAgIH07XG4gICAgY2FzZSAndG9wLXJpZ2h0JzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHgsXG4gICAgICAgIHk6IHkgKyBvZmZzZXRZICsgZGlzdGFuY2VUb0VkZ2UudG9wLFxuICAgICAgICB3aWR0aDogd2lkdGggKyBvZmZzZXRYICsgZGlzdGFuY2VUb0VkZ2UucmlnaHQsXG4gICAgICAgIGhlaWdodDogaGVpZ2h0IC0gb2Zmc2V0WSAtIGRpc3RhbmNlVG9FZGdlLnRvcCxcbiAgICAgIH07XG4gICAgY2FzZSAnYm90dG9tLWxlZnQnOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogeCArIG9mZnNldFggKyBkaXN0YW5jZVRvRWRnZS5sZWZ0LFxuICAgICAgICB5LFxuICAgICAgICB3aWR0aDogd2lkdGggLSBvZmZzZXRYIC0gZGlzdGFuY2VUb0VkZ2UubGVmdCxcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHQgKyBvZmZzZXRZICsgZGlzdGFuY2VUb0VkZ2UuYm90dG9tLFxuICAgICAgfTtcbiAgICBjYXNlICdib3R0b20tcmlnaHQnOlxuICAgICAgcmV0dXJuIHsgeCwgeSwgd2lkdGg6IHdpZHRoICsgb2Zmc2V0WCArIGRpc3RhbmNlVG9FZGdlLnJpZ2h0LCBoZWlnaHQ6IGhlaWdodCArIG9mZnNldFkgKyBkaXN0YW5jZVRvRWRnZS5ib3R0b20gfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb25zdHJhaW5SZWN0KHJlY3Q6IFJlY3QsIG1vZGVsOiBOb2RlTW9kZWwsIHNpZGU6IFNpZGUsIG1pbldpZHRoOiBudW1iZXIsIG1pbkhlaWdodDogbnVtYmVyKSB7XG4gIGxldCB7IHgsIHksIHdpZHRoLCBoZWlnaHQgfSA9IHJlY3Q7XG5cbiAgLy8gMS4gUHJldmVudCBuZWdhdGl2ZSBkaW1lbnNpb25zXG4gIHdpZHRoID0gTWF0aC5tYXgod2lkdGgsIDApO1xuICBoZWlnaHQgPSBNYXRoLm1heChoZWlnaHQsIDApO1xuXG4gIC8vIDIuIEFwcGx5IG1pbmltdW0gc2l6ZSBjb25zdHJhaW50c1xuICB3aWR0aCA9IE1hdGgubWF4KG1pbldpZHRoLCB3aWR0aCk7XG4gIGhlaWdodCA9IE1hdGgubWF4KG1pbkhlaWdodCwgaGVpZ2h0KTtcblxuICAvLyBBcHBseSBsZWZ0L3RvcCBjb25zdHJhaW50cyBiYXNlZCBvbiBtaW5pbXVtIHNpemVcbiAgeCA9IE1hdGgubWluKHgsIG1vZGVsLnBvaW50KCkueCArIG1vZGVsLndpZHRoKCkgLSBtaW5XaWR0aCk7XG4gIHkgPSBNYXRoLm1pbih5LCBtb2RlbC5wb2ludCgpLnkgKyBtb2RlbC5oZWlnaHQoKSAtIG1pbkhlaWdodCk7XG5cbiAgY29uc3QgcGFyZW50ID0gbW9kZWwucGFyZW50KCk7XG4gIC8vIDMuIEFwcGx5IG1heGltdW0gc2l6ZSBjb25zdHJhaW50cyBiYXNlZCBvbiBwYXJlbnQgc2l6ZSAoaWYgZXhpc3RzKVxuICBpZiAocGFyZW50KSB7XG4gICAgY29uc3QgcGFyZW50V2lkdGggPSBwYXJlbnQud2lkdGgoKTtcbiAgICBjb25zdCBwYXJlbnRIZWlnaHQgPSBwYXJlbnQuaGVpZ2h0KCk7XG4gICAgY29uc3QgbW9kZWxYID0gbW9kZWwucG9pbnQoKS54O1xuICAgIGNvbnN0IG1vZGVsWSA9IG1vZGVsLnBvaW50KCkueTtcblxuICAgIHggPSBNYXRoLm1heCh4LCAwKTtcbiAgICB5ID0gTWF0aC5tYXgoeSwgMCk7XG5cbiAgICAvLyBTdG9wIHJlc2l6aW5nIHdoZW4gaGl0dGluZyBsZWZ0IG9yIHRvcCBib3VuZGFyeVxuICAgIGlmIChzaWRlLmluY2x1ZGVzKCdsZWZ0JykgJiYgeCA9PT0gMCkge1xuICAgICAgd2lkdGggPSBNYXRoLm1pbih3aWR0aCwgbW9kZWxYICsgbW9kZWwud2lkdGgoKSk7XG4gICAgfVxuICAgIGlmIChzaWRlLmluY2x1ZGVzKCd0b3AnKSAmJiB5ID09PSAwKSB7XG4gICAgICBoZWlnaHQgPSBNYXRoLm1pbihoZWlnaHQsIG1vZGVsWSArIG1vZGVsLmhlaWdodCgpKTtcbiAgICB9XG5cbiAgICAvLyBBbGxvdyByaWdodC9ib3R0b20gcmVzaXppbmcgd2l0aG91dCBiZWluZyBibG9ja2VkXG4gICAgd2lkdGggPSBNYXRoLm1pbih3aWR0aCwgcGFyZW50V2lkdGggLSB4KTtcbiAgICBoZWlnaHQgPSBNYXRoLm1pbihoZWlnaHQsIHBhcmVudEhlaWdodCAtIHkpO1xuICB9XG5cbiAgY29uc3QgYm91bmRzID0gZ2V0Tm9kZXNCb3VuZHMobW9kZWwuY2hpbGRyZW4oKSk7XG4gIC8vIDQuIEFwcGx5IGNoaWxkIG5vZGUgY29uc3RyYWludHMgKGlmIGNoaWxkcmVuIGV4aXN0KVxuICBpZiAoYm91bmRzKSB7XG4gICAgaWYgKHNpZGUuaW5jbHVkZXMoJ2xlZnQnKSkge1xuICAgICAgeCA9IE1hdGgubWluKHgsIG1vZGVsLnBvaW50KCkueCArIG1vZGVsLndpZHRoKCkgLSAoYm91bmRzLnggKyBib3VuZHMud2lkdGgpKTtcbiAgICAgIHdpZHRoID0gTWF0aC5tYXgod2lkdGgsIGJvdW5kcy54ICsgYm91bmRzLndpZHRoKTtcbiAgICB9XG5cbiAgICBpZiAoc2lkZS5pbmNsdWRlcygncmlnaHQnKSkge1xuICAgICAgd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgYm91bmRzLnggKyBib3VuZHMud2lkdGgpO1xuICAgIH1cblxuICAgIGlmIChzaWRlLmluY2x1ZGVzKCdib3R0b20nKSkge1xuICAgICAgaGVpZ2h0ID0gTWF0aC5tYXgoaGVpZ2h0LCBib3VuZHMueSArIGJvdW5kcy5oZWlnaHQpO1xuICAgIH1cblxuICAgIGlmIChzaWRlLmluY2x1ZGVzKCd0b3AnKSkge1xuICAgICAgeSA9IE1hdGgubWluKHksIG1vZGVsLnBvaW50KCkueSArIG1vZGVsLmhlaWdodCgpIC0gKGJvdW5kcy55ICsgYm91bmRzLmhlaWdodCkpO1xuICAgICAgaGVpZ2h0ID0gTWF0aC5tYXgoaGVpZ2h0LCBib3VuZHMueSArIGJvdW5kcy5oZWlnaHQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgeCxcbiAgICB5LFxuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgfTtcbn1cbiIsIjxuZy10ZW1wbGF0ZSAjcmVzaXplcj5cbiAgPHN2ZzpnPlxuICAgIDwhLS0gdG9wIGxpbmUgLS0+XG4gICAgPHN2ZzpsaW5lXG4gICAgICBjbGFzcz1cInRvcFwiXG4gICAgICBzdHJva2Utd2lkdGg9XCIyXCJcbiAgICAgIFthdHRyLngxXT1cImxpbmVHYXBcIlxuICAgICAgW2F0dHIueTFdPVwiLWdhcCgpXCJcbiAgICAgIFthdHRyLngyXT1cIm1vZGVsLnNpemUoKS53aWR0aCAtIGxpbmVHYXBcIlxuICAgICAgW2F0dHIueTJdPVwiLWdhcCgpXCJcbiAgICAgIFthdHRyLnN0cm9rZV09XCJyZXNpemVyQ29sb3IoKVwiXG4gICAgICAocG9pbnRlclN0YXJ0KT1cInN0YXJ0UmVzaXplKCd0b3AnLCAkZXZlbnQpXCIgLz5cbiAgICA8IS0tIExlZnQgbGluZSAtLT5cbiAgICA8c3ZnOmxpbmVcbiAgICAgIGNsYXNzPVwibGVmdFwiXG4gICAgICBzdHJva2Utd2lkdGg9XCIyXCJcbiAgICAgIFthdHRyLngxXT1cIi1nYXAoKVwiXG4gICAgICBbYXR0ci55MV09XCJsaW5lR2FwXCJcbiAgICAgIFthdHRyLngyXT1cIi1nYXAoKVwiXG4gICAgICBbYXR0ci55Ml09XCJtb2RlbC5zaXplKCkuaGVpZ2h0IC0gbGluZUdhcFwiXG4gICAgICBbYXR0ci5zdHJva2VdPVwicmVzaXplckNvbG9yKClcIlxuICAgICAgKHBvaW50ZXJTdGFydCk9XCJzdGFydFJlc2l6ZSgnbGVmdCcsICRldmVudClcIiAvPlxuICAgIDwhLS0gQm90dG9tIGxpbmUgLS0+XG4gICAgPHN2ZzpsaW5lXG4gICAgICBjbGFzcz1cImJvdHRvbVwiXG4gICAgICBzdHJva2Utd2lkdGg9XCIyXCJcbiAgICAgIFthdHRyLngxXT1cImxpbmVHYXBcIlxuICAgICAgW2F0dHIueTFdPVwibW9kZWwuc2l6ZSgpLmhlaWdodCArIGdhcCgpXCJcbiAgICAgIFthdHRyLngyXT1cIm1vZGVsLnNpemUoKS53aWR0aCAtIGxpbmVHYXBcIlxuICAgICAgW2F0dHIueTJdPVwibW9kZWwuc2l6ZSgpLmhlaWdodCArIGdhcCgpXCJcbiAgICAgIFthdHRyLnN0cm9rZV09XCJyZXNpemVyQ29sb3IoKVwiXG4gICAgICAocG9pbnRlclN0YXJ0KT1cInN0YXJ0UmVzaXplKCdib3R0b20nLCAkZXZlbnQpXCIgLz5cbiAgICA8IS0tIFJpZ2h0IGxpbmUgLS0+XG4gICAgPHN2ZzpsaW5lXG4gICAgICBjbGFzcz1cInJpZ2h0XCJcbiAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxuICAgICAgW2F0dHIueDFdPVwibW9kZWwuc2l6ZSgpLndpZHRoICsgZ2FwKClcIlxuICAgICAgW2F0dHIueTFdPVwibGluZUdhcFwiXG4gICAgICBbYXR0ci54Ml09XCJtb2RlbC5zaXplKCkud2lkdGggKyBnYXAoKVwiXG4gICAgICBbYXR0ci55Ml09XCJtb2RlbC5zaXplKCkuaGVpZ2h0IC0gbGluZUdhcFwiXG4gICAgICBbYXR0ci5zdHJva2VdPVwicmVzaXplckNvbG9yKClcIlxuICAgICAgKHBvaW50ZXJTdGFydCk9XCJzdGFydFJlc2l6ZSgncmlnaHQnLCAkZXZlbnQpXCIgLz5cblxuICAgIDwhLS0gVG9wIExlZnQgLS0+XG4gICAgPHN2ZzpyZWN0XG4gICAgICBjbGFzcz1cInRvcC1sZWZ0XCJcbiAgICAgIFthdHRyLnhdPVwiLShoYW5kbGVTaXplIC8gMikgLSBnYXAoKVwiXG4gICAgICBbYXR0ci55XT1cIi0oaGFuZGxlU2l6ZSAvIDIpIC0gZ2FwKClcIlxuICAgICAgW2F0dHIud2lkdGhdPVwiaGFuZGxlU2l6ZVwiXG4gICAgICBbYXR0ci5oZWlnaHRdPVwiaGFuZGxlU2l6ZVwiXG4gICAgICBbYXR0ci5maWxsXT1cInJlc2l6ZXJDb2xvcigpXCJcbiAgICAgIChwb2ludGVyU3RhcnQpPVwic3RhcnRSZXNpemUoJ3RvcC1sZWZ0JywgJGV2ZW50KVwiIC8+XG5cbiAgICA8IS0tIFRvcCByaWdodCAtLT5cbiAgICA8c3ZnOnJlY3RcbiAgICAgIGNsYXNzPVwidG9wLXJpZ2h0XCJcbiAgICAgIFthdHRyLnhdPVwibW9kZWwuc2l6ZSgpLndpZHRoIC0gaGFuZGxlU2l6ZSAvIDIgKyBnYXAoKVwiXG4gICAgICBbYXR0ci55XT1cIi0oaGFuZGxlU2l6ZSAvIDIpIC0gZ2FwKClcIlxuICAgICAgW2F0dHIud2lkdGhdPVwiaGFuZGxlU2l6ZVwiXG4gICAgICBbYXR0ci5oZWlnaHRdPVwiaGFuZGxlU2l6ZVwiXG4gICAgICBbYXR0ci5maWxsXT1cInJlc2l6ZXJDb2xvcigpXCJcbiAgICAgIChwb2ludGVyU3RhcnQpPVwic3RhcnRSZXNpemUoJ3RvcC1yaWdodCcsICRldmVudClcIiAvPlxuXG4gICAgPCEtLSBCb3R0b20gbGVmdCAtLT5cbiAgICA8c3ZnOnJlY3RcbiAgICAgIGNsYXNzPVwiYm90dG9tLWxlZnRcIlxuICAgICAgW2F0dHIueF09XCItKGhhbmRsZVNpemUgLyAyKSAtIGdhcCgpXCJcbiAgICAgIFthdHRyLnldPVwibW9kZWwuc2l6ZSgpLmhlaWdodCAtIGhhbmRsZVNpemUgLyAyICsgZ2FwKClcIlxuICAgICAgW2F0dHIud2lkdGhdPVwiaGFuZGxlU2l6ZVwiXG4gICAgICBbYXR0ci5oZWlnaHRdPVwiaGFuZGxlU2l6ZVwiXG4gICAgICBbYXR0ci5maWxsXT1cInJlc2l6ZXJDb2xvcigpXCJcbiAgICAgIChwb2ludGVyU3RhcnQpPVwic3RhcnRSZXNpemUoJ2JvdHRvbS1sZWZ0JywgJGV2ZW50KVwiIC8+XG5cbiAgICA8IS0tIEJvdHRvbSByaWdodCAtLT5cbiAgICA8c3ZnOnJlY3RcbiAgICAgIGNsYXNzPVwiYm90dG9tLXJpZ2h0XCJcbiAgICAgIFthdHRyLnhdPVwibW9kZWwuc2l6ZSgpLndpZHRoIC0gaGFuZGxlU2l6ZSAvIDIgKyBnYXAoKVwiXG4gICAgICBbYXR0ci55XT1cIm1vZGVsLnNpemUoKS5oZWlnaHQgLSBoYW5kbGVTaXplIC8gMiArIGdhcCgpXCJcbiAgICAgIFthdHRyLndpZHRoXT1cImhhbmRsZVNpemVcIlxuICAgICAgW2F0dHIuaGVpZ2h0XT1cImhhbmRsZVNpemVcIlxuICAgICAgW2F0dHIuZmlsbF09XCJyZXNpemVyQ29sb3IoKVwiXG4gICAgICAocG9pbnRlclN0YXJ0KT1cInN0YXJ0UmVzaXplKCdib3R0b20tcmlnaHQnLCAkZXZlbnQpXCIgLz5cbiAgPC9zdmc6Zz5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy1jb250ZW50IC8+XG4iXX0=
|
package/fesm2022/ngx-vflow.mjs
CHANGED
|
@@ -2243,10 +2243,9 @@ class ResizableComponent {
|
|
|
2243
2243
|
resize(event) {
|
|
2244
2244
|
if (!this.resizeSide)
|
|
2245
2245
|
return;
|
|
2246
|
-
if (this.isResizeConstrained(event))
|
|
2247
|
-
return;
|
|
2248
2246
|
const offset = calcOffset(event.movementX, event.movementY, this.zoom());
|
|
2249
|
-
const
|
|
2247
|
+
const resized = applyResize(this.resizeSide, this.model, offset, this.getDistanceToEdge(event));
|
|
2248
|
+
const { x, y, width, height } = constrainRect(resized, this.model, this.resizeSide, this.minWidth, this.minHeight);
|
|
2250
2249
|
this.model.setPoint({ x, y });
|
|
2251
2250
|
this.model.width.set(width);
|
|
2252
2251
|
this.model.height.set(height);
|
|
@@ -2255,41 +2254,15 @@ class ResizableComponent {
|
|
|
2255
2254
|
this.resizeSide = null;
|
|
2256
2255
|
this.model.resizing.set(false);
|
|
2257
2256
|
}
|
|
2258
|
-
|
|
2259
|
-
const flowPoint = this.spacePointContext.documentPointToFlowPoint({ x, y });
|
|
2260
|
-
|
|
2261
|
-
|
|
2262
|
-
|
|
2263
|
-
|
|
2264
|
-
|
|
2265
|
-
|
|
2266
|
-
|
|
2267
|
-
}
|
|
2268
|
-
if (this.resizeSide?.includes('left')) {
|
|
2269
|
-
if (movementX < 0 && flowPoint.x > this.model.point().x) {
|
|
2270
|
-
return true;
|
|
2271
|
-
}
|
|
2272
|
-
if (movementX > 0 && flowPoint.x < this.model.point().x) {
|
|
2273
|
-
return true;
|
|
2274
|
-
}
|
|
2275
|
-
}
|
|
2276
|
-
if (this.resizeSide?.includes('bottom')) {
|
|
2277
|
-
if (movementY > 0 && flowPoint.y < this.model.point().y + this.model.size().height) {
|
|
2278
|
-
return true;
|
|
2279
|
-
}
|
|
2280
|
-
if (movementY < 0 && flowPoint.y > this.model.point().y + this.model.size().height) {
|
|
2281
|
-
return true;
|
|
2282
|
-
}
|
|
2283
|
-
}
|
|
2284
|
-
if (this.resizeSide?.includes('top')) {
|
|
2285
|
-
if (movementY < 0 && flowPoint.y > this.model.point().y) {
|
|
2286
|
-
return true;
|
|
2287
|
-
}
|
|
2288
|
-
if (movementY > 0 && flowPoint.y < this.model.point().y) {
|
|
2289
|
-
return true;
|
|
2290
|
-
}
|
|
2291
|
-
}
|
|
2292
|
-
return false;
|
|
2257
|
+
getDistanceToEdge(event) {
|
|
2258
|
+
const flowPoint = this.spacePointContext.documentPointToFlowPoint({ x: event.x, y: event.y });
|
|
2259
|
+
const { x, y } = this.model.globalPoint();
|
|
2260
|
+
return {
|
|
2261
|
+
left: flowPoint.x - x,
|
|
2262
|
+
right: flowPoint.x - (x + this.model.width()),
|
|
2263
|
+
top: flowPoint.y - y,
|
|
2264
|
+
bottom: flowPoint.y - (y + this.model.height()),
|
|
2265
|
+
};
|
|
2293
2266
|
}
|
|
2294
2267
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ResizableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
2295
2268
|
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "17.3.12", type: ResizableComponent, isStandalone: true, selector: "[resizable]", inputs: { resizable: { classPropertyName: "resizable", publicName: "resizable", isSignal: true, isRequired: false, transformFunction: null }, resizerColor: { classPropertyName: "resizerColor", publicName: "resizerColor", isSignal: true, isRequired: false, transformFunction: null }, gap: { classPropertyName: "gap", publicName: "gap", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "resizer", first: true, predicate: ["resizer"], descendants: true, isSignal: true }], ngImport: i0, template: "<ng-template #resizer>\n <svg:g>\n <!-- top line -->\n <svg:line\n class=\"top\"\n stroke-width=\"2\"\n [attr.x1]=\"lineGap\"\n [attr.y1]=\"-gap()\"\n [attr.x2]=\"model.size().width - lineGap\"\n [attr.y2]=\"-gap()\"\n [attr.stroke]=\"resizerColor()\"\n (pointerStart)=\"startResize('top', $event)\" />\n <!-- Left line -->\n <svg:line\n class=\"left\"\n stroke-width=\"2\"\n [attr.x1]=\"-gap()\"\n [attr.y1]=\"lineGap\"\n [attr.x2]=\"-gap()\"\n [attr.y2]=\"model.size().height - lineGap\"\n [attr.stroke]=\"resizerColor()\"\n (pointerStart)=\"startResize('left', $event)\" />\n <!-- Bottom line -->\n <svg:line\n class=\"bottom\"\n stroke-width=\"2\"\n [attr.x1]=\"lineGap\"\n [attr.y1]=\"model.size().height + gap()\"\n [attr.x2]=\"model.size().width - lineGap\"\n [attr.y2]=\"model.size().height + gap()\"\n [attr.stroke]=\"resizerColor()\"\n (pointerStart)=\"startResize('bottom', $event)\" />\n <!-- Right line -->\n <svg:line\n class=\"right\"\n stroke-width=\"2\"\n [attr.x1]=\"model.size().width + gap()\"\n [attr.y1]=\"lineGap\"\n [attr.x2]=\"model.size().width + gap()\"\n [attr.y2]=\"model.size().height - lineGap\"\n [attr.stroke]=\"resizerColor()\"\n (pointerStart)=\"startResize('right', $event)\" />\n\n <!-- Top Left -->\n <svg:rect\n class=\"top-left\"\n [attr.x]=\"-(handleSize / 2) - gap()\"\n [attr.y]=\"-(handleSize / 2) - gap()\"\n [attr.width]=\"handleSize\"\n [attr.height]=\"handleSize\"\n [attr.fill]=\"resizerColor()\"\n (pointerStart)=\"startResize('top-left', $event)\" />\n\n <!-- Top right -->\n <svg:rect\n class=\"top-right\"\n [attr.x]=\"model.size().width - handleSize / 2 + gap()\"\n [attr.y]=\"-(handleSize / 2) - gap()\"\n [attr.width]=\"handleSize\"\n [attr.height]=\"handleSize\"\n [attr.fill]=\"resizerColor()\"\n (pointerStart)=\"startResize('top-right', $event)\" />\n\n <!-- Bottom left -->\n <svg:rect\n class=\"bottom-left\"\n [attr.x]=\"-(handleSize / 2) - gap()\"\n [attr.y]=\"model.size().height - handleSize / 2 + gap()\"\n [attr.width]=\"handleSize\"\n [attr.height]=\"handleSize\"\n [attr.fill]=\"resizerColor()\"\n (pointerStart)=\"startResize('bottom-left', $event)\" />\n\n <!-- Bottom right -->\n <svg:rect\n class=\"bottom-right\"\n [attr.x]=\"model.size().width - handleSize / 2 + gap()\"\n [attr.y]=\"model.size().height - handleSize / 2 + gap()\"\n [attr.width]=\"handleSize\"\n [attr.height]=\"handleSize\"\n [attr.fill]=\"resizerColor()\"\n (pointerStart)=\"startResize('bottom-right', $event)\" />\n </svg:g>\n</ng-template>\n\n<ng-content />\n", styles: [".top{cursor:n-resize}.left{cursor:w-resize}.right{cursor:e-resize}.bottom{cursor:s-resize}.top-left{cursor:nw-resize}.top-right{cursor:ne-resize}.bottom-left{cursor:sw-resize}.bottom-right{cursor:se-resize}\n"], dependencies: [{ kind: "directive", type: PointerDirective, selector: "[pointerStart], [pointerEnd], [pointerOver], [pointerOut]", outputs: ["pointerOver", "pointerOut", "pointerStart", "pointerEnd"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
@@ -2307,43 +2280,44 @@ function calcOffset(movementX, movementY, zoom) {
|
|
|
2307
2280
|
offsetY: round(movementY / zoom),
|
|
2308
2281
|
};
|
|
2309
2282
|
}
|
|
2310
|
-
function applyResize(side, model, offset) {
|
|
2283
|
+
function applyResize(side, model, offset, distanceToEdge) {
|
|
2311
2284
|
const { offsetX, offsetY } = offset;
|
|
2312
2285
|
const { x, y } = model.point();
|
|
2313
|
-
const
|
|
2286
|
+
const width = model.width();
|
|
2287
|
+
const height = model.height();
|
|
2314
2288
|
// Handle each case of resizing (top, bottom, left, right, corners)
|
|
2315
2289
|
switch (side) {
|
|
2316
2290
|
case 'left':
|
|
2317
|
-
return { x: x + offsetX, y, width: width - offsetX, height };
|
|
2291
|
+
return { x: x + offsetX + distanceToEdge.left, y, width: width - offsetX - distanceToEdge.left, height };
|
|
2318
2292
|
case 'right':
|
|
2319
|
-
return { x, y, width: width + offsetX, height };
|
|
2293
|
+
return { x, y, width: width + offsetX + distanceToEdge.right, height };
|
|
2320
2294
|
case 'top':
|
|
2321
|
-
return { x, y: y + offsetY, width, height: height - offsetY };
|
|
2295
|
+
return { x, y: y + offsetY + distanceToEdge.top, width, height: height - offsetY - distanceToEdge.top };
|
|
2322
2296
|
case 'bottom':
|
|
2323
|
-
return { x, y, width, height: height + offsetY };
|
|
2297
|
+
return { x, y, width, height: height + offsetY + distanceToEdge.bottom };
|
|
2324
2298
|
case 'top-left':
|
|
2325
2299
|
return {
|
|
2326
|
-
x: x + offsetX,
|
|
2327
|
-
y: y + offsetY,
|
|
2328
|
-
width: width - offsetX,
|
|
2329
|
-
height: height - offsetY,
|
|
2300
|
+
x: x + offsetX + distanceToEdge.left,
|
|
2301
|
+
y: y + offsetY + distanceToEdge.top,
|
|
2302
|
+
width: width - offsetX - distanceToEdge.left,
|
|
2303
|
+
height: height - offsetY - distanceToEdge.top,
|
|
2330
2304
|
};
|
|
2331
2305
|
case 'top-right':
|
|
2332
2306
|
return {
|
|
2333
2307
|
x,
|
|
2334
|
-
y: y + offsetY,
|
|
2335
|
-
width: width + offsetX,
|
|
2336
|
-
height: height - offsetY,
|
|
2308
|
+
y: y + offsetY + distanceToEdge.top,
|
|
2309
|
+
width: width + offsetX + distanceToEdge.right,
|
|
2310
|
+
height: height - offsetY - distanceToEdge.top,
|
|
2337
2311
|
};
|
|
2338
2312
|
case 'bottom-left':
|
|
2339
2313
|
return {
|
|
2340
|
-
x: x + offsetX,
|
|
2314
|
+
x: x + offsetX + distanceToEdge.left,
|
|
2341
2315
|
y,
|
|
2342
|
-
width: width - offsetX,
|
|
2343
|
-
height: height + offsetY,
|
|
2316
|
+
width: width - offsetX - distanceToEdge.left,
|
|
2317
|
+
height: height + offsetY + distanceToEdge.bottom,
|
|
2344
2318
|
};
|
|
2345
2319
|
case 'bottom-right':
|
|
2346
|
-
return { x, y, width: width + offsetX, height: height + offsetY };
|
|
2320
|
+
return { x, y, width: width + offsetX + distanceToEdge.right, height: height + offsetY + distanceToEdge.bottom };
|
|
2347
2321
|
}
|
|
2348
2322
|
}
|
|
2349
2323
|
function constrainRect(rect, model, side, minWidth, minHeight) {
|
|
@@ -2355,27 +2329,33 @@ function constrainRect(rect, model, side, minWidth, minHeight) {
|
|
|
2355
2329
|
width = Math.max(minWidth, width);
|
|
2356
2330
|
height = Math.max(minHeight, height);
|
|
2357
2331
|
// Apply left/top constraints based on minimum size
|
|
2358
|
-
x = Math.min(x, model.point().x + model.
|
|
2359
|
-
y = Math.min(y, model.point().y + model.
|
|
2332
|
+
x = Math.min(x, model.point().x + model.width() - minWidth);
|
|
2333
|
+
y = Math.min(y, model.point().y + model.height() - minHeight);
|
|
2360
2334
|
const parent = model.parent();
|
|
2361
2335
|
// 3. Apply maximum size constraints based on parent size (if exists)
|
|
2362
2336
|
if (parent) {
|
|
2363
|
-
|
|
2364
|
-
|
|
2365
|
-
|
|
2366
|
-
|
|
2337
|
+
const parentWidth = parent.width();
|
|
2338
|
+
const parentHeight = parent.height();
|
|
2339
|
+
const modelX = model.point().x;
|
|
2340
|
+
const modelY = model.point().y;
|
|
2341
|
+
x = Math.max(x, 0);
|
|
2342
|
+
y = Math.max(y, 0);
|
|
2343
|
+
// Stop resizing when hitting left or top boundary
|
|
2344
|
+
if (side.includes('left') && x === 0) {
|
|
2345
|
+
width = Math.min(width, modelX + model.width());
|
|
2367
2346
|
}
|
|
2368
|
-
if (y === 0) {
|
|
2369
|
-
height =
|
|
2347
|
+
if (side.includes('top') && y === 0) {
|
|
2348
|
+
height = Math.min(height, modelY + model.height());
|
|
2370
2349
|
}
|
|
2371
|
-
|
|
2372
|
-
|
|
2350
|
+
// Allow right/bottom resizing without being blocked
|
|
2351
|
+
width = Math.min(width, parentWidth - x);
|
|
2352
|
+
height = Math.min(height, parentHeight - y);
|
|
2373
2353
|
}
|
|
2374
2354
|
const bounds = getNodesBounds(model.children());
|
|
2375
2355
|
// 4. Apply child node constraints (if children exist)
|
|
2376
2356
|
if (bounds) {
|
|
2377
2357
|
if (side.includes('left')) {
|
|
2378
|
-
x = Math.min(x, model.point().x + model.
|
|
2358
|
+
x = Math.min(x, model.point().x + model.width() - (bounds.x + bounds.width));
|
|
2379
2359
|
width = Math.max(width, bounds.x + bounds.width);
|
|
2380
2360
|
}
|
|
2381
2361
|
if (side.includes('right')) {
|
|
@@ -2385,7 +2365,7 @@ function constrainRect(rect, model, side, minWidth, minHeight) {
|
|
|
2385
2365
|
height = Math.max(height, bounds.y + bounds.height);
|
|
2386
2366
|
}
|
|
2387
2367
|
if (side.includes('top')) {
|
|
2388
|
-
y = Math.min(y, model.point().y + model.
|
|
2368
|
+
y = Math.min(y, model.point().y + model.height() - (bounds.y + bounds.height));
|
|
2389
2369
|
height = Math.max(height, bounds.y + bounds.height);
|
|
2390
2370
|
}
|
|
2391
2371
|
}
|