modern-path2d 0.1.0 → 0.1.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.
package/dist/index.cjs CHANGED
@@ -979,13 +979,13 @@ class Curve {
979
979
  drawTo(ctx) {
980
980
  return this;
981
981
  }
982
- clone() {
983
- return new this.constructor().copy(this);
984
- }
985
982
  copy(source) {
986
983
  this.arcLengthDivisions = source.arcLengthDivisions;
987
984
  return this;
988
985
  }
986
+ clone() {
987
+ return new this.constructor().copy(this);
988
+ }
989
989
  }
990
990
 
991
991
  class CircleCurve extends Curve {
@@ -1072,6 +1072,13 @@ class CubicBezierCurve extends Curve {
1072
1072
  );
1073
1073
  return output;
1074
1074
  }
1075
+ transform(matrix) {
1076
+ this.v0.applyMatrix3(matrix);
1077
+ this.v1.applyMatrix3(matrix);
1078
+ this.v2.applyMatrix3(matrix);
1079
+ this.v3.applyMatrix3(matrix);
1080
+ return this;
1081
+ }
1075
1082
  getMinMax(min = Point2D.MAX, max = Point2D.MIN) {
1076
1083
  const { v0, v1, v2, v3 } = this;
1077
1084
  min.x = Math.min(min.x, v0.x, v1.x, v2.x, v3.x);
@@ -1080,13 +1087,6 @@ class CubicBezierCurve extends Curve {
1080
1087
  max.y = Math.max(max.y, v0.y, v1.y, v2.y, v3.y);
1081
1088
  return { min, max };
1082
1089
  }
1083
- transform(matrix) {
1084
- this.v0.applyMatrix3(matrix);
1085
- this.v1.applyMatrix3(matrix);
1086
- this.v2.applyMatrix3(matrix);
1087
- this.v3.applyMatrix3(matrix);
1088
- return this;
1089
- }
1090
1090
  getCommands() {
1091
1091
  const { v0, v1, v2, v3 } = this;
1092
1092
  return [
@@ -1126,9 +1126,6 @@ class EllipseCurve extends Curve {
1126
1126
  this.clockwise = clockwise;
1127
1127
  this.rotation = rotation;
1128
1128
  }
1129
- getDivisions(divisions = 12) {
1130
- return divisions * 2;
1131
- }
1132
1129
  getPoint(t, output = new Point2D()) {
1133
1130
  const twoPi = Math.PI * 2;
1134
1131
  let deltaAngle = this.endAngle - this.startAngle;
@@ -1164,6 +1161,9 @@ class EllipseCurve extends Curve {
1164
1161
  }
1165
1162
  return output.set(_x, _y);
1166
1163
  }
1164
+ getDivisions(divisions = 12) {
1165
+ return divisions * 2;
1166
+ }
1167
1167
  getCommands() {
1168
1168
  const { x, y, radiusX, radiusY, startAngle, endAngle, clockwise } = this;
1169
1169
  const anticlockwise = !clockwise;
@@ -1377,9 +1377,6 @@ class LineCurve extends Curve {
1377
1377
  this.v1 = v1;
1378
1378
  this.v2 = v2;
1379
1379
  }
1380
- getDivisions() {
1381
- return 1;
1382
- }
1383
1380
  getPoint(t, output = new Point2D()) {
1384
1381
  if (t === 1) {
1385
1382
  output.copy(this.v2);
@@ -1398,12 +1395,13 @@ class LineCurve extends Curve {
1398
1395
  getTangentAt(u, output = new Point2D()) {
1399
1396
  return this.getTangent(u, output);
1400
1397
  }
1401
- getCommands() {
1402
- const { v1, v2 } = this;
1403
- return [
1404
- { type: "M", x: v1.x, y: v1.y },
1405
- { type: "L", x: v2.x, y: v2.y }
1406
- ];
1398
+ transform(matrix) {
1399
+ this.v1.applyMatrix3(matrix);
1400
+ this.v2.applyMatrix3(matrix);
1401
+ return this;
1402
+ }
1403
+ getDivisions() {
1404
+ return 1;
1407
1405
  }
1408
1406
  getMinMax(min = Point2D.MAX, max = Point2D.MIN) {
1409
1407
  const { v1, v2 } = this;
@@ -1413,10 +1411,12 @@ class LineCurve extends Curve {
1413
1411
  max.y = Math.max(max.y, v1.y, v2.y);
1414
1412
  return { min, max };
1415
1413
  }
1416
- transform(matrix) {
1417
- this.v1.applyMatrix3(matrix);
1418
- this.v2.applyMatrix3(matrix);
1419
- return this;
1414
+ getCommands() {
1415
+ const { v1, v2 } = this;
1416
+ return [
1417
+ { type: "M", x: v1.x, y: v1.y },
1418
+ { type: "L", x: v2.x, y: v2.y }
1419
+ ];
1420
1420
  }
1421
1421
  drawTo(ctx) {
1422
1422
  const { v1, v2 } = this;
@@ -1587,12 +1587,11 @@ class QuadraticBezierCurve extends Curve {
1587
1587
  );
1588
1588
  return output;
1589
1589
  }
1590
- getCommands() {
1591
- const { v0, v1, v2 } = this;
1592
- return [
1593
- { type: "M", x: v0.x, y: v0.y },
1594
- { type: "Q", x1: v1.x, y1: v1.y, x: v2.x, y: v2.y }
1595
- ];
1590
+ transform(matrix) {
1591
+ this.v0.applyMatrix3(matrix);
1592
+ this.v1.applyMatrix3(matrix);
1593
+ this.v2.applyMatrix3(matrix);
1594
+ return this;
1596
1595
  }
1597
1596
  getMinMax(min = Point2D.MAX, max = Point2D.MIN) {
1598
1597
  const { v0, v1, v2 } = this;
@@ -1606,11 +1605,12 @@ class QuadraticBezierCurve extends Curve {
1606
1605
  max.y = Math.max(max.y, v0.y, v2.y, y1, y2);
1607
1606
  return { min, max };
1608
1607
  }
1609
- transform(matrix) {
1610
- this.v0.applyMatrix3(matrix);
1611
- this.v1.applyMatrix3(matrix);
1612
- this.v2.applyMatrix3(matrix);
1613
- return this;
1608
+ getCommands() {
1609
+ const { v0, v1, v2 } = this;
1610
+ return [
1611
+ { type: "M", x: v0.x, y: v0.y },
1612
+ { type: "Q", x1: v1.x, y1: v1.y, x: v2.x, y: v2.y }
1613
+ ];
1614
1614
  }
1615
1615
  drawTo(ctx) {
1616
1616
  const { v0, v1, v2 } = this;
@@ -1939,9 +1939,8 @@ class CurvePath extends Curve {
1939
1939
  copy(source) {
1940
1940
  super.copy(source);
1941
1941
  this.curves = [];
1942
- for (let i = 0, l = source.curves.length; i < l; i++) {
1943
- const curve = source.curves[i];
1944
- this.curves.push(curve.clone());
1942
+ for (let i = 0, len = source.curves.length; i < len; i++) {
1943
+ this.curves.push(source.curves[i].clone());
1945
1944
  }
1946
1945
  this.autoClose = source.autoClose;
1947
1946
  this.currentPoint.copy(source.currentPoint);
@@ -2066,21 +2065,25 @@ class Path2D {
2066
2065
  this.forEachCurve((curve) => curve.getMinMax(min, max));
2067
2066
  return { min, max };
2068
2067
  }
2069
- getCommands() {
2070
- return this.paths.flatMap((path) => path.curves.flatMap((curve) => curve.getCommands()));
2071
- }
2072
- getData() {
2073
- return this.paths.map((path) => path.getData()).join(" ");
2074
- }
2075
2068
  getBoundingBox() {
2076
2069
  const { min, max } = this.getMinMax();
2077
2070
  return {
2078
2071
  x: min.x,
2079
2072
  y: min.y,
2073
+ left: min.x,
2074
+ top: min.y,
2075
+ right: max.x,
2076
+ bottom: max.y,
2080
2077
  width: max.x - min.x,
2081
2078
  height: max.y - min.y
2082
2079
  };
2083
2080
  }
2081
+ getCommands() {
2082
+ return this.paths.flatMap((path) => path.curves.flatMap((curve) => curve.getCommands()));
2083
+ }
2084
+ getData() {
2085
+ return this.paths.map((path) => path.getData()).join(" ");
2086
+ }
2084
2087
  getSvgString() {
2085
2088
  const { x, y, width, height } = this.getBoundingBox();
2086
2089
  return `<svg viewBox="${x} ${y} ${width} ${height}" xmlns="http://www.w3.org/2000/svg"><path fill="none" stroke="currentColor" d="${this.getData()}"></path></svg>`;
@@ -2101,6 +2104,15 @@ class Path2D {
2101
2104
  this.drawTo(ctx);
2102
2105
  ctx.fill();
2103
2106
  }
2107
+ copy(source) {
2108
+ source.currentPath = this.currentPath.clone();
2109
+ source.paths = this.paths.map((path) => path.clone());
2110
+ source.userData = this.userData;
2111
+ return this;
2112
+ }
2113
+ clone() {
2114
+ return new Path2D().copy(this);
2115
+ }
2104
2116
  }
2105
2117
 
2106
2118
  const defaultUnit = "px";
package/dist/index.d.cts CHANGED
@@ -103,19 +103,25 @@ declare class Path2D<T = any> {
103
103
  min: Point2D;
104
104
  max: Point2D;
105
105
  };
106
- getCommands(): PathCommand[];
107
- getData(): string;
108
106
  getBoundingBox(): {
109
107
  x: number;
110
108
  y: number;
109
+ left: number;
110
+ top: number;
111
+ right: number;
112
+ bottom: number;
111
113
  width: number;
112
114
  height: number;
113
115
  };
116
+ getCommands(): PathCommand[];
117
+ getData(): string;
114
118
  getSvgString(): string;
115
119
  getSvgDataUri(): string;
116
120
  drawTo(ctx: CanvasRenderingContext2D): void;
117
121
  strokeTo(ctx: CanvasRenderingContext2D): void;
118
122
  fillTo(ctx: CanvasRenderingContext2D): void;
123
+ copy(source: Path2D): this;
124
+ clone(): Path2D;
119
125
  }
120
126
 
121
127
  /**
@@ -200,8 +206,8 @@ declare abstract class Curve {
200
206
  getData(): string;
201
207
  /** overrideable */
202
208
  drawTo(ctx: CanvasRenderingContext2D): this;
203
- clone(): this;
204
209
  copy(source: Curve): this;
210
+ clone(): this;
205
211
  }
206
212
 
207
213
  declare class CircleCurve extends Curve {
@@ -226,11 +232,11 @@ declare class CubicBezierCurve extends Curve {
226
232
  v3: Point2D;
227
233
  constructor(v0?: Point2D, v1?: Point2D, v2?: Point2D, v3?: Point2D);
228
234
  getPoint(t: number, output?: Point2D): Point2D;
235
+ transform(matrix: Matrix3): this;
229
236
  getMinMax(min?: Point2D, max?: Point2D): {
230
237
  min: Point2D;
231
238
  max: Point2D;
232
239
  };
233
- transform(matrix: Matrix3): this;
234
240
  getCommands(): PathCommand[];
235
241
  drawTo(ctx: CanvasRenderingContext2D): this;
236
242
  copy(source: CubicBezierCurve): this;
@@ -246,8 +252,8 @@ declare class EllipseCurve extends Curve {
246
252
  clockwise: boolean;
247
253
  rotation: number;
248
254
  constructor(x?: number, y?: number, radiusX?: number, radiusY?: number, startAngle?: number, endAngle?: number, clockwise?: boolean, rotation?: number);
249
- getDivisions(divisions?: number): number;
250
255
  getPoint(t: number, output?: Point2D): Point2D;
256
+ getDivisions(divisions?: number): number;
251
257
  getCommands(): PathCommand[];
252
258
  drawTo(ctx: CanvasRenderingContext2D): this;
253
259
  transform(matrix: Matrix3): this;
@@ -275,17 +281,17 @@ declare class LineCurve extends Curve {
275
281
  v1: Point2D;
276
282
  v2: Point2D;
277
283
  constructor(v1?: Point2D, v2?: Point2D);
278
- getDivisions(): number;
279
284
  getPoint(t: number, output?: Point2D): Point2D;
280
285
  getPointAt(u: number, output?: Point2D): Point2D;
281
286
  getTangent(t: number, output?: Point2D): Point2D;
282
287
  getTangentAt(u: number, output?: Point2D): Point2D;
283
- getCommands(): PathCommand[];
288
+ transform(matrix: Matrix3): this;
289
+ getDivisions(): number;
284
290
  getMinMax(min?: Point2D, max?: Point2D): {
285
291
  min: Point2D;
286
292
  max: Point2D;
287
293
  };
288
- transform(matrix: Matrix3): this;
294
+ getCommands(): PathCommand[];
289
295
  drawTo(ctx: CanvasRenderingContext2D): this;
290
296
  copy(source: LineCurve): this;
291
297
  }
@@ -320,12 +326,12 @@ declare class QuadraticBezierCurve extends Curve {
320
326
  v2: Point2D;
321
327
  constructor(v0?: Point2D, v1?: Point2D, v2?: Point2D);
322
328
  getPoint(t: number, output?: Point2D): Point2D;
323
- getCommands(): PathCommand[];
329
+ transform(matrix: Matrix3): this;
324
330
  getMinMax(min?: Point2D, max?: Point2D): {
325
331
  min: Point2D;
326
332
  max: Point2D;
327
333
  };
328
- transform(matrix: Matrix3): this;
334
+ getCommands(): PathCommand[];
329
335
  drawTo(ctx: CanvasRenderingContext2D): this;
330
336
  copy(source: QuadraticBezierCurve): this;
331
337
  }
package/dist/index.d.mts CHANGED
@@ -103,19 +103,25 @@ declare class Path2D<T = any> {
103
103
  min: Point2D;
104
104
  max: Point2D;
105
105
  };
106
- getCommands(): PathCommand[];
107
- getData(): string;
108
106
  getBoundingBox(): {
109
107
  x: number;
110
108
  y: number;
109
+ left: number;
110
+ top: number;
111
+ right: number;
112
+ bottom: number;
111
113
  width: number;
112
114
  height: number;
113
115
  };
116
+ getCommands(): PathCommand[];
117
+ getData(): string;
114
118
  getSvgString(): string;
115
119
  getSvgDataUri(): string;
116
120
  drawTo(ctx: CanvasRenderingContext2D): void;
117
121
  strokeTo(ctx: CanvasRenderingContext2D): void;
118
122
  fillTo(ctx: CanvasRenderingContext2D): void;
123
+ copy(source: Path2D): this;
124
+ clone(): Path2D;
119
125
  }
120
126
 
121
127
  /**
@@ -200,8 +206,8 @@ declare abstract class Curve {
200
206
  getData(): string;
201
207
  /** overrideable */
202
208
  drawTo(ctx: CanvasRenderingContext2D): this;
203
- clone(): this;
204
209
  copy(source: Curve): this;
210
+ clone(): this;
205
211
  }
206
212
 
207
213
  declare class CircleCurve extends Curve {
@@ -226,11 +232,11 @@ declare class CubicBezierCurve extends Curve {
226
232
  v3: Point2D;
227
233
  constructor(v0?: Point2D, v1?: Point2D, v2?: Point2D, v3?: Point2D);
228
234
  getPoint(t: number, output?: Point2D): Point2D;
235
+ transform(matrix: Matrix3): this;
229
236
  getMinMax(min?: Point2D, max?: Point2D): {
230
237
  min: Point2D;
231
238
  max: Point2D;
232
239
  };
233
- transform(matrix: Matrix3): this;
234
240
  getCommands(): PathCommand[];
235
241
  drawTo(ctx: CanvasRenderingContext2D): this;
236
242
  copy(source: CubicBezierCurve): this;
@@ -246,8 +252,8 @@ declare class EllipseCurve extends Curve {
246
252
  clockwise: boolean;
247
253
  rotation: number;
248
254
  constructor(x?: number, y?: number, radiusX?: number, radiusY?: number, startAngle?: number, endAngle?: number, clockwise?: boolean, rotation?: number);
249
- getDivisions(divisions?: number): number;
250
255
  getPoint(t: number, output?: Point2D): Point2D;
256
+ getDivisions(divisions?: number): number;
251
257
  getCommands(): PathCommand[];
252
258
  drawTo(ctx: CanvasRenderingContext2D): this;
253
259
  transform(matrix: Matrix3): this;
@@ -275,17 +281,17 @@ declare class LineCurve extends Curve {
275
281
  v1: Point2D;
276
282
  v2: Point2D;
277
283
  constructor(v1?: Point2D, v2?: Point2D);
278
- getDivisions(): number;
279
284
  getPoint(t: number, output?: Point2D): Point2D;
280
285
  getPointAt(u: number, output?: Point2D): Point2D;
281
286
  getTangent(t: number, output?: Point2D): Point2D;
282
287
  getTangentAt(u: number, output?: Point2D): Point2D;
283
- getCommands(): PathCommand[];
288
+ transform(matrix: Matrix3): this;
289
+ getDivisions(): number;
284
290
  getMinMax(min?: Point2D, max?: Point2D): {
285
291
  min: Point2D;
286
292
  max: Point2D;
287
293
  };
288
- transform(matrix: Matrix3): this;
294
+ getCommands(): PathCommand[];
289
295
  drawTo(ctx: CanvasRenderingContext2D): this;
290
296
  copy(source: LineCurve): this;
291
297
  }
@@ -320,12 +326,12 @@ declare class QuadraticBezierCurve extends Curve {
320
326
  v2: Point2D;
321
327
  constructor(v0?: Point2D, v1?: Point2D, v2?: Point2D);
322
328
  getPoint(t: number, output?: Point2D): Point2D;
323
- getCommands(): PathCommand[];
329
+ transform(matrix: Matrix3): this;
324
330
  getMinMax(min?: Point2D, max?: Point2D): {
325
331
  min: Point2D;
326
332
  max: Point2D;
327
333
  };
328
- transform(matrix: Matrix3): this;
334
+ getCommands(): PathCommand[];
329
335
  drawTo(ctx: CanvasRenderingContext2D): this;
330
336
  copy(source: QuadraticBezierCurve): this;
331
337
  }
package/dist/index.d.ts CHANGED
@@ -103,19 +103,25 @@ declare class Path2D<T = any> {
103
103
  min: Point2D;
104
104
  max: Point2D;
105
105
  };
106
- getCommands(): PathCommand[];
107
- getData(): string;
108
106
  getBoundingBox(): {
109
107
  x: number;
110
108
  y: number;
109
+ left: number;
110
+ top: number;
111
+ right: number;
112
+ bottom: number;
111
113
  width: number;
112
114
  height: number;
113
115
  };
116
+ getCommands(): PathCommand[];
117
+ getData(): string;
114
118
  getSvgString(): string;
115
119
  getSvgDataUri(): string;
116
120
  drawTo(ctx: CanvasRenderingContext2D): void;
117
121
  strokeTo(ctx: CanvasRenderingContext2D): void;
118
122
  fillTo(ctx: CanvasRenderingContext2D): void;
123
+ copy(source: Path2D): this;
124
+ clone(): Path2D;
119
125
  }
120
126
 
121
127
  /**
@@ -200,8 +206,8 @@ declare abstract class Curve {
200
206
  getData(): string;
201
207
  /** overrideable */
202
208
  drawTo(ctx: CanvasRenderingContext2D): this;
203
- clone(): this;
204
209
  copy(source: Curve): this;
210
+ clone(): this;
205
211
  }
206
212
 
207
213
  declare class CircleCurve extends Curve {
@@ -226,11 +232,11 @@ declare class CubicBezierCurve extends Curve {
226
232
  v3: Point2D;
227
233
  constructor(v0?: Point2D, v1?: Point2D, v2?: Point2D, v3?: Point2D);
228
234
  getPoint(t: number, output?: Point2D): Point2D;
235
+ transform(matrix: Matrix3): this;
229
236
  getMinMax(min?: Point2D, max?: Point2D): {
230
237
  min: Point2D;
231
238
  max: Point2D;
232
239
  };
233
- transform(matrix: Matrix3): this;
234
240
  getCommands(): PathCommand[];
235
241
  drawTo(ctx: CanvasRenderingContext2D): this;
236
242
  copy(source: CubicBezierCurve): this;
@@ -246,8 +252,8 @@ declare class EllipseCurve extends Curve {
246
252
  clockwise: boolean;
247
253
  rotation: number;
248
254
  constructor(x?: number, y?: number, radiusX?: number, radiusY?: number, startAngle?: number, endAngle?: number, clockwise?: boolean, rotation?: number);
249
- getDivisions(divisions?: number): number;
250
255
  getPoint(t: number, output?: Point2D): Point2D;
256
+ getDivisions(divisions?: number): number;
251
257
  getCommands(): PathCommand[];
252
258
  drawTo(ctx: CanvasRenderingContext2D): this;
253
259
  transform(matrix: Matrix3): this;
@@ -275,17 +281,17 @@ declare class LineCurve extends Curve {
275
281
  v1: Point2D;
276
282
  v2: Point2D;
277
283
  constructor(v1?: Point2D, v2?: Point2D);
278
- getDivisions(): number;
279
284
  getPoint(t: number, output?: Point2D): Point2D;
280
285
  getPointAt(u: number, output?: Point2D): Point2D;
281
286
  getTangent(t: number, output?: Point2D): Point2D;
282
287
  getTangentAt(u: number, output?: Point2D): Point2D;
283
- getCommands(): PathCommand[];
288
+ transform(matrix: Matrix3): this;
289
+ getDivisions(): number;
284
290
  getMinMax(min?: Point2D, max?: Point2D): {
285
291
  min: Point2D;
286
292
  max: Point2D;
287
293
  };
288
- transform(matrix: Matrix3): this;
294
+ getCommands(): PathCommand[];
289
295
  drawTo(ctx: CanvasRenderingContext2D): this;
290
296
  copy(source: LineCurve): this;
291
297
  }
@@ -320,12 +326,12 @@ declare class QuadraticBezierCurve extends Curve {
320
326
  v2: Point2D;
321
327
  constructor(v0?: Point2D, v1?: Point2D, v2?: Point2D);
322
328
  getPoint(t: number, output?: Point2D): Point2D;
323
- getCommands(): PathCommand[];
329
+ transform(matrix: Matrix3): this;
324
330
  getMinMax(min?: Point2D, max?: Point2D): {
325
331
  min: Point2D;
326
332
  max: Point2D;
327
333
  };
328
- transform(matrix: Matrix3): this;
334
+ getCommands(): PathCommand[];
329
335
  drawTo(ctx: CanvasRenderingContext2D): this;
330
336
  copy(source: QuadraticBezierCurve): this;
331
337
  }
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- (function(v,d){typeof exports=="object"&&typeof module<"u"?d(exports):typeof define=="function"&&define.amd?define(["exports"],d):(v=typeof globalThis<"u"?globalThis:v||self,d(v.modernPath2d={}))})(this,function(v){"use strict";var Qt=Object.defineProperty;var Ut=(v,d,$)=>d in v?Qt(v,d,{enumerable:!0,configurable:!0,writable:!0,value:$}):v[d]=$;var b=(v,d,$)=>Ut(v,typeof d!="symbol"?d+"":d,$);class d{constructor(e=1,t=0,s=0,i=0,o=1,c=0,a=0,h=0,n=1){b(this,"elements",[]);this.set(e,t,s,i,o,c,a,h,n)}set(e,t,s,i,o,c,a,h,n){const u=this.elements;return u[0]=e,u[1]=i,u[2]=a,u[3]=t,u[4]=o,u[5]=h,u[6]=s,u[7]=c,u[8]=n,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(e){const t=this.elements,s=e.elements;return t[0]=s[0],t[1]=s[1],t[2]=s[2],t[3]=s[3],t[4]=s[4],t[5]=s[5],t[6]=s[6],t[7]=s[7],t[8]=s[8],this}multiply(e){return this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,t){const s=e.elements,i=t.elements,o=this.elements,c=s[0],a=s[3],h=s[6],n=s[1],u=s[4],y=s[7],p=s[2],x=s[5],g=s[8],f=i[0],M=i[3],w=i[6],I=i[1],T=i[4],C=i[7],A=i[2],E=i[5],z=i[8];return o[0]=c*f+a*I+h*A,o[3]=c*M+a*T+h*E,o[6]=c*w+a*C+h*z,o[1]=n*f+u*I+y*A,o[4]=n*M+u*T+y*E,o[7]=n*w+u*C+y*z,o[2]=p*f+x*I+g*A,o[5]=p*M+x*T+g*E,o[8]=p*w+x*C+g*z,this}invert(){const e=this.elements,t=e[0],s=e[1],i=e[2],o=e[3],c=e[4],a=e[5],h=e[6],n=e[7],u=e[8],y=u*c-a*n,p=a*h-u*o,x=n*o-c*h,g=t*y+s*p+i*x;if(g===0)return this.set(0,0,0,0,0,0,0,0,0);const f=1/g;return e[0]=y*f,e[1]=(i*n-u*s)*f,e[2]=(a*s-i*c)*f,e[3]=p*f,e[4]=(u*t-i*h)*f,e[5]=(i*o-a*t)*f,e[6]=x*f,e[7]=(s*h-n*t)*f,e[8]=(c*t-s*o)*f,this}transpose(){let e;const t=this.elements;return e=t[1],t[1]=t[3],t[3]=e,e=t[2],t[2]=t[6],t[6]=e,e=t[5],t[5]=t[7],t[7]=e,this}scale(e,t){return this.premultiply($.makeScale(e,t)),this}rotate(e){return this.premultiply($.makeRotation(-e)),this}translate(e,t){return this.premultiply($.makeTranslation(e,t)),this}makeTranslation(e,t){return this.set(1,0,e,0,1,t,0,0,1),this}makeRotation(e){const t=Math.cos(e),s=Math.sin(e);return this.set(t,-s,0,s,t,0,0,0,1),this}makeScale(e,t){return this.set(e,0,0,0,t,0,0,0,1),this}fromArray(e,t=0){for(let s=0;s<9;s++)this.elements[s]=e[s+t];return this}clone(){return new this.constructor().fromArray(this.elements)}}const $=new d;class l{constructor(e=0,t=0){this.x=e,this.y=t}static get MAX(){return new l(1/0,1/0)}static get MIN(){return new l(-1/0,-1/0)}set(e,t){return this.x=e,this.y=t,this}add(e){return this.x+=e.x,this.y+=e.y,this}sub(e){return this.x-=e.x,this.y-=e.y,this}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){const t=this.x-e.x,s=this.y-e.y;return t*t+s*s}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}multiplyScalar(e){return this.x*=e,this.y*=e,this}divideScalar(e){return this.multiplyScalar(1/e)}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this}normalize(){return this.divideScalar(this.length()||1)}lerpVectors(e,t,s){return this.x=e.x+(t.x-e.x)*s,this.y=e.y+(t.y-e.y)*s,this}equals(e){return this.x===e.x&&this.y===e.y}applyMatrix3(e){const[t,s,i,o,c,a]=e.elements,{x:h,y:n}=this;return this.set(t*h+s*n+i,o*h+c*n+a),this}copy(e){return this.x=e.x,this.y=e.y,this}clone(){return new l(this.x,this.y)}}function U(r,e,t,s){const i=r*t+e*s,o=Math.sqrt(r*r+e*e)*Math.sqrt(t*t+s*s);let c=Math.acos(Math.max(-1,Math.min(1,i/o)));return r*s-e*t<0&&(c=-c),c}function lt(r,e,t,s,i,o,c,a){if(e===0||t===0){r.lineTo(a.x,a.y);return}s=s*Math.PI/180,e=Math.abs(e),t=Math.abs(t);const h=(c.x-a.x)/2,n=(c.y-a.y)/2,u=Math.cos(s)*h+Math.sin(s)*n,y=-Math.sin(s)*h+Math.cos(s)*n;let p=e*e,x=t*t;const g=u*u,f=y*y,M=g/p+f/x;if(M>1){const ut=Math.sqrt(M);e=ut*e,t=ut*t,p=e*e,x=t*t}const w=p*f+x*g,I=(p*x-w)/w;let T=Math.sqrt(Math.max(0,I));i===o&&(T=-T);const C=T*e*y/t,A=-T*t*u/e,E=Math.cos(s)*C-Math.sin(s)*A+(c.x+a.x)/2,z=Math.sin(s)*C+Math.cos(s)*A+(c.y+a.y)/2,Y=U(1,0,(u-C)/e,(y-A)/t),Q=U((u-C)/e,(y-A)/t,(-u-C)/e,(-y-A)/t)%(Math.PI*2);r.currentPath.absellipse(E,z,e,t,Y,Y+Q,o===0,s)}function D(r,e){return r-(e-r)}function yt(r,e){const t=new l,s=new l,i=new l;let o=!0,c=!1;for(let a=0,h=r.length;a<h;a++){const n=r[a];if(o&&(c=!0,o=!1),n.type==="m"||n.type==="M")n.type==="m"?(t.x+=n.x,t.y+=n.y):(t.x=n.x,t.y=n.y),s.x=t.x,s.y=t.y,e.moveTo(t.x,t.y),a===0&&i.copy(t);else if(n.type==="h"||n.type==="H")n.type==="h"?t.x+=n.x:t.x=n.x,s.x=t.x,s.y=t.y,e.lineTo(t.x,t.y),c&&i.copy(t);else if(n.type==="v"||n.type==="V")n.type==="v"?t.y+=n.y:t.y=n.y,s.x=t.x,s.y=t.y,e.lineTo(t.x,t.y),c&&i.copy(t);else if(n.type==="l"||n.type==="L")n.type==="l"?(t.x+=n.x,t.y+=n.y):(t.x=n.x,t.y=n.y),s.x=t.x,s.y=t.y,e.lineTo(t.x,t.y),c&&i.copy(t);else if(n.type==="c"||n.type==="C")n.type==="c"?(e.bezierCurveTo(t.x+n.x1,t.y+n.y1,t.x+n.x2,t.y+n.y2,t.x+n.x,t.y+n.y),s.x=t.x+n.x2,s.y=t.y+n.y2,t.x+=n.x,t.y+=n.y):(e.bezierCurveTo(n.x1,n.y1,n.x2,n.y2,n.x,n.y),s.x=n.x2,s.y=n.y2,t.x=n.x,t.y=n.y),c&&i.copy(t);else if(n.type==="s"||n.type==="S")n.type==="s"?(e.bezierCurveTo(D(t.x,s.x),D(t.y,s.y),t.x+n.x2,t.y+n.y2,t.x+n.x,t.y+n.y),s.x=t.x+n.x2,s.y=t.y+n.y2,t.x+=n.x,t.y+=n.y):(e.bezierCurveTo(D(t.x,s.x),D(t.y,s.y),n.x2,n.y2,n.x,n.y),s.x=n.x2,s.y=n.y2,t.x=n.x,t.y=n.y),c&&i.copy(t);else if(n.type==="q"||n.type==="Q")n.type==="q"?(e.quadraticCurveTo(t.x+n.x1,t.y+n.y1,t.x+n.x,t.y+n.y),s.x=t.x+n.x1,s.y=t.y+n.y1,t.x+=n.x,t.y+=n.y):(e.quadraticCurveTo(n.x1,n.y1,n.x,n.y),s.x=n.x1,s.y=n.y1,t.x=n.x,t.y=n.y),c&&i.copy(t);else if(n.type==="t"||n.type==="T"){const u=D(t.x,s.x),y=D(t.y,s.y);s.x=u,s.y=y,n.type==="t"?(e.quadraticCurveTo(u,y,t.x+n.x,t.y+n.y),t.x+=n.x,t.y+=n.y):(e.quadraticCurveTo(u,y,n.x,n.y),t.x=n.x,t.y=n.y),c&&i.copy(t)}else if(n.type==="a"||n.type==="A"){if(n.type==="a"){if(n.x===0&&n.y===0)continue;t.x+=n.x,t.y+=n.y}else{if(n.x===t.x&&n.y===t.y)continue;t.x=n.x,t.y=n.y}const u=t.clone();s.x=t.x,s.y=t.y,lt(e,n.rx,n.ry,n.angle,n.largeArcFlag,n.sweepFlag,u,t),c&&i.copy(t)}else n.type==="z"||n.type==="Z"?(e.currentPath.autoClose=!0,e.currentPath.curves.length>0&&(t.copy(i),e.currentPath.currentPoint.copy(t),o=!0)):console.warn(n);c=!1}}const P={SEPARATOR:/[ \t\r\n,.\-+]/,WHITESPACE:/[ \t\r\n]/,DIGIT:/\d/,SIGN:/[-+]/,POINT:/\./,COMMA:/,/,EXP:/e/i,FLAGS:/[01]/};function S(r,e,t=0){let a=0,h=!0,n="",u="";const y=[];function p(M,w,I){const T=new SyntaxError(`Unexpected character "${M}" at index ${w}.`);throw T.partial=I,T}function x(){n!==""&&(u===""?y.push(Number(n)):y.push(Number(n)*10**Number(u))),n="",u=""}let g;const f=r.length;for(let M=0;M<f;M++){if(g=r[M],Array.isArray(e)&&e.includes(y.length%t)&&P.FLAGS.test(g)){a=1,n=g,x();continue}if(a===0){if(P.WHITESPACE.test(g))continue;if(P.DIGIT.test(g)||P.SIGN.test(g)){a=1,n=g;continue}if(P.POINT.test(g)){a=2,n=g;continue}P.COMMA.test(g)&&(h&&p(g,M,y),h=!0)}if(a===1){if(P.DIGIT.test(g)){n+=g;continue}if(P.POINT.test(g)){n+=g,a=2;continue}if(P.EXP.test(g)){a=3;continue}P.SIGN.test(g)&&n.length===1&&P.SIGN.test(n[0])&&p(g,M,y)}if(a===2){if(P.DIGIT.test(g)){n+=g;continue}if(P.EXP.test(g)){a=3;continue}P.POINT.test(g)&&n[n.length-1]==="."&&p(g,M,y)}if(a===3){if(P.DIGIT.test(g)){u+=g;continue}if(P.SIGN.test(g)){if(u===""){u+=g;continue}u.length===1&&P.SIGN.test(u)&&p(g,M,y)}}P.WHITESPACE.test(g)?(x(),a=0,h=!1):P.COMMA.test(g)?(x(),a=0,h=!0):P.SIGN.test(g)?(x(),a=1,n=g):P.POINT.test(g)?(x(),a=2,n=g):p(g,M,y)}return x(),y}function gt(r){switch(r.type){case"m":case"M":return`${r.type} ${r.x} ${r.y}`;case"h":case"H":return`${r.type} ${r.x}`;case"v":case"V":return`${r.type} ${r.y}`;case"l":case"L":return`${r.type} ${r.x} ${r.y}`;case"c":case"C":return`${r.type} ${r.x1} ${r.y1} ${r.x2} ${r.y2} ${r.x} ${r.y}`;case"s":case"S":return`${r.type} ${r.x2} ${r.y2} ${r.x} ${r.y}`;case"q":case"Q":return`${r.type} ${r.x1} ${r.y1} ${r.x} ${r.y}`;case"t":case"T":return`${r.type} ${r.x} ${r.y}`;case"a":case"A":return`${r.type} ${r.rx} ${r.ry} ${r.angle} ${r.largeArcFlag} ${r.sweepFlag} ${r.x} ${r.y}`;case"z":case"Z":return r.type;default:return""}}function pt(r){let e="";for(let t=0,s=r.length;t<s;t++)e+=`${gt(r[t])} `;return e}const ft=/[a-df-z][^a-df-z]*/gi;function xt(r){const e=[],t=r.match(ft);if(!t)return e;for(let s=0,i=t.length;s<i;s++){const o=t[s],c=o.charAt(0),a=o.slice(1).trim();let h;switch(c){case"m":case"M":h=S(a);for(let n=0,u=h.length;n<u;n+=2)n===0?e.push({type:c,x:h[n],y:h[n+1]}):e.push({type:c==="m"?"l":"L",x:h[n],y:h[n+1]});break;case"h":case"H":h=S(a);for(let n=0,u=h.length;n<u;n++)e.push({type:c,x:h[n]});break;case"v":case"V":h=S(a);for(let n=0,u=h.length;n<u;n++)e.push({type:c,y:h[n]});break;case"l":case"L":h=S(a);for(let n=0,u=h.length;n<u;n+=2)e.push({type:c,x:h[n],y:h[n+1]});break;case"c":case"C":h=S(a);for(let n=0,u=h.length;n<u;n+=6)e.push({type:c,x1:h[n],y1:h[n+1],x2:h[n+2],y2:h[n+3],x:h[n+4],y:h[n+5]});break;case"s":case"S":h=S(a);for(let n=0,u=h.length;n<u;n+=4)e.push({type:c,x2:h[n],y2:h[n+1],x:h[n+2],y:h[n+3]});break;case"q":case"Q":h=S(a);for(let n=0,u=h.length;n<u;n+=4)e.push({type:c,x1:h[n],y1:h[n+1],x:h[n+2],y:h[n+3]});break;case"t":case"T":h=S(a);for(let n=0,u=h.length;n<u;n+=2)e.push({type:c,x:h[n],y:h[n+1]});break;case"a":case"A":h=S(a,[3,4],7);for(let n=0,u=h.length;n<u;n+=7)e.push({type:c,rx:h[n],ry:h[n+1],angle:h[n+2],largeArcFlag:h[n+3],sweepFlag:h[n+4],x:h[n+5],y:h[n+6]});break;case"z":case"Z":e.push({type:c});break;default:console.warn(o)}}return e}class k{constructor(){b(this,"arcLengthDivisions",200);b(this,"_cacheArcLengths");b(this,"_needsUpdate",!1)}getPointAt(e,t=new l){return this.getPoint(this.getUtoTmapping(e),t)}getPoints(e=5){const t=[];for(let s=0;s<=e;s++)t.push(this.getPoint(s/e));return t}getSpacedPoints(e=5){const t=[];for(let s=0;s<=e;s++)t.push(this.getPointAt(s/e));return t}getLength(){const e=this.getLengths();return e[e.length-1]}getLengths(e=this.arcLengthDivisions){if(this._cacheArcLengths&&this._cacheArcLengths.length===e+1&&!this._needsUpdate)return this._cacheArcLengths;this._needsUpdate=!1;const t=[];let s,i=this.getPoint(0),o=0;t.push(0);for(let c=1;c<=e;c++)s=this.getPoint(c/e),o+=s.distanceTo(i),t.push(o),i=s;return this._cacheArcLengths=t,t}updateArcLengths(){this._needsUpdate=!0,this.getLengths()}getUtoTmapping(e,t){const s=this.getLengths();let i=0;const o=s.length;let c;t?c=t:c=e*s[o-1];let a=0,h=o-1,n;for(;a<=h;)if(i=Math.floor(a+(h-a)/2),n=s[i]-c,n<0)a=i+1;else if(n>0)h=i-1;else{h=i;break}if(i=h,s[i]===c)return i/(o-1);const u=s[i],p=s[i+1]-u,x=(c-u)/p;return(i+x)/(o-1)}getTangent(e,t=new l){let i=e-1e-4,o=e+1e-4;return i<0&&(i=0),o>1&&(o=1),t.copy(this.getPoint(o)).sub(this.getPoint(i)).normalize()}getTangentAt(e,t=new l){return this.getTangent(this.getUtoTmapping(e),t)}transform(e){return this}getDivisions(e){return e}getMinMax(e=l.MAX,t=l.MIN){return{min:e,max:t}}getCommands(){return[]}getData(){return pt(this.getCommands())}drawTo(e){return this}clone(){return new this.constructor().copy(this)}copy(e){return this.arcLengthDivisions=e.arcLengthDivisions,this}}class O extends k{constructor(e,t,s=0,i=Math.PI*2){super(),this.center=e,this.radius=t,this.start=s,this.end=i}getPoint(e){const{radius:t,center:s}=this;return s.clone().add(this.getNormal(e).clone().multiplyScalar(t))}getTangent(e){const{x:t,y:s}=this.getNormal(e);return new l(-s,t)}getNormal(e){const{start:t,end:s}=this,i=e*(s-t)+t-.5*Math.PI;return new l(Math.cos(i),Math.sin(i))}getMinMax(e=l.MAX,t=l.MIN){return e.x=Math.min(e.x,this.center.x-this.radius),e.y=Math.min(e.y,this.center.y-this.radius),t.x=Math.max(t.x,this.center.x+this.radius),t.y=Math.max(t.y,this.center.y+this.radius),{min:e,max:t}}}function V(r,e,t,s,i){const o=(s-e)*.5,c=(i-t)*.5,a=r*r,h=r*a;return(2*t-2*s+o+c)*h+(-3*t+3*s-2*o-c)*a+o*r+t}function Mt(r,e){const t=1-r;return t*t*e}function vt(r,e){return 2*(1-r)*r*e}function mt(r,e){return r*r*e}function H(r,e,t,s){return Mt(r,e)+vt(r,t)+mt(r,s)}function dt(r,e){const t=1-r;return t*t*t*e}function Pt(r,e){const t=1-r;return 3*t*t*r*e}function Tt(r,e){return 3*(1-r)*r*r*e}function wt(r,e){return r*r*r*e}function W(r,e,t,s,i){return dt(r,e)+Pt(r,t)+Tt(r,s)+wt(r,i)}class j extends k{constructor(e=new l,t=new l,s=new l,i=new l){super(),this.v0=e,this.v1=t,this.v2=s,this.v3=i}getPoint(e,t=new l){const{v0:s,v1:i,v2:o,v3:c}=this;return t.set(W(e,s.x,i.x,o.x,c.x),W(e,s.y,i.y,o.y,c.y)),t}getMinMax(e=l.MAX,t=l.MIN){const{v0:s,v1:i,v2:o,v3:c}=this;return e.x=Math.min(e.x,s.x,i.x,o.x,c.x),e.y=Math.min(e.y,s.y,i.y,o.y,c.y),t.x=Math.max(t.x,s.x,i.x,o.x,c.x),t.y=Math.max(t.y,s.y,i.y,o.y,c.y),{min:e,max:t}}transform(e){return this.v0.applyMatrix3(e),this.v1.applyMatrix3(e),this.v2.applyMatrix3(e),this.v3.applyMatrix3(e),this}getCommands(){const{v0:e,v1:t,v2:s,v3:i}=this;return[{type:"M",x:e.x,y:e.y},{type:"C",x1:t.x,y1:t.y,x2:s.x,y2:s.y,x:i.x,y:i.y}]}drawTo(e){const{v0:t,v1:s,v2:i,v3:o}=this;return e.moveTo(t.x,t.y),e.bezierCurveTo(s.x,s.y,i.x,i.y,o.x,o.y),this}copy(e){return super.copy(e),this.v0.copy(e.v0),this.v1.copy(e.v1),this.v2.copy(e.v2),this.v3.copy(e.v3),this}}const bt=new d,Z=new d,J=new d,R=new l;class K extends k{constructor(e=0,t=0,s=1,i=1,o=0,c=Math.PI*2,a=!1,h=0){super(),this.x=e,this.y=t,this.radiusX=s,this.radiusY=i,this.startAngle=o,this.endAngle=c,this.clockwise=a,this.rotation=h}getDivisions(e=12){return e*2}getPoint(e,t=new l){const s=Math.PI*2;let i=this.endAngle-this.startAngle;const o=Math.abs(i)<Number.EPSILON;for(;i<0;)i+=s;for(;i>s;)i-=s;i<Number.EPSILON&&(o?i=0:i=s),this.clockwise&&!o&&(i===s?i=-s:i=i-s);const c=this.startAngle+e*i;let a=this.x+this.radiusX*Math.cos(c),h=this.y+this.radiusY*Math.sin(c);if(this.rotation!==0){const n=Math.cos(this.rotation),u=Math.sin(this.rotation),y=a-this.x,p=h-this.y;a=y*n-p*u+this.x,h=y*u+p*n+this.y}return t.set(a,h)}getCommands(){const{x:e,y:t,radiusX:s,radiusY:i,startAngle:o,endAngle:c,clockwise:a}=this,h=!a,n=e+s*Math.cos(o),u=t+i*Math.sin(o),y=e+s*Math.cos(c),p=t+i*Math.sin(c),x=Math.abs(o-c),g=x>Math.PI?1:0,f=h?0:1,M=e+s*Math.cos(o+(c-o)/2),w=t+i*Math.sin(o+(c-o)/2);return x>=2*Math.PI?[{type:"M",x:n,y:u},{type:"A",rx:s,ry:i,angle:0,largeArcFlag:1,sweepFlag:f,x:M,y:w},{type:"A",rx:s,ry:i,angle:0,largeArcFlag:1,sweepFlag:f,x:n,y:u}]:[{type:"M",x:n,y:u},{type:"A",rx:s,ry:i,angle:0,largeArcFlag:g,sweepFlag:f,x:y,y:p}]}drawTo(e){const{x:t,y:s,radiusX:i,radiusY:o,rotation:c,startAngle:a,endAngle:h,clockwise:n}=this,u=t+i*Math.cos(a),y=s+o*Math.sin(a);return e.moveTo(u,y),e.ellipse(t,s,i,o,c,a,h,!n),this}transform(e){return R.set(this.x,this.y),R.applyMatrix3(e),this.x=R.x,this.y=R.y,It(e)?At(this,e):Ct(this,e),this}copy(e){return super.copy(e),this.x=e.x,this.y=e.y,this.radiusX=e.radiusX,this.radiusY=e.radiusY,this.startAngle=e.startAngle,this.endAngle=e.endAngle,this.clockwise=e.clockwise,this.rotation=e.rotation,this}}function At(r,e){const t=r.radiusX,s=r.radiusY,i=Math.cos(r.rotation),o=Math.sin(r.rotation),c=new l(t*i,t*o),a=new l(-s*o,s*i),h=c.applyMatrix3(e),n=a.applyMatrix3(e),u=bt.set(h.x,n.x,0,h.y,n.y,0,0,0,1),y=Z.copy(u).invert(),g=J.copy(y).transpose().multiply(y).elements,f=kt(g[0],g[1],g[4]),M=Math.sqrt(f.rt1),w=Math.sqrt(f.rt2);if(r.radiusX=1/M,r.radiusY=1/w,r.rotation=Math.atan2(f.sn,f.cs),!((r.endAngle-r.startAngle)%(2*Math.PI)<Number.EPSILON)){const T=Z.set(M,0,0,0,w,0,0,0,1),C=J.set(f.cs,f.sn,0,-f.sn,f.cs,0,0,0,1),A=T.multiply(C).multiply(u),E=z=>{const{x:Y,y:Q}=new l(Math.cos(z),Math.sin(z)).applyMatrix3(A);return Math.atan2(Q,Y)};r.startAngle=E(r.startAngle),r.endAngle=E(r.endAngle),tt(e)&&(r.clockwise=!r.clockwise)}}function Ct(r,e){const t=et(e),s=st(e);r.radiusX*=t,r.radiusY*=s;const i=t>Number.EPSILON?Math.atan2(e.elements[1],e.elements[0]):Math.atan2(-e.elements[3],e.elements[4]);r.rotation+=i,tt(e)&&(r.startAngle*=-1,r.endAngle*=-1,r.clockwise=!r.clockwise)}function tt(r){const e=r.elements;return e[0]*e[4]-e[1]*e[3]<0}function It(r){const e=r.elements,t=e[0]*e[3]+e[1]*e[4];if(t===0)return!1;const s=et(r),i=st(r);return Math.abs(t/(s*i))>Number.EPSILON}function et(r){const e=r.elements;return Math.sqrt(e[0]*e[0]+e[1]*e[1])}function st(r){const e=r.elements;return Math.sqrt(e[3]*e[3]+e[4]*e[4])}function kt(r,e,t){let s,i,o,c,a;const h=r+t,n=r-t,u=Math.sqrt(n*n+4*e*e);return h>0?(s=.5*(h+u),a=1/s,i=r*a*t-e*a*e):h<0?i=.5*(h-u):(s=.5*u,i=-.5*u),n>0?o=n+u:o=n-u,Math.abs(o)>2*Math.abs(e)?(a=-2*e/o,c=1/Math.sqrt(1+a*a),o=a*c):Math.abs(e)===0?(o=1,c=0):(a=-.5*o/e,o=1/Math.sqrt(1+a*a),c=a*o),n>0&&(a=o,o=-c,c=a),{rt1:s,rt2:i,cs:o,sn:c}}class q extends k{constructor(e=new l,t=new l){super(),this.v1=e,this.v2=t}getDivisions(){return 1}getPoint(e,t=new l){return e===1?t.copy(this.v2):(t.copy(this.v2).sub(this.v1),t.multiplyScalar(e).add(this.v1)),t}getPointAt(e,t=new l){return this.getPoint(e,t)}getTangent(e,t=new l){return t.subVectors(this.v2,this.v1).normalize()}getTangentAt(e,t=new l){return this.getTangent(e,t)}getCommands(){const{v1:e,v2:t}=this;return[{type:"M",x:e.x,y:e.y},{type:"L",x:t.x,y:t.y}]}getMinMax(e=l.MAX,t=l.MIN){const{v1:s,v2:i}=this;return e.x=Math.min(e.x,s.x,i.x),e.y=Math.min(e.y,s.y,i.y),t.x=Math.max(t.x,s.x,i.x),t.y=Math.max(t.y,s.y,i.y),{min:e,max:t}}transform(e){return this.v1.applyMatrix3(e),this.v2.applyMatrix3(e),this}drawTo(e){const{v1:t,v2:s}=this;return e.moveTo(t.x,t.y),e.lineTo(s.x,s.y),this}copy(e){return super.copy(e),this.v1.copy(e.v1),this.v2.copy(e.v2),this}}class Lt extends k{constructor(t,s,i=0,o=1){super();b(this,"curves");b(this,"pointT",0);this.center=t,this.size=s,this.start=i,this.end=o;const{x:c,y:a}=this.center,h=new l(c+.5*this.size,a-.5*this.size),n=new l(c-.5*this.size,a-.5*this.size),u=new l(c,a+.5*this.size),y=new O(h,Math.SQRT1_2*this.size,-.25*Math.PI,.75*Math.PI),p=new O(n,Math.SQRT1_2*this.size,-.75*Math.PI,.25*Math.PI),x=new O(u,.5*Math.SQRT1_2*this.size,.75*Math.PI,1.25*Math.PI),g=new l(c,a+this.size),f=new l(c+this.size,a),M=new l().lerpVectors(f,g,.75),w=new l(c-this.size,a),I=new l().lerpVectors(w,g,.75),T=new q(f,M),C=new q(I,w);this.curves=[y,T,x,C,p]}getPoint(t){return this.getCurrentLine(t).getPoint(this.pointT)}getPointAt(t){return this.getPoint(t)}getCurrentLine(t){let s=(t*(this.end-this.start)+this.start)%1;s<0&&(s+=1),s*=9*Math.PI/8+1.5;let i;const o=.5*Math.PI;return s<o?(i=0,this.pointT=s/o):s<o+.75?(i=1,this.pointT=(s-o)/.75):s<5*Math.PI/8+.75?(i=2,this.pointT=(s-o-.75)/(Math.PI/8)):s<5*Math.PI/8+1.5?(i=3,this.pointT=(s-5*Math.PI/8-.75)/.75):(i=4,this.pointT=(s-5*Math.PI/8-1.5)/o),this.curves[i]}getTangent(t){return this.getCurrentLine(t).getTangent(this.pointT).normalize()}getNormal(t){const s=this.getCurrentLine(t);return new l(s.v2.y-s.v1.y,-(s.v2.x-s.v1.x)).normalize()}getCommands(){return this.curves.flatMap(t=>t.getCommands())}drawTo(t){return this.curves.forEach(s=>s.drawTo(t)),this}}class St extends k{constructor(t,s=0,i=0,o=0,c=1){super();b(this,"curves",[]);b(this,"points",[]);this.center=t,this.radius=s,this.num=i,this.start=o,this.end=c;for(let a=0;a<this.num;a++){let h=a*2*Math.PI/this.num;h-=.5*Math.PI;const n=new l(this.radius*Math.cos(h),this.radius*Math.sin(h));n.add(this.center),this.points.push(n)}for(let a=0;a<this.num;a++)this.curves.push(new q(this.points[a],this.points[(a+1)%this.num]))}getPoint(t){return this.getCurrentLine(t),this.currentLine.getPoint(this.pointK)}getPointAt(t){return this.getPoint(t)}getCurrentLine(t){let s=(t*(this.end-this.start)+this.start)%1;s<0&&(s+=1);const i=s*this.num,o=Math.floor(i);return this.pointK=i-o,this.currentLine=this.curves[o],this.currentLine}getTangent(t){return this.getCurrentLine(t).getTangent(0).normalize()}getNormal(t){const s=this.getCurrentLine(t);return new l(s.v2.y-s.v1.y,-(s.v2.x-s.v1.x)).normalize()}getCommands(){return this.curves.flatMap(t=>t.getCommands())}getMinMax(t=l.MAX,s=l.MIN){return this.curves.forEach(i=>i.getMinMax(t,s)),{min:t,max:s}}drawTo(t){return this.curves.forEach(s=>s.drawTo(t)),this}}class nt extends k{constructor(e=new l,t=new l,s=new l){super(),this.v0=e,this.v1=t,this.v2=s}getPoint(e,t=new l){const{v0:s,v1:i,v2:o}=this;return t.set(H(e,s.x,i.x,o.x),H(e,s.y,i.y,o.y)),t}getCommands(){const{v0:e,v1:t,v2:s}=this;return[{type:"M",x:e.x,y:e.y},{type:"Q",x1:t.x,y1:t.y,x:s.x,y:s.y}]}getMinMax(e=l.MAX,t=l.MIN){const{v0:s,v1:i,v2:o}=this,c=.5*(s.x+i.x),a=.5*(s.y+i.y),h=.5*(s.x+o.x),n=.5*(s.y+o.y);return e.x=Math.min(e.x,s.x,o.x,c,h),e.y=Math.min(e.y,s.y,o.y,a,n),t.x=Math.max(t.x,s.x,o.x,c,h),t.y=Math.max(t.y,s.y,o.y,a,n),{min:e,max:t}}transform(e){return this.v0.applyMatrix3(e),this.v1.applyMatrix3(e),this.v2.applyMatrix3(e),this}drawTo(e){const{v0:t,v1:s,v2:i}=this;return e.moveTo(t.x,t.y),e.quadraticCurveTo(s.x,s.y,i.x,i.y),this}copy(e){return super.copy(e),this.v0.copy(e.v0),this.v1.copy(e.v1),this.v2.copy(e.v2),this}}class it extends k{constructor(t,s,i=1,o=0,c=1){super();b(this,"curves",[]);b(this,"pointT",0);this.center=t,this.rx=s,this.aspectRatio=i,this.start=o,this.end=c;const{x:a,y:h}=this.center,n=this.rx,u=this.rx/this.aspectRatio,y=[new l(a-n,h-u),new l(a+n,h-u),new l(a+n,h+u),new l(a-n,h+u)];for(let p=0;p<4;p++)this.curves.push(new q(y[p],y[(p+1)%4]))}get x(){return this.center.x-this.rx}get y(){return this.center.y-this.rx/this.aspectRatio}get width(){return this.rx*2}get height(){return this.rx/this.aspectRatio*2}getPoint(t){return this.getCurrentLine(t).getPoint(this.pointT)}getPointAt(t){return this.getPoint(t)}getCurrentLine(t){let s=(t*(this.end-this.start)+this.start)%1;s<0&&(s+=1),s*=(1+this.aspectRatio)*2;let i;return s<this.aspectRatio?(i=0,this.pointT=s/this.aspectRatio):s<this.aspectRatio+1?(i=1,this.pointT=(s-this.aspectRatio)/1):s<2*this.aspectRatio+1?(i=2,this.pointT=(s-this.aspectRatio-1)/this.aspectRatio):(i=3,this.pointT=(s-2*this.aspectRatio-1)/1),this.curves[i]}getTangent(t){return this.getCurrentLine(t).getTangent(0).normalize()}getNormal(t){const{v1:s,v2:i}=this.getCurrentLine(t);return new l(i.y-s.y,-(i.x-s.x)).normalize()}getCommands(){return this.curves.flatMap(t=>t.getCommands())}getMinMax(t=l.MAX,s=l.MIN){return this.curves.forEach(i=>i.getMinMax(t,s)),{min:t,max:s}}drawTo(t){return this.curves.forEach(s=>s.drawTo(t)),this}}class rt extends k{constructor(e=[]){super(),this.points=e}getDivisions(e=12){return e*this.points.length}getPoint(e,t=new l){const{points:s}=this,i=(s.length-1)*e,o=Math.floor(i),c=i-o,a=s[o===0?o:o-1],h=s[o],n=s[o>s.length-2?s.length-1:o+1],u=s[o>s.length-3?s.length-1:o+2];return t.set(V(c,a.x,h.x,n.x,u.x),V(c,a.y,h.y,n.y,u.y)),t}copy(e){super.copy(e),this.points=[];for(let t=0,s=e.points.length;t<s;t++)this.points.push(e.points[t].clone());return this}}class X extends k{constructor(t){super();b(this,"curves",[]);b(this,"currentPoint",new l);b(this,"autoClose",!1);b(this,"_cacheLengths",[]);t&&this.setFromPoints(t)}addCurve(t){return this.curves.push(t),this}closePath(){const t=this.curves[0].getPoint(0),s=this.curves[this.curves.length-1].getPoint(1);return t.equals(s)||this.curves.push(new q(s,t)),this}getPoint(t,s=new l){const i=t*this.getLength(),o=this.getCurveLengths();let c=0;for(;c<o.length;){if(o[c]>=i){const a=o[c]-i,h=this.curves[c],n=h.getLength();return h.getPointAt(n===0?0:1-a/n,s)}c++}return s}getLength(){const t=this.getCurveLengths();return t[t.length-1]}updateArcLengths(){super.updateArcLengths(),this._cacheLengths=[],this.getCurveLengths()}getCurveLengths(){if(this._cacheLengths.length===this.curves.length)return this._cacheLengths;const t=[];let s=0;for(let i=0,o=this.curves.length;i<o;i++)s+=this.curves[i].getLength(),t.push(s);return this._cacheLengths=t,t}getSpacedPoints(t=40){const s=[];for(let i=0;i<=t;i++)s.push(this.getPoint(i/t));return this.autoClose&&s.push(s[0]),s}getPoints(t=12){const s=[];let i;for(let o=0,c=this.curves;o<c.length;o++){const a=c[o],h=a.getPoints(a.getDivisions(t));for(let n=0;n<h.length;n++){const u=h[n];i&&i.equals(u)||(s.push(u),i=u)}}return this.autoClose&&s.length>1&&!s[s.length-1].equals(s[0])&&s.push(s[0]),s}setFromPoints(t){this.moveTo(t[0].x,t[0].y);for(let s=1,i=t.length;s<i;s++)this.lineTo(t[s].x,t[s].y);return this}bezierCurveTo(t,s,i,o,c,a){return this.curves.push(new j(this.currentPoint.clone(),new l(t,s),new l(i,o),new l(c,a))),this.currentPoint.set(c,a),this}lineTo(t,s){const i=new q(this.currentPoint.clone(),new l(t,s));return this.curves.push(i),this.currentPoint.set(t,s),this}moveTo(t,s){return this.currentPoint.set(t,s),this}quadraticCurveTo(t,s,i,o){return this.curves.push(new nt(this.currentPoint.clone(),new l(t,s),new l(i,o))),this.currentPoint.set(i,o),this}rect(t,s,i,o){return this.curves.push(new it(new l(t+i/2,s+o/2),i/2,i/o)),this.currentPoint.set(t,s),this}splineThru(t){const s=[this.currentPoint.clone()].concat(t);return this.curves.push(new rt(s)),this.currentPoint.copy(t[t.length-1]),this}arc(t,s,i,o,c,a=!1){const h=this.currentPoint;return this.absarc(t+h.x,s+h.y,i,o,c,a),this}absarc(t,s,i,o,c,a=!1){return this.absellipse(t,s,i,i,o,c,a),this}ellipse(t,s,i,o,c,a,h=!1,n=0){const u=this.currentPoint;return this.absellipse(t+u.x,s+u.y,i,o,c,a,h,n),this}absellipse(t,s,i,o,c,a,h=!1,n=0){const u=new K(t,s,i,o,c,a,h,n);if(this.curves.length>0){const y=u.getPoint(0);y.equals(this.currentPoint)||this.lineTo(y.x,y.y)}return this.curves.push(u),this.currentPoint.copy(u.getPoint(1)),this}getCommands(){return this.curves.flatMap(t=>t.getCommands())}getMinMax(t=l.MAX,s=l.MIN){return this.curves.forEach(i=>i.getMinMax(t,s)),{min:t,max:s}}drawTo(t){return this.curves.forEach(s=>s.drawTo(t)),this}copy(t){super.copy(t),this.curves=[];for(let s=0,i=t.curves.length;s<i;s++){const o=t.curves[s];this.curves.push(o.clone())}return this.autoClose=t.autoClose,this.currentPoint.copy(t.currentPoint),this}}class L{constructor(e){b(this,"currentPath",new X);b(this,"paths",[this.currentPath]);b(this,"userData");e&&(e instanceof L?this.addPath(e):Array.isArray(e)?this.addCommands(e):this.addData(e))}addPath(e){return e instanceof L?this.paths.push(...e.paths.map(t=>t.clone())):this.paths.push(e),this}closePath(){return this.currentPath.closePath(),this}moveTo(e,t){return this.currentPath=new X,this.paths.push(this.currentPath),this.currentPath.moveTo(e,t),this}lineTo(e,t){return this.currentPath.lineTo(e,t),this}bezierCurveTo(e,t,s,i,o,c){return this.currentPath.bezierCurveTo(e,t,s,i,o,c),this}quadraticCurveTo(e,t,s,i){return this.currentPath.quadraticCurveTo(e,t,s,i),this}arc(e,t,s,i,o,c){return this.currentPath.absarc(e,t,s,i,o,!c),this}arcTo(e,t,s,i,o){const c=this.currentPath.currentPoint,a=c.x,h=c.y,n=e-a,u=t-h,y=s-e,p=i-t,x=Math.sqrt(n*n+u*u),g=Math.sqrt(y*y+p*p);if(x<o||g<o)return this.lineTo(s,i),this;const f={x:n/x,y:u/x},M={x:y/g,y:p/g},w=e-f.y*o,I=t+f.x*o,T=Math.atan2(f.y,f.x);let A=Math.atan2(M.y,M.x)-T;return A>Math.PI?A-=2*Math.PI:A<-Math.PI&&(A+=2*Math.PI),this.arc(w,I,o,T,T+A,!1),this.lineTo(s,i),this}ellipse(e,t,s,i,o,c,a,h){return this.currentPath.absellipse(e,t,s,i,c,a,!h,o),this}rect(e,t,s,i){return this.currentPath.rect(e,t,s,i),this}addCommands(e){return yt(e,this),this}addData(e){return this.addCommands(xt(e)),this}splineThru(e){return this.currentPath.splineThru(e),this}forEachCurve(e){return this.paths.forEach(t=>t.curves.forEach(s=>e(s))),this}transform(e){return this.forEachCurve(t=>t.transform(e)),this}getMinMax(e=new l,t=new l){return this.forEachCurve(s=>s.getMinMax(e,t)),{min:e,max:t}}getCommands(){return this.paths.flatMap(e=>e.curves.flatMap(t=>t.getCommands()))}getData(){return this.paths.map(e=>e.getData()).join(" ")}getBoundingBox(){const{min:e,max:t}=this.getMinMax();return{x:e.x,y:e.y,width:t.x-e.x,height:t.y-e.y}}getSvgString(){const{x:e,y:t,width:s,height:i}=this.getBoundingBox();return`<svg viewBox="${e} ${t} ${s} ${i}" xmlns="http://www.w3.org/2000/svg"><path fill="none" stroke="currentColor" d="${this.getData()}"></path></svg>`}getSvgDataUri(){return`data:image/svg+xml;base64,${btoa(this.getSvgString())}`}drawTo(e){this.forEachCurve(t=>{t.drawTo(e)})}strokeTo(e){this.drawTo(e),e.stroke()}fillTo(e){this.drawTo(e),e.fill()}}const _="px",ot=90,at=["mm","cm","in","pt","pc","px"],B={mm:{mm:1,cm:.1,in:1/25.4,pt:72/25.4,pc:6/25.4,px:-1},cm:{mm:10,cm:1,in:1/2.54,pt:72/2.54,pc:6/2.54,px:-1},in:{mm:25.4,cm:2.54,in:1,pt:72,pc:6,px:-1},pt:{mm:25.4/72,cm:2.54/72,in:1/72,pt:1,pc:6/72,px:-1},pc:{mm:25.4/6,cm:2.54/6,in:1/6,pt:72/6,pc:1,px:-1},px:{px:1}};function m(r){let e="px";if(typeof r=="string"||r instanceof String)for(let s=0,i=at.length;s<i;s++){const o=at[s];if(r.endsWith(o)){e=o,r=r.substring(0,r.length-o.length);break}}let t;return e==="px"&&_!=="px"?t=B.in[_]/ot:(t=B[e][_],t<0&&(t=B[e].in*ot)),t*Number.parseFloat(r)}const Nt=new d,F=new d,ct=new d,ht=new d;function $t(r,e,t){if(!(r.hasAttribute("transform")||r.nodeName==="use"&&(r.hasAttribute("x")||r.hasAttribute("y"))))return null;const s=Et(r);return t.length>0&&s.premultiply(t[t.length-1]),e.copy(s),t.push(s),s}function Et(r){const e=new d,t=Nt;if(r.nodeName==="use"&&(r.hasAttribute("x")||r.hasAttribute("y"))&&e.translate(m(r.getAttribute("x")),m(r.getAttribute("y"))),r.hasAttribute("transform")){const s=r.getAttribute("transform").split(")");for(let i=s.length-1;i>=0;i--){const o=s[i].trim();if(o==="")continue;const c=o.indexOf("("),a=o.length;if(c>0&&c<a){const h=o.slice(0,c),n=S(o.slice(c+1));switch(t.identity(),h){case"translate":if(n.length>=1){const u=n[0];let y=0;n.length>=2&&(y=n[1]),t.translate(u,y)}break;case"rotate":if(n.length>=1){let u=0,y=0,p=0;u=n[0]*Math.PI/180,n.length>=3&&(y=n[1],p=n[2]),F.makeTranslation(-y,-p),ct.makeRotation(u),ht.multiplyMatrices(ct,F),F.makeTranslation(y,p),t.multiplyMatrices(F,ht)}break;case"scale":n.length>=1&&t.scale(n[0],n[1]??n[0]);break;case"skewX":n.length===1&&t.set(1,Math.tan(n[0]*Math.PI/180),0,0,1,0,0,0,1);break;case"skewY":n.length===1&&t.set(1,0,0,Math.tan(n[0]*Math.PI/180),1,0,0,0,1);break;case"matrix":n.length===6&&t.set(n[0],n[2],n[4],n[1],n[3],n[5],0,0,1);break}}e.premultiply(t)}}return e}function zt(r){return new L().addPath(new X().absarc(m(r.getAttribute("cx")||0),m(r.getAttribute("cy")||0),m(r.getAttribute("r")||0),0,Math.PI*2))}function qt(r,e){if(!(!r.sheet||!r.sheet.cssRules||!r.sheet.cssRules.length))for(let t=0;t<r.sheet.cssRules.length;t++){const s=r.sheet.cssRules[t];if(s.type!==1)continue;const i=s.selectorText.split(/,/g).filter(Boolean).map(o=>o.trim());for(let o=0;o<i.length;o++){const c=Object.fromEntries(Object.entries(s.style).filter(([,a])=>a!==""));e[i[o]]=Object.assign(e[i[o]]||{},c)}}}function Dt(r){return new L().addPath(new X().absellipse(m(r.getAttribute("cx")||0),m(r.getAttribute("cy")||0),m(r.getAttribute("rx")||0),m(r.getAttribute("ry")||0),0,Math.PI*2))}function Xt(r){return new L().moveTo(m(r.getAttribute("x1")||0),m(r.getAttribute("y1")||0)).lineTo(m(r.getAttribute("x2")||0),m(r.getAttribute("y2")||0))}function Ot(r){const e=new L,t=r.getAttribute("d");return!t||t==="none"?null:(e.addData(t),e)}const Rt=/([+-]?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?)(?:,|\s)([+-]?\d*\.?\d+(?:e[+-]?\d+)?)/g;function Ft(r){var s;const e=new L;let t=0;return(s=r.getAttribute("points"))==null||s.replace(Rt,(i,o,c)=>{const a=m(o),h=m(c);return t===0?e.moveTo(a,h):e.lineTo(a,h),t++,i}),e.currentPath.autoClose=!0,e}const Yt=/([+-]?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?)(?:,|\s)([+-]?\d*\.?\d+(?:e[+-]?\d+)?)/g;function _t(r){var s;const e=new L;let t=0;return(s=r.getAttribute("points"))==null||s.replace(Yt,(i,o,c)=>{const a=m(o),h=m(c);return t===0?e.moveTo(a,h):e.lineTo(a,h),t++,i}),e.currentPath.autoClose=!1,e}function Bt(r){const e=m(r.getAttribute("x")||0),t=m(r.getAttribute("y")||0),s=m(r.getAttribute("rx")||r.getAttribute("ry")||0),i=m(r.getAttribute("ry")||r.getAttribute("rx")||0),o=m(r.getAttribute("width")),c=m(r.getAttribute("height")),a=1-.551915024494,h=new L;return h.moveTo(e+s,t),h.lineTo(e+o-s,t),(s!==0||i!==0)&&h.bezierCurveTo(e+o-s*a,t,e+o,t+i*a,e+o,t+i),h.lineTo(e+o,t+c-i),(s!==0||i!==0)&&h.bezierCurveTo(e+o,t+c-i*a,e+o-s*a,t+c,e+o-s,t+c),h.lineTo(e+s,t+c),(s!==0||i!==0)&&h.bezierCurveTo(e+s*a,t+c,e,t+c-i*a,e,t+c-i),h.lineTo(e,t+i),(s!==0||i!==0)&&h.bezierCurveTo(e,t+i*a,e+s*a,t,e+s,t),h}function N(r,e,t){e=Object.assign({},e);let s={};if(r.hasAttribute("class")){const a=r.getAttribute("class").split(/\s/).filter(Boolean).map(h=>h.trim());for(let h=0;h<a.length;h++)s=Object.assign(s,t[`.${a[h]}`])}r.hasAttribute("id")&&(s=Object.assign(s,t[`#${r.getAttribute("id")}`]));function i(a,h,n){n===void 0&&(n=function(y){return y.startsWith("url")&&console.warn("url access in attributes is not implemented."),y}),r.hasAttribute(a)&&(e[h]=n(r.getAttribute(a))),s[a]&&(e[h]=n(s[a])),r.style&&r.style[a]!==""&&(e[h]=n(r.style[a]))}function o(a){return Math.max(0,Math.min(1,m(a)))}function c(a){return Math.max(0,m(a))}return i("fill","fill"),i("fill-opacity","fillOpacity",o),i("fill-rule","fillRule"),i("opacity","opacity",o),i("stroke","stroke"),i("stroke-dashoffset","strokeDashoffset"),i("stroke-dasharray","strokeDasharray"),i("stroke-linecap","strokeLineCap"),i("stroke-linejoin","strokeLineJoin"),i("stroke-miterlimit","strokeMiterLimit",c),i("stroke-opacity","strokeOpacity",o),i("stroke-width","strokeWidth",c),i("visibility","visibility"),e}function G(r,e,t=[]){var u;if(r.nodeType!==1)return t;let s=!1,i=null;const o={};switch(r.nodeName){case"svg":e=N(r,e,o);break;case"style":qt(r,o);break;case"g":e=N(r,e,o);break;case"path":e=N(r,e,o),r.hasAttribute("d")&&(i=Ot(r));break;case"rect":e=N(r,e,o),i=Bt(r);break;case"polygon":e=N(r,e,o),i=Ft(r);break;case"polyline":e=N(r,e,o),i=_t(r);break;case"circle":e=N(r,e,o),i=zt(r);break;case"ellipse":e=N(r,e,o),i=Dt(r);break;case"line":e=N(r,e,o),i=Xt(r);break;case"defs":s=!0;break;case"use":{e=N(r,e,o);const p=(r.getAttributeNS("http://www.w3.org/1999/xlink","href")||"").substring(1),x=(u=r.viewportElement)==null?void 0:u.getElementById(p);x?G(x,e,t):console.warn(`'use node' references non-existent node id: ${p}`);break}default:console.warn(r);break}const c=new d,a=[],h=$t(r,c,a);i&&(i.transform(c),t.push(i),i.userData={node:r,style:e});const n=r.childNodes;for(let y=0,p=n.length;y<p;y++){const x=n[y];s&&x.nodeName!=="style"&&x.nodeName!=="defs"||G(x,e,t)}return h&&(a.pop(),a.length>0?c.copy(a[a.length-1]):c.identity()),t}function Gt(r){let e;return typeof r=="string"?e=new DOMParser().parseFromString(r,"image/svg+xml").documentElement:e=r,G(e,{fill:"#000",fillOpacity:1,strokeOpacity:1,strokeWidth:1,strokeLineJoin:"miter",strokeLineCap:"butt",strokeMiterLimit:4})}v.CircleCurve=O,v.CubicBezierCurve=j,v.Curve=k,v.CurvePath=X,v.EllipseCurve=K,v.HeartCurve=Lt,v.LineCurve=q,v.Matrix3=d,v.Path2D=L,v.PloygonCurve=St,v.Point2D=l,v.QuadraticBezierCurve=nt,v.RectangularCurve=it,v.SplineCurve=rt,v.parseSvg=Gt,Object.defineProperty(v,Symbol.toStringTag,{value:"Module"})});
1
+ (function(v,d){typeof exports=="object"&&typeof module<"u"?d(exports):typeof define=="function"&&define.amd?define(["exports"],d):(v=typeof globalThis<"u"?globalThis:v||self,d(v.modernPath2d={}))})(this,function(v){"use strict";var Qt=Object.defineProperty;var Ut=(v,d,$)=>d in v?Qt(v,d,{enumerable:!0,configurable:!0,writable:!0,value:$}):v[d]=$;var b=(v,d,$)=>Ut(v,typeof d!="symbol"?d+"":d,$);class d{constructor(e=1,t=0,s=0,i=0,o=1,h=0,a=0,c=0,n=1){b(this,"elements",[]);this.set(e,t,s,i,o,h,a,c,n)}set(e,t,s,i,o,h,a,c,n){const u=this.elements;return u[0]=e,u[1]=i,u[2]=a,u[3]=t,u[4]=o,u[5]=c,u[6]=s,u[7]=h,u[8]=n,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(e){const t=this.elements,s=e.elements;return t[0]=s[0],t[1]=s[1],t[2]=s[2],t[3]=s[3],t[4]=s[4],t[5]=s[5],t[6]=s[6],t[7]=s[7],t[8]=s[8],this}multiply(e){return this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,t){const s=e.elements,i=t.elements,o=this.elements,h=s[0],a=s[3],c=s[6],n=s[1],u=s[4],y=s[7],p=s[2],x=s[5],g=s[8],f=i[0],M=i[3],w=i[6],k=i[1],T=i[4],C=i[7],A=i[2],E=i[5],z=i[8];return o[0]=h*f+a*k+c*A,o[3]=h*M+a*T+c*E,o[6]=h*w+a*C+c*z,o[1]=n*f+u*k+y*A,o[4]=n*M+u*T+y*E,o[7]=n*w+u*C+y*z,o[2]=p*f+x*k+g*A,o[5]=p*M+x*T+g*E,o[8]=p*w+x*C+g*z,this}invert(){const e=this.elements,t=e[0],s=e[1],i=e[2],o=e[3],h=e[4],a=e[5],c=e[6],n=e[7],u=e[8],y=u*h-a*n,p=a*c-u*o,x=n*o-h*c,g=t*y+s*p+i*x;if(g===0)return this.set(0,0,0,0,0,0,0,0,0);const f=1/g;return e[0]=y*f,e[1]=(i*n-u*s)*f,e[2]=(a*s-i*h)*f,e[3]=p*f,e[4]=(u*t-i*c)*f,e[5]=(i*o-a*t)*f,e[6]=x*f,e[7]=(s*c-n*t)*f,e[8]=(h*t-s*o)*f,this}transpose(){let e;const t=this.elements;return e=t[1],t[1]=t[3],t[3]=e,e=t[2],t[2]=t[6],t[6]=e,e=t[5],t[5]=t[7],t[7]=e,this}scale(e,t){return this.premultiply($.makeScale(e,t)),this}rotate(e){return this.premultiply($.makeRotation(-e)),this}translate(e,t){return this.premultiply($.makeTranslation(e,t)),this}makeTranslation(e,t){return this.set(1,0,e,0,1,t,0,0,1),this}makeRotation(e){const t=Math.cos(e),s=Math.sin(e);return this.set(t,-s,0,s,t,0,0,0,1),this}makeScale(e,t){return this.set(e,0,0,0,t,0,0,0,1),this}fromArray(e,t=0){for(let s=0;s<9;s++)this.elements[s]=e[s+t];return this}clone(){return new this.constructor().fromArray(this.elements)}}const $=new d;class l{constructor(e=0,t=0){this.x=e,this.y=t}static get MAX(){return new l(1/0,1/0)}static get MIN(){return new l(-1/0,-1/0)}set(e,t){return this.x=e,this.y=t,this}add(e){return this.x+=e.x,this.y+=e.y,this}sub(e){return this.x-=e.x,this.y-=e.y,this}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){const t=this.x-e.x,s=this.y-e.y;return t*t+s*s}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}multiplyScalar(e){return this.x*=e,this.y*=e,this}divideScalar(e){return this.multiplyScalar(1/e)}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this}normalize(){return this.divideScalar(this.length()||1)}lerpVectors(e,t,s){return this.x=e.x+(t.x-e.x)*s,this.y=e.y+(t.y-e.y)*s,this}equals(e){return this.x===e.x&&this.y===e.y}applyMatrix3(e){const[t,s,i,o,h,a]=e.elements,{x:c,y:n}=this;return this.set(t*c+s*n+i,o*c+h*n+a),this}copy(e){return this.x=e.x,this.y=e.y,this}clone(){return new l(this.x,this.y)}}function U(r,e,t,s){const i=r*t+e*s,o=Math.sqrt(r*r+e*e)*Math.sqrt(t*t+s*s);let h=Math.acos(Math.max(-1,Math.min(1,i/o)));return r*s-e*t<0&&(h=-h),h}function lt(r,e,t,s,i,o,h,a){if(e===0||t===0){r.lineTo(a.x,a.y);return}s=s*Math.PI/180,e=Math.abs(e),t=Math.abs(t);const c=(h.x-a.x)/2,n=(h.y-a.y)/2,u=Math.cos(s)*c+Math.sin(s)*n,y=-Math.sin(s)*c+Math.cos(s)*n;let p=e*e,x=t*t;const g=u*u,f=y*y,M=g/p+f/x;if(M>1){const ut=Math.sqrt(M);e=ut*e,t=ut*t,p=e*e,x=t*t}const w=p*f+x*g,k=(p*x-w)/w;let T=Math.sqrt(Math.max(0,k));i===o&&(T=-T);const C=T*e*y/t,A=-T*t*u/e,E=Math.cos(s)*C-Math.sin(s)*A+(h.x+a.x)/2,z=Math.sin(s)*C+Math.cos(s)*A+(h.y+a.y)/2,Y=U(1,0,(u-C)/e,(y-A)/t),Q=U((u-C)/e,(y-A)/t,(-u-C)/e,(-y-A)/t)%(Math.PI*2);r.currentPath.absellipse(E,z,e,t,Y,Y+Q,o===0,s)}function D(r,e){return r-(e-r)}function yt(r,e){const t=new l,s=new l,i=new l;let o=!0,h=!1;for(let a=0,c=r.length;a<c;a++){const n=r[a];if(o&&(h=!0,o=!1),n.type==="m"||n.type==="M")n.type==="m"?(t.x+=n.x,t.y+=n.y):(t.x=n.x,t.y=n.y),s.x=t.x,s.y=t.y,e.moveTo(t.x,t.y),a===0&&i.copy(t);else if(n.type==="h"||n.type==="H")n.type==="h"?t.x+=n.x:t.x=n.x,s.x=t.x,s.y=t.y,e.lineTo(t.x,t.y),h&&i.copy(t);else if(n.type==="v"||n.type==="V")n.type==="v"?t.y+=n.y:t.y=n.y,s.x=t.x,s.y=t.y,e.lineTo(t.x,t.y),h&&i.copy(t);else if(n.type==="l"||n.type==="L")n.type==="l"?(t.x+=n.x,t.y+=n.y):(t.x=n.x,t.y=n.y),s.x=t.x,s.y=t.y,e.lineTo(t.x,t.y),h&&i.copy(t);else if(n.type==="c"||n.type==="C")n.type==="c"?(e.bezierCurveTo(t.x+n.x1,t.y+n.y1,t.x+n.x2,t.y+n.y2,t.x+n.x,t.y+n.y),s.x=t.x+n.x2,s.y=t.y+n.y2,t.x+=n.x,t.y+=n.y):(e.bezierCurveTo(n.x1,n.y1,n.x2,n.y2,n.x,n.y),s.x=n.x2,s.y=n.y2,t.x=n.x,t.y=n.y),h&&i.copy(t);else if(n.type==="s"||n.type==="S")n.type==="s"?(e.bezierCurveTo(D(t.x,s.x),D(t.y,s.y),t.x+n.x2,t.y+n.y2,t.x+n.x,t.y+n.y),s.x=t.x+n.x2,s.y=t.y+n.y2,t.x+=n.x,t.y+=n.y):(e.bezierCurveTo(D(t.x,s.x),D(t.y,s.y),n.x2,n.y2,n.x,n.y),s.x=n.x2,s.y=n.y2,t.x=n.x,t.y=n.y),h&&i.copy(t);else if(n.type==="q"||n.type==="Q")n.type==="q"?(e.quadraticCurveTo(t.x+n.x1,t.y+n.y1,t.x+n.x,t.y+n.y),s.x=t.x+n.x1,s.y=t.y+n.y1,t.x+=n.x,t.y+=n.y):(e.quadraticCurveTo(n.x1,n.y1,n.x,n.y),s.x=n.x1,s.y=n.y1,t.x=n.x,t.y=n.y),h&&i.copy(t);else if(n.type==="t"||n.type==="T"){const u=D(t.x,s.x),y=D(t.y,s.y);s.x=u,s.y=y,n.type==="t"?(e.quadraticCurveTo(u,y,t.x+n.x,t.y+n.y),t.x+=n.x,t.y+=n.y):(e.quadraticCurveTo(u,y,n.x,n.y),t.x=n.x,t.y=n.y),h&&i.copy(t)}else if(n.type==="a"||n.type==="A"){if(n.type==="a"){if(n.x===0&&n.y===0)continue;t.x+=n.x,t.y+=n.y}else{if(n.x===t.x&&n.y===t.y)continue;t.x=n.x,t.y=n.y}const u=t.clone();s.x=t.x,s.y=t.y,lt(e,n.rx,n.ry,n.angle,n.largeArcFlag,n.sweepFlag,u,t),h&&i.copy(t)}else n.type==="z"||n.type==="Z"?(e.currentPath.autoClose=!0,e.currentPath.curves.length>0&&(t.copy(i),e.currentPath.currentPoint.copy(t),o=!0)):console.warn(n);h=!1}}const P={SEPARATOR:/[ \t\r\n,.\-+]/,WHITESPACE:/[ \t\r\n]/,DIGIT:/\d/,SIGN:/[-+]/,POINT:/\./,COMMA:/,/,EXP:/e/i,FLAGS:/[01]/};function S(r,e,t=0){let a=0,c=!0,n="",u="";const y=[];function p(M,w,k){const T=new SyntaxError(`Unexpected character "${M}" at index ${w}.`);throw T.partial=k,T}function x(){n!==""&&(u===""?y.push(Number(n)):y.push(Number(n)*10**Number(u))),n="",u=""}let g;const f=r.length;for(let M=0;M<f;M++){if(g=r[M],Array.isArray(e)&&e.includes(y.length%t)&&P.FLAGS.test(g)){a=1,n=g,x();continue}if(a===0){if(P.WHITESPACE.test(g))continue;if(P.DIGIT.test(g)||P.SIGN.test(g)){a=1,n=g;continue}if(P.POINT.test(g)){a=2,n=g;continue}P.COMMA.test(g)&&(c&&p(g,M,y),c=!0)}if(a===1){if(P.DIGIT.test(g)){n+=g;continue}if(P.POINT.test(g)){n+=g,a=2;continue}if(P.EXP.test(g)){a=3;continue}P.SIGN.test(g)&&n.length===1&&P.SIGN.test(n[0])&&p(g,M,y)}if(a===2){if(P.DIGIT.test(g)){n+=g;continue}if(P.EXP.test(g)){a=3;continue}P.POINT.test(g)&&n[n.length-1]==="."&&p(g,M,y)}if(a===3){if(P.DIGIT.test(g)){u+=g;continue}if(P.SIGN.test(g)){if(u===""){u+=g;continue}u.length===1&&P.SIGN.test(u)&&p(g,M,y)}}P.WHITESPACE.test(g)?(x(),a=0,c=!1):P.COMMA.test(g)?(x(),a=0,c=!0):P.SIGN.test(g)?(x(),a=1,n=g):P.POINT.test(g)?(x(),a=2,n=g):p(g,M,y)}return x(),y}function gt(r){switch(r.type){case"m":case"M":return`${r.type} ${r.x} ${r.y}`;case"h":case"H":return`${r.type} ${r.x}`;case"v":case"V":return`${r.type} ${r.y}`;case"l":case"L":return`${r.type} ${r.x} ${r.y}`;case"c":case"C":return`${r.type} ${r.x1} ${r.y1} ${r.x2} ${r.y2} ${r.x} ${r.y}`;case"s":case"S":return`${r.type} ${r.x2} ${r.y2} ${r.x} ${r.y}`;case"q":case"Q":return`${r.type} ${r.x1} ${r.y1} ${r.x} ${r.y}`;case"t":case"T":return`${r.type} ${r.x} ${r.y}`;case"a":case"A":return`${r.type} ${r.rx} ${r.ry} ${r.angle} ${r.largeArcFlag} ${r.sweepFlag} ${r.x} ${r.y}`;case"z":case"Z":return r.type;default:return""}}function pt(r){let e="";for(let t=0,s=r.length;t<s;t++)e+=`${gt(r[t])} `;return e}const ft=/[a-df-z][^a-df-z]*/gi;function xt(r){const e=[],t=r.match(ft);if(!t)return e;for(let s=0,i=t.length;s<i;s++){const o=t[s],h=o.charAt(0),a=o.slice(1).trim();let c;switch(h){case"m":case"M":c=S(a);for(let n=0,u=c.length;n<u;n+=2)n===0?e.push({type:h,x:c[n],y:c[n+1]}):e.push({type:h==="m"?"l":"L",x:c[n],y:c[n+1]});break;case"h":case"H":c=S(a);for(let n=0,u=c.length;n<u;n++)e.push({type:h,x:c[n]});break;case"v":case"V":c=S(a);for(let n=0,u=c.length;n<u;n++)e.push({type:h,y:c[n]});break;case"l":case"L":c=S(a);for(let n=0,u=c.length;n<u;n+=2)e.push({type:h,x:c[n],y:c[n+1]});break;case"c":case"C":c=S(a);for(let n=0,u=c.length;n<u;n+=6)e.push({type:h,x1:c[n],y1:c[n+1],x2:c[n+2],y2:c[n+3],x:c[n+4],y:c[n+5]});break;case"s":case"S":c=S(a);for(let n=0,u=c.length;n<u;n+=4)e.push({type:h,x2:c[n],y2:c[n+1],x:c[n+2],y:c[n+3]});break;case"q":case"Q":c=S(a);for(let n=0,u=c.length;n<u;n+=4)e.push({type:h,x1:c[n],y1:c[n+1],x:c[n+2],y:c[n+3]});break;case"t":case"T":c=S(a);for(let n=0,u=c.length;n<u;n+=2)e.push({type:h,x:c[n],y:c[n+1]});break;case"a":case"A":c=S(a,[3,4],7);for(let n=0,u=c.length;n<u;n+=7)e.push({type:h,rx:c[n],ry:c[n+1],angle:c[n+2],largeArcFlag:c[n+3],sweepFlag:c[n+4],x:c[n+5],y:c[n+6]});break;case"z":case"Z":e.push({type:h});break;default:console.warn(o)}}return e}class L{constructor(){b(this,"arcLengthDivisions",200);b(this,"_cacheArcLengths");b(this,"_needsUpdate",!1)}getPointAt(e,t=new l){return this.getPoint(this.getUtoTmapping(e),t)}getPoints(e=5){const t=[];for(let s=0;s<=e;s++)t.push(this.getPoint(s/e));return t}getSpacedPoints(e=5){const t=[];for(let s=0;s<=e;s++)t.push(this.getPointAt(s/e));return t}getLength(){const e=this.getLengths();return e[e.length-1]}getLengths(e=this.arcLengthDivisions){if(this._cacheArcLengths&&this._cacheArcLengths.length===e+1&&!this._needsUpdate)return this._cacheArcLengths;this._needsUpdate=!1;const t=[];let s,i=this.getPoint(0),o=0;t.push(0);for(let h=1;h<=e;h++)s=this.getPoint(h/e),o+=s.distanceTo(i),t.push(o),i=s;return this._cacheArcLengths=t,t}updateArcLengths(){this._needsUpdate=!0,this.getLengths()}getUtoTmapping(e,t){const s=this.getLengths();let i=0;const o=s.length;let h;t?h=t:h=e*s[o-1];let a=0,c=o-1,n;for(;a<=c;)if(i=Math.floor(a+(c-a)/2),n=s[i]-h,n<0)a=i+1;else if(n>0)c=i-1;else{c=i;break}if(i=c,s[i]===h)return i/(o-1);const u=s[i],p=s[i+1]-u,x=(h-u)/p;return(i+x)/(o-1)}getTangent(e,t=new l){let i=e-1e-4,o=e+1e-4;return i<0&&(i=0),o>1&&(o=1),t.copy(this.getPoint(o)).sub(this.getPoint(i)).normalize()}getTangentAt(e,t=new l){return this.getTangent(this.getUtoTmapping(e),t)}transform(e){return this}getDivisions(e){return e}getMinMax(e=l.MAX,t=l.MIN){return{min:e,max:t}}getCommands(){return[]}getData(){return pt(this.getCommands())}drawTo(e){return this}copy(e){return this.arcLengthDivisions=e.arcLengthDivisions,this}clone(){return new this.constructor().copy(this)}}class O extends L{constructor(e,t,s=0,i=Math.PI*2){super(),this.center=e,this.radius=t,this.start=s,this.end=i}getPoint(e){const{radius:t,center:s}=this;return s.clone().add(this.getNormal(e).clone().multiplyScalar(t))}getTangent(e){const{x:t,y:s}=this.getNormal(e);return new l(-s,t)}getNormal(e){const{start:t,end:s}=this,i=e*(s-t)+t-.5*Math.PI;return new l(Math.cos(i),Math.sin(i))}getMinMax(e=l.MAX,t=l.MIN){return e.x=Math.min(e.x,this.center.x-this.radius),e.y=Math.min(e.y,this.center.y-this.radius),t.x=Math.max(t.x,this.center.x+this.radius),t.y=Math.max(t.y,this.center.y+this.radius),{min:e,max:t}}}function V(r,e,t,s,i){const o=(s-e)*.5,h=(i-t)*.5,a=r*r,c=r*a;return(2*t-2*s+o+h)*c+(-3*t+3*s-2*o-h)*a+o*r+t}function Mt(r,e){const t=1-r;return t*t*e}function vt(r,e){return 2*(1-r)*r*e}function mt(r,e){return r*r*e}function H(r,e,t,s){return Mt(r,e)+vt(r,t)+mt(r,s)}function dt(r,e){const t=1-r;return t*t*t*e}function Pt(r,e){const t=1-r;return 3*t*t*r*e}function Tt(r,e){return 3*(1-r)*r*r*e}function wt(r,e){return r*r*r*e}function W(r,e,t,s,i){return dt(r,e)+Pt(r,t)+Tt(r,s)+wt(r,i)}class j extends L{constructor(e=new l,t=new l,s=new l,i=new l){super(),this.v0=e,this.v1=t,this.v2=s,this.v3=i}getPoint(e,t=new l){const{v0:s,v1:i,v2:o,v3:h}=this;return t.set(W(e,s.x,i.x,o.x,h.x),W(e,s.y,i.y,o.y,h.y)),t}transform(e){return this.v0.applyMatrix3(e),this.v1.applyMatrix3(e),this.v2.applyMatrix3(e),this.v3.applyMatrix3(e),this}getMinMax(e=l.MAX,t=l.MIN){const{v0:s,v1:i,v2:o,v3:h}=this;return e.x=Math.min(e.x,s.x,i.x,o.x,h.x),e.y=Math.min(e.y,s.y,i.y,o.y,h.y),t.x=Math.max(t.x,s.x,i.x,o.x,h.x),t.y=Math.max(t.y,s.y,i.y,o.y,h.y),{min:e,max:t}}getCommands(){const{v0:e,v1:t,v2:s,v3:i}=this;return[{type:"M",x:e.x,y:e.y},{type:"C",x1:t.x,y1:t.y,x2:s.x,y2:s.y,x:i.x,y:i.y}]}drawTo(e){const{v0:t,v1:s,v2:i,v3:o}=this;return e.moveTo(t.x,t.y),e.bezierCurveTo(s.x,s.y,i.x,i.y,o.x,o.y),this}copy(e){return super.copy(e),this.v0.copy(e.v0),this.v1.copy(e.v1),this.v2.copy(e.v2),this.v3.copy(e.v3),this}}const bt=new d,Z=new d,J=new d,R=new l;class K extends L{constructor(e=0,t=0,s=1,i=1,o=0,h=Math.PI*2,a=!1,c=0){super(),this.x=e,this.y=t,this.radiusX=s,this.radiusY=i,this.startAngle=o,this.endAngle=h,this.clockwise=a,this.rotation=c}getPoint(e,t=new l){const s=Math.PI*2;let i=this.endAngle-this.startAngle;const o=Math.abs(i)<Number.EPSILON;for(;i<0;)i+=s;for(;i>s;)i-=s;i<Number.EPSILON&&(o?i=0:i=s),this.clockwise&&!o&&(i===s?i=-s:i=i-s);const h=this.startAngle+e*i;let a=this.x+this.radiusX*Math.cos(h),c=this.y+this.radiusY*Math.sin(h);if(this.rotation!==0){const n=Math.cos(this.rotation),u=Math.sin(this.rotation),y=a-this.x,p=c-this.y;a=y*n-p*u+this.x,c=y*u+p*n+this.y}return t.set(a,c)}getDivisions(e=12){return e*2}getCommands(){const{x:e,y:t,radiusX:s,radiusY:i,startAngle:o,endAngle:h,clockwise:a}=this,c=!a,n=e+s*Math.cos(o),u=t+i*Math.sin(o),y=e+s*Math.cos(h),p=t+i*Math.sin(h),x=Math.abs(o-h),g=x>Math.PI?1:0,f=c?0:1,M=e+s*Math.cos(o+(h-o)/2),w=t+i*Math.sin(o+(h-o)/2);return x>=2*Math.PI?[{type:"M",x:n,y:u},{type:"A",rx:s,ry:i,angle:0,largeArcFlag:1,sweepFlag:f,x:M,y:w},{type:"A",rx:s,ry:i,angle:0,largeArcFlag:1,sweepFlag:f,x:n,y:u}]:[{type:"M",x:n,y:u},{type:"A",rx:s,ry:i,angle:0,largeArcFlag:g,sweepFlag:f,x:y,y:p}]}drawTo(e){const{x:t,y:s,radiusX:i,radiusY:o,rotation:h,startAngle:a,endAngle:c,clockwise:n}=this,u=t+i*Math.cos(a),y=s+o*Math.sin(a);return e.moveTo(u,y),e.ellipse(t,s,i,o,h,a,c,!n),this}transform(e){return R.set(this.x,this.y),R.applyMatrix3(e),this.x=R.x,this.y=R.y,It(e)?At(this,e):Ct(this,e),this}copy(e){return super.copy(e),this.x=e.x,this.y=e.y,this.radiusX=e.radiusX,this.radiusY=e.radiusY,this.startAngle=e.startAngle,this.endAngle=e.endAngle,this.clockwise=e.clockwise,this.rotation=e.rotation,this}}function At(r,e){const t=r.radiusX,s=r.radiusY,i=Math.cos(r.rotation),o=Math.sin(r.rotation),h=new l(t*i,t*o),a=new l(-s*o,s*i),c=h.applyMatrix3(e),n=a.applyMatrix3(e),u=bt.set(c.x,n.x,0,c.y,n.y,0,0,0,1),y=Z.copy(u).invert(),g=J.copy(y).transpose().multiply(y).elements,f=kt(g[0],g[1],g[4]),M=Math.sqrt(f.rt1),w=Math.sqrt(f.rt2);if(r.radiusX=1/M,r.radiusY=1/w,r.rotation=Math.atan2(f.sn,f.cs),!((r.endAngle-r.startAngle)%(2*Math.PI)<Number.EPSILON)){const T=Z.set(M,0,0,0,w,0,0,0,1),C=J.set(f.cs,f.sn,0,-f.sn,f.cs,0,0,0,1),A=T.multiply(C).multiply(u),E=z=>{const{x:Y,y:Q}=new l(Math.cos(z),Math.sin(z)).applyMatrix3(A);return Math.atan2(Q,Y)};r.startAngle=E(r.startAngle),r.endAngle=E(r.endAngle),tt(e)&&(r.clockwise=!r.clockwise)}}function Ct(r,e){const t=et(e),s=st(e);r.radiusX*=t,r.radiusY*=s;const i=t>Number.EPSILON?Math.atan2(e.elements[1],e.elements[0]):Math.atan2(-e.elements[3],e.elements[4]);r.rotation+=i,tt(e)&&(r.startAngle*=-1,r.endAngle*=-1,r.clockwise=!r.clockwise)}function tt(r){const e=r.elements;return e[0]*e[4]-e[1]*e[3]<0}function It(r){const e=r.elements,t=e[0]*e[3]+e[1]*e[4];if(t===0)return!1;const s=et(r),i=st(r);return Math.abs(t/(s*i))>Number.EPSILON}function et(r){const e=r.elements;return Math.sqrt(e[0]*e[0]+e[1]*e[1])}function st(r){const e=r.elements;return Math.sqrt(e[3]*e[3]+e[4]*e[4])}function kt(r,e,t){let s,i,o,h,a;const c=r+t,n=r-t,u=Math.sqrt(n*n+4*e*e);return c>0?(s=.5*(c+u),a=1/s,i=r*a*t-e*a*e):c<0?i=.5*(c-u):(s=.5*u,i=-.5*u),n>0?o=n+u:o=n-u,Math.abs(o)>2*Math.abs(e)?(a=-2*e/o,h=1/Math.sqrt(1+a*a),o=a*h):Math.abs(e)===0?(o=1,h=0):(a=-.5*o/e,o=1/Math.sqrt(1+a*a),h=a*o),n>0&&(a=o,o=-h,h=a),{rt1:s,rt2:i,cs:o,sn:h}}class q extends L{constructor(e=new l,t=new l){super(),this.v1=e,this.v2=t}getPoint(e,t=new l){return e===1?t.copy(this.v2):(t.copy(this.v2).sub(this.v1),t.multiplyScalar(e).add(this.v1)),t}getPointAt(e,t=new l){return this.getPoint(e,t)}getTangent(e,t=new l){return t.subVectors(this.v2,this.v1).normalize()}getTangentAt(e,t=new l){return this.getTangent(e,t)}transform(e){return this.v1.applyMatrix3(e),this.v2.applyMatrix3(e),this}getDivisions(){return 1}getMinMax(e=l.MAX,t=l.MIN){const{v1:s,v2:i}=this;return e.x=Math.min(e.x,s.x,i.x),e.y=Math.min(e.y,s.y,i.y),t.x=Math.max(t.x,s.x,i.x),t.y=Math.max(t.y,s.y,i.y),{min:e,max:t}}getCommands(){const{v1:e,v2:t}=this;return[{type:"M",x:e.x,y:e.y},{type:"L",x:t.x,y:t.y}]}drawTo(e){const{v1:t,v2:s}=this;return e.moveTo(t.x,t.y),e.lineTo(s.x,s.y),this}copy(e){return super.copy(e),this.v1.copy(e.v1),this.v2.copy(e.v2),this}}class Lt extends L{constructor(t,s,i=0,o=1){super();b(this,"curves");b(this,"pointT",0);this.center=t,this.size=s,this.start=i,this.end=o;const{x:h,y:a}=this.center,c=new l(h+.5*this.size,a-.5*this.size),n=new l(h-.5*this.size,a-.5*this.size),u=new l(h,a+.5*this.size),y=new O(c,Math.SQRT1_2*this.size,-.25*Math.PI,.75*Math.PI),p=new O(n,Math.SQRT1_2*this.size,-.75*Math.PI,.25*Math.PI),x=new O(u,.5*Math.SQRT1_2*this.size,.75*Math.PI,1.25*Math.PI),g=new l(h,a+this.size),f=new l(h+this.size,a),M=new l().lerpVectors(f,g,.75),w=new l(h-this.size,a),k=new l().lerpVectors(w,g,.75),T=new q(f,M),C=new q(k,w);this.curves=[y,T,x,C,p]}getPoint(t){return this.getCurrentLine(t).getPoint(this.pointT)}getPointAt(t){return this.getPoint(t)}getCurrentLine(t){let s=(t*(this.end-this.start)+this.start)%1;s<0&&(s+=1),s*=9*Math.PI/8+1.5;let i;const o=.5*Math.PI;return s<o?(i=0,this.pointT=s/o):s<o+.75?(i=1,this.pointT=(s-o)/.75):s<5*Math.PI/8+.75?(i=2,this.pointT=(s-o-.75)/(Math.PI/8)):s<5*Math.PI/8+1.5?(i=3,this.pointT=(s-5*Math.PI/8-.75)/.75):(i=4,this.pointT=(s-5*Math.PI/8-1.5)/o),this.curves[i]}getTangent(t){return this.getCurrentLine(t).getTangent(this.pointT).normalize()}getNormal(t){const s=this.getCurrentLine(t);return new l(s.v2.y-s.v1.y,-(s.v2.x-s.v1.x)).normalize()}getCommands(){return this.curves.flatMap(t=>t.getCommands())}drawTo(t){return this.curves.forEach(s=>s.drawTo(t)),this}}class St extends L{constructor(t,s=0,i=0,o=0,h=1){super();b(this,"curves",[]);b(this,"points",[]);this.center=t,this.radius=s,this.num=i,this.start=o,this.end=h;for(let a=0;a<this.num;a++){let c=a*2*Math.PI/this.num;c-=.5*Math.PI;const n=new l(this.radius*Math.cos(c),this.radius*Math.sin(c));n.add(this.center),this.points.push(n)}for(let a=0;a<this.num;a++)this.curves.push(new q(this.points[a],this.points[(a+1)%this.num]))}getPoint(t){return this.getCurrentLine(t),this.currentLine.getPoint(this.pointK)}getPointAt(t){return this.getPoint(t)}getCurrentLine(t){let s=(t*(this.end-this.start)+this.start)%1;s<0&&(s+=1);const i=s*this.num,o=Math.floor(i);return this.pointK=i-o,this.currentLine=this.curves[o],this.currentLine}getTangent(t){return this.getCurrentLine(t).getTangent(0).normalize()}getNormal(t){const s=this.getCurrentLine(t);return new l(s.v2.y-s.v1.y,-(s.v2.x-s.v1.x)).normalize()}getCommands(){return this.curves.flatMap(t=>t.getCommands())}getMinMax(t=l.MAX,s=l.MIN){return this.curves.forEach(i=>i.getMinMax(t,s)),{min:t,max:s}}drawTo(t){return this.curves.forEach(s=>s.drawTo(t)),this}}class nt extends L{constructor(e=new l,t=new l,s=new l){super(),this.v0=e,this.v1=t,this.v2=s}getPoint(e,t=new l){const{v0:s,v1:i,v2:o}=this;return t.set(H(e,s.x,i.x,o.x),H(e,s.y,i.y,o.y)),t}transform(e){return this.v0.applyMatrix3(e),this.v1.applyMatrix3(e),this.v2.applyMatrix3(e),this}getMinMax(e=l.MAX,t=l.MIN){const{v0:s,v1:i,v2:o}=this,h=.5*(s.x+i.x),a=.5*(s.y+i.y),c=.5*(s.x+o.x),n=.5*(s.y+o.y);return e.x=Math.min(e.x,s.x,o.x,h,c),e.y=Math.min(e.y,s.y,o.y,a,n),t.x=Math.max(t.x,s.x,o.x,h,c),t.y=Math.max(t.y,s.y,o.y,a,n),{min:e,max:t}}getCommands(){const{v0:e,v1:t,v2:s}=this;return[{type:"M",x:e.x,y:e.y},{type:"Q",x1:t.x,y1:t.y,x:s.x,y:s.y}]}drawTo(e){const{v0:t,v1:s,v2:i}=this;return e.moveTo(t.x,t.y),e.quadraticCurveTo(s.x,s.y,i.x,i.y),this}copy(e){return super.copy(e),this.v0.copy(e.v0),this.v1.copy(e.v1),this.v2.copy(e.v2),this}}class it extends L{constructor(t,s,i=1,o=0,h=1){super();b(this,"curves",[]);b(this,"pointT",0);this.center=t,this.rx=s,this.aspectRatio=i,this.start=o,this.end=h;const{x:a,y:c}=this.center,n=this.rx,u=this.rx/this.aspectRatio,y=[new l(a-n,c-u),new l(a+n,c-u),new l(a+n,c+u),new l(a-n,c+u)];for(let p=0;p<4;p++)this.curves.push(new q(y[p],y[(p+1)%4]))}get x(){return this.center.x-this.rx}get y(){return this.center.y-this.rx/this.aspectRatio}get width(){return this.rx*2}get height(){return this.rx/this.aspectRatio*2}getPoint(t){return this.getCurrentLine(t).getPoint(this.pointT)}getPointAt(t){return this.getPoint(t)}getCurrentLine(t){let s=(t*(this.end-this.start)+this.start)%1;s<0&&(s+=1),s*=(1+this.aspectRatio)*2;let i;return s<this.aspectRatio?(i=0,this.pointT=s/this.aspectRatio):s<this.aspectRatio+1?(i=1,this.pointT=(s-this.aspectRatio)/1):s<2*this.aspectRatio+1?(i=2,this.pointT=(s-this.aspectRatio-1)/this.aspectRatio):(i=3,this.pointT=(s-2*this.aspectRatio-1)/1),this.curves[i]}getTangent(t){return this.getCurrentLine(t).getTangent(0).normalize()}getNormal(t){const{v1:s,v2:i}=this.getCurrentLine(t);return new l(i.y-s.y,-(i.x-s.x)).normalize()}getCommands(){return this.curves.flatMap(t=>t.getCommands())}getMinMax(t=l.MAX,s=l.MIN){return this.curves.forEach(i=>i.getMinMax(t,s)),{min:t,max:s}}drawTo(t){return this.curves.forEach(s=>s.drawTo(t)),this}}class rt extends L{constructor(e=[]){super(),this.points=e}getDivisions(e=12){return e*this.points.length}getPoint(e,t=new l){const{points:s}=this,i=(s.length-1)*e,o=Math.floor(i),h=i-o,a=s[o===0?o:o-1],c=s[o],n=s[o>s.length-2?s.length-1:o+1],u=s[o>s.length-3?s.length-1:o+2];return t.set(V(h,a.x,c.x,n.x,u.x),V(h,a.y,c.y,n.y,u.y)),t}copy(e){super.copy(e),this.points=[];for(let t=0,s=e.points.length;t<s;t++)this.points.push(e.points[t].clone());return this}}class X extends L{constructor(t){super();b(this,"curves",[]);b(this,"currentPoint",new l);b(this,"autoClose",!1);b(this,"_cacheLengths",[]);t&&this.setFromPoints(t)}addCurve(t){return this.curves.push(t),this}closePath(){const t=this.curves[0].getPoint(0),s=this.curves[this.curves.length-1].getPoint(1);return t.equals(s)||this.curves.push(new q(s,t)),this}getPoint(t,s=new l){const i=t*this.getLength(),o=this.getCurveLengths();let h=0;for(;h<o.length;){if(o[h]>=i){const a=o[h]-i,c=this.curves[h],n=c.getLength();return c.getPointAt(n===0?0:1-a/n,s)}h++}return s}getLength(){const t=this.getCurveLengths();return t[t.length-1]}updateArcLengths(){super.updateArcLengths(),this._cacheLengths=[],this.getCurveLengths()}getCurveLengths(){if(this._cacheLengths.length===this.curves.length)return this._cacheLengths;const t=[];let s=0;for(let i=0,o=this.curves.length;i<o;i++)s+=this.curves[i].getLength(),t.push(s);return this._cacheLengths=t,t}getSpacedPoints(t=40){const s=[];for(let i=0;i<=t;i++)s.push(this.getPoint(i/t));return this.autoClose&&s.push(s[0]),s}getPoints(t=12){const s=[];let i;for(let o=0,h=this.curves;o<h.length;o++){const a=h[o],c=a.getPoints(a.getDivisions(t));for(let n=0;n<c.length;n++){const u=c[n];i&&i.equals(u)||(s.push(u),i=u)}}return this.autoClose&&s.length>1&&!s[s.length-1].equals(s[0])&&s.push(s[0]),s}setFromPoints(t){this.moveTo(t[0].x,t[0].y);for(let s=1,i=t.length;s<i;s++)this.lineTo(t[s].x,t[s].y);return this}bezierCurveTo(t,s,i,o,h,a){return this.curves.push(new j(this.currentPoint.clone(),new l(t,s),new l(i,o),new l(h,a))),this.currentPoint.set(h,a),this}lineTo(t,s){const i=new q(this.currentPoint.clone(),new l(t,s));return this.curves.push(i),this.currentPoint.set(t,s),this}moveTo(t,s){return this.currentPoint.set(t,s),this}quadraticCurveTo(t,s,i,o){return this.curves.push(new nt(this.currentPoint.clone(),new l(t,s),new l(i,o))),this.currentPoint.set(i,o),this}rect(t,s,i,o){return this.curves.push(new it(new l(t+i/2,s+o/2),i/2,i/o)),this.currentPoint.set(t,s),this}splineThru(t){const s=[this.currentPoint.clone()].concat(t);return this.curves.push(new rt(s)),this.currentPoint.copy(t[t.length-1]),this}arc(t,s,i,o,h,a=!1){const c=this.currentPoint;return this.absarc(t+c.x,s+c.y,i,o,h,a),this}absarc(t,s,i,o,h,a=!1){return this.absellipse(t,s,i,i,o,h,a),this}ellipse(t,s,i,o,h,a,c=!1,n=0){const u=this.currentPoint;return this.absellipse(t+u.x,s+u.y,i,o,h,a,c,n),this}absellipse(t,s,i,o,h,a,c=!1,n=0){const u=new K(t,s,i,o,h,a,c,n);if(this.curves.length>0){const y=u.getPoint(0);y.equals(this.currentPoint)||this.lineTo(y.x,y.y)}return this.curves.push(u),this.currentPoint.copy(u.getPoint(1)),this}getCommands(){return this.curves.flatMap(t=>t.getCommands())}getMinMax(t=l.MAX,s=l.MIN){return this.curves.forEach(i=>i.getMinMax(t,s)),{min:t,max:s}}drawTo(t){return this.curves.forEach(s=>s.drawTo(t)),this}copy(t){super.copy(t),this.curves=[];for(let s=0,i=t.curves.length;s<i;s++)this.curves.push(t.curves[s].clone());return this.autoClose=t.autoClose,this.currentPoint.copy(t.currentPoint),this}}class I{constructor(e){b(this,"currentPath",new X);b(this,"paths",[this.currentPath]);b(this,"userData");e&&(e instanceof I?this.addPath(e):Array.isArray(e)?this.addCommands(e):this.addData(e))}addPath(e){return e instanceof I?this.paths.push(...e.paths.map(t=>t.clone())):this.paths.push(e),this}closePath(){return this.currentPath.closePath(),this}moveTo(e,t){return this.currentPath=new X,this.paths.push(this.currentPath),this.currentPath.moveTo(e,t),this}lineTo(e,t){return this.currentPath.lineTo(e,t),this}bezierCurveTo(e,t,s,i,o,h){return this.currentPath.bezierCurveTo(e,t,s,i,o,h),this}quadraticCurveTo(e,t,s,i){return this.currentPath.quadraticCurveTo(e,t,s,i),this}arc(e,t,s,i,o,h){return this.currentPath.absarc(e,t,s,i,o,!h),this}arcTo(e,t,s,i,o){const h=this.currentPath.currentPoint,a=h.x,c=h.y,n=e-a,u=t-c,y=s-e,p=i-t,x=Math.sqrt(n*n+u*u),g=Math.sqrt(y*y+p*p);if(x<o||g<o)return this.lineTo(s,i),this;const f={x:n/x,y:u/x},M={x:y/g,y:p/g},w=e-f.y*o,k=t+f.x*o,T=Math.atan2(f.y,f.x);let A=Math.atan2(M.y,M.x)-T;return A>Math.PI?A-=2*Math.PI:A<-Math.PI&&(A+=2*Math.PI),this.arc(w,k,o,T,T+A,!1),this.lineTo(s,i),this}ellipse(e,t,s,i,o,h,a,c){return this.currentPath.absellipse(e,t,s,i,h,a,!c,o),this}rect(e,t,s,i){return this.currentPath.rect(e,t,s,i),this}addCommands(e){return yt(e,this),this}addData(e){return this.addCommands(xt(e)),this}splineThru(e){return this.currentPath.splineThru(e),this}forEachCurve(e){return this.paths.forEach(t=>t.curves.forEach(s=>e(s))),this}transform(e){return this.forEachCurve(t=>t.transform(e)),this}getMinMax(e=new l,t=new l){return this.forEachCurve(s=>s.getMinMax(e,t)),{min:e,max:t}}getBoundingBox(){const{min:e,max:t}=this.getMinMax();return{x:e.x,y:e.y,left:e.x,top:e.y,right:t.x,bottom:t.y,width:t.x-e.x,height:t.y-e.y}}getCommands(){return this.paths.flatMap(e=>e.curves.flatMap(t=>t.getCommands()))}getData(){return this.paths.map(e=>e.getData()).join(" ")}getSvgString(){const{x:e,y:t,width:s,height:i}=this.getBoundingBox();return`<svg viewBox="${e} ${t} ${s} ${i}" xmlns="http://www.w3.org/2000/svg"><path fill="none" stroke="currentColor" d="${this.getData()}"></path></svg>`}getSvgDataUri(){return`data:image/svg+xml;base64,${btoa(this.getSvgString())}`}drawTo(e){this.forEachCurve(t=>{t.drawTo(e)})}strokeTo(e){this.drawTo(e),e.stroke()}fillTo(e){this.drawTo(e),e.fill()}copy(e){return e.currentPath=this.currentPath.clone(),e.paths=this.paths.map(t=>t.clone()),e.userData=this.userData,this}clone(){return new I().copy(this)}}const _="px",ot=90,at=["mm","cm","in","pt","pc","px"],B={mm:{mm:1,cm:.1,in:1/25.4,pt:72/25.4,pc:6/25.4,px:-1},cm:{mm:10,cm:1,in:1/2.54,pt:72/2.54,pc:6/2.54,px:-1},in:{mm:25.4,cm:2.54,in:1,pt:72,pc:6,px:-1},pt:{mm:25.4/72,cm:2.54/72,in:1/72,pt:1,pc:6/72,px:-1},pc:{mm:25.4/6,cm:2.54/6,in:1/6,pt:72/6,pc:1,px:-1},px:{px:1}};function m(r){let e="px";if(typeof r=="string"||r instanceof String)for(let s=0,i=at.length;s<i;s++){const o=at[s];if(r.endsWith(o)){e=o,r=r.substring(0,r.length-o.length);break}}let t;return e==="px"&&_!=="px"?t=B.in[_]/ot:(t=B[e][_],t<0&&(t=B[e].in*ot)),t*Number.parseFloat(r)}const Nt=new d,F=new d,ht=new d,ct=new d;function $t(r,e,t){if(!(r.hasAttribute("transform")||r.nodeName==="use"&&(r.hasAttribute("x")||r.hasAttribute("y"))))return null;const s=Et(r);return t.length>0&&s.premultiply(t[t.length-1]),e.copy(s),t.push(s),s}function Et(r){const e=new d,t=Nt;if(r.nodeName==="use"&&(r.hasAttribute("x")||r.hasAttribute("y"))&&e.translate(m(r.getAttribute("x")),m(r.getAttribute("y"))),r.hasAttribute("transform")){const s=r.getAttribute("transform").split(")");for(let i=s.length-1;i>=0;i--){const o=s[i].trim();if(o==="")continue;const h=o.indexOf("("),a=o.length;if(h>0&&h<a){const c=o.slice(0,h),n=S(o.slice(h+1));switch(t.identity(),c){case"translate":if(n.length>=1){const u=n[0];let y=0;n.length>=2&&(y=n[1]),t.translate(u,y)}break;case"rotate":if(n.length>=1){let u=0,y=0,p=0;u=n[0]*Math.PI/180,n.length>=3&&(y=n[1],p=n[2]),F.makeTranslation(-y,-p),ht.makeRotation(u),ct.multiplyMatrices(ht,F),F.makeTranslation(y,p),t.multiplyMatrices(F,ct)}break;case"scale":n.length>=1&&t.scale(n[0],n[1]??n[0]);break;case"skewX":n.length===1&&t.set(1,Math.tan(n[0]*Math.PI/180),0,0,1,0,0,0,1);break;case"skewY":n.length===1&&t.set(1,0,0,Math.tan(n[0]*Math.PI/180),1,0,0,0,1);break;case"matrix":n.length===6&&t.set(n[0],n[2],n[4],n[1],n[3],n[5],0,0,1);break}}e.premultiply(t)}}return e}function zt(r){return new I().addPath(new X().absarc(m(r.getAttribute("cx")||0),m(r.getAttribute("cy")||0),m(r.getAttribute("r")||0),0,Math.PI*2))}function qt(r,e){if(!(!r.sheet||!r.sheet.cssRules||!r.sheet.cssRules.length))for(let t=0;t<r.sheet.cssRules.length;t++){const s=r.sheet.cssRules[t];if(s.type!==1)continue;const i=s.selectorText.split(/,/g).filter(Boolean).map(o=>o.trim());for(let o=0;o<i.length;o++){const h=Object.fromEntries(Object.entries(s.style).filter(([,a])=>a!==""));e[i[o]]=Object.assign(e[i[o]]||{},h)}}}function Dt(r){return new I().addPath(new X().absellipse(m(r.getAttribute("cx")||0),m(r.getAttribute("cy")||0),m(r.getAttribute("rx")||0),m(r.getAttribute("ry")||0),0,Math.PI*2))}function Xt(r){return new I().moveTo(m(r.getAttribute("x1")||0),m(r.getAttribute("y1")||0)).lineTo(m(r.getAttribute("x2")||0),m(r.getAttribute("y2")||0))}function Ot(r){const e=new I,t=r.getAttribute("d");return!t||t==="none"?null:(e.addData(t),e)}const Rt=/([+-]?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?)(?:,|\s)([+-]?\d*\.?\d+(?:e[+-]?\d+)?)/g;function Ft(r){var s;const e=new I;let t=0;return(s=r.getAttribute("points"))==null||s.replace(Rt,(i,o,h)=>{const a=m(o),c=m(h);return t===0?e.moveTo(a,c):e.lineTo(a,c),t++,i}),e.currentPath.autoClose=!0,e}const Yt=/([+-]?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?)(?:,|\s)([+-]?\d*\.?\d+(?:e[+-]?\d+)?)/g;function _t(r){var s;const e=new I;let t=0;return(s=r.getAttribute("points"))==null||s.replace(Yt,(i,o,h)=>{const a=m(o),c=m(h);return t===0?e.moveTo(a,c):e.lineTo(a,c),t++,i}),e.currentPath.autoClose=!1,e}function Bt(r){const e=m(r.getAttribute("x")||0),t=m(r.getAttribute("y")||0),s=m(r.getAttribute("rx")||r.getAttribute("ry")||0),i=m(r.getAttribute("ry")||r.getAttribute("rx")||0),o=m(r.getAttribute("width")),h=m(r.getAttribute("height")),a=1-.551915024494,c=new I;return c.moveTo(e+s,t),c.lineTo(e+o-s,t),(s!==0||i!==0)&&c.bezierCurveTo(e+o-s*a,t,e+o,t+i*a,e+o,t+i),c.lineTo(e+o,t+h-i),(s!==0||i!==0)&&c.bezierCurveTo(e+o,t+h-i*a,e+o-s*a,t+h,e+o-s,t+h),c.lineTo(e+s,t+h),(s!==0||i!==0)&&c.bezierCurveTo(e+s*a,t+h,e,t+h-i*a,e,t+h-i),c.lineTo(e,t+i),(s!==0||i!==0)&&c.bezierCurveTo(e,t+i*a,e+s*a,t,e+s,t),c}function N(r,e,t){e=Object.assign({},e);let s={};if(r.hasAttribute("class")){const a=r.getAttribute("class").split(/\s/).filter(Boolean).map(c=>c.trim());for(let c=0;c<a.length;c++)s=Object.assign(s,t[`.${a[c]}`])}r.hasAttribute("id")&&(s=Object.assign(s,t[`#${r.getAttribute("id")}`]));function i(a,c,n){n===void 0&&(n=function(y){return y.startsWith("url")&&console.warn("url access in attributes is not implemented."),y}),r.hasAttribute(a)&&(e[c]=n(r.getAttribute(a))),s[a]&&(e[c]=n(s[a])),r.style&&r.style[a]!==""&&(e[c]=n(r.style[a]))}function o(a){return Math.max(0,Math.min(1,m(a)))}function h(a){return Math.max(0,m(a))}return i("fill","fill"),i("fill-opacity","fillOpacity",o),i("fill-rule","fillRule"),i("opacity","opacity",o),i("stroke","stroke"),i("stroke-dashoffset","strokeDashoffset"),i("stroke-dasharray","strokeDasharray"),i("stroke-linecap","strokeLineCap"),i("stroke-linejoin","strokeLineJoin"),i("stroke-miterlimit","strokeMiterLimit",h),i("stroke-opacity","strokeOpacity",o),i("stroke-width","strokeWidth",h),i("visibility","visibility"),e}function G(r,e,t=[]){var u;if(r.nodeType!==1)return t;let s=!1,i=null;const o={};switch(r.nodeName){case"svg":e=N(r,e,o);break;case"style":qt(r,o);break;case"g":e=N(r,e,o);break;case"path":e=N(r,e,o),r.hasAttribute("d")&&(i=Ot(r));break;case"rect":e=N(r,e,o),i=Bt(r);break;case"polygon":e=N(r,e,o),i=Ft(r);break;case"polyline":e=N(r,e,o),i=_t(r);break;case"circle":e=N(r,e,o),i=zt(r);break;case"ellipse":e=N(r,e,o),i=Dt(r);break;case"line":e=N(r,e,o),i=Xt(r);break;case"defs":s=!0;break;case"use":{e=N(r,e,o);const p=(r.getAttributeNS("http://www.w3.org/1999/xlink","href")||"").substring(1),x=(u=r.viewportElement)==null?void 0:u.getElementById(p);x?G(x,e,t):console.warn(`'use node' references non-existent node id: ${p}`);break}default:console.warn(r);break}const h=new d,a=[],c=$t(r,h,a);i&&(i.transform(h),t.push(i),i.userData={node:r,style:e});const n=r.childNodes;for(let y=0,p=n.length;y<p;y++){const x=n[y];s&&x.nodeName!=="style"&&x.nodeName!=="defs"||G(x,e,t)}return c&&(a.pop(),a.length>0?h.copy(a[a.length-1]):h.identity()),t}function Gt(r){let e;return typeof r=="string"?e=new DOMParser().parseFromString(r,"image/svg+xml").documentElement:e=r,G(e,{fill:"#000",fillOpacity:1,strokeOpacity:1,strokeWidth:1,strokeLineJoin:"miter",strokeLineCap:"butt",strokeMiterLimit:4})}v.CircleCurve=O,v.CubicBezierCurve=j,v.Curve=L,v.CurvePath=X,v.EllipseCurve=K,v.HeartCurve=Lt,v.LineCurve=q,v.Matrix3=d,v.Path2D=I,v.PloygonCurve=St,v.Point2D=l,v.QuadraticBezierCurve=nt,v.RectangularCurve=it,v.SplineCurve=rt,v.parseSvg=Gt,Object.defineProperty(v,Symbol.toStringTag,{value:"Module"})});
package/dist/index.mjs CHANGED
@@ -977,13 +977,13 @@ class Curve {
977
977
  drawTo(ctx) {
978
978
  return this;
979
979
  }
980
- clone() {
981
- return new this.constructor().copy(this);
982
- }
983
980
  copy(source) {
984
981
  this.arcLengthDivisions = source.arcLengthDivisions;
985
982
  return this;
986
983
  }
984
+ clone() {
985
+ return new this.constructor().copy(this);
986
+ }
987
987
  }
988
988
 
989
989
  class CircleCurve extends Curve {
@@ -1070,6 +1070,13 @@ class CubicBezierCurve extends Curve {
1070
1070
  );
1071
1071
  return output;
1072
1072
  }
1073
+ transform(matrix) {
1074
+ this.v0.applyMatrix3(matrix);
1075
+ this.v1.applyMatrix3(matrix);
1076
+ this.v2.applyMatrix3(matrix);
1077
+ this.v3.applyMatrix3(matrix);
1078
+ return this;
1079
+ }
1073
1080
  getMinMax(min = Point2D.MAX, max = Point2D.MIN) {
1074
1081
  const { v0, v1, v2, v3 } = this;
1075
1082
  min.x = Math.min(min.x, v0.x, v1.x, v2.x, v3.x);
@@ -1078,13 +1085,6 @@ class CubicBezierCurve extends Curve {
1078
1085
  max.y = Math.max(max.y, v0.y, v1.y, v2.y, v3.y);
1079
1086
  return { min, max };
1080
1087
  }
1081
- transform(matrix) {
1082
- this.v0.applyMatrix3(matrix);
1083
- this.v1.applyMatrix3(matrix);
1084
- this.v2.applyMatrix3(matrix);
1085
- this.v3.applyMatrix3(matrix);
1086
- return this;
1087
- }
1088
1088
  getCommands() {
1089
1089
  const { v0, v1, v2, v3 } = this;
1090
1090
  return [
@@ -1124,9 +1124,6 @@ class EllipseCurve extends Curve {
1124
1124
  this.clockwise = clockwise;
1125
1125
  this.rotation = rotation;
1126
1126
  }
1127
- getDivisions(divisions = 12) {
1128
- return divisions * 2;
1129
- }
1130
1127
  getPoint(t, output = new Point2D()) {
1131
1128
  const twoPi = Math.PI * 2;
1132
1129
  let deltaAngle = this.endAngle - this.startAngle;
@@ -1162,6 +1159,9 @@ class EllipseCurve extends Curve {
1162
1159
  }
1163
1160
  return output.set(_x, _y);
1164
1161
  }
1162
+ getDivisions(divisions = 12) {
1163
+ return divisions * 2;
1164
+ }
1165
1165
  getCommands() {
1166
1166
  const { x, y, radiusX, radiusY, startAngle, endAngle, clockwise } = this;
1167
1167
  const anticlockwise = !clockwise;
@@ -1375,9 +1375,6 @@ class LineCurve extends Curve {
1375
1375
  this.v1 = v1;
1376
1376
  this.v2 = v2;
1377
1377
  }
1378
- getDivisions() {
1379
- return 1;
1380
- }
1381
1378
  getPoint(t, output = new Point2D()) {
1382
1379
  if (t === 1) {
1383
1380
  output.copy(this.v2);
@@ -1396,12 +1393,13 @@ class LineCurve extends Curve {
1396
1393
  getTangentAt(u, output = new Point2D()) {
1397
1394
  return this.getTangent(u, output);
1398
1395
  }
1399
- getCommands() {
1400
- const { v1, v2 } = this;
1401
- return [
1402
- { type: "M", x: v1.x, y: v1.y },
1403
- { type: "L", x: v2.x, y: v2.y }
1404
- ];
1396
+ transform(matrix) {
1397
+ this.v1.applyMatrix3(matrix);
1398
+ this.v2.applyMatrix3(matrix);
1399
+ return this;
1400
+ }
1401
+ getDivisions() {
1402
+ return 1;
1405
1403
  }
1406
1404
  getMinMax(min = Point2D.MAX, max = Point2D.MIN) {
1407
1405
  const { v1, v2 } = this;
@@ -1411,10 +1409,12 @@ class LineCurve extends Curve {
1411
1409
  max.y = Math.max(max.y, v1.y, v2.y);
1412
1410
  return { min, max };
1413
1411
  }
1414
- transform(matrix) {
1415
- this.v1.applyMatrix3(matrix);
1416
- this.v2.applyMatrix3(matrix);
1417
- return this;
1412
+ getCommands() {
1413
+ const { v1, v2 } = this;
1414
+ return [
1415
+ { type: "M", x: v1.x, y: v1.y },
1416
+ { type: "L", x: v2.x, y: v2.y }
1417
+ ];
1418
1418
  }
1419
1419
  drawTo(ctx) {
1420
1420
  const { v1, v2 } = this;
@@ -1585,12 +1585,11 @@ class QuadraticBezierCurve extends Curve {
1585
1585
  );
1586
1586
  return output;
1587
1587
  }
1588
- getCommands() {
1589
- const { v0, v1, v2 } = this;
1590
- return [
1591
- { type: "M", x: v0.x, y: v0.y },
1592
- { type: "Q", x1: v1.x, y1: v1.y, x: v2.x, y: v2.y }
1593
- ];
1588
+ transform(matrix) {
1589
+ this.v0.applyMatrix3(matrix);
1590
+ this.v1.applyMatrix3(matrix);
1591
+ this.v2.applyMatrix3(matrix);
1592
+ return this;
1594
1593
  }
1595
1594
  getMinMax(min = Point2D.MAX, max = Point2D.MIN) {
1596
1595
  const { v0, v1, v2 } = this;
@@ -1604,11 +1603,12 @@ class QuadraticBezierCurve extends Curve {
1604
1603
  max.y = Math.max(max.y, v0.y, v2.y, y1, y2);
1605
1604
  return { min, max };
1606
1605
  }
1607
- transform(matrix) {
1608
- this.v0.applyMatrix3(matrix);
1609
- this.v1.applyMatrix3(matrix);
1610
- this.v2.applyMatrix3(matrix);
1611
- return this;
1606
+ getCommands() {
1607
+ const { v0, v1, v2 } = this;
1608
+ return [
1609
+ { type: "M", x: v0.x, y: v0.y },
1610
+ { type: "Q", x1: v1.x, y1: v1.y, x: v2.x, y: v2.y }
1611
+ ];
1612
1612
  }
1613
1613
  drawTo(ctx) {
1614
1614
  const { v0, v1, v2 } = this;
@@ -1937,9 +1937,8 @@ class CurvePath extends Curve {
1937
1937
  copy(source) {
1938
1938
  super.copy(source);
1939
1939
  this.curves = [];
1940
- for (let i = 0, l = source.curves.length; i < l; i++) {
1941
- const curve = source.curves[i];
1942
- this.curves.push(curve.clone());
1940
+ for (let i = 0, len = source.curves.length; i < len; i++) {
1941
+ this.curves.push(source.curves[i].clone());
1943
1942
  }
1944
1943
  this.autoClose = source.autoClose;
1945
1944
  this.currentPoint.copy(source.currentPoint);
@@ -2064,21 +2063,25 @@ class Path2D {
2064
2063
  this.forEachCurve((curve) => curve.getMinMax(min, max));
2065
2064
  return { min, max };
2066
2065
  }
2067
- getCommands() {
2068
- return this.paths.flatMap((path) => path.curves.flatMap((curve) => curve.getCommands()));
2069
- }
2070
- getData() {
2071
- return this.paths.map((path) => path.getData()).join(" ");
2072
- }
2073
2066
  getBoundingBox() {
2074
2067
  const { min, max } = this.getMinMax();
2075
2068
  return {
2076
2069
  x: min.x,
2077
2070
  y: min.y,
2071
+ left: min.x,
2072
+ top: min.y,
2073
+ right: max.x,
2074
+ bottom: max.y,
2078
2075
  width: max.x - min.x,
2079
2076
  height: max.y - min.y
2080
2077
  };
2081
2078
  }
2079
+ getCommands() {
2080
+ return this.paths.flatMap((path) => path.curves.flatMap((curve) => curve.getCommands()));
2081
+ }
2082
+ getData() {
2083
+ return this.paths.map((path) => path.getData()).join(" ");
2084
+ }
2082
2085
  getSvgString() {
2083
2086
  const { x, y, width, height } = this.getBoundingBox();
2084
2087
  return `<svg viewBox="${x} ${y} ${width} ${height}" xmlns="http://www.w3.org/2000/svg"><path fill="none" stroke="currentColor" d="${this.getData()}"></path></svg>`;
@@ -2099,6 +2102,15 @@ class Path2D {
2099
2102
  this.drawTo(ctx);
2100
2103
  ctx.fill();
2101
2104
  }
2105
+ copy(source) {
2106
+ source.currentPath = this.currentPath.clone();
2107
+ source.paths = this.paths.map((path) => path.clone());
2108
+ source.userData = this.userData;
2109
+ return this;
2110
+ }
2111
+ clone() {
2112
+ return new Path2D().copy(this);
2113
+ }
2102
2114
  }
2103
2115
 
2104
2116
  const defaultUnit = "px";
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "modern-path2d",
3
3
  "type": "module",
4
- "version": "0.1.0",
4
+ "version": "0.1.1",
5
5
  "packageManager": "pnpm@9.9.0",
6
6
  "description": "A modern Path2D library, fully compatible with Web Path2D, with additional support for path animation, path deformation, path playback, etc.",
7
7
  "author": "wxm",