modern-path2d 0.1.17 → 0.1.18

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
@@ -141,6 +141,11 @@ class BoundingBox {
141
141
  return this.top + this.height;
142
142
  }
143
143
  static from(...boxes) {
144
+ if (boxes.length === 0) {
145
+ return new BoundingBox();
146
+ } else if (boxes.length === 1) {
147
+ return boxes[0].clone();
148
+ }
144
149
  const firstBox = boxes[0];
145
150
  const merged = boxes.slice(1).reduce(
146
151
  (merged2, box) => {
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- (function(x,v){typeof exports=="object"&&typeof module<"u"?v(exports):typeof define=="function"&&define.amd?define(["exports"],v):(x=typeof globalThis<"u"?globalThis:x||self,v(x.modernPath2d={}))})(this,function(x){"use strict";var Kt=Object.defineProperty;var te=(x,v,z)=>v in x?Kt(x,v,{enumerable:!0,configurable:!0,writable:!0,value:z}):x[v]=z;var w=(x,v,z)=>te(x,typeof v!="symbol"?v+"":v,z);const v={arcs:"bevel",bevel:"bevel",miter:"miter","miter-clip":"miter",round:"round"};function z(r,e){const{fill:t="#000",stroke:s="none",strokeWidth:n=s==="none"?0:1,strokeLinecap:o="round",strokeLinejoin:i="miter",strokeMiterlimit:h=0,strokeDasharray:c=[],strokeDashoffset:a=0,shadowOffsetX:u=0,shadowOffsetY:f=0,shadowBlur:g=0,shadowColor:p="rgba(0, 0, 0, 0)"}=e;r.fillStyle=t,r.strokeStyle=s,r.lineWidth=n,r.lineCap=o,r.lineJoin=v[i],r.miterLimit=h,r.setLineDash(c),r.lineDashOffset=a,r.shadowOffsetX=u,r.shadowOffsetY=f,r.shadowBlur=g,r.shadowColor=p}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=this.x,s=this.y,n=e.elements;return this.x=n[0]*t+n[3]*s+n[6],this.y=n[1]*t+n[4]*s+n[7],this}copy(e){return this.x=e.x,this.y=e.y,this}clone(){return new l(this.x,this.y)}}class D{constructor(e=0,t=0,s=0,n=0){this.left=e,this.top=t,this.width=s,this.height=n}get x(){return this.left}set x(e){this.left=e}get y(){return this.top}set y(e){this.top=e}get right(){return this.left+this.width}get bottom(){return this.top+this.height}static from(...e){const t=e[0],s=e.slice(1).reduce((n,o)=>(n.left=Math.min(n.left,o.left),n.top=Math.min(n.top,o.top),n.right=Math.max(n.right,o.right),n.bottom=Math.max(n.bottom,o.bottom),n),{left:(t==null?void 0:t.left)??0,top:(t==null?void 0:t.top)??0,right:(t==null?void 0:t.right)??0,bottom:(t==null?void 0:t.bottom)??0});return new D(s.left,s.top,s.right-s.left,s.bottom-s.top)}translate(e,t){return this.left+=e,this.top+=t,this}getCenterPoint(){return new l((this.left+this.right)/2,(this.top+this.bottom)/2)}clone(){return new D(this.left,this.top,this.width,this.height)}toArray(){return[this.left,this.top,this.width,this.height]}}class C{constructor(e=1,t=0,s=0,n=0,o=1,i=0,h=0,c=0,a=1){w(this,"elements",[]);this.set(e,t,s,n,o,i,h,c,a)}set(e,t,s,n,o,i,h,c,a){const u=this.elements;return u[0]=e,u[1]=n,u[2]=h,u[3]=t,u[4]=o,u[5]=c,u[6]=s,u[7]=i,u[8]=a,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,n=t.elements,o=this.elements,i=s[0],h=s[3],c=s[6],a=s[1],u=s[4],f=s[7],g=s[2],p=s[5],y=s[8],d=n[0],m=n[3],T=n[6],E=n[1],b=n[4],S=n[7],N=n[2],L=n[5],q=n[8];return o[0]=i*d+h*E+c*N,o[3]=i*m+h*b+c*L,o[6]=i*T+h*S+c*q,o[1]=a*d+u*E+f*N,o[4]=a*m+u*b+f*L,o[7]=a*T+u*S+f*q,o[2]=g*d+p*E+y*N,o[5]=g*m+p*b+y*L,o[8]=g*T+p*S+y*q,this}invert(){const e=this.elements,t=e[0],s=e[1],n=e[2],o=e[3],i=e[4],h=e[5],c=e[6],a=e[7],u=e[8],f=u*i-h*a,g=h*c-u*o,p=a*o-i*c,y=t*f+s*g+n*p;if(y===0)return this.set(0,0,0,0,0,0,0,0,0);const d=1/y;return e[0]=f*d,e[1]=(n*a-u*s)*d,e[2]=(h*s-n*i)*d,e[3]=g*d,e[4]=(u*t-n*c)*d,e[5]=(n*o-h*t)*d,e[6]=p*d,e[7]=(s*c-a*t)*d,e[8]=(i*t-s*o)*d,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(U.makeScale(e,t)),this}rotate(e){return this.premultiply(U.makeRotation(-e)),this}translate(e,t){return this.premultiply(U.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 U=new C;function Z(r,e,t,s){const n=r*t+e*s,o=Math.sqrt(r*r+e*e)*Math.sqrt(t*t+s*s);let i=Math.acos(Math.max(-1,Math.min(1,n/o)));return r*s-e*t<0&&(i=-i),i}function J(r,e,t,s,n,o,i,h){if(e===0||t===0){r.lineTo(h.x,h.y);return}s=s*Math.PI/180,e=Math.abs(e),t=Math.abs(t);const c=(i.x-h.x)/2,a=(i.y-h.y)/2,u=Math.cos(s)*c+Math.sin(s)*a,f=-Math.sin(s)*c+Math.cos(s)*a;let g=e*e,p=t*t;const y=u*u,d=f*f,m=y/g+d/p;if(m>1){const Tt=Math.sqrt(m);e=Tt*e,t=Tt*t,g=e*e,p=t*t}const T=g*d+p*y,E=(g*p-T)/T;let b=Math.sqrt(Math.max(0,E));n===o&&(b=-b);const S=b*e*f/t,N=-b*t*u/e,L=Math.cos(s)*S-Math.sin(s)*N+(i.x+h.x)/2,q=Math.sin(s)*S+Math.cos(s)*N+(i.y+h.y)/2,B=Z(1,0,(u-S)/e,(f-N)/t),j=Z((u-S)/e,(f-N)/t,(-u-S)/e,(-f-N)/t)%(Math.PI*2);r.ellipse(L,q,e,t,s,B,B+j,o===1)}function O(r,e){return r-(e-r)}function W(r,e){const t=new l,s=new l;for(let n=0,o=r.length;n<o;n++){const i=r[n];if(i.type==="m"||i.type==="M")i.type==="m"?t.add(i):t.copy(i),e.moveTo(t.x,t.y),s.copy(t);else if(i.type==="h"||i.type==="H")i.type==="h"?t.x+=i.x:t.x=i.x,e.lineTo(t.x,t.y),s.copy(t);else if(i.type==="v"||i.type==="V")i.type==="v"?t.y+=i.y:t.y=i.y,e.lineTo(t.x,t.y),s.copy(t);else if(i.type==="l"||i.type==="L")i.type==="l"?t.add(i):t.copy(i),e.lineTo(t.x,t.y),s.copy(t);else if(i.type==="c"||i.type==="C")i.type==="c"?(e.bezierCurveTo(t.x+i.x1,t.y+i.y1,t.x+i.x2,t.y+i.y2,t.x+i.x,t.y+i.y),s.x=t.x+i.x2,s.y=t.y+i.y2,t.add(i)):(e.bezierCurveTo(i.x1,i.y1,i.x2,i.y2,i.x,i.y),s.x=i.x2,s.y=i.y2,t.copy(i));else if(i.type==="s"||i.type==="S")i.type==="s"?(e.bezierCurveTo(O(t.x,s.x),O(t.y,s.y),t.x+i.x2,t.y+i.y2,t.x+i.x,t.y+i.y),s.x=t.x+i.x2,s.y=t.y+i.y2,t.add(i)):(e.bezierCurveTo(O(t.x,s.x),O(t.y,s.y),i.x2,i.y2,i.x,i.y),s.x=i.x2,s.y=i.y2,t.copy(i));else if(i.type==="q"||i.type==="Q")i.type==="q"?(e.quadraticCurveTo(t.x+i.x1,t.y+i.y1,t.x+i.x,t.y+i.y),s.x=t.x+i.x1,s.y=t.y+i.y1,t.add(i)):(e.quadraticCurveTo(i.x1,i.y1,i.x,i.y),s.x=i.x1,s.y=i.y1,t.copy(i));else if(i.type==="t"||i.type==="T"){const h=O(t.x,s.x),c=O(t.y,s.y);s.x=h,s.y=c,i.type==="t"?(e.quadraticCurveTo(h,c,t.x+i.x,t.y+i.y),t.add(i)):(e.quadraticCurveTo(h,c,i.x,i.y),t.copy(i))}else if(i.type==="a"||i.type==="A"){const h=t.clone();if(i.type==="a"){if(i.x===0&&i.y===0)continue;t.add(i)}else{if(t.equals(i))continue;t.copy(i)}s.copy(t),J(e,i.rx,i.ry,i.angle,i.largeArcFlag,i.sweepFlag,h,t)}else i.type==="z"||i.type==="Z"?(e.startPoint&&t.copy(e.startPoint),e.closePath()):console.warn("Unsupported commands",i)}}const P={SEPARATOR:/[ \t\r\n,.\-+]/,WHITESPACE:/[ \t\r\n]/,DIGIT:/\d/,SIGN:/[-+]/,POINT:/\./,COMMA:/,/,EXP:/e/i,FLAGS:/[01]/};function A(r,e,t=0){let h=0,c=!0,a="",u="";const f=[];function g(m,T,E){const b=new SyntaxError(`Unexpected character "${m}" at index ${T}.`);throw b.partial=E,b}function p(){a!==""&&(u===""?f.push(Number(a)):f.push(Number(a)*10**Number(u))),a="",u=""}let y;const d=r.length;for(let m=0;m<d;m++){if(y=r[m],Array.isArray(e)&&e.includes(f.length%t)&&P.FLAGS.test(y)){h=1,a=y,p();continue}if(h===0){if(P.WHITESPACE.test(y))continue;if(P.DIGIT.test(y)||P.SIGN.test(y)){h=1,a=y;continue}if(P.POINT.test(y)){h=2,a=y;continue}P.COMMA.test(y)&&(c&&g(y,m,f),c=!0)}if(h===1){if(P.DIGIT.test(y)){a+=y;continue}if(P.POINT.test(y)){a+=y,h=2;continue}if(P.EXP.test(y)){h=3;continue}P.SIGN.test(y)&&a.length===1&&P.SIGN.test(a[0])&&g(y,m,f)}if(h===2){if(P.DIGIT.test(y)){a+=y;continue}if(P.EXP.test(y)){h=3;continue}P.POINT.test(y)&&a[a.length-1]==="."&&g(y,m,f)}if(h===3){if(P.DIGIT.test(y)){u+=y;continue}if(P.SIGN.test(y)){if(u===""){u+=y;continue}u.length===1&&P.SIGN.test(u)&&g(y,m,f)}}P.WHITESPACE.test(y)?(p(),h=0,c=!1):P.COMMA.test(y)?(p(),h=0,c=!0):P.SIGN.test(y)?(p(),h=1,a=y):P.POINT.test(y)?(p(),h=2,a=y):g(y,m,f)}return p(),f}function wt(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 K(r){let e="";for(let t=0,s=r.length;t<s;t++)e+=`${wt(r[t])} `;return e}const vt=/[a-df-z][^a-df-z]*/gi;function G(r){const e=[],t=r.match(vt);if(!t)return e;for(let s=0,n=t.length;s<n;s++){const o=t[s],i=o.charAt(0),h=o.slice(1).trim();let c;switch(i){case"m":case"M":c=A(h);for(let a=0,u=c.length;a<u;a+=2)a===0?e.push({type:i,x:c[a],y:c[a+1]}):e.push({type:i==="m"?"l":"L",x:c[a],y:c[a+1]});break;case"h":case"H":c=A(h);for(let a=0,u=c.length;a<u;a++)e.push({type:i,x:c[a]});break;case"v":case"V":c=A(h);for(let a=0,u=c.length;a<u;a++)e.push({type:i,y:c[a]});break;case"l":case"L":c=A(h);for(let a=0,u=c.length;a<u;a+=2)e.push({type:i,x:c[a],y:c[a+1]});break;case"c":case"C":c=A(h);for(let a=0,u=c.length;a<u;a+=6)e.push({type:i,x1:c[a],y1:c[a+1],x2:c[a+2],y2:c[a+3],x:c[a+4],y:c[a+5]});break;case"s":case"S":c=A(h);for(let a=0,u=c.length;a<u;a+=4)e.push({type:i,x2:c[a],y2:c[a+1],x:c[a+2],y:c[a+3]});break;case"q":case"Q":c=A(h);for(let a=0,u=c.length;a<u;a+=4)e.push({type:i,x1:c[a],y1:c[a+1],x:c[a+2],y:c[a+3]});break;case"t":case"T":c=A(h);for(let a=0,u=c.length;a<u;a+=2)e.push({type:i,x:c[a],y:c[a+1]});break;case"a":case"A":c=A(h,[3,4],7);for(let a=0,u=c.length;a<u;a+=7)e.push({type:i,rx:c[a],ry:c[a+1],angle:c[a+2],largeArcFlag:c[a+3],sweepFlag:c[a+4],x:c[a+5],y:c[a+6]});break;case"z":case"Z":e.push({type:i});break;default:console.warn(o)}}return e}class k{constructor(){w(this,"arcLengthDivisions",200);w(this,"_cacheArcLengths");w(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,n=this.getPoint(0),o=0;t.push(0);for(let i=1;i<=e;i++)s=this.getPoint(i/e),o+=s.distanceTo(n),t.push(o),n=s;return this._cacheArcLengths=t,t}updateArcLengths(){this._needsUpdate=!0,this.getLengths()}getUtoTmapping(e,t){const s=this.getLengths();let n=0;const o=s.length;let i;t?i=t:i=e*s[o-1];let h=0,c=o-1,a;for(;h<=c;)if(n=Math.floor(h+(c-h)/2),a=s[n]-i,a<0)h=n+1;else if(a>0)c=n-1;else{c=n;break}if(n=c,s[n]===i)return n/(o-1);const u=s[n],g=s[n+1]-u,p=(i-u)/g;return(n+p)/(o-1)}getTangent(e,t=new l){const n=Math.max(0,e-1e-4),o=Math.min(1,e+1e-4);return t.copy(this.getPoint(o).sub(this.getPoint(n)).normalize())}getTangentAt(e,t){return this.getTangent(this.getUtoTmapping(e),t)}transformPoint(e){return this}transform(e){return this.transformPoint(t=>t.applyMatrix3(e)),this}getMinMax(e=l.MAX,t=l.MIN){return this.getPoints().forEach(s=>{e.x=Math.min(e.x,s.x),e.y=Math.min(e.y,s.y),t.x=Math.max(t.x,s.x),t.y=Math.max(t.y,s.y)}),{min:e,max:t}}getBoundingBox(){const{min:e,max:t}=this.getMinMax();return new D(e.x,e.y,t.x-e.x,t.y-e.y)}getCommands(){return this.getPoints().map((e,t)=>t===0?{type:"M",x:e.x,y:e.y}:{type:"L",x:e.x,y:e.y})}getData(){return K(this.getCommands())}drawTo(e){return this}copy(e){return this.arcLengthDivisions=e.arcLengthDivisions,this}clone(){return new this.constructor().copy(this)}}class _ extends k{constructor(e,t,s=0,n=Math.PI*2){super(),this.center=e,this.radius=t,this.start=s,this.end=n}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,n=e*(s-t)+t-.5*Math.PI;return new l(Math.cos(n),Math.sin(n))}transformPoint(e){return e(this.center),this}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 tt(r,e,t,s,n){const o=(s-e)*.5,i=(n-t)*.5,h=r*r,c=r*h;return(2*t-2*s+o+i)*c+(-3*t+3*s-2*o-i)*h+o*r+t}function bt(r,e){const t=1-r;return t*t*e}function Ct(r,e){return 2*(1-r)*r*e}function At(r,e){return r*r*e}function et(r,e,t,s){return bt(r,e)+Ct(r,t)+At(r,s)}function kt(r,e){const t=1-r;return t*t*t*e}function It(r,e){const t=1-r;return 3*t*t*r*e}function St(r,e){return 3*(1-r)*r*r*e}function Nt(r,e){return r*r*r*e}function st(r,e,t,s,n){return kt(r,e)+It(r,t)+St(r,s)+Nt(r,n)}class nt extends k{constructor(e=new l,t=new l,s=new l,n=new l){super(),this.start=e,this.startControl=t,this.endControl=s,this.end=n}getPoint(e,t=new l){const{start:s,startControl:n,endControl:o,end:i}=this;return t.set(st(e,s.x,n.x,o.x,i.x),st(e,s.y,n.y,o.y,i.y)),t}transformPoint(e){return e(this.start),e(this.startControl),e(this.endControl),e(this.end),this}_solveQuadratic(e,t,s){const n=t*t-4*e*s;if(n<0)return[];const o=Math.sqrt(n),i=(-t+o)/(2*e),h=(-t-o)/(2*e);return[i,h].filter(c=>c>=0&&c<=1)}getMinMax(e=l.MAX,t=l.MIN){const s=this.start,n=this.startControl,o=this.endControl,i=this.end,h=this._solveQuadratic(3*(n.x-s.x),6*(o.x-n.x),3*(i.x-o.x)),c=this._solveQuadratic(3*(n.y-s.y),6*(o.y-n.y),3*(i.y-o.y)),a=[0,1,...h,...c];return((f,g)=>{for(const p of f)for(let y=0;y<=g;y++){const d=y/g-.5,m=Math.min(1,Math.max(0,p+d)),T=this.getPoint(m);e.x=Math.min(e.x,T.x),e.y=Math.min(e.y,T.y),t.x=Math.max(t.x,T.x),t.y=Math.max(t.y,T.y)}})(a,10),{min:e,max:t}}getCommands(){const{start:e,startControl:t,endControl:s,end:n}=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:n.x,y:n.y}]}drawTo(e){const{startControl:t,endControl:s,end:n}=this;return e.bezierCurveTo(t.x,t.y,s.x,s.y,n.x,n.y),this}copy(e){return super.copy(e),this.start.copy(e.start),this.startControl.copy(e.startControl),this.endControl.copy(e.endControl),this.end.copy(e.end),this}}const $t=new C,rt=new C,it=new C,F=new l;class ot extends k{constructor(e=new l,t=1,s=1,n=0,o=0,i=Math.PI*2,h=!1){super(),this.center=e,this.radiusX=t,this.radiusY=s,this.rotation=n,this.startAngle=o,this.endAngle=i,this.clockwise=h}getPoint(e,t=new l){const s=Math.PI*2;let n=this.endAngle-this.startAngle;const o=Math.abs(n)<Number.EPSILON;for(;n<0;)n+=s;for(;n>s;)n-=s;n<Number.EPSILON&&(o?n=0:n=s),this.clockwise&&!o&&(n===s?n=-s:n=n-s);const i=this.startAngle+e*n;let h=this.center.x+this.radiusX*Math.cos(i),c=this.center.y+this.radiusY*Math.sin(i);if(this.rotation!==0){const a=Math.cos(this.rotation),u=Math.sin(this.rotation),f=h-this.center.x,g=c-this.center.y;h=f*a-g*u+this.center.x,c=f*u+g*a+this.center.y}return t.set(h,c)}getCommands(){const{center:e,radiusX:t,radiusY:s,startAngle:n,endAngle:o,clockwise:i,rotation:h}=this,{x:c,y:a}=e,u=c+t*Math.cos(n)*Math.cos(h)-s*Math.sin(n)*Math.sin(h),f=a+t*Math.cos(n)*Math.sin(h)+s*Math.sin(n)*Math.cos(h),g=Math.abs(n-o),p=g>Math.PI?1:0,y=i?1:0,d=h*180/Math.PI;if(g>=2*Math.PI){const m=n+Math.PI,T=c+t*Math.cos(m)*Math.cos(h)-s*Math.sin(m)*Math.sin(h),E=a+t*Math.cos(m)*Math.sin(h)+s*Math.sin(m)*Math.cos(h);return[{type:"M",x:u,y:f},{type:"A",rx:t,ry:s,angle:d,largeArcFlag:0,sweepFlag:y,x:T,y:E},{type:"A",rx:t,ry:s,angle:d,largeArcFlag:0,sweepFlag:y,x:u,y:f}]}else{const m=c+t*Math.cos(o)*Math.cos(h)-s*Math.sin(o)*Math.sin(h),T=a+t*Math.cos(o)*Math.sin(h)+s*Math.sin(o)*Math.cos(h);return[{type:"M",x:u,y:f},{type:"A",rx:t,ry:s,angle:d,largeArcFlag:p,sweepFlag:y,x:m,y:T}]}}drawTo(e){const{center:t,radiusX:s,radiusY:n,rotation:o,startAngle:i,endAngle:h,clockwise:c}=this;return e.ellipse(t.x,t.y,s,n,o,i,h,!c),this}transform(e){return F.set(this.center.x,this.center.y),F.applyMatrix3(e),this.center.x=F.x,this.center.y=F.y,qt(e)?Et(this,e):Lt(this,e),this}transformPoint(e){return e(this.center),this}getMinMax(e=l.MAX,t=l.MIN){const{center:s,radiusX:n,radiusY:o,rotation:i}=this,{x:h,y:c}=s,a=Math.cos(i),u=Math.sin(i),f=Math.sqrt(n*n*a*a+o*o*u*u),g=Math.sqrt(n*n*u*u+o*o*a*a);return e.x=Math.min(e.x,h-f),e.y=Math.min(e.y,c-g),t.x=Math.max(t.x,h+f),t.y=Math.max(t.y,c+g),{min:e,max:t}}copy(e){return super.copy(e),this.center.x=e.center.x,this.center.y=e.center.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 Et(r,e){const t=r.radiusX,s=r.radiusY,n=Math.cos(r.rotation),o=Math.sin(r.rotation),i=new l(t*n,t*o),h=new l(-s*o,s*n),c=i.applyMatrix3(e),a=h.applyMatrix3(e),u=$t.set(c.x,a.x,0,c.y,a.y,0,0,0,1),f=rt.copy(u).invert(),y=it.copy(f).transpose().multiply(f).elements,d=zt(y[0],y[1],y[4]),m=Math.sqrt(d.rt1),T=Math.sqrt(d.rt2);if(r.radiusX=1/m,r.radiusY=1/T,r.rotation=Math.atan2(d.sn,d.cs),!((r.endAngle-r.startAngle)%(2*Math.PI)<Number.EPSILON)){const b=rt.set(m,0,0,0,T,0,0,0,1),S=it.set(d.cs,d.sn,0,-d.sn,d.cs,0,0,0,1),N=b.multiply(S).multiply(u),L=q=>{const{x:B,y:j}=new l(Math.cos(q),Math.sin(q)).applyMatrix3(N);return Math.atan2(j,B)};r.startAngle=L(r.startAngle),r.endAngle=L(r.endAngle),at(e)&&(r.clockwise=!r.clockwise)}}function Lt(r,e){const t=ht(e),s=ct(e);r.radiusX*=t,r.radiusY*=s;const n=t>Number.EPSILON?Math.atan2(e.elements[1],e.elements[0]):Math.atan2(-e.elements[3],e.elements[4]);r.rotation+=n,at(e)&&(r.startAngle*=-1,r.endAngle*=-1,r.clockwise=!r.clockwise)}function at(r){const e=r.elements;return e[0]*e[4]-e[1]*e[3]<0}function qt(r){const e=r.elements,t=e[0]*e[3]+e[1]*e[4];if(t===0)return!1;const s=ht(r),n=ct(r);return Math.abs(t/(s*n))>Number.EPSILON}function ht(r){const e=r.elements;return Math.sqrt(e[0]*e[0]+e[1]*e[1])}function ct(r){const e=r.elements;return Math.sqrt(e[3]*e[3]+e[4]*e[4])}function zt(r,e,t){let s,n,o,i,h;const c=r+t,a=r-t,u=Math.sqrt(a*a+4*e*e);return c>0?(s=.5*(c+u),h=1/s,n=r*h*t-e*h*e):c<0?n=.5*(c-u):(s=.5*u,n=-.5*u),a>0?o=a+u:o=a-u,Math.abs(o)>2*Math.abs(e)?(h=-2*e/o,i=1/Math.sqrt(1+h*h),o=h*i):Math.abs(e)===0?(o=1,i=0):(h=-.5*o/e,o=1/Math.sqrt(1+h*h),i=h*o),a>0&&(h=o,o=-i,i=h),{rt1:s,rt2:n,cs:o,sn:i}}class X extends k{constructor(e=new l,t=new l){super(),this.start=e,this.end=t}getPoint(e,t=new l){return e===1?t.copy(this.end):t.copy(this.end).sub(this.start).multiplyScalar(e).add(this.start),t}getPointAt(e,t=new l){return this.getPoint(e,t)}getTangent(e,t=new l){return t.subVectors(this.end,this.start).normalize()}getTangentAt(e,t=new l){return this.getTangent(e,t)}getNormal(e,t=new l){const{x:s,y:n}=this.getPoint(e).sub(this.start);return t.set(n,-s).normalize()}transformPoint(e){return e(this.start),e(this.end),this}getMinMax(e=l.MAX,t=l.MIN){const{start:s,end:n}=this;return e.x=Math.min(e.x,s.x,n.x),e.y=Math.min(e.y,s.y,n.y),t.x=Math.max(t.x,s.x,n.x),t.y=Math.max(t.y,s.y,n.y),{min:e,max:t}}getCommands(){const{start:e,end:t}=this;return[{type:"M",x:e.x,y:e.y},{type:"L",x:t.x,y:t.y}]}drawTo(e){const{end:t}=this;return e.lineTo(t.x,t.y),this}copy(e){return super.copy(e),this.start.copy(e.start),this.end.copy(e.end),this}}class Dt extends k{constructor(t,s,n=0,o=1){super();w(this,"curveT",0);this.center=t,this.size=s,this.start=n,this.end=o,this.update()}update(){const{x:t,y:s}=this.center,n=new l(t+.5*this.size,s-.5*this.size),o=new l(t-.5*this.size,s-.5*this.size),i=new l(t,s+.5*this.size),h=new _(n,Math.SQRT1_2*this.size,-.25*Math.PI,.75*Math.PI),c=new _(o,Math.SQRT1_2*this.size,-.75*Math.PI,.25*Math.PI),a=new _(i,.5*Math.SQRT1_2*this.size,.75*Math.PI,1.25*Math.PI),u=new l(t,s+this.size),f=new l(t+this.size,s),g=new l().lerpVectors(f,u,.75),p=new l(t-this.size,s),y=new l().lerpVectors(p,u,.75),d=new X(f,g),m=new X(y,p);return this.curves=[h,d,a,m,c],this}getPoint(t){return this.getCurve(t).getPoint(this.curveT)}getPointAt(t){return this.getPoint(t)}getCurve(t){let s=(t*(this.end-this.start)+this.start)%1;s<0&&(s+=1),s*=9*Math.PI/8+1.5;let n;const o=.5*Math.PI;return s<o?(n=0,this.curveT=s/o):s<o+.75?(n=1,this.curveT=(s-o)/.75):s<5*Math.PI/8+.75?(n=2,this.curveT=(s-o-.75)/(Math.PI/8)):s<5*Math.PI/8+1.5?(n=3,this.curveT=(s-5*Math.PI/8-.75)/.75):(n=4,this.curveT=(s-5*Math.PI/8-1.5)/o),this.curves[n]}getTangent(t){return this.getCurve(t).getTangent(this.curveT)}getNormal(t){return this.getCurve(t).getNormal(this.curveT)}transformPoint(t){return this.curves.forEach(s=>s.transformPoint(t)),this}getMinMax(t=l.MAX,s=l.MIN){return this.curves.forEach(n=>n.getMinMax(t,s)),{min:t,max:s}}getCommands(){return this.curves.flatMap(t=>t.getCommands())}drawTo(t){return this.curves.forEach(s=>s.drawTo(t)),this}}class Xt extends k{constructor(t,s=0,n=0,o=0,i=1){super();w(this,"curves",[]);w(this,"curveT",0);w(this,"points",[]);this.center=t,this.radius=s,this.number=n,this.start=o,this.end=i,this.update()}update(){for(let t=0;t<this.number;t++){let s=t*2*Math.PI/this.number;s-=.5*Math.PI,this.points.push(new l(this.radius*Math.cos(s),this.radius*Math.sin(s)).add(this.center))}for(let t=0;t<this.number;t++)this.curves.push(new X(this.points[t],this.points[(t+1)%this.number]));return this}getCurve(t){let s=(t*(this.end-this.start)+this.start)%1;s<0&&(s+=1);const n=s*this.number,o=Math.floor(n);return this.curveT=n-o,this.curves[o]}getPoint(t,s){return this.getCurve(t).getPoint(this.curveT,s)}getPointAt(t,s){return this.getPoint(t,s)}getTangent(t,s){return this.getCurve(t).getTangent(this.curveT,s)}getNormal(t,s){return this.getCurve(t).getNormal(this.curveT,s)}transformPoint(t){return this.curves.forEach(s=>s.transformPoint(t)),this}getMinMax(t=l.MAX,s=l.MIN){return this.curves.forEach(n=>n.getMinMax(t,s)),{min:t,max:s}}getCommands(){return this.curves.flatMap(t=>t.getCommands())}drawTo(t){return this.curves.forEach(s=>s.drawTo(t)),this}}class ut extends k{constructor(e=new l,t=new l,s=new l){super(),this.start=e,this.control=t,this.end=s}getPoint(e,t=new l){const{start:s,control:n,end:o}=this;return t.set(et(e,s.x,n.x,o.x),et(e,s.y,n.y,o.y)),t}transformPoint(e){return e(this.start),e(this.control),e(this.end),this}getMinMax(e=l.MAX,t=l.MIN){const{start:s,control:n,end:o}=this,i=.5*(s.x+n.x),h=.5*(s.y+n.y),c=.5*(s.x+o.x),a=.5*(s.y+o.y);return e.x=Math.min(e.x,s.x,o.x,i,c),e.y=Math.min(e.y,s.y,o.y,h,a),t.x=Math.max(t.x,s.x,o.x,i,c),t.y=Math.max(t.y,s.y,o.y,h,a),{min:e,max:t}}getCommands(){const{start:e,control:t,end: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{control:t,end:s}=this;return e.quadraticCurveTo(t.x,t.y,s.x,s.y),this}copy(e){return super.copy(e),this.start.copy(e.start),this.control.copy(e.control),this.end.copy(e.end),this}}class lt extends k{constructor(t,s,n=1,o=0,i=1){super();w(this,"curves",[]);w(this,"curveT",0);this.center=t,this.rx=s,this.aspectRatio=n,this.start=o,this.end=i,this.update()}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}update(){const{x:t,y:s}=this.center,n=this.rx,o=this.rx/this.aspectRatio,i=[new l(t-n,s-o),new l(t+n,s-o),new l(t+n,s+o),new l(t-n,s+o)];for(let h=0;h<4;h++)this.curves.push(new X(i[h].clone(),i[(h+1)%4].clone()));return this}getCurve(t){let s=(t*(this.end-this.start)+this.start)%1;s<0&&(s+=1),s*=(1+this.aspectRatio)*2;let n;return s<this.aspectRatio?(n=0,this.curveT=s/this.aspectRatio):s<this.aspectRatio+1?(n=1,this.curveT=(s-this.aspectRatio)/1):s<2*this.aspectRatio+1?(n=2,this.curveT=(s-this.aspectRatio-1)/this.aspectRatio):(n=3,this.curveT=(s-2*this.aspectRatio-1)/1),this.curves[n]}getPoint(t,s){return this.getCurve(t).getPoint(this.curveT,s)}getPointAt(t,s){return this.getPoint(t,s)}getTangent(t,s){return this.getCurve(t).getTangent(this.curveT,s)}getNormal(t,s){return this.getCurve(t).getNormal(this.curveT,s)}transformPoint(t){return this.curves.forEach(s=>s.transformPoint(t)),this}getMinMax(t=l.MAX,s=l.MIN){return this.curves.forEach(n=>n.getMinMax(t,s)),{min:t,max:s}}getCommands(){return this.curves.flatMap(t=>t.getCommands())}drawTo(t){return this.curves.forEach(s=>s.drawTo(t)),this}}class ft extends k{constructor(e=[]){super(),this.points=e}getPoint(e,t=new l){const{points:s}=this,n=(s.length-1)*e,o=Math.floor(n),i=n-o,h=s[o===0?o:o-1],c=s[o],a=s[o>s.length-2?s.length-1:o+1],u=s[o>s.length-3?s.length-1:o+2];return t.set(tt(i,h.x,c.x,a.x,u.x),tt(i,h.y,c.y,a.y,u.y)),t}transformPoint(e){return this.points.forEach(t=>e(t)),this}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 R extends k{constructor(t){super();w(this,"curves",[]);w(this,"startPoint");w(this,"currentPoint",new l);w(this,"autoClose",!1);w(this,"_cacheLengths",[]);t&&this.addPoints(t)}addCurve(t){return this.curves.push(t),this}addPoints(t){this.moveTo(t[0].x,t[0].y);for(let s=1,n=t.length;s<n;s++){const{x:o,y:i}=t[s];this.lineTo(o,i)}return this}addCommands(t){return W(t,this),this}addData(t){return this.addCommands(G(t)),this}getPoint(t,s=new l){const n=t*this.getLength(),o=this.getCurveLengths();let i=0;for(;i<o.length;){if(o[i]>=n){const h=o[i]-n,c=this.curves[i],a=c.getLength();return c.getPointAt(a===0?0:1-h/a,s)}i++}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 n=0,o=this.curves.length;n<o;n++)s+=this.curves[n].getLength(),t.push(s);return this._cacheLengths=t,t}getSpacedPoints(t=40){const s=[];for(let n=0;n<=t;n++)s.push(this.getPoint(n/t));return this.autoClose&&s.push(s[0]),s}getPoints(t=12){const s=[],n=this.curves;let o;for(let i=0,h=n.length;i<h;i++){const a=n[i].getPoints(t);for(let u=0;u<a.length;u++){const f=a[u];o!=null&&o.equals(f)||(s.push(f),o=f)}}return this.autoClose&&s.length>1&&!s[s.length-1].equals(s[0])&&s.push(s[0]),s}_setCurrentPoint(t){return this.currentPoint.copy(t),this.startPoint||(this.startPoint=this.currentPoint.clone()),this}closePath(){const t=this.startPoint;if(t){const s=this.currentPoint;t.equals(s)||(this.curves.push(new X(s.clone(),t)),this.currentPoint.copy(t)),this.startPoint=void 0}return this}moveTo(t,s){return this.currentPoint.set(t,s),this.startPoint=this.currentPoint.clone(),this}lineTo(t,s){return this.currentPoint.equals({x:t,y:s})||this.curves.push(new X(this.currentPoint.clone(),new l(t,s))),this._setCurrentPoint({x:t,y:s}),this}bezierCurveTo(t,s,n,o,i,h){return this.currentPoint.equals({x:i,y:h})||this.curves.push(new nt(this.currentPoint.clone(),new l(t,s),new l(n,o),new l(i,h))),this._setCurrentPoint({x:i,y:h}),this}quadraticCurveTo(t,s,n,o){return this.currentPoint.equals({x:n,y:o})||this.curves.push(new ut(this.currentPoint.clone(),new l(t,s),new l(n,o))),this._setCurrentPoint({x:n,y:o}),this}arc(t,s,n,o,i,h){return this.ellipse(t,s,n,n,0,o,i,h),this}relativeArc(t,s,n,o,i,h){const c=this.currentPoint;return this.arc(t+c.x,s+c.y,n,o,i,h),this}arcTo(t,s,n,o,i){return console.warn("Method arcTo not supported yet"),this}ellipse(t,s,n,o,i,h,c,a=!0){const u=new ot(new l(t,s),n,o,i,h,c,!a);if(this.curves.length>0){const f=u.getPoint(0);f.equals(this.currentPoint)||this.lineTo(f.x,f.y)}return this.curves.push(u),this._setCurrentPoint(u.getPoint(1)),this}relativeEllipse(t,s,n,o,i,h,c,a){const u=this.currentPoint;return this.ellipse(t+u.x,s+u.y,n,o,i,h,c,a),this}rect(t,s,n,o){return this.curves.push(new lt(new l(t+n/2,s+o/2),n/2,n/o)),this._setCurrentPoint({x:t,y:s}),this}splineThru(t){return this.curves.push(new ft([this.currentPoint.clone()].concat(t))),this._setCurrentPoint(t[t.length-1]),this}transformPoint(t){return this.curves.forEach(s=>s.transformPoint(t)),this}getMinMax(t=l.MAX,s=l.MIN){return this.curves.forEach(n=>n.getMinMax(t,s)),{min:t,max:s}}getBoundingBox(){const{min:t,max:s}=this.getMinMax();return new D(t.x,t.y,s.x-t.x,s.y-t.y)}getCommands(){return this.curves.flatMap(t=>t.getCommands())}drawTo(t){var n;const s=(n=this.curves[0])==null?void 0:n.getPoint(0);return s&&t.moveTo(s.x,s.y),this.curves.forEach(o=>o.drawTo(t)),this.autoClose&&t.closePath(),this}copy(t){super.copy(t),this.curves=[];for(let s=0,n=t.curves.length;s<n;s++)this.curves.push(t.curves[s].clone());return this.autoClose=t.autoClose,this.currentPoint.copy(t.currentPoint),this}}function Ot(r){return r.replace(/[^a-z0-9]/gi,"-").replace(/\B([A-Z])/g,"-$1").toLowerCase()}class I{constructor(e){w(this,"currentPath",new R);w(this,"paths",[this.currentPath]);w(this,"style",{});e&&(e instanceof I?this.addPath(e):Array.isArray(e)?this.addCommands(e):this.addData(e))}get startPoint(){return this.currentPath.startPoint}get currentPoint(){return this.currentPath.currentPoint}get strokeWidth(){return this.style.strokeWidth??((this.style.stroke??"none")==="none"?0:1)}addPath(e){return e instanceof I?this.paths.push(...e.paths.map(t=>t.clone())):this.paths.push(e),this}closePath(){const e=this.startPoint;return e&&(this.currentPath.closePath(),this.currentPath.curves.length>0&&(this.currentPath=new R().moveTo(e.x,e.y),this.paths.push(this.currentPath))),this}moveTo(e,t){const{currentPoint:s,curves:n}=this.currentPath;return s.equals({x:e,y:t})||(n.length?(this.currentPath=new R().moveTo(e,t),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,n,o,i){return this.currentPath.bezierCurveTo(e,t,s,n,o,i),this}quadraticCurveTo(e,t,s,n){return this.currentPath.quadraticCurveTo(e,t,s,n),this}arc(e,t,s,n,o,i){return this.currentPath.arc(e,t,s,n,o,i),this}arcTo(e,t,s,n,o){return this.currentPath.arcTo(e,t,s,n,o),this}ellipse(e,t,s,n,o,i,h,c){return this.currentPath.ellipse(e,t,s,n,o,i,h,c),this}rect(e,t,s,n){return this.currentPath.rect(e,t,s,n),this}addCommands(e){return W(e,this),this}addData(e){return this.addCommands(G(e)),this}splineThru(e){return this.currentPath.splineThru(e),this}forEachCurve(e){return this.paths.forEach(t=>t.curves.forEach(s=>e(s))),this}transformPoint(e){return this.forEachCurve(t=>t.transformPoint(e)),this}transform(e){return this.forEachCurve(t=>t.transform(e)),this}getMinMax(e=l.MAX,t=l.MIN,s=!0){if(this.forEachCurve(n=>n.getMinMax(e,t)),s){const n=this.strokeWidth/2;e.x-=n,e.y-=n,t.x+=n,t.y+=n}return{min:e,max:t}}getBoundingBox(e=!0){const{min:t,max:s}=this.getMinMax(void 0,void 0,e);return new D(t.x,t.y,s.x-t.x,s.y-t.y)}getCommands(){return this.paths.flatMap(e=>e.getCommands())}getData(){return this.paths.map(e=>e.getData()).join(" ")}getSvgPathXml(){const e={...this.style,fill:this.style.fill??"#000",stroke:this.style.stroke??"none"},t={};for(const n in e)e[n]!==void 0&&(t[Ot(n)]=e[n]);Object.assign(t,{"stroke-width":`${this.strokeWidth}px`});let s="";for(const n in t)t[n]!==void 0&&(s+=`${n}:${t[n]};`);return`<path d="${this.getData()}" style="${s}"></path>`}getSvgXml(){const{x:e,y:t,width:s,height:n}=this.getBoundingBox(),o=this.getSvgPathXml();return`<svg viewBox="${e} ${t} ${s} ${n}" width="${s}px" height="${n}px" xmlns="http://www.w3.org/2000/svg">${o}</svg>`}getSvgDataUri(){return`data:image/svg+xml;base64,${btoa(this.getSvgXml())}`}drawTo(e,t={}){t={...this.style,...t};const{fill:s="#000",stroke:n="none"}=t;z(e,t),this.paths.forEach(o=>{o.drawTo(e)}),s!=="none"&&e.fill(),n!=="none"&&e.stroke()}copy(e){return this.currentPath=e.currentPath.clone(),this.paths=e.paths.map(t=>t.clone()),this.style={...e.style},this}toSvg(){return new DOMParser().parseFromString(this.getSvgXml(),"image/svg+xml").documentElement}toCanvas(e=2){const{left:t,top:s,width:n,height:o}=this.getBoundingBox(),i=document.createElement("canvas");i.width=n*e,i.height=o*e,i.style.width=`${n}px`,i.style.height=`${o}px`;const h=i.getContext("2d");return h&&(h.scale(e,e),h.translate(-t,-s),this.drawTo(h)),i}clone(){return new this.constructor().copy(this)}}const Q="px",yt=90,gt=["mm","cm","in","pt","pc","px"],H={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,n=gt.length;s<n;s++){const o=gt[s];if(r.endsWith(o)){e=o,r=r.substring(0,r.length-o.length);break}}let t;return e==="px"&&Q!=="px"?t=H.in[Q]/yt:(t=H[e][Q],t<0&&(t=H[e].in*yt)),t*Number.parseFloat(r)}const Rt=new C,Y=new C,pt=new C,dt=new C;function _t(r,e,t){if(!(r.hasAttribute("transform")||r.nodeName==="use"&&(r.hasAttribute("x")||r.hasAttribute("y"))))return null;const s=Ft(r);return t.length>0&&s.premultiply(t[t.length-1]),e.copy(s),t.push(s),s}function Ft(r){const e=new C,t=Rt;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 n=s.length-1;n>=0;n--){const o=s[n].trim();if(o==="")continue;const i=o.indexOf("("),h=o.length;if(i>0&&i<h){const c=o.slice(0,i),a=A(o.slice(i+1));switch(t.identity(),c){case"translate":if(a.length>=1){const u=a[0];let f=0;a.length>=2&&(f=a[1]),t.translate(u,f)}break;case"rotate":if(a.length>=1){let u=0,f=0,g=0;u=a[0]*Math.PI/180,a.length>=3&&(f=a[1],g=a[2]),Y.makeTranslation(-f,-g),pt.makeRotation(u),dt.multiplyMatrices(pt,Y),Y.makeTranslation(f,g),t.multiplyMatrices(Y,dt)}break;case"scale":a.length>=1&&t.scale(a[0],a[1]??a[0]);break;case"skewX":a.length===1&&t.set(1,Math.tan(a[0]*Math.PI/180),0,0,1,0,0,0,1);break;case"skewY":a.length===1&&t.set(1,0,0,Math.tan(a[0]*Math.PI/180),1,0,0,0,1);break;case"matrix":a.length===6&&t.set(a[0],a[2],a[4],a[1],a[3],a[5],0,0,1);break}}e.premultiply(t)}}return e}function Yt(r){return new I().addPath(new R().arc(M(r.getAttribute("cx")||0),M(r.getAttribute("cy")||0),M(r.getAttribute("r")||0),0,Math.PI*2))}function Bt(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 n=s.selectorText.split(/,/g).filter(Boolean).map(o=>o.trim());for(let o=0;o<n.length;o++){const i=Object.fromEntries(Object.entries(s.style).filter(([,h])=>h!==""));e[n[o]]=Object.assign(e[n[o]]||{},i)}}}function Ut(r){return new I().addPath(new R().ellipse(M(r.getAttribute("cx")||0),M(r.getAttribute("cy")||0),M(r.getAttribute("rx")||0),M(r.getAttribute("ry")||0),0,0,Math.PI*2))}function Wt(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 Gt(r){const e=new I,t=r.getAttribute("d");return!t||t==="none"?null:(e.addData(t),e)}const Qt=/([+-]?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?)(?:,|\s)([+-]?\d*\.?\d+(?:e[+-]?\d+)?)/g;function Ht(r){var s;const e=new I;let t=0;return(s=r.getAttribute("points"))==null||s.replace(Qt,(n,o,i)=>{const h=M(o),c=M(i);return t===0?e.moveTo(h,c):e.lineTo(h,c),t++,n}),e.currentPath.autoClose=!0,e}const Vt=/([+-]?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?)(?:,|\s)([+-]?\d*\.?\d+(?:e[+-]?\d+)?)/g;function jt(r){var s;const e=new I;let t=0;return(s=r.getAttribute("points"))==null||s.replace(Vt,(n,o,i)=>{const h=M(o),c=M(i);return t===0?e.moveTo(h,c):e.lineTo(h,c),t++,n}),e.currentPath.autoClose=!1,e}function Zt(r){const e=M(r.getAttribute("x")||0),t=M(r.getAttribute("y")||0),s=M(r.getAttribute("rx")||r.getAttribute("ry")||0),n=M(r.getAttribute("ry")||r.getAttribute("rx")||0),o=M(r.getAttribute("width")),i=M(r.getAttribute("height")),h=1-.551915024494,c=new I;return c.moveTo(e+s,t),c.lineTo(e+o-s,t),(s!==0||n!==0)&&c.bezierCurveTo(e+o-s*h,t,e+o,t+n*h,e+o,t+n),c.lineTo(e+o,t+i-n),(s!==0||n!==0)&&c.bezierCurveTo(e+o,t+i-n*h,e+o-s*h,t+i,e+o-s,t+i),c.lineTo(e+s,t+i),(s!==0||n!==0)&&c.bezierCurveTo(e+s*h,t+i,e,t+i-n*h,e,t+i-n),c.lineTo(e,t+n),(s!==0||n!==0)&&c.bezierCurveTo(e,t+n*h,e+s*h,t,e+s,t),c}function $(r,e,t){e=Object.assign({},e);let s={};if(r.hasAttribute("class")){const c=r.getAttribute("class").split(/\s/).filter(Boolean).map(a=>a.trim());for(let a=0;a<c.length;a++)s=Object.assign(s,t[`.${c[a]}`])}r.hasAttribute("id")&&(s=Object.assign(s,t[`#${r.getAttribute("id")}`]));function n(c,a,u){u===void 0&&(u=function(g){return g.startsWith("url")&&console.warn("url access in attributes is not implemented."),g}),r.hasAttribute(c)&&(e[a]=u(r.getAttribute(c))),s[c]&&(e[a]=u(s[c])),r.style&&r.style[c]!==""&&(e[a]=u(r.style[c]))}function o(c){return Math.max(0,Math.min(1,M(c)))}function i(c){return Math.max(0,M(c))}function h(c){return c.split(" ").filter(a=>a!=="").map(a=>M(a))}return n("fill","fill"),n("fill-opacity","fillOpacity",o),n("fill-rule","fillRule"),n("opacity","opacity",o),n("stroke","stroke"),n("stroke-opacity","strokeOpacity",o),n("stroke-width","strokeWidth",i),n("stroke-linecap","strokeLinecap"),n("stroke-linejoin","strokeLinejoin"),n("stroke-miterlimit","strokeMiterlimit",i),n("stroke-dasharray","strokeDasharray",h),n("stroke-dashoffset","strokeDashoffset",M),n("visibility","visibility"),e}function V(r,e,t=[]){var u;if(r.nodeType!==1)return t;let s=!1,n=null;const o={};switch(r.nodeName){case"svg":e=$(r,e,o);break;case"style":Bt(r,o);break;case"g":e=$(r,e,o);break;case"path":e=$(r,e,o),r.hasAttribute("d")&&(n=Gt(r));break;case"rect":e=$(r,e,o),n=Zt(r);break;case"polygon":e=$(r,e,o),n=Ht(r);break;case"polyline":e=$(r,e,o),n=jt(r);break;case"circle":e=$(r,e,o),n=Yt(r);break;case"ellipse":e=$(r,e,o),n=Ut(r);break;case"line":e=$(r,e,o),n=Wt(r);break;case"defs":s=!0;break;case"use":{e=$(r,e,o);const g=(r.getAttributeNS("http://www.w3.org/1999/xlink","href")||"").substring(1),p=(u=r.viewportElement)==null?void 0:u.getElementById(g);p?V(p,e,t):console.warn(`'use node' references non-existent node id: ${g}`);break}default:console.warn(r);break}const i=new C,h=[],c=_t(r,i,h);n&&(n.transform(i),t.push(n),n.style=e);const a=r.childNodes;for(let f=0,g=a.length;f<g;f++){const p=a[f];s&&p.nodeName!=="style"&&p.nodeName!=="defs"||V(p,e,t)}return c&&(h.pop(),h.length>0?i.copy(h[h.length-1]):i.identity()),t}const xt="data:image/svg+xml;",mt=`${xt}base64,`,Mt=`${xt}charset=utf8,`;function Pt(r){if(typeof r=="string"){let e;return r.startsWith(mt)?(r=r.substring(mt.length,r.length),e=atob(r)):r.startsWith(Mt)?(r=r.substring(Mt.length,r.length),e=decodeURIComponent(r)):e=r,new DOMParser().parseFromString(e,"image/svg+xml").documentElement}else return r}function Jt(r){return V(Pt(r),{})}x.BoundingBox=D,x.CircleCurve=_,x.CubicBezierCurve=nt,x.Curve=k,x.CurvePath=R,x.EllipseCurve=ot,x.HeartCurve=Dt,x.LineCurve=X,x.Matrix3=C,x.Path2D=I,x.PloygonCurve=Xt,x.QuadraticBezierCurve=ut,x.RectangularCurve=lt,x.SplineCurve=ft,x.Vector2=l,x.addPathCommandsToPath2D=W,x.parseArcCommand=J,x.parsePathDataArgs=A,x.parseSvg=Jt,x.parseSvgToDom=Pt,x.pathCommandsToPathData=K,x.pathDataToPathCommands=G,x.setCanvasContext=z,Object.defineProperty(x,Symbol.toStringTag,{value:"Module"})});
1
+ (function(x,v){typeof exports=="object"&&typeof module<"u"?v(exports):typeof define=="function"&&define.amd?define(["exports"],v):(x=typeof globalThis<"u"?globalThis:x||self,v(x.modernPath2d={}))})(this,function(x){"use strict";var Kt=Object.defineProperty;var te=(x,v,D)=>v in x?Kt(x,v,{enumerable:!0,configurable:!0,writable:!0,value:D}):x[v]=D;var w=(x,v,D)=>te(x,typeof v!="symbol"?v+"":v,D);const v={arcs:"bevel",bevel:"bevel",miter:"miter","miter-clip":"miter",round:"round"};function D(r,e){const{fill:t="#000",stroke:s="none",strokeWidth:n=s==="none"?0:1,strokeLinecap:o="round",strokeLinejoin:i="miter",strokeMiterlimit:h=0,strokeDasharray:c=[],strokeDashoffset:a=0,shadowOffsetX:u=0,shadowOffsetY:f=0,shadowBlur:g=0,shadowColor:p="rgba(0, 0, 0, 0)"}=e;r.fillStyle=t,r.strokeStyle=s,r.lineWidth=n,r.lineCap=o,r.lineJoin=v[i],r.miterLimit=h,r.setLineDash(c),r.lineDashOffset=a,r.shadowOffsetX=u,r.shadowOffsetY=f,r.shadowBlur=g,r.shadowColor=p}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=this.x,s=this.y,n=e.elements;return this.x=n[0]*t+n[3]*s+n[6],this.y=n[1]*t+n[4]*s+n[7],this}copy(e){return this.x=e.x,this.y=e.y,this}clone(){return new l(this.x,this.y)}}class L{constructor(e=0,t=0,s=0,n=0){this.left=e,this.top=t,this.width=s,this.height=n}get x(){return this.left}set x(e){this.left=e}get y(){return this.top}set y(e){this.top=e}get right(){return this.left+this.width}get bottom(){return this.top+this.height}static from(...e){if(e.length===0)return new L;if(e.length===1)return e[0].clone();const t=e[0],s=e.slice(1).reduce((n,o)=>(n.left=Math.min(n.left,o.left),n.top=Math.min(n.top,o.top),n.right=Math.max(n.right,o.right),n.bottom=Math.max(n.bottom,o.bottom),n),{left:(t==null?void 0:t.left)??0,top:(t==null?void 0:t.top)??0,right:(t==null?void 0:t.right)??0,bottom:(t==null?void 0:t.bottom)??0});return new L(s.left,s.top,s.right-s.left,s.bottom-s.top)}translate(e,t){return this.left+=e,this.top+=t,this}getCenterPoint(){return new l((this.left+this.right)/2,(this.top+this.bottom)/2)}clone(){return new L(this.left,this.top,this.width,this.height)}toArray(){return[this.left,this.top,this.width,this.height]}}class C{constructor(e=1,t=0,s=0,n=0,o=1,i=0,h=0,c=0,a=1){w(this,"elements",[]);this.set(e,t,s,n,o,i,h,c,a)}set(e,t,s,n,o,i,h,c,a){const u=this.elements;return u[0]=e,u[1]=n,u[2]=h,u[3]=t,u[4]=o,u[5]=c,u[6]=s,u[7]=i,u[8]=a,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,n=t.elements,o=this.elements,i=s[0],h=s[3],c=s[6],a=s[1],u=s[4],f=s[7],g=s[2],p=s[5],y=s[8],d=n[0],m=n[3],T=n[6],E=n[1],b=n[4],S=n[7],N=n[2],q=n[5],z=n[8];return o[0]=i*d+h*E+c*N,o[3]=i*m+h*b+c*q,o[6]=i*T+h*S+c*z,o[1]=a*d+u*E+f*N,o[4]=a*m+u*b+f*q,o[7]=a*T+u*S+f*z,o[2]=g*d+p*E+y*N,o[5]=g*m+p*b+y*q,o[8]=g*T+p*S+y*z,this}invert(){const e=this.elements,t=e[0],s=e[1],n=e[2],o=e[3],i=e[4],h=e[5],c=e[6],a=e[7],u=e[8],f=u*i-h*a,g=h*c-u*o,p=a*o-i*c,y=t*f+s*g+n*p;if(y===0)return this.set(0,0,0,0,0,0,0,0,0);const d=1/y;return e[0]=f*d,e[1]=(n*a-u*s)*d,e[2]=(h*s-n*i)*d,e[3]=g*d,e[4]=(u*t-n*c)*d,e[5]=(n*o-h*t)*d,e[6]=p*d,e[7]=(s*c-a*t)*d,e[8]=(i*t-s*o)*d,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(W.makeScale(e,t)),this}rotate(e){return this.premultiply(W.makeRotation(-e)),this}translate(e,t){return this.premultiply(W.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 W=new C;function Z(r,e,t,s){const n=r*t+e*s,o=Math.sqrt(r*r+e*e)*Math.sqrt(t*t+s*s);let i=Math.acos(Math.max(-1,Math.min(1,n/o)));return r*s-e*t<0&&(i=-i),i}function J(r,e,t,s,n,o,i,h){if(e===0||t===0){r.lineTo(h.x,h.y);return}s=s*Math.PI/180,e=Math.abs(e),t=Math.abs(t);const c=(i.x-h.x)/2,a=(i.y-h.y)/2,u=Math.cos(s)*c+Math.sin(s)*a,f=-Math.sin(s)*c+Math.cos(s)*a;let g=e*e,p=t*t;const y=u*u,d=f*f,m=y/g+d/p;if(m>1){const Tt=Math.sqrt(m);e=Tt*e,t=Tt*t,g=e*e,p=t*t}const T=g*d+p*y,E=(g*p-T)/T;let b=Math.sqrt(Math.max(0,E));n===o&&(b=-b);const S=b*e*f/t,N=-b*t*u/e,q=Math.cos(s)*S-Math.sin(s)*N+(i.x+h.x)/2,z=Math.sin(s)*S+Math.cos(s)*N+(i.y+h.y)/2,U=Z(1,0,(u-S)/e,(f-N)/t),j=Z((u-S)/e,(f-N)/t,(-u-S)/e,(-f-N)/t)%(Math.PI*2);r.ellipse(q,z,e,t,s,U,U+j,o===1)}function O(r,e){return r-(e-r)}function B(r,e){const t=new l,s=new l;for(let n=0,o=r.length;n<o;n++){const i=r[n];if(i.type==="m"||i.type==="M")i.type==="m"?t.add(i):t.copy(i),e.moveTo(t.x,t.y),s.copy(t);else if(i.type==="h"||i.type==="H")i.type==="h"?t.x+=i.x:t.x=i.x,e.lineTo(t.x,t.y),s.copy(t);else if(i.type==="v"||i.type==="V")i.type==="v"?t.y+=i.y:t.y=i.y,e.lineTo(t.x,t.y),s.copy(t);else if(i.type==="l"||i.type==="L")i.type==="l"?t.add(i):t.copy(i),e.lineTo(t.x,t.y),s.copy(t);else if(i.type==="c"||i.type==="C")i.type==="c"?(e.bezierCurveTo(t.x+i.x1,t.y+i.y1,t.x+i.x2,t.y+i.y2,t.x+i.x,t.y+i.y),s.x=t.x+i.x2,s.y=t.y+i.y2,t.add(i)):(e.bezierCurveTo(i.x1,i.y1,i.x2,i.y2,i.x,i.y),s.x=i.x2,s.y=i.y2,t.copy(i));else if(i.type==="s"||i.type==="S")i.type==="s"?(e.bezierCurveTo(O(t.x,s.x),O(t.y,s.y),t.x+i.x2,t.y+i.y2,t.x+i.x,t.y+i.y),s.x=t.x+i.x2,s.y=t.y+i.y2,t.add(i)):(e.bezierCurveTo(O(t.x,s.x),O(t.y,s.y),i.x2,i.y2,i.x,i.y),s.x=i.x2,s.y=i.y2,t.copy(i));else if(i.type==="q"||i.type==="Q")i.type==="q"?(e.quadraticCurveTo(t.x+i.x1,t.y+i.y1,t.x+i.x,t.y+i.y),s.x=t.x+i.x1,s.y=t.y+i.y1,t.add(i)):(e.quadraticCurveTo(i.x1,i.y1,i.x,i.y),s.x=i.x1,s.y=i.y1,t.copy(i));else if(i.type==="t"||i.type==="T"){const h=O(t.x,s.x),c=O(t.y,s.y);s.x=h,s.y=c,i.type==="t"?(e.quadraticCurveTo(h,c,t.x+i.x,t.y+i.y),t.add(i)):(e.quadraticCurveTo(h,c,i.x,i.y),t.copy(i))}else if(i.type==="a"||i.type==="A"){const h=t.clone();if(i.type==="a"){if(i.x===0&&i.y===0)continue;t.add(i)}else{if(t.equals(i))continue;t.copy(i)}s.copy(t),J(e,i.rx,i.ry,i.angle,i.largeArcFlag,i.sweepFlag,h,t)}else i.type==="z"||i.type==="Z"?(e.startPoint&&t.copy(e.startPoint),e.closePath()):console.warn("Unsupported commands",i)}}const P={SEPARATOR:/[ \t\r\n,.\-+]/,WHITESPACE:/[ \t\r\n]/,DIGIT:/\d/,SIGN:/[-+]/,POINT:/\./,COMMA:/,/,EXP:/e/i,FLAGS:/[01]/};function A(r,e,t=0){let h=0,c=!0,a="",u="";const f=[];function g(m,T,E){const b=new SyntaxError(`Unexpected character "${m}" at index ${T}.`);throw b.partial=E,b}function p(){a!==""&&(u===""?f.push(Number(a)):f.push(Number(a)*10**Number(u))),a="",u=""}let y;const d=r.length;for(let m=0;m<d;m++){if(y=r[m],Array.isArray(e)&&e.includes(f.length%t)&&P.FLAGS.test(y)){h=1,a=y,p();continue}if(h===0){if(P.WHITESPACE.test(y))continue;if(P.DIGIT.test(y)||P.SIGN.test(y)){h=1,a=y;continue}if(P.POINT.test(y)){h=2,a=y;continue}P.COMMA.test(y)&&(c&&g(y,m,f),c=!0)}if(h===1){if(P.DIGIT.test(y)){a+=y;continue}if(P.POINT.test(y)){a+=y,h=2;continue}if(P.EXP.test(y)){h=3;continue}P.SIGN.test(y)&&a.length===1&&P.SIGN.test(a[0])&&g(y,m,f)}if(h===2){if(P.DIGIT.test(y)){a+=y;continue}if(P.EXP.test(y)){h=3;continue}P.POINT.test(y)&&a[a.length-1]==="."&&g(y,m,f)}if(h===3){if(P.DIGIT.test(y)){u+=y;continue}if(P.SIGN.test(y)){if(u===""){u+=y;continue}u.length===1&&P.SIGN.test(u)&&g(y,m,f)}}P.WHITESPACE.test(y)?(p(),h=0,c=!1):P.COMMA.test(y)?(p(),h=0,c=!0):P.SIGN.test(y)?(p(),h=1,a=y):P.POINT.test(y)?(p(),h=2,a=y):g(y,m,f)}return p(),f}function wt(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 K(r){let e="";for(let t=0,s=r.length;t<s;t++)e+=`${wt(r[t])} `;return e}const vt=/[a-df-z][^a-df-z]*/gi;function G(r){const e=[],t=r.match(vt);if(!t)return e;for(let s=0,n=t.length;s<n;s++){const o=t[s],i=o.charAt(0),h=o.slice(1).trim();let c;switch(i){case"m":case"M":c=A(h);for(let a=0,u=c.length;a<u;a+=2)a===0?e.push({type:i,x:c[a],y:c[a+1]}):e.push({type:i==="m"?"l":"L",x:c[a],y:c[a+1]});break;case"h":case"H":c=A(h);for(let a=0,u=c.length;a<u;a++)e.push({type:i,x:c[a]});break;case"v":case"V":c=A(h);for(let a=0,u=c.length;a<u;a++)e.push({type:i,y:c[a]});break;case"l":case"L":c=A(h);for(let a=0,u=c.length;a<u;a+=2)e.push({type:i,x:c[a],y:c[a+1]});break;case"c":case"C":c=A(h);for(let a=0,u=c.length;a<u;a+=6)e.push({type:i,x1:c[a],y1:c[a+1],x2:c[a+2],y2:c[a+3],x:c[a+4],y:c[a+5]});break;case"s":case"S":c=A(h);for(let a=0,u=c.length;a<u;a+=4)e.push({type:i,x2:c[a],y2:c[a+1],x:c[a+2],y:c[a+3]});break;case"q":case"Q":c=A(h);for(let a=0,u=c.length;a<u;a+=4)e.push({type:i,x1:c[a],y1:c[a+1],x:c[a+2],y:c[a+3]});break;case"t":case"T":c=A(h);for(let a=0,u=c.length;a<u;a+=2)e.push({type:i,x:c[a],y:c[a+1]});break;case"a":case"A":c=A(h,[3,4],7);for(let a=0,u=c.length;a<u;a+=7)e.push({type:i,rx:c[a],ry:c[a+1],angle:c[a+2],largeArcFlag:c[a+3],sweepFlag:c[a+4],x:c[a+5],y:c[a+6]});break;case"z":case"Z":e.push({type:i});break;default:console.warn(o)}}return e}class k{constructor(){w(this,"arcLengthDivisions",200);w(this,"_cacheArcLengths");w(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,n=this.getPoint(0),o=0;t.push(0);for(let i=1;i<=e;i++)s=this.getPoint(i/e),o+=s.distanceTo(n),t.push(o),n=s;return this._cacheArcLengths=t,t}updateArcLengths(){this._needsUpdate=!0,this.getLengths()}getUtoTmapping(e,t){const s=this.getLengths();let n=0;const o=s.length;let i;t?i=t:i=e*s[o-1];let h=0,c=o-1,a;for(;h<=c;)if(n=Math.floor(h+(c-h)/2),a=s[n]-i,a<0)h=n+1;else if(a>0)c=n-1;else{c=n;break}if(n=c,s[n]===i)return n/(o-1);const u=s[n],g=s[n+1]-u,p=(i-u)/g;return(n+p)/(o-1)}getTangent(e,t=new l){const n=Math.max(0,e-1e-4),o=Math.min(1,e+1e-4);return t.copy(this.getPoint(o).sub(this.getPoint(n)).normalize())}getTangentAt(e,t){return this.getTangent(this.getUtoTmapping(e),t)}transformPoint(e){return this}transform(e){return this.transformPoint(t=>t.applyMatrix3(e)),this}getMinMax(e=l.MAX,t=l.MIN){return this.getPoints().forEach(s=>{e.x=Math.min(e.x,s.x),e.y=Math.min(e.y,s.y),t.x=Math.max(t.x,s.x),t.y=Math.max(t.y,s.y)}),{min:e,max:t}}getBoundingBox(){const{min:e,max:t}=this.getMinMax();return new L(e.x,e.y,t.x-e.x,t.y-e.y)}getCommands(){return this.getPoints().map((e,t)=>t===0?{type:"M",x:e.x,y:e.y}:{type:"L",x:e.x,y:e.y})}getData(){return K(this.getCommands())}drawTo(e){return this}copy(e){return this.arcLengthDivisions=e.arcLengthDivisions,this}clone(){return new this.constructor().copy(this)}}class _ extends k{constructor(e,t,s=0,n=Math.PI*2){super(),this.center=e,this.radius=t,this.start=s,this.end=n}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,n=e*(s-t)+t-.5*Math.PI;return new l(Math.cos(n),Math.sin(n))}transformPoint(e){return e(this.center),this}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 tt(r,e,t,s,n){const o=(s-e)*.5,i=(n-t)*.5,h=r*r,c=r*h;return(2*t-2*s+o+i)*c+(-3*t+3*s-2*o-i)*h+o*r+t}function bt(r,e){const t=1-r;return t*t*e}function Ct(r,e){return 2*(1-r)*r*e}function At(r,e){return r*r*e}function et(r,e,t,s){return bt(r,e)+Ct(r,t)+At(r,s)}function kt(r,e){const t=1-r;return t*t*t*e}function It(r,e){const t=1-r;return 3*t*t*r*e}function St(r,e){return 3*(1-r)*r*r*e}function Nt(r,e){return r*r*r*e}function st(r,e,t,s,n){return kt(r,e)+It(r,t)+St(r,s)+Nt(r,n)}class nt extends k{constructor(e=new l,t=new l,s=new l,n=new l){super(),this.start=e,this.startControl=t,this.endControl=s,this.end=n}getPoint(e,t=new l){const{start:s,startControl:n,endControl:o,end:i}=this;return t.set(st(e,s.x,n.x,o.x,i.x),st(e,s.y,n.y,o.y,i.y)),t}transformPoint(e){return e(this.start),e(this.startControl),e(this.endControl),e(this.end),this}_solveQuadratic(e,t,s){const n=t*t-4*e*s;if(n<0)return[];const o=Math.sqrt(n),i=(-t+o)/(2*e),h=(-t-o)/(2*e);return[i,h].filter(c=>c>=0&&c<=1)}getMinMax(e=l.MAX,t=l.MIN){const s=this.start,n=this.startControl,o=this.endControl,i=this.end,h=this._solveQuadratic(3*(n.x-s.x),6*(o.x-n.x),3*(i.x-o.x)),c=this._solveQuadratic(3*(n.y-s.y),6*(o.y-n.y),3*(i.y-o.y)),a=[0,1,...h,...c];return((f,g)=>{for(const p of f)for(let y=0;y<=g;y++){const d=y/g-.5,m=Math.min(1,Math.max(0,p+d)),T=this.getPoint(m);e.x=Math.min(e.x,T.x),e.y=Math.min(e.y,T.y),t.x=Math.max(t.x,T.x),t.y=Math.max(t.y,T.y)}})(a,10),{min:e,max:t}}getCommands(){const{start:e,startControl:t,endControl:s,end:n}=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:n.x,y:n.y}]}drawTo(e){const{startControl:t,endControl:s,end:n}=this;return e.bezierCurveTo(t.x,t.y,s.x,s.y,n.x,n.y),this}copy(e){return super.copy(e),this.start.copy(e.start),this.startControl.copy(e.startControl),this.endControl.copy(e.endControl),this.end.copy(e.end),this}}const $t=new C,rt=new C,it=new C,F=new l;class ot extends k{constructor(e=new l,t=1,s=1,n=0,o=0,i=Math.PI*2,h=!1){super(),this.center=e,this.radiusX=t,this.radiusY=s,this.rotation=n,this.startAngle=o,this.endAngle=i,this.clockwise=h}getPoint(e,t=new l){const s=Math.PI*2;let n=this.endAngle-this.startAngle;const o=Math.abs(n)<Number.EPSILON;for(;n<0;)n+=s;for(;n>s;)n-=s;n<Number.EPSILON&&(o?n=0:n=s),this.clockwise&&!o&&(n===s?n=-s:n=n-s);const i=this.startAngle+e*n;let h=this.center.x+this.radiusX*Math.cos(i),c=this.center.y+this.radiusY*Math.sin(i);if(this.rotation!==0){const a=Math.cos(this.rotation),u=Math.sin(this.rotation),f=h-this.center.x,g=c-this.center.y;h=f*a-g*u+this.center.x,c=f*u+g*a+this.center.y}return t.set(h,c)}getCommands(){const{center:e,radiusX:t,radiusY:s,startAngle:n,endAngle:o,clockwise:i,rotation:h}=this,{x:c,y:a}=e,u=c+t*Math.cos(n)*Math.cos(h)-s*Math.sin(n)*Math.sin(h),f=a+t*Math.cos(n)*Math.sin(h)+s*Math.sin(n)*Math.cos(h),g=Math.abs(n-o),p=g>Math.PI?1:0,y=i?1:0,d=h*180/Math.PI;if(g>=2*Math.PI){const m=n+Math.PI,T=c+t*Math.cos(m)*Math.cos(h)-s*Math.sin(m)*Math.sin(h),E=a+t*Math.cos(m)*Math.sin(h)+s*Math.sin(m)*Math.cos(h);return[{type:"M",x:u,y:f},{type:"A",rx:t,ry:s,angle:d,largeArcFlag:0,sweepFlag:y,x:T,y:E},{type:"A",rx:t,ry:s,angle:d,largeArcFlag:0,sweepFlag:y,x:u,y:f}]}else{const m=c+t*Math.cos(o)*Math.cos(h)-s*Math.sin(o)*Math.sin(h),T=a+t*Math.cos(o)*Math.sin(h)+s*Math.sin(o)*Math.cos(h);return[{type:"M",x:u,y:f},{type:"A",rx:t,ry:s,angle:d,largeArcFlag:p,sweepFlag:y,x:m,y:T}]}}drawTo(e){const{center:t,radiusX:s,radiusY:n,rotation:o,startAngle:i,endAngle:h,clockwise:c}=this;return e.ellipse(t.x,t.y,s,n,o,i,h,!c),this}transform(e){return F.set(this.center.x,this.center.y),F.applyMatrix3(e),this.center.x=F.x,this.center.y=F.y,qt(e)?Et(this,e):Lt(this,e),this}transformPoint(e){return e(this.center),this}getMinMax(e=l.MAX,t=l.MIN){const{center:s,radiusX:n,radiusY:o,rotation:i}=this,{x:h,y:c}=s,a=Math.cos(i),u=Math.sin(i),f=Math.sqrt(n*n*a*a+o*o*u*u),g=Math.sqrt(n*n*u*u+o*o*a*a);return e.x=Math.min(e.x,h-f),e.y=Math.min(e.y,c-g),t.x=Math.max(t.x,h+f),t.y=Math.max(t.y,c+g),{min:e,max:t}}copy(e){return super.copy(e),this.center.x=e.center.x,this.center.y=e.center.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 Et(r,e){const t=r.radiusX,s=r.radiusY,n=Math.cos(r.rotation),o=Math.sin(r.rotation),i=new l(t*n,t*o),h=new l(-s*o,s*n),c=i.applyMatrix3(e),a=h.applyMatrix3(e),u=$t.set(c.x,a.x,0,c.y,a.y,0,0,0,1),f=rt.copy(u).invert(),y=it.copy(f).transpose().multiply(f).elements,d=zt(y[0],y[1],y[4]),m=Math.sqrt(d.rt1),T=Math.sqrt(d.rt2);if(r.radiusX=1/m,r.radiusY=1/T,r.rotation=Math.atan2(d.sn,d.cs),!((r.endAngle-r.startAngle)%(2*Math.PI)<Number.EPSILON)){const b=rt.set(m,0,0,0,T,0,0,0,1),S=it.set(d.cs,d.sn,0,-d.sn,d.cs,0,0,0,1),N=b.multiply(S).multiply(u),q=z=>{const{x:U,y:j}=new l(Math.cos(z),Math.sin(z)).applyMatrix3(N);return Math.atan2(j,U)};r.startAngle=q(r.startAngle),r.endAngle=q(r.endAngle),at(e)&&(r.clockwise=!r.clockwise)}}function Lt(r,e){const t=ht(e),s=ct(e);r.radiusX*=t,r.radiusY*=s;const n=t>Number.EPSILON?Math.atan2(e.elements[1],e.elements[0]):Math.atan2(-e.elements[3],e.elements[4]);r.rotation+=n,at(e)&&(r.startAngle*=-1,r.endAngle*=-1,r.clockwise=!r.clockwise)}function at(r){const e=r.elements;return e[0]*e[4]-e[1]*e[3]<0}function qt(r){const e=r.elements,t=e[0]*e[3]+e[1]*e[4];if(t===0)return!1;const s=ht(r),n=ct(r);return Math.abs(t/(s*n))>Number.EPSILON}function ht(r){const e=r.elements;return Math.sqrt(e[0]*e[0]+e[1]*e[1])}function ct(r){const e=r.elements;return Math.sqrt(e[3]*e[3]+e[4]*e[4])}function zt(r,e,t){let s,n,o,i,h;const c=r+t,a=r-t,u=Math.sqrt(a*a+4*e*e);return c>0?(s=.5*(c+u),h=1/s,n=r*h*t-e*h*e):c<0?n=.5*(c-u):(s=.5*u,n=-.5*u),a>0?o=a+u:o=a-u,Math.abs(o)>2*Math.abs(e)?(h=-2*e/o,i=1/Math.sqrt(1+h*h),o=h*i):Math.abs(e)===0?(o=1,i=0):(h=-.5*o/e,o=1/Math.sqrt(1+h*h),i=h*o),a>0&&(h=o,o=-i,i=h),{rt1:s,rt2:n,cs:o,sn:i}}class X extends k{constructor(e=new l,t=new l){super(),this.start=e,this.end=t}getPoint(e,t=new l){return e===1?t.copy(this.end):t.copy(this.end).sub(this.start).multiplyScalar(e).add(this.start),t}getPointAt(e,t=new l){return this.getPoint(e,t)}getTangent(e,t=new l){return t.subVectors(this.end,this.start).normalize()}getTangentAt(e,t=new l){return this.getTangent(e,t)}getNormal(e,t=new l){const{x:s,y:n}=this.getPoint(e).sub(this.start);return t.set(n,-s).normalize()}transformPoint(e){return e(this.start),e(this.end),this}getMinMax(e=l.MAX,t=l.MIN){const{start:s,end:n}=this;return e.x=Math.min(e.x,s.x,n.x),e.y=Math.min(e.y,s.y,n.y),t.x=Math.max(t.x,s.x,n.x),t.y=Math.max(t.y,s.y,n.y),{min:e,max:t}}getCommands(){const{start:e,end:t}=this;return[{type:"M",x:e.x,y:e.y},{type:"L",x:t.x,y:t.y}]}drawTo(e){const{end:t}=this;return e.lineTo(t.x,t.y),this}copy(e){return super.copy(e),this.start.copy(e.start),this.end.copy(e.end),this}}class Dt extends k{constructor(t,s,n=0,o=1){super();w(this,"curveT",0);this.center=t,this.size=s,this.start=n,this.end=o,this.update()}update(){const{x:t,y:s}=this.center,n=new l(t+.5*this.size,s-.5*this.size),o=new l(t-.5*this.size,s-.5*this.size),i=new l(t,s+.5*this.size),h=new _(n,Math.SQRT1_2*this.size,-.25*Math.PI,.75*Math.PI),c=new _(o,Math.SQRT1_2*this.size,-.75*Math.PI,.25*Math.PI),a=new _(i,.5*Math.SQRT1_2*this.size,.75*Math.PI,1.25*Math.PI),u=new l(t,s+this.size),f=new l(t+this.size,s),g=new l().lerpVectors(f,u,.75),p=new l(t-this.size,s),y=new l().lerpVectors(p,u,.75),d=new X(f,g),m=new X(y,p);return this.curves=[h,d,a,m,c],this}getPoint(t){return this.getCurve(t).getPoint(this.curveT)}getPointAt(t){return this.getPoint(t)}getCurve(t){let s=(t*(this.end-this.start)+this.start)%1;s<0&&(s+=1),s*=9*Math.PI/8+1.5;let n;const o=.5*Math.PI;return s<o?(n=0,this.curveT=s/o):s<o+.75?(n=1,this.curveT=(s-o)/.75):s<5*Math.PI/8+.75?(n=2,this.curveT=(s-o-.75)/(Math.PI/8)):s<5*Math.PI/8+1.5?(n=3,this.curveT=(s-5*Math.PI/8-.75)/.75):(n=4,this.curveT=(s-5*Math.PI/8-1.5)/o),this.curves[n]}getTangent(t){return this.getCurve(t).getTangent(this.curveT)}getNormal(t){return this.getCurve(t).getNormal(this.curveT)}transformPoint(t){return this.curves.forEach(s=>s.transformPoint(t)),this}getMinMax(t=l.MAX,s=l.MIN){return this.curves.forEach(n=>n.getMinMax(t,s)),{min:t,max:s}}getCommands(){return this.curves.flatMap(t=>t.getCommands())}drawTo(t){return this.curves.forEach(s=>s.drawTo(t)),this}}class Xt extends k{constructor(t,s=0,n=0,o=0,i=1){super();w(this,"curves",[]);w(this,"curveT",0);w(this,"points",[]);this.center=t,this.radius=s,this.number=n,this.start=o,this.end=i,this.update()}update(){for(let t=0;t<this.number;t++){let s=t*2*Math.PI/this.number;s-=.5*Math.PI,this.points.push(new l(this.radius*Math.cos(s),this.radius*Math.sin(s)).add(this.center))}for(let t=0;t<this.number;t++)this.curves.push(new X(this.points[t],this.points[(t+1)%this.number]));return this}getCurve(t){let s=(t*(this.end-this.start)+this.start)%1;s<0&&(s+=1);const n=s*this.number,o=Math.floor(n);return this.curveT=n-o,this.curves[o]}getPoint(t,s){return this.getCurve(t).getPoint(this.curveT,s)}getPointAt(t,s){return this.getPoint(t,s)}getTangent(t,s){return this.getCurve(t).getTangent(this.curveT,s)}getNormal(t,s){return this.getCurve(t).getNormal(this.curveT,s)}transformPoint(t){return this.curves.forEach(s=>s.transformPoint(t)),this}getMinMax(t=l.MAX,s=l.MIN){return this.curves.forEach(n=>n.getMinMax(t,s)),{min:t,max:s}}getCommands(){return this.curves.flatMap(t=>t.getCommands())}drawTo(t){return this.curves.forEach(s=>s.drawTo(t)),this}}class ut extends k{constructor(e=new l,t=new l,s=new l){super(),this.start=e,this.control=t,this.end=s}getPoint(e,t=new l){const{start:s,control:n,end:o}=this;return t.set(et(e,s.x,n.x,o.x),et(e,s.y,n.y,o.y)),t}transformPoint(e){return e(this.start),e(this.control),e(this.end),this}getMinMax(e=l.MAX,t=l.MIN){const{start:s,control:n,end:o}=this,i=.5*(s.x+n.x),h=.5*(s.y+n.y),c=.5*(s.x+o.x),a=.5*(s.y+o.y);return e.x=Math.min(e.x,s.x,o.x,i,c),e.y=Math.min(e.y,s.y,o.y,h,a),t.x=Math.max(t.x,s.x,o.x,i,c),t.y=Math.max(t.y,s.y,o.y,h,a),{min:e,max:t}}getCommands(){const{start:e,control:t,end: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{control:t,end:s}=this;return e.quadraticCurveTo(t.x,t.y,s.x,s.y),this}copy(e){return super.copy(e),this.start.copy(e.start),this.control.copy(e.control),this.end.copy(e.end),this}}class lt extends k{constructor(t,s,n=1,o=0,i=1){super();w(this,"curves",[]);w(this,"curveT",0);this.center=t,this.rx=s,this.aspectRatio=n,this.start=o,this.end=i,this.update()}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}update(){const{x:t,y:s}=this.center,n=this.rx,o=this.rx/this.aspectRatio,i=[new l(t-n,s-o),new l(t+n,s-o),new l(t+n,s+o),new l(t-n,s+o)];for(let h=0;h<4;h++)this.curves.push(new X(i[h].clone(),i[(h+1)%4].clone()));return this}getCurve(t){let s=(t*(this.end-this.start)+this.start)%1;s<0&&(s+=1),s*=(1+this.aspectRatio)*2;let n;return s<this.aspectRatio?(n=0,this.curveT=s/this.aspectRatio):s<this.aspectRatio+1?(n=1,this.curveT=(s-this.aspectRatio)/1):s<2*this.aspectRatio+1?(n=2,this.curveT=(s-this.aspectRatio-1)/this.aspectRatio):(n=3,this.curveT=(s-2*this.aspectRatio-1)/1),this.curves[n]}getPoint(t,s){return this.getCurve(t).getPoint(this.curveT,s)}getPointAt(t,s){return this.getPoint(t,s)}getTangent(t,s){return this.getCurve(t).getTangent(this.curveT,s)}getNormal(t,s){return this.getCurve(t).getNormal(this.curveT,s)}transformPoint(t){return this.curves.forEach(s=>s.transformPoint(t)),this}getMinMax(t=l.MAX,s=l.MIN){return this.curves.forEach(n=>n.getMinMax(t,s)),{min:t,max:s}}getCommands(){return this.curves.flatMap(t=>t.getCommands())}drawTo(t){return this.curves.forEach(s=>s.drawTo(t)),this}}class ft extends k{constructor(e=[]){super(),this.points=e}getPoint(e,t=new l){const{points:s}=this,n=(s.length-1)*e,o=Math.floor(n),i=n-o,h=s[o===0?o:o-1],c=s[o],a=s[o>s.length-2?s.length-1:o+1],u=s[o>s.length-3?s.length-1:o+2];return t.set(tt(i,h.x,c.x,a.x,u.x),tt(i,h.y,c.y,a.y,u.y)),t}transformPoint(e){return this.points.forEach(t=>e(t)),this}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 R extends k{constructor(t){super();w(this,"curves",[]);w(this,"startPoint");w(this,"currentPoint",new l);w(this,"autoClose",!1);w(this,"_cacheLengths",[]);t&&this.addPoints(t)}addCurve(t){return this.curves.push(t),this}addPoints(t){this.moveTo(t[0].x,t[0].y);for(let s=1,n=t.length;s<n;s++){const{x:o,y:i}=t[s];this.lineTo(o,i)}return this}addCommands(t){return B(t,this),this}addData(t){return this.addCommands(G(t)),this}getPoint(t,s=new l){const n=t*this.getLength(),o=this.getCurveLengths();let i=0;for(;i<o.length;){if(o[i]>=n){const h=o[i]-n,c=this.curves[i],a=c.getLength();return c.getPointAt(a===0?0:1-h/a,s)}i++}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 n=0,o=this.curves.length;n<o;n++)s+=this.curves[n].getLength(),t.push(s);return this._cacheLengths=t,t}getSpacedPoints(t=40){const s=[];for(let n=0;n<=t;n++)s.push(this.getPoint(n/t));return this.autoClose&&s.push(s[0]),s}getPoints(t=12){const s=[],n=this.curves;let o;for(let i=0,h=n.length;i<h;i++){const a=n[i].getPoints(t);for(let u=0;u<a.length;u++){const f=a[u];o!=null&&o.equals(f)||(s.push(f),o=f)}}return this.autoClose&&s.length>1&&!s[s.length-1].equals(s[0])&&s.push(s[0]),s}_setCurrentPoint(t){return this.currentPoint.copy(t),this.startPoint||(this.startPoint=this.currentPoint.clone()),this}closePath(){const t=this.startPoint;if(t){const s=this.currentPoint;t.equals(s)||(this.curves.push(new X(s.clone(),t)),this.currentPoint.copy(t)),this.startPoint=void 0}return this}moveTo(t,s){return this.currentPoint.set(t,s),this.startPoint=this.currentPoint.clone(),this}lineTo(t,s){return this.currentPoint.equals({x:t,y:s})||this.curves.push(new X(this.currentPoint.clone(),new l(t,s))),this._setCurrentPoint({x:t,y:s}),this}bezierCurveTo(t,s,n,o,i,h){return this.currentPoint.equals({x:i,y:h})||this.curves.push(new nt(this.currentPoint.clone(),new l(t,s),new l(n,o),new l(i,h))),this._setCurrentPoint({x:i,y:h}),this}quadraticCurveTo(t,s,n,o){return this.currentPoint.equals({x:n,y:o})||this.curves.push(new ut(this.currentPoint.clone(),new l(t,s),new l(n,o))),this._setCurrentPoint({x:n,y:o}),this}arc(t,s,n,o,i,h){return this.ellipse(t,s,n,n,0,o,i,h),this}relativeArc(t,s,n,o,i,h){const c=this.currentPoint;return this.arc(t+c.x,s+c.y,n,o,i,h),this}arcTo(t,s,n,o,i){return console.warn("Method arcTo not supported yet"),this}ellipse(t,s,n,o,i,h,c,a=!0){const u=new ot(new l(t,s),n,o,i,h,c,!a);if(this.curves.length>0){const f=u.getPoint(0);f.equals(this.currentPoint)||this.lineTo(f.x,f.y)}return this.curves.push(u),this._setCurrentPoint(u.getPoint(1)),this}relativeEllipse(t,s,n,o,i,h,c,a){const u=this.currentPoint;return this.ellipse(t+u.x,s+u.y,n,o,i,h,c,a),this}rect(t,s,n,o){return this.curves.push(new lt(new l(t+n/2,s+o/2),n/2,n/o)),this._setCurrentPoint({x:t,y:s}),this}splineThru(t){return this.curves.push(new ft([this.currentPoint.clone()].concat(t))),this._setCurrentPoint(t[t.length-1]),this}transformPoint(t){return this.curves.forEach(s=>s.transformPoint(t)),this}getMinMax(t=l.MAX,s=l.MIN){return this.curves.forEach(n=>n.getMinMax(t,s)),{min:t,max:s}}getBoundingBox(){const{min:t,max:s}=this.getMinMax();return new L(t.x,t.y,s.x-t.x,s.y-t.y)}getCommands(){return this.curves.flatMap(t=>t.getCommands())}drawTo(t){var n;const s=(n=this.curves[0])==null?void 0:n.getPoint(0);return s&&t.moveTo(s.x,s.y),this.curves.forEach(o=>o.drawTo(t)),this.autoClose&&t.closePath(),this}copy(t){super.copy(t),this.curves=[];for(let s=0,n=t.curves.length;s<n;s++)this.curves.push(t.curves[s].clone());return this.autoClose=t.autoClose,this.currentPoint.copy(t.currentPoint),this}}function Ot(r){return r.replace(/[^a-z0-9]/gi,"-").replace(/\B([A-Z])/g,"-$1").toLowerCase()}class I{constructor(e){w(this,"currentPath",new R);w(this,"paths",[this.currentPath]);w(this,"style",{});e&&(e instanceof I?this.addPath(e):Array.isArray(e)?this.addCommands(e):this.addData(e))}get startPoint(){return this.currentPath.startPoint}get currentPoint(){return this.currentPath.currentPoint}get strokeWidth(){return this.style.strokeWidth??((this.style.stroke??"none")==="none"?0:1)}addPath(e){return e instanceof I?this.paths.push(...e.paths.map(t=>t.clone())):this.paths.push(e),this}closePath(){const e=this.startPoint;return e&&(this.currentPath.closePath(),this.currentPath.curves.length>0&&(this.currentPath=new R().moveTo(e.x,e.y),this.paths.push(this.currentPath))),this}moveTo(e,t){const{currentPoint:s,curves:n}=this.currentPath;return s.equals({x:e,y:t})||(n.length?(this.currentPath=new R().moveTo(e,t),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,n,o,i){return this.currentPath.bezierCurveTo(e,t,s,n,o,i),this}quadraticCurveTo(e,t,s,n){return this.currentPath.quadraticCurveTo(e,t,s,n),this}arc(e,t,s,n,o,i){return this.currentPath.arc(e,t,s,n,o,i),this}arcTo(e,t,s,n,o){return this.currentPath.arcTo(e,t,s,n,o),this}ellipse(e,t,s,n,o,i,h,c){return this.currentPath.ellipse(e,t,s,n,o,i,h,c),this}rect(e,t,s,n){return this.currentPath.rect(e,t,s,n),this}addCommands(e){return B(e,this),this}addData(e){return this.addCommands(G(e)),this}splineThru(e){return this.currentPath.splineThru(e),this}forEachCurve(e){return this.paths.forEach(t=>t.curves.forEach(s=>e(s))),this}transformPoint(e){return this.forEachCurve(t=>t.transformPoint(e)),this}transform(e){return this.forEachCurve(t=>t.transform(e)),this}getMinMax(e=l.MAX,t=l.MIN,s=!0){if(this.forEachCurve(n=>n.getMinMax(e,t)),s){const n=this.strokeWidth/2;e.x-=n,e.y-=n,t.x+=n,t.y+=n}return{min:e,max:t}}getBoundingBox(e=!0){const{min:t,max:s}=this.getMinMax(void 0,void 0,e);return new L(t.x,t.y,s.x-t.x,s.y-t.y)}getCommands(){return this.paths.flatMap(e=>e.getCommands())}getData(){return this.paths.map(e=>e.getData()).join(" ")}getSvgPathXml(){const e={...this.style,fill:this.style.fill??"#000",stroke:this.style.stroke??"none"},t={};for(const n in e)e[n]!==void 0&&(t[Ot(n)]=e[n]);Object.assign(t,{"stroke-width":`${this.strokeWidth}px`});let s="";for(const n in t)t[n]!==void 0&&(s+=`${n}:${t[n]};`);return`<path d="${this.getData()}" style="${s}"></path>`}getSvgXml(){const{x:e,y:t,width:s,height:n}=this.getBoundingBox(),o=this.getSvgPathXml();return`<svg viewBox="${e} ${t} ${s} ${n}" width="${s}px" height="${n}px" xmlns="http://www.w3.org/2000/svg">${o}</svg>`}getSvgDataUri(){return`data:image/svg+xml;base64,${btoa(this.getSvgXml())}`}drawTo(e,t={}){t={...this.style,...t};const{fill:s="#000",stroke:n="none"}=t;D(e,t),this.paths.forEach(o=>{o.drawTo(e)}),s!=="none"&&e.fill(),n!=="none"&&e.stroke()}copy(e){return this.currentPath=e.currentPath.clone(),this.paths=e.paths.map(t=>t.clone()),this.style={...e.style},this}toSvg(){return new DOMParser().parseFromString(this.getSvgXml(),"image/svg+xml").documentElement}toCanvas(e=2){const{left:t,top:s,width:n,height:o}=this.getBoundingBox(),i=document.createElement("canvas");i.width=n*e,i.height=o*e,i.style.width=`${n}px`,i.style.height=`${o}px`;const h=i.getContext("2d");return h&&(h.scale(e,e),h.translate(-t,-s),this.drawTo(h)),i}clone(){return new this.constructor().copy(this)}}const Q="px",yt=90,gt=["mm","cm","in","pt","pc","px"],H={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,n=gt.length;s<n;s++){const o=gt[s];if(r.endsWith(o)){e=o,r=r.substring(0,r.length-o.length);break}}let t;return e==="px"&&Q!=="px"?t=H.in[Q]/yt:(t=H[e][Q],t<0&&(t=H[e].in*yt)),t*Number.parseFloat(r)}const Rt=new C,Y=new C,pt=new C,dt=new C;function _t(r,e,t){if(!(r.hasAttribute("transform")||r.nodeName==="use"&&(r.hasAttribute("x")||r.hasAttribute("y"))))return null;const s=Ft(r);return t.length>0&&s.premultiply(t[t.length-1]),e.copy(s),t.push(s),s}function Ft(r){const e=new C,t=Rt;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 n=s.length-1;n>=0;n--){const o=s[n].trim();if(o==="")continue;const i=o.indexOf("("),h=o.length;if(i>0&&i<h){const c=o.slice(0,i),a=A(o.slice(i+1));switch(t.identity(),c){case"translate":if(a.length>=1){const u=a[0];let f=0;a.length>=2&&(f=a[1]),t.translate(u,f)}break;case"rotate":if(a.length>=1){let u=0,f=0,g=0;u=a[0]*Math.PI/180,a.length>=3&&(f=a[1],g=a[2]),Y.makeTranslation(-f,-g),pt.makeRotation(u),dt.multiplyMatrices(pt,Y),Y.makeTranslation(f,g),t.multiplyMatrices(Y,dt)}break;case"scale":a.length>=1&&t.scale(a[0],a[1]??a[0]);break;case"skewX":a.length===1&&t.set(1,Math.tan(a[0]*Math.PI/180),0,0,1,0,0,0,1);break;case"skewY":a.length===1&&t.set(1,0,0,Math.tan(a[0]*Math.PI/180),1,0,0,0,1);break;case"matrix":a.length===6&&t.set(a[0],a[2],a[4],a[1],a[3],a[5],0,0,1);break}}e.premultiply(t)}}return e}function Yt(r){return new I().addPath(new R().arc(M(r.getAttribute("cx")||0),M(r.getAttribute("cy")||0),M(r.getAttribute("r")||0),0,Math.PI*2))}function Ut(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 n=s.selectorText.split(/,/g).filter(Boolean).map(o=>o.trim());for(let o=0;o<n.length;o++){const i=Object.fromEntries(Object.entries(s.style).filter(([,h])=>h!==""));e[n[o]]=Object.assign(e[n[o]]||{},i)}}}function Wt(r){return new I().addPath(new R().ellipse(M(r.getAttribute("cx")||0),M(r.getAttribute("cy")||0),M(r.getAttribute("rx")||0),M(r.getAttribute("ry")||0),0,0,Math.PI*2))}function Bt(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 Gt(r){const e=new I,t=r.getAttribute("d");return!t||t==="none"?null:(e.addData(t),e)}const Qt=/([+-]?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?)(?:,|\s)([+-]?\d*\.?\d+(?:e[+-]?\d+)?)/g;function Ht(r){var s;const e=new I;let t=0;return(s=r.getAttribute("points"))==null||s.replace(Qt,(n,o,i)=>{const h=M(o),c=M(i);return t===0?e.moveTo(h,c):e.lineTo(h,c),t++,n}),e.currentPath.autoClose=!0,e}const Vt=/([+-]?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?)(?:,|\s)([+-]?\d*\.?\d+(?:e[+-]?\d+)?)/g;function jt(r){var s;const e=new I;let t=0;return(s=r.getAttribute("points"))==null||s.replace(Vt,(n,o,i)=>{const h=M(o),c=M(i);return t===0?e.moveTo(h,c):e.lineTo(h,c),t++,n}),e.currentPath.autoClose=!1,e}function Zt(r){const e=M(r.getAttribute("x")||0),t=M(r.getAttribute("y")||0),s=M(r.getAttribute("rx")||r.getAttribute("ry")||0),n=M(r.getAttribute("ry")||r.getAttribute("rx")||0),o=M(r.getAttribute("width")),i=M(r.getAttribute("height")),h=1-.551915024494,c=new I;return c.moveTo(e+s,t),c.lineTo(e+o-s,t),(s!==0||n!==0)&&c.bezierCurveTo(e+o-s*h,t,e+o,t+n*h,e+o,t+n),c.lineTo(e+o,t+i-n),(s!==0||n!==0)&&c.bezierCurveTo(e+o,t+i-n*h,e+o-s*h,t+i,e+o-s,t+i),c.lineTo(e+s,t+i),(s!==0||n!==0)&&c.bezierCurveTo(e+s*h,t+i,e,t+i-n*h,e,t+i-n),c.lineTo(e,t+n),(s!==0||n!==0)&&c.bezierCurveTo(e,t+n*h,e+s*h,t,e+s,t),c}function $(r,e,t){e=Object.assign({},e);let s={};if(r.hasAttribute("class")){const c=r.getAttribute("class").split(/\s/).filter(Boolean).map(a=>a.trim());for(let a=0;a<c.length;a++)s=Object.assign(s,t[`.${c[a]}`])}r.hasAttribute("id")&&(s=Object.assign(s,t[`#${r.getAttribute("id")}`]));function n(c,a,u){u===void 0&&(u=function(g){return g.startsWith("url")&&console.warn("url access in attributes is not implemented."),g}),r.hasAttribute(c)&&(e[a]=u(r.getAttribute(c))),s[c]&&(e[a]=u(s[c])),r.style&&r.style[c]!==""&&(e[a]=u(r.style[c]))}function o(c){return Math.max(0,Math.min(1,M(c)))}function i(c){return Math.max(0,M(c))}function h(c){return c.split(" ").filter(a=>a!=="").map(a=>M(a))}return n("fill","fill"),n("fill-opacity","fillOpacity",o),n("fill-rule","fillRule"),n("opacity","opacity",o),n("stroke","stroke"),n("stroke-opacity","strokeOpacity",o),n("stroke-width","strokeWidth",i),n("stroke-linecap","strokeLinecap"),n("stroke-linejoin","strokeLinejoin"),n("stroke-miterlimit","strokeMiterlimit",i),n("stroke-dasharray","strokeDasharray",h),n("stroke-dashoffset","strokeDashoffset",M),n("visibility","visibility"),e}function V(r,e,t=[]){var u;if(r.nodeType!==1)return t;let s=!1,n=null;const o={};switch(r.nodeName){case"svg":e=$(r,e,o);break;case"style":Ut(r,o);break;case"g":e=$(r,e,o);break;case"path":e=$(r,e,o),r.hasAttribute("d")&&(n=Gt(r));break;case"rect":e=$(r,e,o),n=Zt(r);break;case"polygon":e=$(r,e,o),n=Ht(r);break;case"polyline":e=$(r,e,o),n=jt(r);break;case"circle":e=$(r,e,o),n=Yt(r);break;case"ellipse":e=$(r,e,o),n=Wt(r);break;case"line":e=$(r,e,o),n=Bt(r);break;case"defs":s=!0;break;case"use":{e=$(r,e,o);const g=(r.getAttributeNS("http://www.w3.org/1999/xlink","href")||"").substring(1),p=(u=r.viewportElement)==null?void 0:u.getElementById(g);p?V(p,e,t):console.warn(`'use node' references non-existent node id: ${g}`);break}default:console.warn(r);break}const i=new C,h=[],c=_t(r,i,h);n&&(n.transform(i),t.push(n),n.style=e);const a=r.childNodes;for(let f=0,g=a.length;f<g;f++){const p=a[f];s&&p.nodeName!=="style"&&p.nodeName!=="defs"||V(p,e,t)}return c&&(h.pop(),h.length>0?i.copy(h[h.length-1]):i.identity()),t}const xt="data:image/svg+xml;",mt=`${xt}base64,`,Mt=`${xt}charset=utf8,`;function Pt(r){if(typeof r=="string"){let e;return r.startsWith(mt)?(r=r.substring(mt.length,r.length),e=atob(r)):r.startsWith(Mt)?(r=r.substring(Mt.length,r.length),e=decodeURIComponent(r)):e=r,new DOMParser().parseFromString(e,"image/svg+xml").documentElement}else return r}function Jt(r){return V(Pt(r),{})}x.BoundingBox=L,x.CircleCurve=_,x.CubicBezierCurve=nt,x.Curve=k,x.CurvePath=R,x.EllipseCurve=ot,x.HeartCurve=Dt,x.LineCurve=X,x.Matrix3=C,x.Path2D=I,x.PloygonCurve=Xt,x.QuadraticBezierCurve=ut,x.RectangularCurve=lt,x.SplineCurve=ft,x.Vector2=l,x.addPathCommandsToPath2D=B,x.parseArcCommand=J,x.parsePathDataArgs=A,x.parseSvg=Jt,x.parseSvgToDom=Pt,x.pathCommandsToPathData=K,x.pathDataToPathCommands=G,x.setCanvasContext=D,Object.defineProperty(x,Symbol.toStringTag,{value:"Module"})});
package/dist/index.mjs CHANGED
@@ -139,6 +139,11 @@ class BoundingBox {
139
139
  return this.top + this.height;
140
140
  }
141
141
  static from(...boxes) {
142
+ if (boxes.length === 0) {
143
+ return new BoundingBox();
144
+ } else if (boxes.length === 1) {
145
+ return boxes[0].clone();
146
+ }
142
147
  const firstBox = boxes[0];
143
148
  const merged = boxes.slice(1).reduce(
144
149
  (merged2, box) => {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "modern-path2d",
3
3
  "type": "module",
4
- "version": "0.1.17",
4
+ "version": "0.1.18",
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",