textmode.js 0.3.1 → 0.3.2-beta.2
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/README.md +1 -1
- package/dist/textmode.esm.js +1201 -1556
- package/dist/textmode.esm.min.js +1230 -1585
- package/dist/textmode.umd.js +7 -9
- package/dist/textmode.umd.min.js +7 -9
- package/dist/types/index.d.ts +1 -0
- package/dist/types/rendering/webgl/Framebuffer.d.ts +1 -2
- package/dist/types/textmode/Textmodifier.d.ts +49 -2
- package/package.json +1 -1
package/dist/textmode.umd.js
CHANGED
|
@@ -1,13 +1,11 @@
|
|
|
1
|
-
var
|
|
1
|
+
var he=Object.defineProperty;var ae=(b,R,S)=>R in b?he(b,R,{enumerable:!0,configurable:!0,writable:!0,value:S}):b[R]=S;var c=(b,R,S)=>ae(b,typeof R!="symbol"?R+"":R,S);var s,e;s=this,e=function(b){class R extends Error{constructor(t,i={}){super(R.i(t,i)),this.name="TextmodeError"}static i(t,i){return`${t}${i&&Object.keys(i).length>0?`
|
|
2
2
|
|
|
3
3
|
📋 Context:`+Object.entries(i).map(([r,n])=>`
|
|
4
|
-
- ${r}: ${
|
|
4
|
+
- ${r}: ${R.o(n)}`).join(""):""}
|
|
5
5
|
|
|
6
6
|
${"↓".repeat(24)}
|
|
7
|
-
`}static o(t){if(t===null)return"null";if(t===void 0)return"undefined";if(typeof t=="string")return`"${t}"`;if(typeof t=="number"||typeof t=="boolean")return t+"";if(Array.isArray(t))return t.length===0?"[]":t.length<=5?`[${t.map(i=>
|
|
8
|
-
in vec2 a_position;in vec2 a_texCoord;in vec2 a_instancePosition;in vec2 a_instanceSize;in vec3 a_instanceCharacter;in vec4 a_instancePrimaryColor;in vec4 a_instanceSecondaryColor;in vec2 a_instanceRotation;in vec3 a_instanceTransform;in vec3 a_instanceGlobalRotation;in vec2 a_instanceRotationCenter;in vec2 a_instanceBezierCP1;in vec2 a_instanceBezierCP2;in vec2 a_instanceBezierStart;in vec2 a_instanceBezierEnd;in vec2 a_instanceArcAngles;uniform float U9;uniform vec2 Uw;out vec2 v_uv;out vec3 v_character;out vec4 v_primaryColor;out vec4 v_secondaryColor;out vec2 v_rotation;out vec3 v_transform;mat3 A(float B){float C=sin(B),D=cos(B);return mat3(1,0,0,0,D,-C,0,C,D);}mat3 E(float B){float C=sin(B),D=cos(B);return mat3(D,0,C,0,1,0,-C,0,D);}mat3 F(float B){float C=sin(B),D=cos(B);return mat3(D,-C,0,C,D,0,0,0,1);}vec2 G(float H,vec2 I,vec2 J,vec2 K,vec2 L){float M=1.-H,N=M*M,O=H*H;return N*M*I+3.*N*H*J+3.*M*O*K+O*H*L;}vec2 P(float H,vec2 I,vec2 J,vec2 K,vec2 L){float M=1.-H,N=M*M,O=H*H;return-3.*N*I+3.*N*J-6.*M*H*J+6.*M*H*K-3.*O*K+3.*O*L;}void main(){v_uv=a_texCoord;v_character=a_instanceCharacter;v_primaryColor=a_instancePrimaryColor;v_secondaryColor=a_instanceSecondaryColor;v_rotation=a_instanceRotation;v_transform=a_instanceTransform;vec2 Q;bool R=length(a_instanceBezierCP1)+length(a_instanceBezierCP2)+length(a_instanceBezierStart)+length(a_instanceBezierEnd)>0.;bool S=a_instanceArcAngles.x!=0.||a_instanceArcAngles.y!=0.;if(R){float H=a_position.x;vec2 T=G(H,a_instanceBezierStart,a_instanceBezierCP1,a_instanceBezierCP2,a_instanceBezierEnd);vec2 U=P(H,a_instanceBezierStart,a_instanceBezierCP1,a_instanceBezierCP2,a_instanceBezierEnd);float V=length(U);U=V>0.?U/V:vec2(1,0);Q=T+vec2(-U.y,U.x)*a_position.y*a_instanceSize.y;}else if(S){float C=a_instanceArcAngles.x,W=a_instanceArcAngles.y;C=mod(C,6.28318530718);if(C<0.)C+=6.28318530718;W=mod(W,6.28318530718);if(W<0.)W+=6.28318530718;float X=C-W;if(X<=0.)X+=6.28318530718;float Y=C-a_position.x*X;vec2 Z=vec2(cos(Y),sin(Y))*a_position.y;Q=Z*a_instanceSize*.5+a_instanceSize*.5+a_instancePosition;}else{Q=a_position*a_instanceSize+a_instancePosition;}vec2 a=(Q/Uw)*2.-1.;a.y=-a.y;if(length(a_instanceGlobalRotation)>0.){vec3 b=vec3(a-a_instanceRotationCenter,0);b.x*=U9;if(a_instanceGlobalRotation.x!=0.)b=A(-a_instanceGlobalRotation.x)*b;if(a_instanceGlobalRotation.y!=0.)b=E(-a_instanceGlobalRotation.y)*b;if(a_instanceGlobalRotation.z!=0.)b=F(-a_instanceGlobalRotation.z)*b;b.x/=U9;a=b.xy+a_instanceRotationCenter;}gl_Position=vec4(a,0,1);}`,
|
|
9
|
-
precision highp float;in vec2 v_uv;in vec3 v_character;in vec4 v_primaryColor;in vec4 v_secondaryColor;in vec2 v_rotation;in vec3 v_transform;layout(location=0)out vec4 o_character;layout(location=1)out vec4 o_primaryColor;layout(location=2)out vec4 o_secondaryColor;layout(location=3)out vec4 o_rotation;layout(location=4)out vec4 o_transform;void main(){o_character=vec4(v_character,1.);o_primaryColor=v_primaryColor;o_secondaryColor=v_secondaryColor;o_rotation=vec4(v_rotation,0.,1.);o_transform=vec4(v_transform,1.);}`),this.
|
|
10
|
-
precision highp float;in vec2 v_uv;uniform sampler2D Ue;uniform sampler2D Uf;uniform sampler2D Ug;uniform sampler2D Uh;uniform sampler2D Ui;uniform vec2 Uj;layout(location=0)out vec4 o_character;layout(location=1)out vec4 o_primaryColor;layout(location=2)out vec4 o_secondaryColor;layout(location=3)out vec4 o_rotation;layout(location=4)out vec4 o_transform;void main(){vec2 A=vec2(v_uv.x,1.-v_uv.y);vec2 B=A*Uj;vec2 C=(floor(B)+0.5f)/Uj;vec4 D=texture(Ue,C);vec4 E=texture(Uf,C);if(E.a==0.){discard;}vec4 F=texture(Ug,C);vec4 G=texture(Uh,C);vec4 H=texture(Ui,C);o_character=D;o_primaryColor=E;o_secondaryColor=F;o_rotation=G;o_transform=H;}`),this.
|
|
11
|
-
precision highp float;in vec2 v_uv;uniform sampler2D Uk;uniform bool Ul;uniform bool Um;uniform bool Un;uniform vec2 Uo;uniform bool Up;uniform vec4 Uq;uniform bool Ur;uniform vec4 Us;uniform vec4 Ut;uniform int Uu;uniform vec3 Uv[64];layout(location=0)out vec4 o_character;layout(location=1)out vec4 o_primaryColor;layout(location=2)out vec4 o_secondaryColor;layout(location=3)out vec4 o_rotation;layout(location=4)out vec4 o_transform;float A(vec3 B){return dot(B,vec3(0.299f,0.587f,0.114f));}void main(){vec2 C=vec2(v_uv.x,1.0f-v_uv.y);vec4 D=texture(Uk,C);float E=A(D.rgb);if(Uu>0){float F=float(Uu);float G=clamp(E*(F-1.0f),0.0f,F-1.0f);int H=int(floor(G+0.5f));vec3 I=Uv[H];o_character=vec4(I,1.0f);}else{o_character=vec4(E,0.0f,0.0f,1.0f);}vec4 J=Up?Uq:D;vec4 K=Ur?Us:D;if(D.a<0.01f){J=Ut;K=Ut;}else{}o_primaryColor=vec4(J);o_secondaryColor=vec4(K);o_rotation=vec4(Uo.xy,0.0f,1.0f);o_transform=vec4(float(Ul),float(Um),float(Un),1.0f);}`)}ie(){return this.Jt}St(){return this.te}re(){return this.ee}ne(){return this.se}oe(t){return new N(this.vt,K,t)}he(t,i){return new N(this.vt,t,i)}kt(){this.Jt.kt(),this.te.kt(),this.ee.kt(),this.se.kt()}}var T=(l=>(l.RECTANGLE="rectangle",l.LINE="line",l.ELLIPSE="ellipse",l.ARC="arc",l.TRIANGLE="triangle",l.BEZIER_CURVE="bezier_curve",l.CUSTOM="custom",l))(T||{});class Et{constructor(t){c(this,"vt");c(this,"ae",new Map);this.vt=t}ce(t,i,r,n){const o=this.vt;let h=this.ae.get(t);h||(h=new Map,this.ae.set(t,h));let a=h.get(i)||null;if(!a){a=o.createVertexArray(),h.set(i,a),o.bindVertexArray(a),o.bindBuffer(o.ARRAY_BUFFER,n);const u=o.getAttribLocation(t,"a_position");u!==-1&&(o.enableVertexAttribArray(u),o.vertexAttribPointer(u,r.ue.le.size,o.FLOAT,!1,r.fe,r.ue.le.offset),o.vertexAttribDivisor(u,0));const f=o.getAttribLocation(t,"a_texCoord");f!==-1&&(o.enableVertexAttribArray(f),o.vertexAttribPointer(f,r.ue.de.size,o.FLOAT,!1,r.fe,r.ue.de.offset),o.vertexAttribDivisor(f,0))}o.bindVertexArray(a)}pe(){this.vt.bindVertexArray(null)}kt(){for(const[,t]of this.ae)for(const[,i]of t)i&&this.vt.deleteVertexArray(i)}}class wt{constructor(t,i){c(this,"_e");c(this,"vt");c(this,"xt");c(this,"me",null);c(this,"ge",null);this.vt=t,this._e=new Et(t),this.xt=i}ve(t,i,r){const{shader:n}=t,o=j(this.vt)||this.vt.getParameter(this.vt.VIEWPORT);n.Vt({U9:o[2]/o[3],Uw:[o[2],o[3]]});const h=f=>{if(!f||!f.ye())return;const d=f.unitGeometry,g=f.unitBuffer;try{this._e.ce(n.Qt,f.type+"",d,g),f.batch.we(n),f.batch.Ce(d.Ae,d.be)}finally{f.batch.xe(n),this._e.pe(),f.Me()}};let a=null,u=null;for(const f of i){if(f.type===T.CUSTOM){u&&(h(u),a=null,u=null),this.$e(t,f.params,f.state,r.get(T.RECTANGLE));continue}a!==null&&f.type!==a&&(h(u),a=null,u=null);let d=u;d&&f.type===a||(d=r.get(f.type)||null,u=d,a=f.type),d&&d.Te(f.params,f.state)}h(u)}$e(t,i,r,n){const{x:o,y:h,width:a,height:u,shader:f,uniforms:d}=i,g=this.Fe(Math.max(1,Math.floor(a)),Math.max(1,Math.floor(u)));g.begin(),this.Re(n,f,d,0,0,g.width,g.height,{}),g.end();const m=this.ze(),x={Ue:g.textures[0],Uf:g.textures[1],Ug:g.textures[2],Uh:g.textures[3],Ui:g.textures[4],Uj:[g.width,g.height]};this.Re(n,m,x,Math.floor(o),Math.floor(h),Math.max(1,Math.floor(a)),Math.max(1,Math.floor(u)),r),t.shader.Xt()}Re(t,i,r,n,o,h,a,u){i.Xt(),i.Vt(r);const f=this.vt.getParameter(this.vt.VIEWPORT);if(i.Vt({U9:f[2]/f[3],Uw:[f[2],f[3]]}),t.Me(),t.Te({x:n,y:o,width:h,height:a},u),t.ye()){const d=t.unitGeometry,g=t.unitBuffer;try{this._e.ce(i.Qt,t.type+"",d,g),t.batch.we(i),t.batch.Ce(d.Ae,d.be)}finally{t.batch.xe(i),this._e.pe(),t.Me()}}}ze(){return this.xt.ie()}Fe(t,i){return this.me&&this.ge&&this.ge.w===t&&this.ge.h===i||(this.me&&this.me.kt(),this.me=new V(this.vt,t,i,5),this.ge={w:t,h:i}),this.me}kt(){this._e.kt(),this.me&&this.me.kt()}}class Tt{constructor(){c(this,"Se",[]);c(this,"Pe",1);c(this,"Ee",0)}De(t){if(this.Ee>=this.Se.length){const r={id:this.Pe++,type:t,params:{},state:{I:1,N:0,X:0,W:0,K:[0,0,0],Y:[1,1,1,1],q:[0,0,0,1],V:!1,j:!1,k:!1,G:[0,0]}};this.Se.push(r)}const i=this.Se[this.Ee];return i.id=this.Pe++,i.type=t,this.Ee++,i}ke(t,i,r,n,o){const h=this.De(T.RECTANGLE);return h.params.x=t,h.params.y=i,h.params.width=r,h.params.height=n,o.J(h.state),h.id}Be(t,i,r,n,o,h,a){const u=this.De(T.CUSTOM);return u.params.x=t,u.params.y=i,u.params.width=r,u.params.height=n,u.params.shader=o,u.params.uniforms=h,a.J(u.state),u.id}Ge(t,i,r,n,o,h){const a=this.De(T.LINE);return a.params.x1=t,a.params.y1=i,a.params.x2=r,a.params.y2=n,a.params.thickness=o,h.J(a.state),a.id}Le(t,i,r,n,o){const h=this.De(T.ELLIPSE);return h.params.x=t,h.params.y=i,h.params.width=r,h.params.height=n,o.J(h.state),h.id}Oe(t,i,r,n,o,h,a){const u=this.De(T.ARC);return u.params.x=t,u.params.y=i,u.params.width=r,u.params.height=n,u.params.start=o,u.params.stop=h,a.J(u.state),u.id}He(t,i,r,n,o,h,a){const u=this.De(T.TRIANGLE);return u.params.x1=t,u.params.y1=i,u.params.x2=r,u.params.y2=n,u.params.x3=o,u.params.y3=h,a.J(u.state),u.id}Ie(t,i,r,n,o,h,a,u,f,d){const g=this.De(T.BEZIER_CURVE);return g.params.x1=t,g.params.y1=i,g.params.cp1x=r,g.params.cp1y=n,g.params.cp2x=o,g.params.cp2y=h,g.params.x2=a,g.params.y2=u,g.params.thickness=f,d.J(g.state),g.id}get length(){return this.Ee}get isEmpty(){return this.Ee===0}Ne(){this.Ee=0}[Symbol.iterator](){let t=0;const i=this.Ee,r=this.Se;return{next:()=>t<i?{value:r[t++],done:!1}:{value:void 0,done:!0}}}}const G=class G{static Xe(t,i,r=0){var h,a,u,f,d,g,m,x,A,p;const n=i||new Float32Array(G.FLOATS_PER_INSTANCE);let o=r;return n[o++]=t.le[0],n[o++]=t.le[1],n[o++]=t.Ee[0],n[o++]=t.Ee[1],n[o++]=t.K[0],n[o++]=t.K[1],n[o++]=t.K[2],n[o++]=t.Y[0],n[o++]=t.Y[1],n[o++]=t.Y[2],n[o++]=t.Y[3],n[o++]=t.q[0],n[o++]=t.q[1],n[o++]=t.q[2],n[o++]=t.q[3],n[o++]=t.G[0],n[o++]=t.G[1],n[o++]=t.We[0],n[o++]=t.We[1],n[o++]=t.We[2],n[o++]=t.N,n[o++]=t.X,n[o++]=t.W,n[o++]=t.Ve[0],n[o++]=t.Ve[1],n[o++]=((h=t.je)==null?void 0:h[0])||0,n[o++]=((a=t.je)==null?void 0:a[1])||0,n[o++]=((u=t.Ke)==null?void 0:u[0])||0,n[o++]=((f=t.Ke)==null?void 0:f[1])||0,n[o++]=((d=t.Ye)==null?void 0:d[0])||0,n[o++]=((g=t.Ye)==null?void 0:g[1])||0,n[o++]=((m=t.qe)==null?void 0:m[0])||0,n[o++]=((x=t.qe)==null?void 0:x[1])||0,n[o++]=((A=t.Ze)==null?void 0:A[0])||0,n[o++]=((p=t.Ze)==null?void 0:p[1])||0,n}static Qe(t){const i=t.length*G.FLOATS_PER_INSTANCE,r=new Float32Array(i);for(let n=0;n<t.length;n++){const o=n*G.FLOATS_PER_INSTANCE;G.Xe(t[n],r,o)}return r}};c(G,"BYTES_PER_INSTANCE",140),c(G,"FLOATS_PER_INSTANCE",35);let D=G;const F=class F{};c(F,"STRIDE",D.BYTES_PER_INSTANCE),c(F,"ATTRIBUTES",{a_instancePosition:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:F.STRIDE,offset:0,divisor:1},a_instanceSize:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:F.STRIDE,offset:8,divisor:1},a_instanceCharacter:{location:-1,size:3,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:F.STRIDE,offset:16,divisor:1},a_instancePrimaryColor:{location:-1,size:4,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:F.STRIDE,offset:28,divisor:1},a_instanceSecondaryColor:{location:-1,size:4,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:F.STRIDE,offset:44,divisor:1},a_instanceRotation:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:F.STRIDE,offset:60,divisor:1},a_instanceTransform:{location:-1,size:3,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:F.STRIDE,offset:68,divisor:1},a_instanceGlobalRotation:{location:-1,size:3,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:F.STRIDE,offset:80,divisor:1},a_instanceRotationCenter:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:F.STRIDE,offset:92,divisor:1},a_instanceArcAngles:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:F.STRIDE,offset:100,divisor:1},a_instanceBezierCP1:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:F.STRIDE,offset:108,divisor:1},a_instanceBezierCP2:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:F.STRIDE,offset:116,divisor:1},a_instanceBezierStart:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:F.STRIDE,offset:124,divisor:1},a_instanceBezierEnd:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:F.STRIDE,offset:132,divisor:1}});let q=F;class bt{constructor(t,i=1e3,r=1.5){c(this,"vt");c(this,"Je",[]);c(this,"ts");c(this,"es");c(this,"ss",null);c(this,"rs",!0);c(this,"ns",0);c(this,"hs",new Map);c(this,"cs",null);this.vt=t,this.ts=i,this.es=r,this.ls()}Te(t){const i=this.Je.length;return this.Je.push(t),this.rs=!0,i}get count(){return this.Je.length}get isEmpty(){return this.Je.length===0}clear(){this.Je.length=0,this.rs=!0}us(t){if(t<=this.ts)return;const i=Math.ceil(t*this.es);this.ts=i,this.ls()}ls(){const t=this.vt;this.ss&&t.deleteBuffer(this.ss),this.ss=t.createBuffer();const i=this.ts*D.BYTES_PER_INSTANCE;t.bindBuffer(t.ARRAY_BUFFER,this.ss),t.bufferData(t.ARRAY_BUFFER,i,t.DYNAMIC_DRAW),t.bindBuffer(t.ARRAY_BUFFER,null),this.rs=!0,this.ns=0}fs(){if(!this.rs||this.Je.length===0)return;const t=this.vt,i=this.Je.length;this.us(i),(!this.cs||this.cs.length<i*D.FLOATS_PER_INSTANCE)&&(this.cs=new Float32Array(i*D.FLOATS_PER_INSTANCE));const r=D.Qe(this.Je);t.bindBuffer(t.ARRAY_BUFFER,this.ss),i<=this.ns?t.bufferSubData(t.ARRAY_BUFFER,0,r):t.bufferData(t.ARRAY_BUFFER,r,t.DYNAMIC_DRAW),t.bindBuffer(t.ARRAY_BUFFER,null),this.rs=!1,this.ns=i}ds(t){let i=this.hs.get(t);if(!i){i=new Map;const r=this.vt;for(const n in q.ATTRIBUTES){const o=r.getAttribLocation(t,n);o!==-1&&i.set(n,o)}this.hs.set(t,i)}return i}we(t){if(!this.ss||this.Je.length===0)return;const i=this.vt,r=t.Qt;this.fs();const n=this.ds(r);i.bindBuffer(i.ARRAY_BUFFER,this.ss);for(const[o,h]of n){const a=q.ATTRIBUTES[o];a&&(i.enableVertexAttribArray(h),i.vertexAttribPointer(h,a.size,a.type,a.normalized,a.stride,a.offset),i.vertexAttribDivisor(h,a.divisor))}}xe(t){const i=this.vt,r=this.ds(t.Qt);for(const[,n]of r)i.disableVertexAttribArray(n),i.vertexAttribDivisor(n,0)}Ce(t,i){this.Je.length!==0&&this.vt.drawArraysInstanced(t,0,i,this.Je.length)}kt(){this.ss&&this.vt.deleteBuffer(this.ss)}}class z{constructor(t,i,r,n){c(this,"vt");c(this,"ps");c(this,"_s");c(this,"gs");c(this,"vs",null);this.vt=t,this.ps=i,this._s=r,this.gs=n;const o=this.vt.createBuffer();if(!o)throw Error("Failed to create unit geometry buffer");this.vt.bindBuffer(this.vt.ARRAY_BUFFER,o),this.vt.bufferData(this.vt.ARRAY_BUFFER,this.gs.ws,this.vt.STATIC_DRAW),this.vt.bindBuffer(this.vt.ARRAY_BUFFER,null),this.vs=o}get type(){return this._s}get unitGeometry(){return this.gs}get unitBuffer(){return this.vs}get batch(){return this.ps}Me(){this.ps.clear()}ye(){return!this.ps.isEmpty}kt(){this.ps.kt(),this.vt.deleteBuffer(this.vs)}Cs(t,i,r,n,o){const h=this.As(t,i,r,n,o.N||0,o.X||0,o.W||0);return{le:[t,i],Ee:[r,n],K:o.K||[0,0,0],Y:o.Y||[1,1,1,1],q:o.q||[0,0,0,1],G:o.G||[0,0],We:[o.k?1:0,o.V?1:0,o.j?1:0],N:h.radiansX,X:h.radiansY,W:h.radiansZ,Ve:[h.centerX,h.centerY]}}bs(t,i){const r=j(this.vt)||[0,0,this.vt.canvas.width,this.vt.canvas.height];return{nx:t/r[2]*2-1,ny:1-i/r[3]*2}}Ms(t,i,r){const n=this.bs(i,r);t.Ve=[n.nx,n.ny]}As(t,i,r,n,o,h,a){const u=j(this.vt)||[0,0,this.vt.canvas.width,this.vt.canvas.height],f=u[2],d=u[3];return{centerX:(t+r/2)/f*2-1,centerY:1-(i+n/2)/d*2,radiansX:-o*Math.PI/180,radiansY:-h*Math.PI/180,radiansZ:-a*Math.PI/180,aspectRatio:f/d}}}const Rt={ws:new Float32Array([0,0,0,0,1,0,1,0,0,1,0,1,0,1,0,1,1,0,1,0,1,1,1,1]),be:6,Ae:WebGL2RenderingContext.TRIANGLES,fe:16,ue:{le:{size:2,offset:0},de:{size:2,offset:8}}};class Ct extends z{constructor(t,i){super(t,i,T.RECTANGLE,Rt)}Te(t,i){const r=this.Cs(t.x,t.y,t.width,t.height,i);return this.ps.Te(r)}}const Ft={ws:new Float32Array([0,-.5,0,0,1,-.5,1,0,0,.5,0,1,0,.5,0,1,1,-.5,1,0,1,.5,1,1]),be:6,Ae:WebGL2RenderingContext.TRIANGLES,fe:16,ue:{le:{size:2,offset:0},de:{size:2,offset:8}}};class Ut extends z{constructor(t,i){super(t,i,T.LINE,Ft)}Te(t,i){const r=t.x2-t.x1,n=t.y2-t.y1,o=Math.hypot(r,n),h=t.thickness||i.I||1,a=t.x1+r/2,u=t.y1+n/2,f=a-o/2,d=u,g=this.Cs(f,d,o,h,i);return this.Ms(g,a,u),this.ps.Te(g)}}const Lt={ws:function(l=32){const t=[],i=2*Math.PI/l;for(let r=0;r<l;r++){const n=r*i,o=(r+1)%l*i,h=Math.cos(n),a=Math.sin(n),u=.5*(h+1),f=.5*(a+1),d=Math.cos(o),g=Math.sin(o),m=.5*(d+1),x=.5*(g+1);t.push(0,0,.5,.5,h,a,u,f,d,g,m,x)}return new Float32Array(t)}(32),be:96,Ae:WebGL2RenderingContext.TRIANGLES,fe:16,ue:{le:{size:2,offset:0},de:{size:2,offset:8}}};class Pt extends z{constructor(t,i){super(t,i,T.ELLIPSE,Lt)}Te(t,i){const r=this.Cs(t.x,t.y,t.width,t.height,i);return this.Ms(r,t.x,t.y),this.ps.Te(r)}}let Mt={ws:function(l){const t=[];for(let i=0;i<l;i++){const r=i/l,n=(i+1)/l;t.push(r,0,r,0,r,1,r,1,n,1,n,1)}return new Float32Array(t)}(32),be:96,Ae:WebGL2RenderingContext.TRIANGLES,fe:16,ue:{le:{size:2,offset:0},de:{size:2,offset:8}}};class St extends z{constructor(t,i){super(t,i,T.ARC,Mt)}Te(t,i){const r=t.x-t.width/2,n=t.y-t.height/2,o=t.start*Math.PI/180,h=t.stop*Math.PI/180,a=this.Cs(r,n,t.width,t.height,i);return this.Ms(a,t.x,t.y),a.je=[o,h],this.ps.Te(a)}}const Bt={ws:new Float32Array([0,0,0,0,1,0,1,0,.5,1,.5,1]),be:3,Ae:WebGL2RenderingContext.TRIANGLES,fe:16,ue:{le:{size:2,offset:0},de:{size:2,offset:8}}};class Gt extends z{constructor(t,i){super(t,i,T.TRIANGLE,Bt)}Te(t,i){const r=Math.min(t.x1,t.x2,t.x3),n=Math.max(t.x1,t.x2,t.x3),o=Math.min(t.y1,t.y2,t.y3),h=n-r,a=Math.max(t.y1,t.y2,t.y3)-o,u=this.Cs(r,o,h,a,i),f=r+.5*h,d=o+a*(1/3);return this.Ms(u,f,d),this.ps.Te(u)}}function ht(l,t,i,r,n){const o=1-l,h=o*o,a=l*l;return h*o*t+3*h*l*i+3*o*a*r+a*l*n}const _t={ws:function(l=16){const t=[];for(let i=0;i<l;i++){const r=i/l,n=(i+1)/l;t.push(r,-.5,r,0),t.push(n,-.5,n,0),t.push(r,.5,r,1),t.push(r,.5,r,1),t.push(n,-.5,n,0),t.push(n,.5,n,1)}return new Float32Array(t)}(16),be:96,Ae:WebGL2RenderingContext.TRIANGLES,fe:16,ue:{le:{size:2,offset:0},de:{size:2,offset:8}}};class Dt extends z{constructor(t,i){super(t,i,T.BEZIER_CURVE,_t)}Te(t,i){const r=i.I||1,n=ht(.5,t.x1,t.cp1x,t.cp2x,t.x2),o=ht(.5,t.y1,t.cp1y,t.cp2y,t.y2),h=this.Cs(0,0,1,r,i);return this.Ms(h,n,o),h.qe=[t.x1,t.y1],h.Ke=[t.cp1x,t.cp1y],h.Ye=[t.cp2x,t.cp2y],h.Ze=[t.x2,t.y2],this.ps.Te(h)}}class Ot{constructor(t){c(this,"vt");c(this,"$s",null);c(this,"Ts");c(this,"Fs",null);c(this,"Rs",{});c(this,"zs",null);c(this,"Ss",new Map);c(this,"Ps");c(this,"Es");c(this,"Ds");c(this,"O",[]);this.vt=t,this.Ts=new yt(t),this.Ds=new nt,this.Ps=new wt(t,this),this.Es=new Tt,this.zs=t.createBuffer(),W(this.vt,[0,0,this.vt.canvas.width,this.vt.canvas.height])}ks(t){let i=this.Ss.get(t);if(i)return i;const r=new bt(this.vt);return i=(0,{[T.RECTANGLE]:()=>new Ct(this.vt,r),[T.LINE]:()=>new Ut(this.vt,r),[T.ELLIPSE]:()=>new Pt(this.vt,r),[T.ARC]:()=>new St(this.vt,r),[T.TRIANGLE]:()=>new Gt(this.vt,r),[T.BEZIER_CURVE]:()=>new Dt(this.vt,r)}[t])(),this.Ss.set(t,i),i}Bs(t){this.$s!==t&&(this.$s=t,t.Xt())}he(t,i){return this.Ts.he(t,i)}ie(){return this.Ts.ie()}St(){return this.Ts.St()}re(){return this.Ts.re()}ne(){return this.Ts.ne()}Gs(t){this.Fs=t,t&&(this.Rs={})}jt(t,i){this.Rs[t]=i}Ls(t){Object.assign(this.Rs,t)}oe(t){return this.Ts.oe(t)}Os(t,i,r,n,o){const h=this.ie(),a={Ue:t.textures[0],Uf:t.textures[1],Ug:t.textures[2],Uh:t.textures[3],Ui:t.textures[4],Uj:[t.width,t.height]};this.Es.Be(i,r,n,o,h,a,this.Ds)}Hs(t,i,r,n,o){const h=this.ne(),a=t.Is(),u={Uk:a.texture,Ul:!!a.invert,Um:!!a.flipX,Un:!!a.flipY,Uo:a.charRotation,Up:a.charColorFixed,Uq:a.charColor,Ur:a.cellColorFixed,Us:a.cellColor,Ut:a.backgroundColor,Uu:a.charCount,Uv:a.charList};this.Es.Be(i,r,n,o,h,u,this.Ds)}Ns(t,i,r,n){var p;const o=this.vt,h=o.canvas.width,a=o.canvas.height,u=t/h*2-1,f=(t+r)/h*2-1,d=1-i/a*2,g=1-(i+n)/a*2,m=new Float32Array([u,g,f,g,u,d,f,g,f,d,u,d]);o.bindBuffer(o.ARRAY_BUFFER,this.zs),o.bufferData(o.ARRAY_BUFFER,m,o.DYNAMIC_DRAW);const x=((p=this.$s)==null?void 0:p.Qt)||o.getParameter(o.CURRENT_PROGRAM),A=x?o.getAttribLocation(x,"a_position"):-1;A!==-1&&(o.enableVertexAttribArray(A),o.vertexAttribPointer(A,2,o.FLOAT,!1,8,0)),o.drawArrays(o.TRIANGLES,0,6),A!==-1&&o.disableVertexAttribArray(A)}Xs(t,i,r,n){this.Fs?(this.Es.Be(t,i,r,n,this.Fs,{...this.Rs},this.Ds),this.Fs=null,this.Rs={}):this.Es.ke(t,i,r,n,this.Ds)}Ws(t,i,r,n){this.Es.Ge(t,i,r,n,this.Ds.lineWeight,this.Ds)}Vs(t,i,r,n){this.Es.Le(t,i,r,n,this.Ds)}js(t,i,r,n,o,h){this.Es.He(t,i,r,n,o,h,this.Ds)}Ks(t,i,r,n,o,h,a,u){const f=this.Ds.lineWeight;this.Es.Ie(t,i,r,n,o,h,a,u,f,this.Ds)}Ys(t,i,r=1,n={}){return new V(this.vt,t,i,r,n,this,!0)}qs(t,i,r,n,o,h){this.Es.Oe(t,i,r,n,o,h,this.Ds)}Zs(t,i=t,r=t,n=255){this.Ds.ft(t,i,r,n),this.Ne(t/255,i/255,r/255,n/255)}Ne(t=0,i=0,r=0,n=0){this.vt.clearColor(t,i,r,n),this.vt.clear(this.vt.COLOR_BUFFER_BIT)}Qs(){this.vt.viewport(0,0,this.vt.canvas.width,this.vt.canvas.height),W(this.vt,[0,0,this.vt.canvas.width,this.vt.canvas.height])}get context(){return this.vt}get state(){return this.Ds}Et(t){this.O.push(this.Ds),this.Ds=t}Dt(){const t=this.O.pop();t&&(this.Ds=t)}Pt(t){const i=t,r=j(this.vt)??this.vt.getParameter(this.vt.VIEWPORT),n={shader:i,gl:this.vt,viewport:r};this.Bs(i);const o=new Set;for(const h of this.Es)h.type===T.CUSTOM?o.add(T.RECTANGLE):o.add(h.type);for(const h of o)h!==T.CUSTOM&&this.ks(h);this.Ps.ve(n,this.Es,this.Ss),this.Es.Ne()}kt(){this.vt.deleteBuffer(this.zs),this.Es.Ne();for(const t of this.Ss.values())t.kt();this.Ts.kt(),this.Ps.kt()}}const C={readShort:(l,t)=>(C.t.uint16[0]=l[t]<<8|l[t+1],C.t.int16[0]),readUshort:(l,t)=>l[t]<<8|l[t+1],readUshorts(l,t,i){const r=[];for(let n=0;n<i;n++)r.push(C.readUshort(l,t+2*n));return r},readUint(l,t){const i=C.t.uint8;return i[3]=l[t],i[2]=l[t+1],i[1]=l[t+2],i[0]=l[t+3],C.t.uint32[0]},readASCII(l,t,i){let r="";for(let n=0;n<i;n++)r+=String.fromCharCode(l[t+n]);return r},writeUshort(l,t,i){l[t]=i>>>8&255,l[t+1]=255&i},writeUint(l,t,i){l[t]=i>>>24&255,l[t+1]=i>>>16&255,l[t+2]=i>>>8&255,l[t+3]=255&i},writeASCII(l,t,i){for(let r=0;r<i.length;r++)l[t+r]=255&i.charCodeAt(r)},t:(()=>{const l=new ArrayBuffer(8);return{uint8:new Uint8Array(l),int16:new Int16Array(l),uint16:new Uint16Array(l),uint32:new Uint32Array(l)}})()};function Z(l){return l+3&-4}function Q(l,t,i){const r=t+i;let n=0;const o=C.t;for(let h=t;h<r;h+=4)o.uint8[3]=l[h]||0,o.uint8[2]=l[h+1]||0,o.uint8[1]=l[h+2]||0,o.uint8[0]=l[h+3]||0,n=n+(o.uint32[0]>>>0)>>>0;return n>>>0}class It{constructor(t){c(this,"b");c(this,"p",0);c(this,"bitbuf",0);c(this,"bitcnt",0);this.b=t}readBits(t){for(;this.bitcnt<t;){const r=this.b[this.p++]||0;this.bitbuf|=r<<this.bitcnt,this.bitcnt+=8}const i=this.bitbuf&(1<<t)-1;return this.bitbuf>>>=t,this.bitcnt-=t,i}alignToByte(){this.bitbuf=0,this.bitcnt=0}get offset(){return this.p}}function k(l){let t=32,i=0;for(const a of l)a&&(a<t&&(t=a),a>i&&(i=a));if(i===0)return{min:0,max:0,table:new Map};const r=new Uint32Array(i+1);for(const a of l)a&&r[a]++;const n=new Uint32Array(i+1);let o=0;r[0]=0;for(let a=1;a<=i;a++)o=o+r[a-1]<<1,n[a]=o;const h=new Map;for(let a=0;a<l.length;a++){const u=l[a];if(!u)continue;const f=n[u]++;let d=h.get(u);d||(d=[],h.set(u,d)),d[Nt(f,u)]=a}return{min:t,max:i,table:h}}function tt(l,t){let i=0;for(let r=1;r<=t.max;r++){i|=l.readBits(1)<<r-1;const n=t.table.get(r);if(n&&i<n.length){const o=n[i];if(o!==void 0)return o}}throw Error("Invalid Huffman code")}function Nt(l,t){let i=0;for(let r=0;r<t;r++)i=i<<1|1&l,l>>>=1;return i>>>0}function zt(l){if(l.length<2)throw Error("ZLIB data too short");const t=l[0],i=l[1];if((15&t)!=8)throw Error("Unsupported ZLIB compression method");if(((t<<8)+i)%31!=0)throw Error("Bad ZLIB header check");let r=2;32&i&&(r+=4);const n=[];return function(o,h){const a=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258],u=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],f=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],d=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13];let g=0;for(;!g;){g=o.readBits(1);const m=o.readBits(2);if(m===0){o.alignToByte();const x=o.readBits(16);if((65535&(65535^x))!==o.readBits(16))throw Error("DEFLATE uncompressed LEN/NLEN mismatch");for(let A=0;A<x;A++)h.push(o.readBits(8))}else{if(m!==1&&m!==2)throw Error("Unsupported DEFLATE type");{let x,A;if(m===1){const p=Array(288).fill(0);for(let y=0;y<=143;y++)p[y]=8;for(let y=144;y<=255;y++)p[y]=9;for(let y=256;y<=279;y++)p[y]=7;for(let y=280;y<=287;y++)p[y]=8;x=k(p),A=k(Array(32).fill(5))}else{const p=o.readBits(5)+257,y=o.readBits(5)+1,v=o.readBits(4)+4,w=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],E=Array(19).fill(0);for(let M=0;M<v;M++)E[w[M]]=o.readBits(3);const P=k(E),U=[];for(;U.length<p+y;){const M=tt(o,P);if(M<=15)U.push(M);else if(M===16){const H=o.readBits(2)+3,I=U[U.length-1]||0;for(let xt=0;xt<H;xt++)U.push(I)}else if(M===17){const H=o.readBits(3)+3;for(let I=0;I<H;I++)U.push(0)}else{if(M!==18)throw Error("Invalid code length symbol");{const H=o.readBits(7)+11;for(let I=0;I<H;I++)U.push(0)}}}const L=U.slice(0,p),S=U.slice(p,p+y);x=k(L),A=k(S)}for(;;){const p=tt(o,x);if(p<256)h.push(p);else{if(p===256)break;if(p>256&&p<286){const y=p-257;let v=a[y];const w=u[y];w&&(v+=o.readBits(w));const E=tt(o,A);if(E>=30)throw Error("Invalid distance symbol");let P=f[E];const U=d[E];U&&(P+=o.readBits(U));const L=h.length-P;if(L<0)throw Error("Invalid distance");for(let S=0;S<v;S++)h.push(h[L+S]||0)}else if(p===286||p===287)throw Error("Reserved length symbol")}}}}}}(new It(l.subarray(r)),n),new Uint8Array(n)}function Xt(l){const t=C,i=new Uint8Array(l);if(t.readASCII(i,0,4)!=="wOFF")throw Error("Invalid WOFF signature");const r=t.readUint(i,4),n=t.readUshort(i,12),o=t.readUint(i,16),h=[];let a=44;for(let v=0;v<n;v++){const w=t.readASCII(i,a,4),E=t.readUint(i,a+4),P=t.readUint(i,a+8),U=t.readUint(i,a+12),L=t.readUint(i,a+16);h.push({tag:w,offset:E,compLength:P,origLength:U,checksum:L}),a+=20}for(const v of h){const w=new Uint8Array(i.buffer,v.offset,v.compLength);if(v.compLength===v.origLength)v.data=new Uint8Array(w);else if(v.data=zt(w),v.data.length!==v.origLength)if(v.data.length<v.origLength){const E=new Uint8Array(v.origLength);E.set(v.data),v.data=E}else v.data=v.data.subarray(0,v.origLength)}const u=n;let f=1,d=0;for(;f<<1<=u;)f<<=1,d++;const g=16*f,m=16*u-g;let x=12+16*u;const A={};for(const v of h)A[v.tag]=x,x=Z(x+v.data.length);const p=new Uint8Array(Math.max(o||0,x));t.writeUint(p,0,r),t.writeUshort(p,4,u),t.writeUshort(p,6,g),t.writeUshort(p,8,d),t.writeUshort(p,10,m);let y=12;for(const v of h){t.writeASCII(p,y,v.tag),y+=4;let w=v.data;if(v.tag==="head"&&w.length>=12){const E=new Uint8Array(w);t.writeUint(E,8,0);const P=Q(E,0,Z(E.length));t.writeUint(p,y,P),y+=4}else{const E=Q(w,0,Z(w.length));t.writeUint(p,y,E),y+=4}t.writeUint(p,y,A[v.tag]),y+=4,t.writeUint(p,y,v.data.length),y+=4}for(const v of h){const w=A[v.tag];p.set(v.data,w)}if(h.find(v=>v.tag==="head")){const v=A.head,w=function(E,P){const U=C,L=P+8,S=[E[L],E[L+1],E[L+2],E[L+3]];U.writeUint(E,L,0);const M=2981146554-(Q(E,0,Z(E.length))>>>0)>>>0;return E[L]=S[0],E[L+1]=S[1],E[L+2]=S[2],E[L+3]=S[3],M>>>0}(p,v);t.writeUint(p,v+8,w)}return p.buffer}const Yt={parseTab(l,t,i){const r={tables:[],ids:{},off:t};l=new Uint8Array(l.buffer,t,i),t=0;const n=C,o=n.readUshort,h=o(l,t+=2);t+=2;const a=[];for(let u=0;u<h;u++){const f=o(l,t),d=o(l,t+=2);t+=2;const g=n.readUint(l,t);t+=4;const m=`p${f}e${d}`;let x=a.indexOf(g);if(x===-1){let A;x=r.tables.length,a.push(g);const p=o(l,g);A=p===4?this.parse4(l,g):p===12?this.parse12(l,g):{format:p},r.tables.push(A)}r.ids[m]=x}return r},parse4(l,t){const i=C,r=i.readUshort,n=i.readUshorts,o=t,h=r(l,t+=2);t+=2;const a=r(l,t+=2)>>>1,u={format:4,searchRange:r(l,t+=2),entrySelector:0,rangeShift:0,endCount:[],startCount:[],idDelta:[],idRangeOffset:[],glyphIdArray:[]};t+=2,u.entrySelector=r(l,t),t+=2,u.rangeShift=r(l,t),t+=2,u.endCount=n(l,t,a),t+=2*a,t+=2,u.startCount=n(l,t,a),t+=2*a;for(let f=0;f<a;f++)u.idDelta.push(i.readShort(l,t)),t+=2;return u.idRangeOffset=n(l,t,a),t+=2*a,u.glyphIdArray=n(l,t,o+h-t>>1),u},parse12(l,t){const i=C.readUint;i(l,t+=4),i(l,t+=4);const r=i(l,t+=4);t+=4;const n=new Uint32Array(3*r);for(let o=0;o<3*r;o+=3)n[o]=i(l,t+(o<<2)),n[o+1]=i(l,t+(o<<2)+4),n[o+2]=i(l,t+(o<<2)+8);return{format:12,groups:n}}},kt={parseTab(l,t,i){const r=C;t+=18;const n=r.readUshort(l,t);t+=2,t+=16;const o=r.readShort(l,t);t+=2;const h=r.readShort(l,t);t+=2;const a=r.readShort(l,t);t+=2;const u=r.readShort(l,t);return t+=2,t+=6,{unitsPerEm:n,xMin:o,yMin:h,xMax:a,yMax:u,indexToLocFormat:r.readShort(l,t)}}},Ht={parseTab(l,t,i){const r=C;t+=4;const n=["ascender","descender","lineGap","advanceWidthMax","minLeftSideBearing","minRightSideBearing","xMaxExtent","caretSlopeRise","caretSlopeRun","caretOffset","res0","res1","res2","res3","metricDataFormat","numberOfHMetrics"],o={};for(let h=0;h<n.length;h++){const a=n[h],u=a==="advanceWidthMax"||a==="numberOfHMetrics"?r.readUshort:r.readShort;o[a]=u(l,t+2*h)}return o}},Wt={parseTab(l,t,i,r){const n=C,o=[],h=[],a=r.maxp.numGlyphs,u=r.hhea.numberOfHMetrics;let f=0,d=0,g=0;for(;g<u;)f=n.readUshort(l,t+(g<<2)),d=n.readShort(l,t+(g<<2)+2),o.push(f),h.push(d),g++;for(;g<a;)o.push(f),h.push(d),g++;return{aWidth:o,lsBearing:h}}},at={cmap:Yt,head:kt,hhea:Ht,maxp:{parseTab(l,t,i){const r=C;return r.readUint(l,t),t+=4,{numGlyphs:r.readUshort(l,t)}}},hmtx:Wt,loca:{parseTab(l,t,i,r){const n=C,o=[],h=r.head.indexToLocFormat,a=r.maxp.numGlyphs+1;if(h===0)for(let u=0;u<a;u++)o.push(n.readUshort(l,t+(u<<1))<<1);else if(h===1)for(let u=0;u<a;u++)o.push(n.readUint(l,t+(u<<2)));return o}},glyf:{parseTab(l,t,i,r){const n=[],o=r.maxp.numGlyphs;for(let h=0;h<o;h++)n.push(null);return n},Js(l,t){const i=C,r=l.ti,n=l.loca;if(n[t]===n[t+1])return null;const o=B.findTable(r,"glyf",l.ei);if(!o)return null;let h=o[0]+n[t];const a={};if(a.noc=i.readShort(r,h),h+=2,a.xMin=i.readShort(r,h),h+=2,a.yMin=i.readShort(r,h),h+=2,a.xMax=i.readShort(r,h),h+=2,a.yMax=i.readShort(r,h),h+=2,a.xMin>=a.xMax||a.yMin>=a.yMax)return null;if(a.noc>0){a.endPts=[];for(let m=0;m<a.noc;m++)a.endPts.push(i.readUshort(r,h)),h+=2;const u=i.readUshort(r,h);if(h+=2,r.length-h<u)return null;h+=u;const f=a.endPts[a.noc-1]+1;a.flags=[];for(let m=0;m<f;m++){const x=r[h];if(h++,a.flags.push(x),8&x){const A=r[h];h++;for(let p=0;p<A;p++)a.flags.push(x),m++}}a.xs=[];for(let m=0;m<f;m++){const x=a.flags[m],A=!!(16&x);2&x?(a.xs.push(A?r[h]:-r[h]),h++):A?a.xs.push(0):(a.xs.push(i.readShort(r,h)),h+=2)}a.ys=[];for(let m=0;m<f;m++){const x=a.flags[m],A=!!(32&x);4&x?(a.ys.push(A?r[h]:-r[h]),h++):A?a.ys.push(0):(a.ys.push(i.readShort(r,h)),h+=2)}let d=0,g=0;for(let m=0;m<f;m++)d+=a.xs[m],g+=a.ys[m],a.xs[m]=d,a.ys[m]=g}else a.parts=[],a.endPts=[],a.flags=[],a.xs=[],a.ys=[];return a}}},B={parse(l){const t=new Uint8Array(l),i=C.readASCII(t,0,4);if(i==="wOFF")l=Xt(l);else if(i==="wOF2")throw Error("WOFF2 is not supported in this build (Brotli + WOFF2 transforms required)");return[((r,n,o,h)=>{const a=at,u={ti:r,si:n,ei:o};for(const f in a){const d=f,g=B.findTable(r,d,o);if(g){const[m,x]=g;let A=h[m];A==null&&(A=a[d].parseTab(r,m,x,u),h[m]=A),u[d]=A}}return u})(new Uint8Array(l),0,0,{})]},findTable(l,t,i){const r=C,n=r.readUshort(l,i+4);let o=i+12;for(let h=0;h<n;h++){const a=r.readASCII(l,o,4);r.readUint(l,o+4);const u=r.readUint(l,o+8),f=r.readUint(l,o+12);if(a===t)return[u,f];o+=16}return null},T:at,B:C};class jt{ii(t){var r;const i=[];return(r=t.cmap)!=null&&r.tables?(t.cmap.tables.forEach(n=>{if(n.format===4){const o=this.ri(n);i.push(...o)}else if(n.format===12){const o=this.ni(n);i.push(...o)}}),[...new Set(i)]):[]}oi(t){return t.filter(i=>this.hi(i))}ri(t){const i=[];if(!(t.startCount&&t.endCount&&t.idRangeOffset&&t.idDelta))return i;for(let r=0;r<t.startCount.length;r++){const n=t.startCount[r],o=t.endCount[r];if(n!==65535||o!==65535){for(let h=n;h<=o;h++)if(this.ai(t,h,r)>0)try{const a=String.fromCodePoint(h);i.push(a)}catch{}}}return i}ni(t){const i=[];if(!t.groups)return i;for(let r=0;r<t.groups.length;r+=3){const n=t.groups[r],o=t.groups[r+1],h=t.groups[r+2];for(let a=n;a<=o;a++)if(h+(a-n)>0)try{const u=String.fromCodePoint(a);i.push(u)}catch{}}return i}ai(t,i,r){if(t.idRangeOffset[r]===0)return i+t.idDelta[r]&65535;{const n=t.idRangeOffset[r]/2+(i-t.startCount[r])-(t.startCount.length-r);if(n>=0&&t.glyphIdArray&&n<t.glyphIdArray.length){const o=t.glyphIdArray[n];if(o!==0)return o+t.idDelta[r]&65535}}return 0}hi(t){const i=t.codePointAt(0)||0;return!(i>=0&&i<=31&&i!==9&&i!==10&&i!==13||i>=127&&i<=159)}}class et{constructor(){c(this,"ci",new Map);c(this,"li",new Map)}ui(t,i){const r=`${this.fi(t)}_${i}`;if(this.ci.has(r))return this.ci.get(r);const n=t.cmap;if(!n||!n.tables)return this.ci.set(r,0),0;let o=0;for(const h of n.tables)if(h.format===4?o=this.di(i,h):h.format===12&&(o=this.pi(i,h)),o>0)break;return this.ci.set(r,o),o}_i(t,i){const r=i.codePointAt(0);return r===void 0?0:this.ui(t,r)}mi(t,i){const r=t.hmtx;return r&&r.aWidth&&r.aWidth.length!==0?i<r.aWidth.length?r.aWidth[i]:r.aWidth[r.aWidth.length-1]:0}gi(t,i){const r=i/t.head.unitsPerEm,n=t.hhea.ascender*r,o=t.hhea.descender*r,h=t.hhea.lineGap*r;return{ascender:n,descender:o,lineGap:h,lineHeight:n-o+h,unitsPerEm:t.head.unitsPerEm,scale:r}}yi(){this.ci.clear(),this.li.clear()}fi(t){return`${t.ei}_${t.ti.length}`}di(t,i){const r=i.endCount.length;let n=-1;for(let o=0;o<r;o++)if(t<=i.endCount[o]){n=o;break}if(n===-1||t<i.startCount[n])return 0;if(i.idRangeOffset[n]===0)return t+i.idDelta[n]&65535;{const o=i.idRangeOffset[n]/2+(t-i.startCount[n])-(r-n);if(o>=0&&o<i.glyphIdArray.length){const h=i.glyphIdArray[o];return h===0?0:h+i.idDelta[n]&65535}}return 0}pi(t,i){const r=i.groups.length/3;for(let n=0;n<r;n++){const o=i.groups[3*n],h=i.groups[3*n+1],a=i.groups[3*n+2];if(t>=o&&t<=h)return a+(t-o)}return 0}}class Vt{constructor(t){c(this,"wi");c(this,"Ci");c(this,"xt");c(this,"Ai");this.xt=t,this.Ai=new et,this.wi=document.createElement("canvas"),this.Ci=this.wi.getContext("2d",{willReadFrequently:!0,alpha:!0})}createTextureAtlas(t,i,r,n){const o=t.length,h=Math.ceil(Math.sqrt(o)),a=Math.ceil(o/h),u=i.width*h,f=i.height*a,d=typeof n=="object"?n:null;this.bi(u,f),this.xi(t,i,h,r,d);const g=this.xt.Ys(u,f,1,{filter:"nearest"});return g.Rt(this.wi),{framebuffer:g,columns:h,rows:a}}bi(t,i){this.wi.width=t,this.wi.height=i,this.wi.style.width=t+"px",this.wi.style.height=i+"px",this.Ci.imageSmoothingEnabled=!1,this.wi.style.imageRendering="pixelated",this.Ci.clearRect(0,0,t,i),this.Ci.textBaseline="top",this.Ci.textAlign="left",this.Ci.fillStyle="white"}xi(t,i,r,n,o){const h=n/o.head.unitsPerEm;for(let a=0;a<t.length;a++){const u=a%r,f=Math.floor(a/r),d=t[a].character,g=this.Mi(o,d);if(!g)continue;const m=d.codePointAt(0)||0,x=this.Ai.ui(o,m),A=this.$i(o,x)*h,p=u*i.width,y=f*i.height,v=p+.5*i.width,w=y+.5*i.height,E=Math.round(v-.5*i.width),P=Math.round(w-.5*n),U=E+.5*(i.width-A),L=P+o.hhea.ascender*h;this.Ti(g,U,L,h)}}Mi(t,i){const r=i.codePointAt(0)||0,n=this.Ai.ui(t,r);if(n===0)return null;if(t.glyf&&t.glyf[n]!==null)return t.glyf[n];if(B&&B.T&&B.T.glyf){const o=B.T.glyf.Js(t,n);return t.glyf&&o&&(t.glyf[n]=o),o}return null}$i(t,i){const r=t.hmtx;return r&&r.aWidth?i<r.aWidth.length?r.aWidth[i]:r.aWidth[r.aWidth.length-1]:0}Ti(t,i,r,n){if(!t||!t.xs||t.noc===0)return;const{xs:o,ys:h,endPts:a,flags:u}=t;if(!(o&&h&&a&&u))return;this.Ci.beginPath();let f=0;for(let d=0;d<a.length;d++){const g=a[d];if(!(g<f)){if(g>=f){const m=i+o[f]*n,x=r-h[f]*n;this.Ci.moveTo(m,x);let A=f+1;for(;A<=g;)if(1&u[A]){const p=i+o[A]*n,y=r-h[A]*n;this.Ci.lineTo(p,y),A++}else{const p=i+o[A]*n,y=r-h[A]*n;let v=A+1>g?f:A+1;if(1&u[v]){const w=i+o[v]*n,E=r-h[v]*n;this.Ci.quadraticCurveTo(p,y,w,E),A=v+1}else{const w=(p+(i+o[v]*n))/2,E=(y+(r-h[v]*n))/2;this.Ci.quadraticCurveTo(p,y,w,E),A=v}}this.Ci.closePath()}f=g+1}}this.Ci.fill()}}class Kt{constructor(){c(this,"Fi");this.Fi=new et}Ri(t,i,r){let n=0;const o=this.Fi.gi(r,i),h=o.lineHeight;for(const a of t){const u=this.Fi._i(r,a);if(u===0)continue;const f=this.Fi.mi(r,u)*o.scale;n=Math.max(n,f)}return{width:Math.ceil(n),height:Math.ceil(h)}}yi(){this.Fi.yi()}}class qt{constructor(){c(this,"Ai");this.Ai=new et}createCharacterObjects(t,i){return t.map((r,n)=>{const o=r.codePointAt(0)||0,h=this.zi(n);let a=0;if(i.hmtx&&i.hmtx.aWidth){const u=this.Ai.ui(i,o);u>0&&i.hmtx.aWidth[u]!==void 0&&(a=i.hmtx.aWidth[u])}return{character:r,unicode:o,color:h,advanceWidth:a}})}zi(t){return[t%256/255,Math.floor(t/256)%256/255,Math.floor(t/65536)%256/255]}Si(t,i){if(!Y.v(typeof t=="string","Character must be a string.",{method:"getCharacterColor",providedValue:t}))return[0,0,0];const r=i.find(n=>n.character===t);return r?r.color:[0,0,0]}Pi(t,i){return Y.v(typeof t=="string"&&t.length>0,"Characters must be a string with at least one character.",{method:"getCharacterColors",providedValue:t})?Array.from(t).map(r=>this.Si(r,i)||[0,0,0]):[[0,0,0]]}}class ct{constructor(t,i=16){c(this,"Ei");c(this,"Di",[]);c(this,"ki");c(this,"Bi",16);c(this,"Gi",0);c(this,"Li",0);c(this,"Oi",{width:0,height:0});c(this,"Hi");c(this,"Ii");c(this,"Ni");c(this,"Xi");c(this,"Wi");this.Bi=i,this.Ii=new jt,this.Ni=new Vt(t),this.Xi=new Kt,this.Wi=new qt}async Vi(t){let i;if(t){const r=await fetch(t);if(!r.ok)throw new b(`Failed to load font file: ${r.status} ${r.statusText}`);i=await r.arrayBuffer()}else i=await(await fetch("data:font/woff;base64,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")).arrayBuffer();await this.ji(i),this.Ei=B.parse(i)[0],await this.Ki()}Yi(t){if(t===void 0)return this.Bi;this.Bi=t,this.Oi=this.Xi.Ri(this.Di.map(r=>r.character),this.Bi,this.Ei);const i=this.Ni.createTextureAtlas(this.Di,this.Oi,this.Bi,this.Ei);this.ki=i.framebuffer,this.Gi=i.columns,this.Li=i.rows}async qi(t){try{const i=await fetch(t);if(!i.ok)throw new b(`Failed to load font file: ${i.status} ${i.statusText}`);const r=await i.arrayBuffer();await this.ji(r);const n=B.parse(r);if(!n||n.length===0)throw Error("Failed to parse font file");this.Ei=n[0],await this.Ki()}catch(i){throw new b("Failed to load font: "+(i instanceof Error?i.message:"Unknown error"),i)}}async ji(t){const i=Date.now();this.Hi=new FontFace("CustomFont_"+i,t),await this.Hi.load(),document.fonts.add(this.Hi)}async Ki(){const t=this.Ii.ii(this.Ei),i=this.Ii.oi(t);this.Di=this.Wi.createCharacterObjects(i,this.Ei),this.Oi=this.Xi.Ri(i,this.Bi,this.Ei);const r=this.Ni.createTextureAtlas(this.Di,this.Oi,this.Bi,this.Ei);this.ki=r.framebuffer,this.Gi=r.columns,this.Li=r.rows}Si(t){return this.Wi.Si(t,this.Di)}Pi(t){return this.Wi.Pi(t,this.Di)}kt(){this.ki.kt(),document.fonts.delete(this.Hi)}get fontFramebuffer(){return this.ki}get characters(){return this.Di}get textureColumns(){return this.Gi}get textureRows(){return this.Li}get maxGlyphDimensions(){return this.Oi}get fontSize(){return this.Bi}get font(){return this.Ei}}class lt{constructor(t,i,r){c(this,"Zi");c(this,"Qi");c(this,"dt");c(this,"_t");c(this,"Ji");c(this,"tr");c(this,"er");c(this,"sr");c(this,"ir");this.er=t,this.sr=i,this.ir=r,this.rr()}rr(){this.Zi=Math.floor(this.er.width/this.sr),this.Qi=Math.floor(this.er.height/this.ir),this.dt=this.Zi*this.sr,this._t=this.Qi*this.ir,this.Ji=Math.floor((this.er.width-this.dt)/2),this.tr=Math.floor((this.er.height-this._t)/2)}nr(t,i){this.sr=t,this.ir=i,this.rr()}get cellWidth(){return this.sr}get cellHeight(){return this.ir}get cols(){return this.Zi}get rows(){return this.Qi}get width(){return this.dt}get height(){return this._t}get offsetX(){return this.Ji}get offsetY(){return this.tr}}class ut{constructor(t={}){c(this,"er");c(this,"hr",null);c(this,"ar",!1);c(this,"cr");c(this,"lr");this.ar=t.overlay??!1,this.ar&&t.canvas?(this.hr=t.canvas,this.er=this.ur(),this.lr=!0,this.dr()):t.canvas?(this.er=t.canvas,this.lr=!1):(this.er=this.pr(t.width,t.height),this.lr=!0),this.er.style.imageRendering="pixelated"}pr(t,i){const r=document.createElement("canvas");return r.className="textmodeCanvas",r.style.imageRendering="pixelated",r.width=t||800,r.height=i||600,document.body.appendChild(r),r}ur(){const t=document.createElement("canvas");t.className="textmodeCanvas",t.style.imageRendering="pixelated";const i=this.hr.getBoundingClientRect();let r=Math.round(i.width),n=Math.round(i.height);if(this.hr instanceof HTMLVideoElement){const a=this.hr;(r===0||n===0)&&a.videoWidth>0&&a.videoHeight>0&&(r=a.videoWidth,n=a.videoHeight)}t.width=r,t.height=n,t.style.position="absolute",t.style.pointerEvents="none";const o=window.getComputedStyle(this.hr);let h=parseInt(o.zIndex||"0",10);return isNaN(h)&&(h=0),t.style.zIndex=""+(h+1),t}dr(){var t;this._r(),(t=this.hr.parentNode)==null||t.insertBefore(this.er,this.hr.nextSibling),window.ResizeObserver&&(this.cr=new ResizeObserver(()=>{this.mr()}),this.cr.observe(this.hr)),window.addEventListener("resize",()=>{this.mr()})}_r(){if(!this.hr)return;const t=this.hr.getBoundingClientRect();let i=this.hr.offsetParent;if(i&&i!==document.body){const r=i.getBoundingClientRect();this.er.style.top=t.top-r.top+"px",this.er.style.left=t.left-r.left+"px"}else this.er.style.top=t.top+window.scrollY+"px",this.er.style.left=t.left+window.scrollX+"px"}mr(t,i){if(this.ar){const r=this.hr.getBoundingClientRect();let n=Math.round(r.width),o=Math.round(r.height);if(this.hr instanceof HTMLVideoElement){const h=this.hr;(n===0||o===0)&&h.videoWidth>0&&h.videoHeight>0&&(n=h.videoWidth,o=h.videoHeight)}this.er.width=n,this.er.height=o,this._r()}else this.er.width=t??this.er.width,this.er.height=i??this.er.height}gr(){const t=this.er.getContext("webgl2",{alpha:!0,premultipliedAlpha:!1,preserveDrawingBuffer:!0,antialias:!1,depth:!1,stencil:!1,powerPreference:"high-performance"});if(!t)throw new b("`textmode.js` requires WebGL2 support.");return t}kt(){this.cr&&this.cr.disconnect();const t=this.er.getContext("webgl")||this.er.getContext("webgl2");if(t){const i=t.getExtension("WEBGL_lose_context");i&&i.loseContext()}this.lr&&this.er.parentNode&&this.er.parentNode.removeChild(this.er)}get canvas(){return this.er}get targetCanvas(){return this.hr}get width(){return this.er.width}get height(){return this.er.height}}class X{constructor(t,i,r,n){c(this,"vr");c(this,"dt");c(this,"_t");c(this,"vt");c(this,"k",0);c(this,"V",0);c(this,"j",0);c(this,"G",[0,0]);c(this,"yr","sampled");c(this,"wr","fixed");c(this,"Y",[1,1,1,1]);c(this,"q",[0,0,0,1]);c(this,"Cr",[0,0,0,1]);c(this,"Ar",[[.1,0,0]]);c(this,"br");this.vt=t,this.vr=i,this.dt=r,this._t=n}kt(){this.vt.deleteTexture(this.vr)}Mr(t){return typeof t=="boolean"?t?1:0:(t==null?0:Number(t))>0?1:0}invert(t=!0){return this.k=this.Mr(t),this}flipX(t=!0){return this.V=this.Mr(t),this}flipY(t=!0){return this.j=this.Mr(t),this}charRotation(t){const i=255*t/360,r=Math.floor(i)/255,n=Math.round(i-Math.floor(i));return this.G=[r,n],this}Is(){return{texture:this.vr,invert:this.k,flipX:this.V,flipY:this.j,charRotation:this.G,charColorFixed:this.yr==="fixed",charColor:this.Y,cellColorFixed:this.wr==="fixed",cellColor:this.q,backgroundColor:this.Cr,charCount:this.Ar.length,charList:this.Ar}}charColorMode(t){return this.yr=t,this}cellColorMode(t){return this.wr=t,this}charColor(t,i,r,n){return this.Y=[(t??0)/255,(i??t??0)/255,(r??t??0)/255,(n??255)/255],this}cellColor(t,i,r,n){return this.q=[(t??0)/255,(i??t??0)/255,(r??t??0)/255,(n??255)/255],this}background(t,i,r,n){return this.Cr=[(t??0)/255,(i??t??0)/255,(r??t??0)/255,(n??255)/255],this}characters(t){const i=this.br(t).filter(r=>Array.isArray(r)).slice(0,64);return this.Ar=i,this}static $r(t,i,r){const n=t.context,o=n.createTexture();n.bindTexture(n.TEXTURE_2D,o),n.pixelStorei(n.UNPACK_FLIP_Y_WEBGL,1),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MIN_FILTER,n.NEAREST),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MAG_FILTER,n.NEAREST),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_S,n.CLAMP_TO_EDGE),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_T,n.CLAMP_TO_EDGE),n.texImage2D(n.TEXTURE_2D,0,n.RGBA,n.RGBA,n.UNSIGNED_BYTE,i),n.bindTexture(n.TEXTURE_2D,null);const h=i.naturalWidth??i.width??i.videoWidth??0,a=i.naturalHeight??i.height??i.videoHeight??0,u=new X(n,o,h,a);return u.br=r,u}get texture(){return this.vr}get width(){return this.dt}get height(){return this._t}}class Zt{constructor(t=60){c(this,"Tr");c(this,"Fr");c(this,"Rr",null);c(this,"zr",0);c(this,"Sr",!0);c(this,"Pr",0);c(this,"Er",0);c(this,"Dr",[]);c(this,"kr",10);c(this,"Br",0);this.Tr=t,this.Fr=1e3/t}start(t){if(!this.Sr)return;this.zr=performance.now();const i=r=>{if(!this.Sr)return void(this.Rr=null);const n=r-this.zr;n>=this.Fr&&(t(),this.zr=r-n%this.Fr),this.Sr&&(this.Rr=requestAnimationFrame(i))};this.Rr=requestAnimationFrame(i)}stop(){this.Rr&&(cancelAnimationFrame(this.Rr),this.Rr=null)}pause(){this.Sr&&(this.Sr=!1,this.stop())}resume(t){this.Sr||(this.Sr=!0,this.start(t))}frameRate(t,i){if(t===void 0)return this.Pr;this.Tr=t,this.Fr=1e3/t,this.Sr&&i&&(this.stop(),this.start(i))}measureFrameRate(){const t=performance.now();if(this.Er>0){const i=t-this.Er;this.Dr.push(i),this.Dr.length>this.kr&&this.Dr.shift();const r=this.Dr.reduce((n,o)=>n+o,0)/this.Dr.length;this.Pr=1e3/r}this.Er=t}get isLooping(){return this.Sr}get frameRateLimit(){return this.Tr}get currentFrameRate(){return this.Pr}get frameCount(){return this.Br}set frameCount(t){this.Br=t}incrementFrame(){this.Br++}resetFrameCount(){this.Br=0}}class ft{constructor(t){c(this,"er");c(this,"Gr");c(this,"Lr",{x:-1,y:-1});c(this,"Or",{x:-1,y:-1});c(this,"Hr",null);c(this,"Ir",0);c(this,"Nr");c(this,"Xr");c(this,"Wr");c(this,"Vr");c(this,"jr");c(this,"Kr");c(this,"Yr",!1);c(this,"qr");c(this,"Zr");c(this,"Qr");c(this,"Jr");c(this,"tn");this.er=t}en(t){const i=performance.now()+Math.max(0,t);i>this.Ir&&(this.Ir=i)}sn(){return performance.now()<this.Ir}rn(t){const i=this.er.canvas;i.style.cursor=t==null||t===""?"":t}Vi(t){this.Gr=t,this.nn()}hn(){if(this.Yr)return;const t=this.er.canvas;this.Nr=i=>{this.an(i),this.cn(i)},this.Xr=()=>{this.Or={...this.Lr},this.Lr.x=-1,this.Lr.y=-1,this.Hr=null},this.Wr=i=>{this.an(i),this.ln(i)},this.Vr=i=>{this.an(i),this.un(i)},this.jr=i=>{this.an(i),this.fn(i)},this.Kr=i=>{this.an(i),this.dn(i)},t.addEventListener("mousemove",this.Nr,{passive:!0}),t.addEventListener("mouseleave",this.Xr,{passive:!0}),t.addEventListener("mousedown",this.Wr,{passive:!0}),t.addEventListener("mouseup",this.Vr,{passive:!0}),t.addEventListener("click",this.jr,{passive:!0}),t.addEventListener("wheel",this.Kr,{passive:!1}),this.Yr=!0}pn(){if(!this.Yr)return;const t=this.er.canvas;t.removeEventListener("mousemove",this.Nr),t.removeEventListener("mouseleave",this.Xr),t.removeEventListener("mousedown",this.Wr),t.removeEventListener("mouseup",this.Vr),t.removeEventListener("click",this.jr),t.removeEventListener("wheel",this.Kr),this.Yr=!1}nn(){if(this.Yr)try{if(this.Hr){const t=new MouseEvent("mousemove",{clientX:this.Hr.x,clientY:this.Hr.y,bubbles:!1,cancelable:!1});this.an(t)}else this.Lr.x!==-1&&this.Lr.y!==-1&&(this.Lr.x>=this.Gr.cols||this.Lr.y>=this.Gr.rows)&&(this.Lr.x=-1,this.Lr.y=-1)}catch{this.Lr.x=-1,this.Lr.y=-1}}_n(t){this.qr=t}mn(t){this.Zr=t}gn(t){this.Qr=t}vn(t){this.Jr=t}yn(t){this.tn=t}wn(){return{x:this.Lr.x,y:this.Lr.y}}cn(t){if(this.Jr&&!this.sn()){const i={position:{...this.Lr},previousPosition:{...this.Or},originalEvent:t};this.Jr(i)}}ln(t){if(this.Zr&&!this.sn()){const i={position:{...this.Lr},previousPosition:{...this.Or},button:t.button,originalEvent:t};this.Zr(i)}}un(t){if(this.Qr&&!this.sn()){const i={position:{...this.Lr},previousPosition:{...this.Or},button:t.button,originalEvent:t};this.Qr(i)}}fn(t){if(this.qr&&!this.sn()){const i={position:{...this.Lr},previousPosition:{...this.Or},button:t.button,originalEvent:t};this.qr(i)}}dn(t){if(this.tn&&!this.sn()){const i={position:{...this.Lr},previousPosition:{...this.Or},delta:{x:t.deltaX,y:t.deltaY},originalEvent:t};this.tn(i)}}an(t){const i=this.er.canvas;this.Or={...this.Lr},this.Hr={x:t.clientX,y:t.clientY};const r=i.getBoundingClientRect(),n=t.clientX-r.left,o=t.clientY-r.top,h=i.width/r.width,a=o*(i.height/r.height),u=n*h-this.Gr.offsetX,f=a-this.Gr.offsetY,d=Math.floor(u/this.Gr.cellWidth),g=Math.floor(f/this.Gr.cellHeight);d>=0&&d<this.Gr.cols&&g>=0&&g<this.Gr.rows?(this.Lr.x=d,this.Lr.y=g):(this.Lr.x=-1,this.Lr.y=-1)}}const Jt=Object.freeze(Object.defineProperty({__proto__:null,MouseManager:ft},Symbol.toStringTag,{value:"Module"}));class dt{constructor(){c(this,"Cn",new Map);c(this,"An",null);c(this,"bn",null);c(this,"xn");c(this,"Mn");c(this,"Yr",!1);c(this,"$n");c(this,"Tn");c(this,"Fn",{ArrowUp:"UP_ARROW",ArrowDown:"DOWN_ARROW",ArrowLeft:"LEFT_ARROW",ArrowRight:"RIGHT_ARROW",F1:"F1",F2:"F2",F3:"F3",F4:"F4",F5:"F5",F6:"F6",F7:"F7",F8:"F8",F9:"F9",F10:"F10",F11:"F11",F12:"F12",Enter:"ENTER",Return:"RETURN",Tab:"TAB",Escape:"ESCAPE",Backspace:"BACKSPACE",Delete:"DELETE",Insert:"INSERT",Home:"HOME",End:"END",PageUp:"PAGE_UP",PageDown:"PAGE_DOWN",Shift:"SHIFT",Control:"CONTROL",Alt:"ALT",Meta:"META"," ":"SPACE"})}hn(){this.Yr||(this.xn=t=>{this.Rn(t)},this.Mn=t=>{this.zn(t)},window.addEventListener("keydown",this.xn,{passive:!1}),window.addEventListener("keyup",this.Mn,{passive:!1}),this.Yr=!0)}pn(){this.Yr&&(window.removeEventListener("keydown",this.xn),window.removeEventListener("keyup",this.Mn),this.Yr=!1,this.Cn.clear(),this.An=null,this.bn=null)}mn(t){this.$n=t}gn(t){this.Tn=t}Sn(t){const i=this.Pn(t),r=this.Cn.get(t)||this.Cn.get(i);return(r==null?void 0:r.isPressed)||!1}En(){return this.An}Dn(){return this.bn}kn(){const t=[];for(const[i,r]of this.Cn)r.isPressed&&t.push(i);return t}Bn(){return{ctrl:this.Sn("Control"),shift:this.Sn("Shift"),alt:this.Sn("Alt"),meta:this.Sn("Meta")}}Gn(){this.Cn.clear(),this.An=null,this.bn=null}Rn(t){const i=t.key,r=Date.now();this.Cn.has(i)||this.Cn.set(i,{isPressed:!1,lastPressTime:0,lastReleaseTime:0});const n=this.Cn.get(i);if(!n.isPressed&&(n.isPressed=!0,n.lastPressTime=r,this.An=i,this.$n)){const o={key:i,keyCode:t.keyCode,ctrlKey:t.ctrlKey,shiftKey:t.shiftKey,altKey:t.altKey,metaKey:t.metaKey,isPressed:!0,originalEvent:t};this.$n(o)}}zn(t){const i=t.key,r=Date.now();this.Cn.has(i)||this.Cn.set(i,{isPressed:!1,lastPressTime:0,lastReleaseTime:0});const n=this.Cn.get(i);if(n.isPressed=!1,n.lastReleaseTime=r,this.bn=i,this.Tn){const o={key:i,keyCode:t.keyCode,ctrlKey:t.ctrlKey,shiftKey:t.shiftKey,altKey:t.altKey,metaKey:t.metaKey,isPressed:!1,originalEvent:t};this.Tn(o)}}Pn(t){return this.Fn[t]||t.toLowerCase()}}const $t=Object.freeze(Object.defineProperty({__proto__:null,KeyboardManager:dt},Symbol.toStringTag,{value:"Module"}));class gt{constructor(t,i){c(this,"er");c(this,"Ln");c(this,"Gr");c(this,"On",new Map);c(this,"Hn",new Map);c(this,"In",new Map);c(this,"Nn",null);c(this,"Xn");c(this,"Wn");c(this,"Vn");c(this,"jn");c(this,"Kn");c(this,"Yn");c(this,"Yr",!1);c(this,"qn");c(this,"Zn");c(this,"Qn");c(this,"Jn");c(this,"eo");c(this,"so");c(this,"io");c(this,"ro");c(this,"no");c(this,"oo");c(this,"ho",320);c(this,"ao",350);c(this,"co",10);c(this,"lo",550);c(this,"uo",14);c(this,"fo",48);c(this,"do",650);c(this,"po",.02);c(this,"_o",2);c(this,"mo",600);c(this,"vo",0);c(this,"yo",null);this.er=t,this.Ln=i;const r=this.er.canvas;this.Xn=r.style.touchAction,this.Wn=r.style.userSelect,r.style.touchAction||(r.style.touchAction="none"),r.style.userSelect||(r.style.userSelect="none")}Vi(t){this.Gr=t,this.wo()}hn(){if(this.Yr)return;const t=this.er.canvas;this.Vn=i=>{this.Co(i)},this.jn=i=>{this.Ao(i)},this.Kn=i=>{this.bo(i)},this.Yn=i=>{this.xo(i)},t.addEventListener("touchstart",this.Vn,{passive:!1}),t.addEventListener("touchmove",this.jn,{passive:!1}),t.addEventListener("touchend",this.Kn,{passive:!1}),t.addEventListener("touchcancel",this.Yn,{passive:!1}),this.Yr=!0}pn(){if(!this.Yr)return;const t=this.er.canvas;t.removeEventListener("touchstart",this.Vn),t.removeEventListener("touchmove",this.jn),t.removeEventListener("touchend",this.Kn),t.removeEventListener("touchcancel",this.Yn),this.Yr=!1,this.Nn=null,this.On.clear(),this.Hn.clear(),this.In.forEach(i=>{i.longPressTimer!==null&&window.clearTimeout(i.longPressTimer)}),this.In.clear(),this.yo=null,this.vo=0,t.style.touchAction=this.Xn,t.style.userSelect=this.Wn}wo(){if(!this.Gr||this.On.size===0)return;const t=new Map;for(const i of this.On.values()){const r=this.Mo(i.clientX,i.clientY,i.id,i);t.set(i.id,r)}this.On=t}$o(){return Array.from(this.On.values()).map(t=>({...t}))}To(t){this.qn=t}vn(t){this.Zn=t}Fo(t){this.Qn=t}Ro(t){this.Jn=t}zo(t){this.eo=t}So(t){this.so=t}Po(t){this.io=t}Eo(t){this.ro=t}Do(t){this.no=t}ko(t){this.oo=t}Co(t){var n;if(!this.Gr)return;t.preventDefault(),(n=this.Ln)==null||n.en(this.mo);const i=performance.now(),r=this.Bo(t.changedTouches);for(const o of r){const h=this.On.get(o.id);h&&this.Hn.set(o.id,this.Go(h)),this.On.set(o.id,o);const a={id:o.id,startPosition:o,lastPosition:o,startTime:i,lastTime:i,longPressTimer:null,longPressFired:!1};this.io&&(a.longPressTimer=window.setTimeout(()=>{const u=this.On.get(o.id);u&&(a.longPressFired=!0,this.io({touch:this.Go(u),duration:performance.now()-a.startTime,originalEvent:t}))},this.lo)),this.In.set(o.id,a),this.qn&&this.qn(this.Lo(o,t,void 0,i))}this.On.size===2&&this.Oo()}Ao(t){var n;if(!this.Gr)return;t.preventDefault(),(n=this.Ln)==null||n.en(this.mo);const i=performance.now(),r=this.Bo(t.changedTouches);for(const o of r){const h=this.On.get(o.id),a=h?this.Go(h):void 0;a&&this.Hn.set(o.id,a),this.On.set(o.id,o);const u=this.In.get(o.id);u&&(u.lastPosition=o,u.lastTime=i,a)&&this.Ho(a,o,!0)>this.uo&&u.longPressTimer!==null&&(window.clearTimeout(u.longPressTimer),u.longPressTimer=null),this.Zn&&this.Zn(this.Lo(o,t,a,i))}this.On.size===2?this.Io(t):this.Nn=null}bo(t){if(!this.Gr)return;t.preventDefault();const i=performance.now(),r=this.Bo(t.changedTouches);for(const n of r){const o=this.On.get(n.id),h=o?this.Go(o):void 0,a=this.In.get(n.id);a&&a.longPressTimer!==null&&(window.clearTimeout(a.longPressTimer),a.longPressTimer=null),this.Qn&&this.Qn(this.Lo(n,t,h,i)),a&&this.No(a,t),this.In.delete(n.id),this.Hn.delete(n.id),this.On.delete(n.id)}this.On.size<2&&(this.Nn=null)}xo(t){if(!this.Gr)return;t.preventDefault();const i=performance.now(),r=this.Bo(t.changedTouches);for(const n of r){const o=this.On.get(n.id),h=o?this.Go(o):void 0,a=this.In.get(n.id);a&&a.longPressTimer!==null&&(window.clearTimeout(a.longPressTimer),a.longPressTimer=null),this.Jn&&this.Jn(this.Lo(n,t,h,i)),this.In.delete(n.id),this.Hn.delete(n.id),this.On.delete(n.id)}this.On.size<2&&(this.Nn=null)}Bo(t){const i=[];for(let r=0;r<t.length;r+=1){const n=t.item(r);n&&i.push(this.Xo(n))}return i}Xo(t){return this.Mo(t.clientX,t.clientY,t.identifier,{id:t.identifier,x:-1,y:-1,clientX:t.clientX,clientY:t.clientY,pressure:t.force,radiusX:t.radiusX,radiusY:t.radiusY,rotationAngle:t.rotationAngle})}Mo(t,i,r,n){const o=this.er.canvas,h=o.getBoundingClientRect(),a=t-h.left,u=i-h.top,f=o.width/h.width,d=u*(o.height/h.height),g=a*f-this.Gr.offsetX,m=d-this.Gr.offsetY,x=Math.floor(g/this.Gr.cellWidth),A=Math.floor(m/this.Gr.cellHeight),p=x>=0&&x<this.Gr.cols&&A>=0&&A<this.Gr.rows;return{id:r,x:p?x:-1,y:p?A:-1,clientX:t,clientY:i,pressure:n.pressure,radiusX:n.radiusX,radiusY:n.radiusY,rotationAngle:n.rotationAngle}}Lo(t,i,r,n){const o=this.In.get(t.id),h=Array.from(this.Hn.values()).map(f=>this.Go(f)),a=Array.from(this.On.values()).map(f=>this.Go(f)),u=this.Bo(i.changedTouches);return{touch:this.Go(t),previousTouch:r?this.Go(r):void 0,touches:a,previousTouches:h,changedTouches:u,deltaTime:o?n-o.lastTime:0,originalEvent:i}}Oo(){if(this.On.size!==2)return void(this.Nn=null);const t=Array.from(this.On.values()),[i,r]=t,n=this.Ho(i,r,!1),o=this.Wo(i,r);this.Nn={ids:[i.id,r.id],initialDistance:Math.max(n,1e-4),initialAngle:o,lastScale:1,lastRotation:0}}Io(t){if(this.Nn||this.Oo(),!this.Nn)return;const[i,r]=this.Nn.ids,n=this.On.get(i),o=this.On.get(r);if(!n||!o)return;const h=this.Ho(n,o,!1)/this.Nn.initialDistance,a=h-this.Nn.lastScale;this.no&&Math.abs(a)>this.po&&(this.no({touches:[this.Go(n),this.Go(o)],scale:h,deltaScale:a,center:this.Vo(n,o),originalEvent:t}),this.Nn.lastScale=h);let u=this.Wo(n,o)-this.Nn.initialAngle;u=(u+180)%360-180;const f=u-this.Nn.lastRotation;this.oo&&Math.abs(f)>this._o&&(this.oo({touches:[this.Go(n),this.Go(o)],rotation:u,deltaRotation:f,center:this.Vo(n,o),originalEvent:t}),this.Nn.lastRotation=u)}Vo(t,i){const r=(t.clientX+i.clientX)/2,n=(t.clientY+i.clientY)/2,o=this.Mo(r,n,-1,{id:-1,x:-1,y:-1,clientX:r,clientY:n});return{x:o.x,y:o.y}}No(t,i){const r=performance.now(),n=r-t.startTime,o=this.Ho(t.startPosition,t.lastPosition,!0);if(!t.longPressFired&&n<=this.ho&&o<=this.co)this.jo(t.lastPosition,r)&&this.so?this.so({touch:this.Go(t.lastPosition),taps:2,originalEvent:i}):this.eo&&this.eo({touch:this.Go(t.lastPosition),taps:1,originalEvent:i});else if(!t.longPressFired&&n<=this.do&&o>=this.fo){const h={x:t.lastPosition.clientX-t.startPosition.clientX,y:t.lastPosition.clientY-t.startPosition.clientY},a=Math.max(Math.hypot(h.x,h.y),1e-4),u={x:h.x/a,y:h.y/a},f={x:h.x/n,y:h.y/n};this.ro&&this.ro({touch:this.Go(t.lastPosition),direction:u,distance:a,velocity:f,originalEvent:i})}this.vo=r,this.yo=this.Go(t.lastPosition)}jo(t,i){return!!this.yo&&!(i-this.vo>this.ao)&&this.Ho(t,this.yo,!0)<=this.co}Go(t){return{...t}}Ho(t,i,r){return r?Math.hypot(t.clientX-i.clientX,t.clientY-i.clientY):Math.hypot(t.x-i.x,t.y-i.y)}Wo(t,i){return 180*Math.atan2(i.clientY-t.clientY,i.clientX-t.clientX)/Math.PI}}const Qt=Object.freeze(Object.defineProperty({__proto__:null,TouchManager:gt},Symbol.toStringTag,{value:"Module"})),te=l=>class extends l{rotate(t=0,i=0,r=0){this.xt.state.et(t),this.xt.state.st(i),this.xt.state.it(r)}rotateX(t){this.xt.state.et(t)}rotateY(t){this.xt.state.st(t)}rotateZ(t){this.xt.state.it(t)}push(){this.xt.state.H()}pop(){this.xt.state.Z()}rect(t,i,r=1,n=1){this.xt.Xs(t,i,r,n)}point(t,i){this.xt.Xs(t,i,1,1)}line(t,i,r,n){this.xt.Ws(t,i,r,n)}lineWeight(t){this.xt.state.tt(t)}background(t,i=t,r=t,n=255){this.xt.Zs(t,i,r,n)}char(t){this.xt.state.rt(this.Ei.Si(t))}charColor(t,i,r,n=255){this.xt.state.nt(t,i,r,n)}cellColor(t,i,r,n=255){this.xt.state.ot(t,i,r,n)}flipX(t){this.xt.state.ht(t)}flipY(t){this.xt.state.ct(t)}charRotation(t){this.xt.state.ut(t)}invert(t){this.xt.state.lt(t)}clear(){this.xt.Zs(0,0,0,0)}ellipse(t,i,r,n){this.xt.Vs(t,i,r/2,n/2)}triangle(t,i,r,n,o,h){this.xt.js(t,i,r,n,o,h)}bezierCurve(t,i,r,n,o,h,a,u){this.xt.Ks(t,i,r,n,o,h,a,u)}arc(t,i,r,n,o,h){this.xt.qs(t,i,r,n,o,h)}shader(t){this.xt.Gs(t)}setUniform(t,i){this.xt.jt(t,i)}setUniforms(t){this.xt.Ls(t)}createFilterShader(t){return this.xt.oe(t)}createFramebuffer(t){return this.xt.Ys(t.width,t.height,5,{filter:"nearest",wrap:"clamp",format:"rgba",type:"unsigned_byte"})}image(t,i,r,n,o){if(t.textures){const h=t;this.xt.Os(h,i,r,n??h.width,o??h.height)}else{const h=t;this.xt.Hs(h,i,r,n??Math.floor(this.Gr.cols/2),o??Math.floor(this.Gr.rows/2))}}async loadImage(t){if(typeof t!="string")return X.$r(this.xt,t,n=>this.Ei.Pi(n));const i=t,r=await new Promise((n,o)=>{const h=new Image;h.crossOrigin="anonymous",h.onload=()=>n(h),h.onerror=a=>o(a),h.src=i});return X.$r(this.xt,r,n=>this.Ei.Pi(n))}};class it{Ko(t){const i=t.zt(0),r=t.zt(1),n=t.zt(2),o=t.zt(3);return{characterPixels:i,primaryColorPixels:r,secondaryColorPixels:n,transformPixels:t.zt(4),rotationPixels:o}}Yo(t,i){return t[i]+(t[i+1]<<8)}qo(t,i){return{r:t[i],g:t[i+1],b:t[i+2],a:t[i+3]}}}class st{Zo(t,i){return new Blob([t],{type:i})}Qo(t,i,r){try{const n=this.Zo(t,r),o=URL.createObjectURL(n),h=document.createElement("a");h.href=o,h.download=i,h.style.display="none",h.rel="noopener",document.body.appendChild(h),h.click(),document.body.removeChild(h),URL.revokeObjectURL(o)}catch(n){console.error("Failed to download file:",n)}}Jo(){return new Date().toISOString().slice(0,19).replace(/:/g,"-")}th(){const t=new Date;return{date:t.toISOString().split("T")[0],time:t.toTimeString().split(" ")[0].replace(/:/g,"-")}}eh(t){return t.replace(/[<>:"/\\|?*]/g,"_").replace(/\s+/g,"_").replace(/_{2,}/g,"_").replace(/^_+|_+$/g,"").substring(0,255)}sh(){return"textmode-export-"+this.Jo()}}class ee extends it{ih(t,i,r){const n=t[r]===255,o=t[r+1]===255,h=t[r+2]===255,a=i[r],u=i[r+1];return{isInverted:n,flipHorizontal:o,flipVertical:h,rotation:Math.round(360*(a+u/255)/255*100)/100}}rh(t,i,r){return{x:t,y:i,cellX:t*r.cellWidth,cellY:i*r.cellHeight}}nh(t,i){const r=[];let n=0;for(let o=0;o<i.rows;o++)for(let h=0;h<i.cols;h++){const a=4*n,u=this.Yo(t.characterPixels,a);let f=this.qo(t.primaryColorPixels,a),d=this.qo(t.secondaryColorPixels,a);const g=this.ih(t.transformPixels,t.rotationPixels,a);if(g.isInverted){const x=f;f=d,d=x}const m=this.rh(h,o,i);r.push({charIndex:u,primaryColor:f,secondaryColor:d,transform:g,position:m}),n++}return r}}class ie{oh(t,i){const r=t.cmap;for(const n of r.tables)if(n.format===4){const o=n;for(let h=0;h<o.startCount.length;h++)if(i>=o.startCount[h]&&i<=o.endCount[h]){if(o.idRangeOffset[h]===0)return i+o.idDelta[h]&65535;{const a=o.idRangeOffset[h]/2+(i-o.startCount[h])-(o.startCount.length-h);if(a>=0&&a<o.glyphIdArray.length){const u=o.glyphIdArray[a];if(u!==0)return u+o.idDelta[h]&65535}}}}else if(n.format===12){const o=n;for(let h=0;h<o.groups.length;h+=3){const a=o.groups[h],u=o.groups[h+1],f=o.groups[h+2];if(i>=a&&i<=u)return f+(i-a)}}return 0}hh(t,i,r,n,o){const h=o/t.head.unitsPerEm;return{getBoundingBox:()=>({x1:r+i.xMin*h,y1:n+-i.yMax*h,x2:r+i.xMax*h,y2:n+-i.yMin*h}),toSVG:()=>this.ah(i,r,n,h)}}ah(t,i,r,n){if(!t||!t.xs)return"";const{xs:o,ys:h,endPts:a,flags:u}=t;if(!(o&&h&&a&&u))return"";let f="",d=0;for(let g=0;g<a.length;g++){const m=a[g];if(!(m<d)){if(m>=d){const x=i+o[d]*n,A=r-h[d]*n;f+=`M${x.toFixed(2)},${A.toFixed(2)}`;let p=d+1;for(;p<=m;)if(1&u[p]){const y=i+o[p]*n,v=r-h[p]*n;f+=`L${y.toFixed(2)},${v.toFixed(2)}`,p++}else{const y=i+o[p]*n,v=r-h[p]*n;let w=p+1>m?d:p+1;if(1&u[w]){const E=i+o[w]*n,P=r-h[w]*n;f+=`Q${y.toFixed(2)},${v.toFixed(2)} ${E.toFixed(2)},${P.toFixed(2)}`,p=w+1}else{const E=(y+(i+o[w]*n))/2,P=(v+(r-h[w]*n))/2;f+=`Q${y.toFixed(2)},${v.toFixed(2)} ${E.toFixed(2)},${P.toFixed(2)}`,p=w}}f+="Z"}d=m+1}}return f}uh(t,i,r,n,o){const h=t.codePointAt(0)||0,a=this.oh(i,h);let u=null;return i.glyf&&i.glyf[a]!==null?u=i.glyf[a]:(u=B.T.glyf.Js(i,a),i.glyf[a]=u),this.hh(i,u,r,n,o)}fh(t,i,r,n,o,h,a,u){const f=r+(o-u*(a/i.head.unitsPerEm))/2,d=n+(h+.7*a)/2;return this.uh(t,i,f,d,a).toSVG()||null}}class se{constructor(){c(this,"dh");this.dh=new ie}ph(t){const{width:i,height:r}=t;return`<?xml version="1.0" encoding="UTF-8"?><svg width="${i}" height="${r}" viewBox="0 0 ${i} ${r}" xmlns="http://www.w3.org/2000/svg"><title>textmode.js sketch</title>`}_h(){return"</g></svg>"}mh(t,i){if(!i.includeBackgroundRectangles)return"";const[r,n,o,h]=i.backgroundColor;return`<rect width="${t.width}" height="${t.height}" fill="rgba(${r},${n},${o},${h/255})"/>`}gh(t,i){const{transform:r,position:n}=t;if(!r.flipHorizontal&&!r.flipVertical&&!r.rotation)return"";const o=n.cellX+i.cellWidth/2,h=n.cellY+i.cellHeight/2,a=[];if(r.flipHorizontal||r.flipVertical){const u=r.flipHorizontal?-1:1,f=r.flipVertical?-1:1;a.push(`translate(${o} ${h})scale(${u} ${f})translate(${-o} ${-h})`)}return r.rotation&&a.push(`rotate(${r.rotation} ${o} ${h})`),` transform="${a.join(" ")}"`}yh(t,i,r){if(!r.includeBackgroundRectangles||t.secondaryColor.a===0)return"";const{position:n}=t,{r:o,g:h,b:a,a:u}=t.secondaryColor,f=`rgba(${o},${h},${a},${u/255})`;return r.drawMode==="stroke"?`<rect x="${n.cellX}" y="${n.cellY}" width="${i.cellWidth}" height="${i.cellHeight}" stroke="${f}" fill="none" stroke-width="${r.strokeWidth}"/>`:`<rect x="${n.cellX}" y="${n.cellY}" width="${i.cellWidth}" height="${i.cellHeight}" fill="${f}"/>`}uh(t,i,r,n){const o=r.characters[t.charIndex];if(!o)return"";const h=this.dh.fh(o.character,r.font,t.position.cellX,t.position.cellY,i.cellWidth,i.cellHeight,r.fontSize,o.advanceWidth);if(!h)return"";const{r:a,g:u,b:f,a:d}=t.primaryColor,g=`rgba(${a},${u},${f},${d/255})`;return n.drawMode==="stroke"?`<path d="${h}" stroke="${g}" stroke-width="${n.strokeWidth}" fill="none"/>`:`<path d="${h}" fill="${g}"/>`}wh(t,i,r,n){const o=[],h=this.yh(t,i,n);h&&o.push(h);const a=this.uh(t,i,r,n);if(a){const u=this.gh(t,i);o.push(u?`<g${u}>${a}</g>`:a)}return o.join("")}Ch(t,i,r,n){const o=[this.ph(i),this.mh(i,n),'<g id="ascii-cells">'];for(const h of t)o.push(this.wh(h,i,r,n));return o.push(this._h()),o.join("")}Ah(t){return t.replace(/<path[^>]*d=""[^>]*\/>/g,"").replace(/\s+/g," ").replace(/> </g,"><")}}class re extends st{bh(t){return this.Zo(t,"image/svg+xml;charset=utf-8")}xh(t,i){this.Qo(t,this.eh(i)+".svg","image/svg+xml;charset=utf-8")}Mh(t,i){this.xh(t,i||this.sh())}}class pt{constructor(){c(this,"$h");c(this,"Th");c(this,"Fh");this.$h=new ee,this.Th=new se,this.Fh=new re}Rh(t){return{includeBackgroundRectangles:t.includeBackgroundRectangles??!0,drawMode:t.drawMode??"fill",strokeWidth:t.strokeWidth??1,backgroundColor:t.backgroundColor??[0,0,0,0],filename:t.filename||this.Fh.sh()}}zh(t,i={}){const r=this.$h.nh(this.$h.Ko(t.pipeline),t.grid),n=this.Th.Ch(r,t.grid,t.font,this.Rh(i));return this.Th.Ah(n)}Mh(t,i={}){this.Fh.Mh(this.zh(t,i),i.filename)}}class ne extends it{Sh(t,i,r,n=" "){var a;const o=[];let h=0;for(let u=0;u<i.rows;u++){const f=[];for(let d=0;d<i.cols;d++){const g=4*h,m=this.Yo(t.characterPixels,g),x=((a=r.characters[m])==null?void 0:a.character)||n;f.push(x),h++}o.push(f)}return o}}class oe{Ph(t,i){const r=[];for(const o of t){let h=o.join("");i.preserveTrailingSpaces||(h=h.replace(/\s+$/,"")),r.push(h)}const n=i.lineEnding==="crlf"?`\r
|
|
12
|
-
`:`
|
|
13
|
-
`;return r.join(n)}}class he extends st{Eh(t,i){const r=this.Dh(i);this.Qo(t,r,"text/plain;charset=utf-8")}Dh(t){let i=this.eh(t);return i===".txt"||i.length<=4?this.sh():i}}class mt{constructor(){c(this,"$h");c(this,"Th");c(this,"Fh");this.$h=new ne,this.Th=new oe,this.Fh=new he}Rh(t){return{preserveTrailingSpaces:t.preserveTrailingSpaces??!1,lineEnding:t.lineEnding??"lf",emptyCharacter:t.emptyCharacter??" ",filename:t.filename||this.Fh.sh()}}kh(t,i={}){const r=this.Rh(i),n=this.$h.Sh(this.$h.Ko(t.pipeline),t.grid,t.font,r.emptyCharacter);return this.Th.Ph(n,r)}Eh(t,i={}){this.Fh.Eh(this.kh(t,i),i.filename)}}class ae extends it{Bh(t,i=1,r="transparent"){const n=t.canvas;if(i===1&&r==="transparent")return n;const o=document.createElement("canvas"),h=o.getContext("2d"),a=Math.round(n.width*i),u=Math.round(n.height*i);return o.width=a,o.height=u,r!=="transparent"&&(h.fillStyle=r,h.fillRect(0,0,a,u)),h.imageSmoothingEnabled=!1,h.drawImage(n,0,0,n.width,n.height,0,0,a,u),o}}class ce{Gh(t,i){const r=this.Lh(i.format);return i.format==="png"?t.toDataURL(r):t.toDataURL(r,i.quality)}async Oh(t,i){return new Promise((r,n)=>{const o=this.Lh(i.format),h=a=>{a?r(a):n(Error(`Failed to generate ${i.format.toUpperCase()} blob`))};i.format==="png"?t.toBlob(h,o):t.toBlob(h,o,i.quality)})}Lh(t){switch(t){case"png":return"image/png";case"jpg":return"image/jpeg";case"webp":return"image/webp";default:throw Error("Unsupported image format: "+t)}}}const le={png:"image/png",jpg:"image/jpeg",webp:"image/webp"},vt={png:".png",jpg:".jpg",webp:".webp"};class ue extends st{Hh(t,i,r){this.Ih(t,this.eh(i)+vt[r])}Ih(t,i){const r=URL.createObjectURL(t);try{const n=document.createElement("a");n.href=r,n.download=i,n.style.display="none",n.rel="noopener",document.body.appendChild(n),n.click(),document.body.removeChild(n)}finally{URL.revokeObjectURL(r)}}Nh(t){return t in le&&t in vt}}class fe{constructor(){c(this,"$h");c(this,"Th");c(this,"Fh");this.$h=new ae,this.Th=new ce,this.Fh=new ue}Rh(t){return{format:t.format??"png",quality:t.quality??1,scale:t.scale??1,backgroundColor:t.backgroundColor??"transparent",filename:t.filename||this.Fh.sh()}}Xh(t){if(!this.Fh.Nh(t.format))throw Error(`Saving '${t.format}' files is not supported`);if(t.quality<0||t.quality>1)throw Error("Image quality must be between 0.0 and 1.0");if(t.scale<=0)throw Error("Scale factor must be greater than 0");t.format==="jpg"&&t.backgroundColor==="transparent"&&(t.backgroundColor="black")}async Oh(t,i){if(i.scale===1&&i.backgroundColor==="transparent")return await this.Th.Oh(t.canvas,i);const r=this.$h.Bh(t,i.scale,i.backgroundColor);return await this.Th.Oh(r,i)}async Hh(t,i={}){const r=this.Rh(i);this.Xh(r);const n=await this.Oh(t,r);this.Fh.Hh(n,r.filename,r.format)}}const de=l=>class extends l{Wh(){this.xt.Pt(this.Vh)}toString(t={}){return this.Wh(),new mt().kh({pipeline:this.jh,grid:this.Gr,font:this.Ei},t)}saveStrings(t={}){this.Wh(),new mt().Eh({pipeline:this.jh,grid:this.Gr,font:this.Ei},t)}toSVG(t={}){return this.Wh(),new pt().zh({pipeline:this.jh,grid:this.Gr,font:this.Ei},t)}saveSVG(t={}){this.Wh(),new pt().Mh({pipeline:this.jh,grid:this.Gr,font:this.Ei},t)}async saveCanvas(t={}){await new fe().Hh(this.er,t)}},ge=l=>class extends l{async loadFont(t){return this.Ei.qi(t).then(()=>{const i=this.Ei.maxGlyphDimensions;this.Gr.nr(i.width,i.height),this.jh.resize(this.Gr.cols,this.Gr.rows),this.xt.Qs(),this.Ln.nn()})}fontSize(t){if(!Y.v(typeof t=="number"&&t>0,"Font size must be a positive number greater than 0.",{method:"fontSize",providedValue:t})||this.Ei.fontSize===t)return;this.Ei.Yi(t);const i=this.Ei.maxGlyphDimensions;this.Gr.nr(i.width,i.height),this.jh.resize(this.Gr.cols,this.Gr.rows),this.xt.Qs(),this.Ln.nn()}glyphColor(t){return this.Ei.Si(t)}glyphColors(t){return this.Ei.Pi(t)}},pe=l=>class extends l{get frameCount(){return this.Kh.frameCount}set frameCount(t){this.Kh.frameCount=t}frameRate(t){return t===void 0?this.Kh.currentFrameRate:this.Kh.frameRate(t,()=>this.Yh())}noLoop(){this.Kh.pause()}loop(){this.Kh.resume(()=>this.Yh())}redraw(t=1){if(Y.v(typeof t=="number"&&t>0&&Number.isInteger(t),"Redraw count must be a positive integer.",{method:"redraw",providedValue:t}))for(let i=0;i<t;i++)this.Yh()}isLooping(){return this.Kh.isLooping}},me=l=>class extends l{constructor(...t){super(...t)}mouseClicked(t){this.Ln._n(t)}mousePressed(t){this.Ln.mn(t)}mouseReleased(t){this.Ln.gn(t)}mouseMoved(t){this.Ln.vn(t)}mouseScrolled(t){this.Ln.yn(t)}get mouse(){return this.Ln.wn()}cursor(t){this.Ln.rn(t)}},ve=l=>class extends l{constructor(...t){super(...t)}touchStarted(t){this.qh.To(t)}touchMoved(t){this.qh.vn(t)}touchEnded(t){this.qh.Fo(t)}touchCancelled(t){this.qh.Ro(t)}tap(t){this.qh.zo(t)}doubleTap(t){this.qh.So(t)}longPress(t){this.qh.Po(t)}swipe(t){this.qh.Eo(t)}pinch(t){this.qh.Do(t)}rotateGesture(t){this.qh.ko(t)}get touches(){return this.qh.$o()}},Ae=l=>class extends l{constructor(...t){super(...t)}keyPressed(t){this.Zh.mn(t)}keyReleased(t){this.Zh.gn(t)}isKeyPressed(t){return this.Zh.Sn(t)}get lastKeyPressed(){return this.Zh.En()}get lastKeyReleased(){return this.Zh.Dn()}get pressedKeys(){return this.Zh.kn()}get modifierState(){return this.Zh.Bn()}};class xe{constructor(){c(this,"xt");c(this,"Ei");c(this,"er");c(this,"Gr");c(this,"Kh");c(this,"Ln");c(this,"qh");c(this,"Zh");c(this,"Vh");c(this,"jh");c(this,"Qh");c(this,"Jh");c(this,"ta")}Yh(){}}class At extends function(i,...r){return r.reduce((n,o)=>o(n),i)}(xe,te,de,ge,pe,me,ve,Ae){constructor(i={}){super();c(this,"ea",!1);c(this,"sa",()=>{});c(this,"ia",()=>{});c(this,"ra",()=>{});c(this,"na");c(this,"cr");c(this,"ar",!1);c(this,"oa");this.ar=i.overlay??!1,this.er=new ut(i),this.xt=new Ot(this.er.gr()),this.Ei=new ct(this.xt,i.fontSize??16),this.Kh=new Zt(i.frameRate??60),this.Ln=new ft(this.er),this.qh=new gt(this.er,this.Ln),this.Zh=new dt,this.Vh=this.xt.St(),this.Qh=this.xt.re(),this.ha(i)}async ha(i){await this.Ei.Vi(i.fontSource);const r=this.Ei.maxGlyphDimensions;this.Gr=new lt(this.er.canvas,r.width,r.height),this.Ln.Vi(this.Gr),this.qh.Vi(this.Gr),this.jh=this.xt.Ys(this.Gr.cols,this.Gr.rows,5),this.Jh=this.xt.Ys(this.Gr.width,this.Gr.height,1),this.ar&&(this.oa=X.$r(this.xt,this.er.targetCanvas,n=>this.Ei.Pi(n))),this.ta=this.xt.he(ot,"precision mediump float;uniform sampler2D Ua;uniform vec2 Ub;uniform vec2 Uc;uniform vec2 Ud;void main(){vec2 A=gl_FragCoord.xy-Uc;vec2 B=A*(Ub/Ud);vec2 C=(floor(B)+0.5)/Ub;gl_FragColor=texture2D(Ua,C);}"),this.aa(),this.sa(),this.Kh.start(()=>this.Yh())}aa(){this.na=()=>{this.ar&&this.resizeCanvas(this.er.targetCanvas.width,this.er.targetCanvas.height),this.ra()},window.addEventListener("resize",this.na),this.Ln.hn(),this.qh.hn(),this.Zh.hn(),window.addEventListener("blur",()=>{this.Zh.Gn()}),window.ResizeObserver&&this.ar&&(this.cr=new ResizeObserver(()=>{this.resizeCanvas(this.er.targetCanvas.width,this.er.targetCanvas.height)}),this.cr.observe(this.er.targetCanvas))}Yh(){if(this.Kh.measureFrameRate(),this.Kh.incrementFrame(),this.ea)return;if(this.ar){const r=this.xt.context;r.bindTexture(r.TEXTURE_2D,this.oa.texture),r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,1),r.texImage2D(r.TEXTURE_2D,0,r.RGBA,r.RGBA,r.UNSIGNED_BYTE,this.er.targetCanvas),r.bindTexture(r.TEXTURE_2D,null)}this.jh.begin(),this.xt.Bs(this.Vh),this.ia(),this.xt.Pt(this.Vh),this.jh.end(),this.Jh.begin(),this.xt.Bs(this.Qh),this.Qh.Vt({U0:this.Ei.fontFramebuffer,U1:[this.Ei.textureColumns,this.Ei.textureRows],U2:this.jh.textures[0],U3:this.jh.textures[1],U4:this.jh.textures[2],U5:this.jh.textures[4],U6:this.jh.textures[3],U7:[this.Gr.cols,this.Gr.rows],U8:[this.Jh.width,this.Jh.height],U9:this.Jh.width/this.Jh.height}),this.xt.Ns(0,0,this.er.width,this.er.height),this.Jh.end();const i=this.xt.state.canvasBackgroundColor;this.xt.Ne(i[0],i[1],i[2],i[3]),this.xt.Bs(this.ta),this.ta.Vt({Ua:this.Jh.textures[0],Ub:[this.Jh.width,this.Jh.height],Uc:[this.Gr.offsetX,this.Gr.offsetY],Ud:[this.Gr.width,this.Gr.height]}),this.xt.Ns(this.Gr.offsetX,this.Gr.offsetY,this.Gr.width,this.Gr.height)}setup(i){this.sa=i}draw(i){this.ia=i}windowResized(i){this.ra=i}resizeCanvas(i,r){this.er.mr(i,r),this.Gr.rr(),this.jh.resize(this.Gr.cols,this.Gr.rows),this.Jh.resize(this.Gr.width,this.Gr.height),this.xt.Qs(),this.Ln.nn(),this.qh.wo(),this.Yh()}destroy(){this.ea||(this.Kh.stop(),window.removeEventListener("resize",this.na),this.Ln.pn(),this.qh.pn(),this.Zh.pn(),this.Ei.kt(),this.xt.kt(),this.Jh.kt(),this.ta.kt(),this.oa&&this.oa.kt(),this.ea=!0)}get grid(){return this.Gr}get font(){return this.Ei}get width(){return this.er.width}get height(){return this.er.height}get canvas(){return this.er.canvas}get isDisposed(){return this.ea}get overlay(){return this.oa}}class J{constructor(){}static create(t={}){return new At(t)}static setErrorLevel(t){Y.C(t)}static get version(){return"0.3.1"}}const ye=Object.freeze(Object.defineProperty({__proto__:null},Symbol.toStringTag,{value:"Module"})),Ee=Object.freeze(Object.defineProperty({__proto__:null,keyboard:$t,mouse:Jt,touch:Qt},Symbol.toStringTag,{value:"Module"})),we=J.create,Te=J.setErrorLevel,be=J.version;R.TextmodeCanvas=ut,R.TextmodeErrorLevel=_,R.TextmodeFont=ct,R.TextmodeFramebuffer=V,R.TextmodeGrid=lt,R.TextmodeImage=X,R.Textmodifier=At,R.create=we,R.export=ye,R.input=Ee,R.setErrorLevel=Te,R.textmode=J,R.version=be,Object.defineProperty(R,Symbol.toStringTag,{value:"Module"})},typeof exports=="object"&&typeof module<"u"?s(exports):typeof define=="function"&&define.amd?define(["exports"],s):s((e=typeof globalThis<"u"?globalThis:e||self).textmode={});
|
|
7
|
+
`}static o(t){if(t===null)return"null";if(t===void 0)return"undefined";if(typeof t=="string")return`"${t}"`;if(typeof t=="number"||typeof t=="boolean")return t+"";if(Array.isArray(t))return t.length===0?"[]":t.length<=5?`[${t.map(i=>R.o(i)).join(", ")}]`:`[${t.slice(0,3).map(i=>R.o(i)).join(", ")}, ... +${t.length-3} more]`;if(typeof t=="object"){const i=Object.keys(t);return i.length===0?"{}":i.length<=3?`{ ${i.map(r=>`${r}: ${R.o(t[r])}`).join(", ")} }`:`{ ${i.slice(0,2).map(r=>`${r}: ${R.o(t[r])}`).join(", ")}, ... +${i.length-2} more }`}return t+""}}var S=(l=>(l[l.SILENT=0]="SILENT",l[l.WARNING=1]="WARNING",l[l.ERROR=2]="ERROR",l[l.THROW=3]="THROW",l))(S||{});const I=class I{constructor(){c(this,"u",{globalLevel:3})}static _(){return I.l||(I.l=new I),I.l}v(t,i){const r="%c[textmode.js] Oops! (╯°□°)╯︵ Something went wrong in your code.",n="color: #f44336; font-weight: bold; background: #ffebee; padding: 2px 6px; border-radius: 3px;";switch(this.u.globalLevel){case 0:return!1;case 1:return console.group(r,n),console.warn(R.i(t,i)),console.groupEnd(),!1;case 2:return console.group(r,n),console.error(R.i(t,i)),console.groupEnd(),!1;default:throw new R(t,i)}}m(t,i,r){return!!t||(this.v(i,r),!1)}A(t){this.u.globalLevel=t}};c(I,"l",null);let J=I;const X=J._(),it=new WeakMap;function k(l,t){it.set(l,t)}function V(l){return it.get(l)}class st{constructor(){c(this,"C",1);c(this,"M",0);c(this,"U",0);c(this,"F",0);c(this,"R",[0,0,0]);c(this,"P",[1,1,1,1]);c(this,"S",[0,0,0,1]);c(this,"$",!1);c(this,"D",!1);c(this,"k",!1);c(this,"O",[0,0]);c(this,"L",[0,0,0,1]);c(this,"G",[])}H(){this.G.push({I:this.C,N:this.M,X:this.U,W:this.F,O:[...this.O],K:this.$,j:this.D,k:this.k,Y:[...this.R],V:[...this.P],q:[...this.S]})}Z(){const t=this.G.pop();t?(this.C=t.I,this.M=t.N,this.U=t.X,this.F=t.W,this.O=t.O,this.$=t.K,this.D=t.j,this.k=t.k,this.R=t.Y,this.P=t.V,this.S=t.q):console.warn("pop() called without matching push()")}J(t){t.I=this.C,t.N=this.M,t.X=this.U,t.W=this.F,t.Y[0]=this.R[0],t.Y[1]=this.R[1],t.Y[2]=this.R[2],t.V[0]=this.P[0],t.V[1]=this.P[1],t.V[2]=this.P[2],t.V[3]=this.P[3],t.q[0]=this.S[0],t.q[1]=this.S[1],t.q[2]=this.S[2],t.q[3]=this.S[3],t.K=this.$,t.j=this.D,t.k=this.k,t.O[0]=this.O[0],t.O[1]=this.O[1]}get lineWeight(){return this.C}get canvasBackgroundColor(){return this.L}tt(t){this.C=Math.abs(t)}st(t){this.M=t}et(t){this.U=t}it(t){this.F=t}rt(t){this.R=t}nt(t,i,r,n=255){this.P=[t/255,i/255,r/255,n/255]}ot(t,i,r,n=255){this.S=[t/255,i/255,r/255,n/255]}ht(t){this.$=t}ct(t){this.D=t}lt(t){this.k=t}ut(t){const i=255*t/360,r=Math.floor(i)/255,n=Math.round(i-Math.floor(i));this.O=[r,n]}ft(t,i,r,n){this.L=[t/255,i/255,r/255,n/255]}}class j{constructor(t,i,r=i,n=1,o={},h=null,a=!1){c(this,"dt");c(this,"_t");c(this,"u");c(this,"vt",null);c(this,"gt");c(this,"At");c(this,"yt",[]);c(this,"Ct");c(this,"wt",null);c(this,"bt",[]);c(this,"xt",null);c(this,"Mt",!1);c(this,"Ft",null);this.dt=i,this._t=r,this.u={filter:"nearest",wrap:"clamp",format:"rgba",type:"unsigned_byte",...o},this.gt=t,this.Ct=Math.min(Math.max(1,n),8),this.xt=h,this.Mt=!!a,this.Ft=this.Mt?new st:null;const u=t.getParameter(t.MAX_DRAW_BUFFERS),f=t.getParameter(t.MAX_COLOR_ATTACHMENTS);this.Ct=Math.min(this.Ct,u,f),this.At=t.createFramebuffer(),this.zt(),this.Rt(),this.bt=Array(this.Ct).fill(null)}zt(){const t=this.gt,i=this.u.filter==="linear"?t.LINEAR:t.NEAREST,r=this.u.wrap==="repeat"?t.REPEAT:t.CLAMP_TO_EDGE,n=this.u.type==="float"?t.FLOAT:t.UNSIGNED_BYTE;for(let o=0;o<this.Ct;o++){const h=t.createTexture();t.bindTexture(t.TEXTURE_2D,h),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,i),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,i),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,r),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,r),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.dt,this._t,0,t.RGBA,n,null),this.yt.push(h)}t.bindTexture(t.TEXTURE_2D,null)}Rt(){const t=this.gt;if(t.bindFramebuffer(t.FRAMEBUFFER,this.At),this.Ct===1)t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.yt[0],0);else{const r=[];for(let n=0;n<this.Ct;n++){const o=t.COLOR_ATTACHMENT0+n;t.framebufferTexture2D(t.FRAMEBUFFER,o,t.TEXTURE_2D,this.yt[n],0),r.push(o)}t.drawBuffers(r)}const i=t.checkFramebufferStatus(t.FRAMEBUFFER);i!==t.FRAMEBUFFER_COMPLETE&&console.error("GLFramebuffer is not complete:",i),t.bindFramebuffer(t.FRAMEBUFFER,null)}Tt(t){const i=this.gt;i.bindTexture(i.TEXTURE_2D,this.yt[0]),i.pixelStorei(i.UNPACK_FLIP_Y_WEBGL,1),i.texImage2D(i.TEXTURE_2D,0,i.RGBA,i.RGBA,i.UNSIGNED_BYTE,t),i.bindTexture(i.TEXTURE_2D,null)}resize(t,i){this.dt=t,this._t=i,this.vt=null,this.bt=Array(this.Ct).fill(null);const r=this.gt,n=this.u.type==="float"?r.FLOAT:r.UNSIGNED_BYTE;for(const o of this.yt)r.bindTexture(r.TEXTURE_2D,o),r.texImage2D(r.TEXTURE_2D,0,r.RGBA,this.dt,this._t,0,r.RGBA,n,null);r.bindTexture(r.TEXTURE_2D,null)}readPixels(t){const i=this.gt,r=this.bt[t];if(r)return r;const n=this.dt,o=this._t,h=new Uint8Array(n*o*4),a=i.getParameter(i.READ_FRAMEBUFFER_BINDING);i.bindFramebuffer(i.READ_FRAMEBUFFER,this.At),i.readBuffer(i.COLOR_ATTACHMENT0+t),i.readPixels(0,0,n,o,i.RGBA,i.UNSIGNED_BYTE,h),i.bindFramebuffer(i.READ_FRAMEBUFFER,a);const u=4*n,f=new Uint8Array(h.length);for(let g=0;g<o;g++){const d=(o-1-g)*u,p=g*u;f.set(h.subarray(d,d+u),p)}return this.bt[t]=f,f}begin(){var i,r,n,o;const t=this.gt;if(this.xt){const h=((r=(i=this.xt).Pt)==null?void 0:r.call(i))??null;h&&this.xt.St(h),this.Mt&&this.Ft&&((o=(n=this.xt).Et)==null||o.call(n,this.Ft))}this.wt={framebuffer:t.getParameter(t.FRAMEBUFFER_BINDING),viewport:t.getParameter(t.VIEWPORT)},t.bindFramebuffer(t.FRAMEBUFFER,this.At),this.bt=Array(this.Ct).fill(null);for(let h=0;h<this.Ct;h++)t.clearBufferfv(t.COLOR,h,new Float32Array([0,0,0,0]));t.viewport(0,0,this.dt,this._t),k(t,[0,0,this.dt,this._t])}end(){var i,r,n,o;if(!this.wt)return;const t=this.gt;if(this.xt){const h=((r=(i=this.xt).Pt)==null?void 0:r.call(i))??null;h&&this.xt.St(h)}t.bindFramebuffer(t.FRAMEBUFFER,this.wt.framebuffer),t.viewport(...this.wt.viewport),k(t,this.wt.viewport),this.wt=null,this.xt&&this.Mt&&this.Ft&&((o=(n=this.xt).$t)==null||o.call(n))}Dt(){const t=this.gt;t.deleteFramebuffer(this.At);for(const i of this.yt)t.deleteTexture(i)}get width(){return this.dt}get height(){return this._t}get textures(){return[...this.yt]}}class N{constructor(t,i,r){c(this,"gt");c(this,"kt");c(this,"Bt",new Map);c(this,"Ot",new Map);c(this,"Lt",0);this.gt=t,this.kt=this.Gt(i,r),this.Ht()}Ht(){const t=this.gt.getProgramParameter(this.kt,this.gt.ACTIVE_UNIFORMS);for(let i=0;i<t;i++){const r=this.gt.getActiveUniform(this.kt,i);if(r){const n=this.gt.getUniformLocation(this.kt,r.name);if(n&&(this.Bt.set(r.name,n),this.Ot.set(r.name,{type:r.type,size:r.size}),r.size>1)){const o=r.name.replace(/\[.*\]$/,"");this.Bt.has(o)||(this.Bt.set(o,n),this.Ot.set(o,{type:r.type,size:r.size}))}}}}Gt(t,i){const r=this.It(this.gt.VERTEX_SHADER,t),n=this.It(this.gt.FRAGMENT_SHADER,i),o=this.gt.createProgram();if(this.gt.attachShader(o,r),this.gt.attachShader(o,n),this.gt.linkProgram(o),!this.gt.getProgramParameter(o,this.gt.LINK_STATUS)){const h=this.gt.getProgramInfoLog(o);throw Error("Shader program link error: "+h)}return this.gt.deleteShader(r),this.gt.deleteShader(n),o}It(t,i){const r=this.gt.createShader(t);if(this.gt.shaderSource(r,i),this.gt.compileShader(r),!this.gt.getShaderParameter(r,this.gt.COMPILE_STATUS)){const n=this.gt.getShaderInfoLog(r);throw this.gt.deleteShader(r),Error("Shader compilation error: "+n)}return r}Nt(){this.gt.useProgram(this.kt),this.Xt()}Xt(){this.Lt=0}Wt(t){for(const[i,r]of Object.entries(t))this.Kt(i,r)}jt(t){return this.Bt.has(t)}Yt(t){return this.Ot.get(t)||null}Vt(){const t=[];for(const[i,r]of this.Ot.entries())t.push({name:i,...r});return t}Kt(t,i){var u;const r=this.Bt.get(t);if(!r)return;const n=this.Ot.get(t);if(!n)return void console.warn(`No type information found for uniform '${t}'`);const{type:o,size:h}=n,a=this.gt;if(typeof i=="number")switch(o){case a.INT:case a.BOOL:a.uniform1i(r,i);break;case a.FLOAT:a.uniform1f(r,i);break;default:console.warn(`Unexpected uniform type for scalar '${t}': ${o}`),a.uniform1f(r,i)}else if(typeof i=="boolean")a.uniform1i(r,i?1:0);else if(Array.isArray(i))if(Array.isArray(i[0])){const f=i,g=((u=f[0])==null?void 0:u.length)||0,d=f.flat();switch(o){case a.FLOAT_VEC2:g===2?a.uniform2fv(r,d):console.warn(`Vector length mismatch for '${t}': expected 2, got ${g}`);break;case a.FLOAT_VEC3:g===3?a.uniform3fv(r,d):console.warn(`Vector length mismatch for '${t}': expected 3, got ${g}`);break;case a.FLOAT_VEC4:g===4?a.uniform4fv(r,d):console.warn(`Vector length mismatch for '${t}': expected 4, got ${g}`);break;default:console.warn(`Unsupported uniform type for vector array '${t}': ${o}`)}}else switch(o){case a.FLOAT_VEC2:i.length===2?a.uniform2f(r,i[0],i[1]):console.warn(`Vector length mismatch for '${t}': expected 2, got ${i.length}`);break;case a.FLOAT_VEC3:i.length===3?a.uniform3f(r,i[0],i[1],i[2]):console.warn(`Vector length mismatch for '${t}': expected 3, got ${i.length}`);break;case a.FLOAT_VEC4:i.length===4?a.uniform4f(r,i[0],i[1],i[2],i[3]):console.warn(`Vector length mismatch for '${t}': expected 4, got ${i.length}`);break;case a.INT:h>1?a.uniform1iv(r,i):console.warn(`Array provided for scalar uniform '${t}'`);break;case a.FLOAT:h>1?a.uniform1fv(r,i):console.warn(`Array provided for scalar uniform '${t}'`);break;default:console.warn(`Unsupported uniform type for array '${t}': ${o}`)}else if(i instanceof WebGLTexture){const f=this.qt();a.uniform1i(r,f),a.activeTexture(a.TEXTURE0+f),a.bindTexture(a.TEXTURE_2D,i)}else if(i instanceof j){const f=this.qt();a.uniform1i(r,f),a.activeTexture(a.TEXTURE0+f),a.bindTexture(a.TEXTURE_2D,i.textures[0])}else console.warn(`Unsupported uniform type for '${t}':`,typeof i)}qt(){return this.Lt++}get Zt(){return this.kt}Dt(){this.gt.deleteProgram(this.kt)}}const q=`#version 300 es
|
|
8
|
+
in vec2 a_position;in vec2 a_texCoord;in vec2 a_instancePosition;in vec2 a_instanceSize;in vec3 a_instanceCharacter;in vec4 a_instancePrimaryColor;in vec4 a_instanceSecondaryColor;in vec2 a_instanceRotation;in vec3 a_instanceTransform;in vec3 a_instanceGlobalRotation;in vec2 a_instanceRotationCenter;in vec2 a_instanceBezierCP1;in vec2 a_instanceBezierCP2;in vec2 a_instanceBezierStart;in vec2 a_instanceBezierEnd;in vec2 a_instanceArcAngles;uniform float U9;uniform vec2 Uw;out vec2 v_uv;out vec3 v_character;out vec4 v_primaryColor;out vec4 v_secondaryColor;out vec2 v_rotation;out vec3 v_transform;mat3 A(float B){float C=sin(B),D=cos(B);return mat3(1,0,0,0,D,-C,0,C,D);}mat3 E(float B){float C=sin(B),D=cos(B);return mat3(D,0,C,0,1,0,-C,0,D);}mat3 F(float B){float C=sin(B),D=cos(B);return mat3(D,-C,0,C,D,0,0,0,1);}vec2 G(float H,vec2 I,vec2 J,vec2 K,vec2 L){float M=1.-H,N=M*M,O=H*H;return N*M*I+3.*N*H*J+3.*M*O*K+O*H*L;}vec2 P(float H,vec2 I,vec2 J,vec2 K,vec2 L){float M=1.-H,N=M*M,O=H*H;return-3.*N*I+3.*N*J-6.*M*H*J+6.*M*H*K-3.*O*K+3.*O*L;}void main(){v_uv=a_texCoord;v_character=a_instanceCharacter;v_primaryColor=a_instancePrimaryColor;v_secondaryColor=a_instanceSecondaryColor;v_rotation=a_instanceRotation;v_transform=a_instanceTransform;vec2 Q;bool R=length(a_instanceBezierCP1)+length(a_instanceBezierCP2)+length(a_instanceBezierStart)+length(a_instanceBezierEnd)>0.;bool S=a_instanceArcAngles.x!=0.||a_instanceArcAngles.y!=0.;if(R){float H=a_position.x;vec2 T=G(H,a_instanceBezierStart,a_instanceBezierCP1,a_instanceBezierCP2,a_instanceBezierEnd);vec2 U=P(H,a_instanceBezierStart,a_instanceBezierCP1,a_instanceBezierCP2,a_instanceBezierEnd);float V=length(U);U=V>0.?U/V:vec2(1,0);Q=T+vec2(-U.y,U.x)*a_position.y*a_instanceSize.y;}else if(S){float C=a_instanceArcAngles.x,W=a_instanceArcAngles.y;C=mod(C,6.28318530718);if(C<0.)C+=6.28318530718;W=mod(W,6.28318530718);if(W<0.)W+=6.28318530718;float X=C-W;if(X<=0.)X+=6.28318530718;float Y=C-a_position.x*X;vec2 Z=vec2(cos(Y),sin(Y))*a_position.y;Q=Z*a_instanceSize*.5+a_instanceSize*.5+a_instancePosition;}else{Q=a_position*a_instanceSize+a_instancePosition;}vec2 a=(Q/Uw)*2.-1.;a.y=-a.y;if(length(a_instanceGlobalRotation)>0.){vec3 b=vec3(a-a_instanceRotationCenter,0);b.x*=U9;if(a_instanceGlobalRotation.x!=0.)b=A(-a_instanceGlobalRotation.x)*b;if(a_instanceGlobalRotation.y!=0.)b=E(-a_instanceGlobalRotation.y)*b;if(a_instanceGlobalRotation.z!=0.)b=F(-a_instanceGlobalRotation.z)*b;b.x/=U9;a=b.xy+a_instanceRotationCenter;}gl_Position=vec4(a,0,1);}`,rt="attribute vec2 a_position;attribute vec2 a_texCoord;varying vec2 v_uv;void main(){v_uv=a_texCoord;gl_Position=vec4(a_position,0.,1.);}";class mt{constructor(t){c(this,"gt");c(this,"Qt");c(this,"Jt");c(this,"ts");c(this,"ss");this.gt=t,this.Jt=new N(this.gt,q,`#version 300 es
|
|
9
|
+
precision highp float;in vec2 v_uv;in vec3 v_character;in vec4 v_primaryColor;in vec4 v_secondaryColor;in vec2 v_rotation;in vec3 v_transform;layout(location=0)out vec4 o_character;layout(location=1)out vec4 o_primaryColor;layout(location=2)out vec4 o_secondaryColor;layout(location=3)out vec4 o_rotation;layout(location=4)out vec4 o_transform;void main(){o_character=vec4(v_character,1.);o_primaryColor=v_primaryColor;o_secondaryColor=v_secondaryColor;o_rotation=vec4(v_rotation,0.,1.);o_transform=vec4(v_transform,1.);}`),this.Qt=new N(this.gt,q,`#version 300 es
|
|
10
|
+
precision highp float;in vec2 v_uv;uniform sampler2D Ue;uniform sampler2D Uf;uniform sampler2D Ug;uniform sampler2D Uh;uniform sampler2D Ui;uniform vec2 Uj;layout(location=0)out vec4 o_character;layout(location=1)out vec4 o_primaryColor;layout(location=2)out vec4 o_secondaryColor;layout(location=3)out vec4 o_rotation;layout(location=4)out vec4 o_transform;void main(){vec2 A=vec2(v_uv.x,1.-v_uv.y);vec2 B=A*Uj;vec2 C=(floor(B)+0.5f)/Uj;vec4 D=texture(Ue,C);vec4 E=texture(Uf,C);if(E.a==0.){discard;}vec4 F=texture(Ug,C);vec4 G=texture(Uh,C);vec4 H=texture(Ui,C);o_character=D;o_primaryColor=E;o_secondaryColor=F;o_rotation=G;o_transform=H;}`),this.ts=new N(this.gt,rt,"precision mediump float;uniform sampler2D U0;uniform vec2 U1;uniform sampler2D U3;uniform sampler2D U4;uniform sampler2D U5;uniform sampler2D U2;uniform sampler2D U6;uniform vec2 U7;uniform vec2 U8;mat2 A(float B){float C=sin(B);float D=cos(B);return mat2(D,-C,C,D);}void main(){vec2 E=gl_FragCoord.xy/U8;vec2 F=E*U7;vec2 G=floor(F);vec2 H=(G+0.5)/U7;vec4 I=texture2D(U3,H);vec4 J=texture2D(U4,H);vec4 K=texture2D(U5,H);bool L=K.r>0.5;bool M=K.g>0.5;bool N=K.b>0.5;vec4 O=texture2D(U2,H);int P=int(O.r*255.+0.5)+int(O.g*255.+0.5)*256;int Q=int(mod(float(P),U1.x));int R=P/int(U1.x);float S=(U1.y-1.)-float(R);vec2 T=vec2(float(Q),S)/U1;vec4 U=texture2D(U6,H);float V=U.r*255.+U.g;float W=-(V*360./255.)*0.017453292;vec2 X=fract(F)-0.5;if(M)X.x=-X.x;if(N)X.y=-X.y;X=A(W)*X+0.5;vec2 Y=1./U1;vec2 Z=T+X*Y;vec2 a=T+Y;if(any(lessThan(Z,T))||any(greaterThan(Z,a))){gl_FragColor=L?I:J;return;}vec4 b=texture2D(U0,Z);if(L)b.rgb=1.-b.rgb;gl_FragColor=mix(J,I,b);}"),this.ss=new N(this.gt,q,`#version 300 es
|
|
11
|
+
precision highp float;in vec2 v_uv;uniform sampler2D Uk;uniform bool Ul;uniform bool Um;uniform bool Un;uniform vec2 Uo;uniform bool Up;uniform vec4 Uq;uniform bool Ur;uniform vec4 Us;uniform vec4 Ut;uniform int Uu;uniform vec3 Uv[64];layout(location=0)out vec4 o_character;layout(location=1)out vec4 o_primaryColor;layout(location=2)out vec4 o_secondaryColor;layout(location=3)out vec4 o_rotation;layout(location=4)out vec4 o_transform;float A(vec3 B){return dot(B,vec3(0.299f,0.587f,0.114f));}void main(){vec2 C=vec2(v_uv.x,1.0f-v_uv.y);vec4 D=texture(Uk,C);float E=A(D.rgb);if(Uu>0){float F=float(Uu);float G=clamp(E*(F-1.0f),0.0f,F-1.0f);int H=int(floor(G+0.5f));vec3 I=Uv[H];o_character=vec4(I,1.0f);}else{o_character=vec4(E,0.0f,0.0f,1.0f);}vec4 J=Up?Uq:D;vec4 K=Ur?Us:D;if(D.a<0.01f){J=Ut;K=Ut;}else{}o_primaryColor=vec4(J);o_secondaryColor=vec4(K);o_rotation=vec4(Uo.xy,0.0f,1.0f);o_transform=vec4(float(Ul),float(Um),float(Un),1.0f);}`)}es(){return this.Qt}Pt(){return this.Jt}rs(){return this.ts}ns(){return this.ss}hs(t){return new N(this.gt,q,t)}cs(t,i){return new N(this.gt,t,i)}Dt(){this.Qt.Dt(),this.Jt.Dt(),this.ts.Dt(),this.ss.Dt()}}var w=(l=>(l.RECTANGLE="rectangle",l.LINE="line",l.ELLIPSE="ellipse",l.ARC="arc",l.TRIANGLE="triangle",l.BEZIER_CURVE="bezier_curve",l.CUSTOM="custom",l))(w||{});class At{constructor(t){c(this,"gt");c(this,"ls",new Map);this.gt=t}us(t,i,r,n){const o=this.gt;let h=this.ls.get(t);h||(h=new Map,this.ls.set(t,h));let a=h.get(i)||null;if(!a){a=o.createVertexArray(),h.set(i,a),o.bindVertexArray(a),o.bindBuffer(o.ARRAY_BUFFER,n);const u=o.getAttribLocation(t,"a_position");u!==-1&&(o.enableVertexAttribArray(u),o.vertexAttribPointer(u,r.ds.fs.size,o.FLOAT,!1,r._s,r.ds.fs.offset),o.vertexAttribDivisor(u,0));const f=o.getAttribLocation(t,"a_texCoord");f!==-1&&(o.enableVertexAttribArray(f),o.vertexAttribPointer(f,r.ds.ps.size,o.FLOAT,!1,r._s,r.ds.ps.offset),o.vertexAttribDivisor(f,0))}o.bindVertexArray(a)}vs(){this.gt.bindVertexArray(null)}Dt(){for(const[,t]of this.ls)for(const[,i]of t)i&&this.gt.deleteVertexArray(i)}}class pt{constructor(t,i){c(this,"gs");c(this,"gt");c(this,"xt");c(this,"As",null);c(this,"Cs",null);this.gt=t,this.gs=new At(t),this.xt=i}ws(t,i,r){const{shader:n}=t,o=V(this.gt)||this.gt.getParameter(this.gt.VIEWPORT);n.Wt({U9:o[2]/o[3],Uw:[o[2],o[3]]});const h=f=>{if(!f||!f.bs())return;const g=f.unitGeometry,d=f.unitBuffer;try{this.gs.us(n.Zt,f.type+"",g,d),f.batch.Ms(n),f.batch.Fs(g.zs,g.Rs)}finally{f.batch.Ts(n),this.gs.vs(),f.Ps()}};let a=null,u=null;for(const f of i){if(f.type===w.CUSTOM){u&&(h(u),a=null,u=null),this.Ss(t,f.params,f.state,r.get(w.RECTANGLE));continue}a!==null&&f.type!==a&&(h(u),a=null,u=null);let g=u;g&&f.type===a||(g=r.get(f.type)||null,u=g,a=f.type),g&&g.Es(f.params,f.state)}h(u)}Ss(t,i,r,n){const{x:o,y:h,width:a,height:u,shader:f,uniforms:g}=i,d=this.$s(Math.max(1,Math.floor(a)),Math.max(1,Math.floor(u)));d.begin(),this.Ds(n,f,g,0,0,d.width,d.height,{}),d.end();const p=this.ks(),y={Ue:d.textures[0],Uf:d.textures[1],Ug:d.textures[2],Uh:d.textures[3],Ui:d.textures[4],Uj:[d.width,d.height]};this.Ds(n,p,y,Math.floor(o),Math.floor(h),Math.max(1,Math.floor(a)),Math.max(1,Math.floor(u)),r),t.shader.Nt()}Ds(t,i,r,n,o,h,a,u){i.Nt(),i.Wt(r);const f=this.gt.getParameter(this.gt.VIEWPORT);if(i.Wt({U9:f[2]/f[3],Uw:[f[2],f[3]]}),t.Ps(),t.Es({x:n,y:o,width:h,height:a},u),t.bs()){const g=t.unitGeometry,d=t.unitBuffer;try{this.gs.us(i.Zt,t.type+"",g,d),t.batch.Ms(i),t.batch.Fs(g.zs,g.Rs)}finally{t.batch.Ts(i),this.gs.vs(),t.Ps()}}}ks(){return this.xt.es()}$s(t,i){return this.As&&this.Cs&&this.Cs.w===t&&this.Cs.h===i||(this.As&&this.As.Dt(),this.As=new j(this.gt,t,i,5),this.Cs={w:t,h:i}),this.As}Dt(){this.gs.Dt(),this.As&&this.As.Dt()}}class vt{constructor(){c(this,"Bs",[]);c(this,"Os",1);c(this,"Ls",0)}Gs(t){if(this.Ls>=this.Bs.length){const r={id:this.Os++,type:t,params:{},state:{I:1,N:0,X:0,W:0,Y:[0,0,0],V:[1,1,1,1],q:[0,0,0,1],K:!1,j:!1,k:!1,O:[0,0]}};this.Bs.push(r)}const i=this.Bs[this.Ls];return i.id=this.Os++,i.type=t,this.Ls++,i}Hs(t,i,r,n,o){const h=this.Gs(w.RECTANGLE);return h.params.x=t,h.params.y=i,h.params.width=r,h.params.height=n,o.J(h.state),h.id}Is(t,i,r,n,o,h,a){const u=this.Gs(w.CUSTOM);return u.params.x=t,u.params.y=i,u.params.width=r,u.params.height=n,u.params.shader=o,u.params.uniforms=h,a.J(u.state),u.id}Ns(t,i,r,n,o,h){const a=this.Gs(w.LINE);return a.params.x1=t,a.params.y1=i,a.params.x2=r,a.params.y2=n,a.params.thickness=o,h.J(a.state),a.id}Xs(t,i,r,n,o){const h=this.Gs(w.ELLIPSE);return h.params.x=t,h.params.y=i,h.params.width=r,h.params.height=n,o.J(h.state),h.id}Ws(t,i,r,n,o,h,a){const u=this.Gs(w.ARC);return u.params.x=t,u.params.y=i,u.params.width=r,u.params.height=n,u.params.start=o,u.params.stop=h,a.J(u.state),u.id}Ks(t,i,r,n,o,h,a){const u=this.Gs(w.TRIANGLE);return u.params.x1=t,u.params.y1=i,u.params.x2=r,u.params.y2=n,u.params.x3=o,u.params.y3=h,a.J(u.state),u.id}js(t,i,r,n,o,h,a,u,f,g){const d=this.Gs(w.BEZIER_CURVE);return d.params.x1=t,d.params.y1=i,d.params.cp1x=r,d.params.cp1y=n,d.params.cp2x=o,d.params.cp2y=h,d.params.x2=a,d.params.y2=u,d.params.thickness=f,g.J(d.state),d.id}get length(){return this.Ls}get isEmpty(){return this.Ls===0}Ys(){this.Ls=0}[Symbol.iterator](){let t=0;const i=this.Ls,r=this.Bs;return{next:()=>t<i?{value:r[t++],done:!1}:{value:void 0,done:!0}}}}const _=class _{static Vs(t,i,r=0){var h,a,u,f,g,d,p,y,A,m;const n=i||new Float32Array(_.FLOATS_PER_INSTANCE);let o=r;return n[o++]=t.fs[0],n[o++]=t.fs[1],n[o++]=t.Ls[0],n[o++]=t.Ls[1],n[o++]=t.Y[0],n[o++]=t.Y[1],n[o++]=t.Y[2],n[o++]=t.V[0],n[o++]=t.V[1],n[o++]=t.V[2],n[o++]=t.V[3],n[o++]=t.q[0],n[o++]=t.q[1],n[o++]=t.q[2],n[o++]=t.q[3],n[o++]=t.O[0],n[o++]=t.O[1],n[o++]=t.qs[0],n[o++]=t.qs[1],n[o++]=t.qs[2],n[o++]=t.N,n[o++]=t.X,n[o++]=t.W,n[o++]=t.Zs[0],n[o++]=t.Zs[1],n[o++]=((h=t.Qs)==null?void 0:h[0])||0,n[o++]=((a=t.Qs)==null?void 0:a[1])||0,n[o++]=((u=t.Js)==null?void 0:u[0])||0,n[o++]=((f=t.Js)==null?void 0:f[1])||0,n[o++]=((g=t.te)==null?void 0:g[0])||0,n[o++]=((d=t.te)==null?void 0:d[1])||0,n[o++]=((p=t.se)==null?void 0:p[0])||0,n[o++]=((y=t.se)==null?void 0:y[1])||0,n[o++]=((A=t.ee)==null?void 0:A[0])||0,n[o++]=((m=t.ee)==null?void 0:m[1])||0,n}static ie(t){const i=t.length*_.FLOATS_PER_INSTANCE,r=new Float32Array(i);for(let n=0;n<t.length;n++){const o=n*_.FLOATS_PER_INSTANCE;_.Vs(t[n],r,o)}return r}};c(_,"BYTES_PER_INSTANCE",140),c(_,"FLOATS_PER_INSTANCE",35);let D=_;const U=class U{};c(U,"STRIDE",D.BYTES_PER_INSTANCE),c(U,"ATTRIBUTES",{a_instancePosition:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:U.STRIDE,offset:0,divisor:1},a_instanceSize:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:U.STRIDE,offset:8,divisor:1},a_instanceCharacter:{location:-1,size:3,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:U.STRIDE,offset:16,divisor:1},a_instancePrimaryColor:{location:-1,size:4,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:U.STRIDE,offset:28,divisor:1},a_instanceSecondaryColor:{location:-1,size:4,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:U.STRIDE,offset:44,divisor:1},a_instanceRotation:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:U.STRIDE,offset:60,divisor:1},a_instanceTransform:{location:-1,size:3,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:U.STRIDE,offset:68,divisor:1},a_instanceGlobalRotation:{location:-1,size:3,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:U.STRIDE,offset:80,divisor:1},a_instanceRotationCenter:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:U.STRIDE,offset:92,divisor:1},a_instanceArcAngles:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:U.STRIDE,offset:100,divisor:1},a_instanceBezierCP1:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:U.STRIDE,offset:108,divisor:1},a_instanceBezierCP2:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:U.STRIDE,offset:116,divisor:1},a_instanceBezierStart:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:U.STRIDE,offset:124,divisor:1},a_instanceBezierEnd:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:U.STRIDE,offset:132,divisor:1}});let K=U;class yt{constructor(t,i=1e3,r=1.5){c(this,"gt");c(this,"re",[]);c(this,"ne");c(this,"oe");c(this,"he",null);c(this,"ae",!0);c(this,"ce",0);c(this,"le",new Map);c(this,"ue",null);this.gt=t,this.ne=i,this.oe=r,this.fe()}Es(t){const i=this.re.length;return this.re.push(t),this.ae=!0,i}get count(){return this.re.length}get isEmpty(){return this.re.length===0}clear(){this.re.length=0,this.ae=!0}de(t){if(t<=this.ne)return;const i=Math.ceil(t*this.oe);this.ne=i,this.fe()}fe(){const t=this.gt;this.he&&t.deleteBuffer(this.he),this.he=t.createBuffer();const i=this.ne*D.BYTES_PER_INSTANCE;t.bindBuffer(t.ARRAY_BUFFER,this.he),t.bufferData(t.ARRAY_BUFFER,i,t.DYNAMIC_DRAW),t.bindBuffer(t.ARRAY_BUFFER,null),this.ae=!0,this.ce=0}_e(){if(!this.ae||this.re.length===0)return;const t=this.gt,i=this.re.length;this.de(i),(!this.ue||this.ue.length<i*D.FLOATS_PER_INSTANCE)&&(this.ue=new Float32Array(i*D.FLOATS_PER_INSTANCE));const r=D.ie(this.re);t.bindBuffer(t.ARRAY_BUFFER,this.he),i<=this.ce?t.bufferSubData(t.ARRAY_BUFFER,0,r):t.bufferData(t.ARRAY_BUFFER,r,t.DYNAMIC_DRAW),t.bindBuffer(t.ARRAY_BUFFER,null),this.ae=!1,this.ce=i}pe(t){let i=this.le.get(t);if(!i){i=new Map;const r=this.gt;for(const n in K.ATTRIBUTES){const o=r.getAttribLocation(t,n);o!==-1&&i.set(n,o)}this.le.set(t,i)}return i}Ms(t){if(!this.he||this.re.length===0)return;const i=this.gt,r=t.Zt;this._e();const n=this.pe(r);i.bindBuffer(i.ARRAY_BUFFER,this.he);for(const[o,h]of n){const a=K.ATTRIBUTES[o];a&&(i.enableVertexAttribArray(h),i.vertexAttribPointer(h,a.size,a.type,a.normalized,a.stride,a.offset),i.vertexAttribDivisor(h,a.divisor))}}Ts(t){const i=this.gt,r=this.pe(t.Zt);for(const[,n]of r)i.disableVertexAttribArray(n),i.vertexAttribDivisor(n,0)}Fs(t,i){this.re.length!==0&&this.gt.drawArraysInstanced(t,0,i,this.re.length)}Dt(){this.he&&this.gt.deleteBuffer(this.he)}}class G{constructor(t,i,r,n){c(this,"gt");c(this,"ve");c(this,"me");c(this,"ge");c(this,"Ae",null);this.gt=t,this.ve=i,this.me=r,this.ge=n;const o=this.gt.createBuffer();if(!o)throw Error("Failed to create unit geometry buffer");this.gt.bindBuffer(this.gt.ARRAY_BUFFER,o),this.gt.bufferData(this.gt.ARRAY_BUFFER,this.ge.ye,this.gt.STATIC_DRAW),this.gt.bindBuffer(this.gt.ARRAY_BUFFER,null),this.Ae=o}get type(){return this.me}get unitGeometry(){return this.ge}get unitBuffer(){return this.Ae}get batch(){return this.ve}Ps(){this.ve.clear()}bs(){return!this.ve.isEmpty}Dt(){this.ve.Dt(),this.gt.deleteBuffer(this.Ae)}Ce(t,i,r,n,o){const h=this.we(t,i,r,n,o.N||0,o.X||0,o.W||0);return{fs:[t,i],Ls:[r,n],Y:o.Y||[0,0,0],V:o.V||[1,1,1,1],q:o.q||[0,0,0,1],O:o.O||[0,0],qs:[o.k?1:0,o.K?1:0,o.j?1:0],N:h.radiansX,X:h.radiansY,W:h.radiansZ,Zs:[h.centerX,h.centerY]}}be(t,i){const r=V(this.gt)||[0,0,this.gt.canvas.width,this.gt.canvas.height];return{nx:t/r[2]*2-1,ny:1-i/r[3]*2}}xe(t,i,r){const n=this.be(i,r);t.Zs=[n.nx,n.ny]}we(t,i,r,n,o,h,a){const u=V(this.gt)||[0,0,this.gt.canvas.width,this.gt.canvas.height],f=u[2],g=u[3];return{centerX:(t+r/2)/f*2-1,centerY:1-(i+n/2)/g*2,radiansX:-o*Math.PI/180,radiansY:-h*Math.PI/180,radiansZ:-a*Math.PI/180,aspectRatio:f/g}}}const Et={ye:new Float32Array([0,0,0,0,1,0,1,0,0,1,0,1,0,1,0,1,1,0,1,0,1,1,1,1]),Rs:6,zs:WebGL2RenderingContext.TRIANGLES,_s:16,ds:{fs:{size:2,offset:0},ps:{size:2,offset:8}}};class xt extends G{constructor(t,i){super(t,i,w.RECTANGLE,Et)}Es(t,i){const r=this.Ce(t.x,t.y,t.width,t.height,i);return this.ve.Es(r)}}const wt={ye:new Float32Array([0,-.5,0,0,1,-.5,1,0,0,.5,0,1,0,.5,0,1,1,-.5,1,0,1,.5,1,1]),Rs:6,zs:WebGL2RenderingContext.TRIANGLES,_s:16,ds:{fs:{size:2,offset:0},ps:{size:2,offset:8}}};class Tt extends G{constructor(t,i){super(t,i,w.LINE,wt)}Es(t,i){const r=t.x2-t.x1,n=t.y2-t.y1,o=Math.hypot(r,n),h=t.thickness||i.I||1,a=t.x1+r/2,u=t.y1+n/2,f=a-o/2,g=u,d=this.Ce(f,g,o,h,i);return this.xe(d,a,u),this.ve.Es(d)}}const Rt={ye:function(l=32){const t=[],i=2*Math.PI/l;for(let r=0;r<l;r++){const n=r*i,o=(r+1)%l*i,h=Math.cos(n),a=Math.sin(n),u=.5*(h+1),f=.5*(a+1),g=Math.cos(o),d=Math.sin(o),p=.5*(g+1),y=.5*(d+1);t.push(0,0,.5,.5,h,a,u,f,g,d,p,y)}return new Float32Array(t)}(32),Rs:96,zs:WebGL2RenderingContext.TRIANGLES,_s:16,ds:{fs:{size:2,offset:0},ps:{size:2,offset:8}}};class bt extends G{constructor(t,i){super(t,i,w.ELLIPSE,Rt)}Es(t,i){const r=this.Ce(t.x,t.y,t.width,t.height,i);return this.xe(r,t.x,t.y),this.ve.Es(r)}}let Ct={ye:function(l){const t=[];for(let i=0;i<l;i++){const r=i/l,n=(i+1)/l;t.push(r,0,r,0,r,1,r,1,n,1,n,1)}return new Float32Array(t)}(32),Rs:96,zs:WebGL2RenderingContext.TRIANGLES,_s:16,ds:{fs:{size:2,offset:0},ps:{size:2,offset:8}}};class Ut extends G{constructor(t,i){super(t,i,w.ARC,Ct)}Es(t,i){const r=t.x-t.width/2,n=t.y-t.height/2,o=t.start*Math.PI/180,h=t.stop*Math.PI/180,a=this.Ce(r,n,t.width,t.height,i);return this.xe(a,t.x,t.y),a.Qs=[o,h],this.ve.Es(a)}}const Ft={ye:new Float32Array([0,0,0,0,1,0,1,0,.5,1,.5,1]),Rs:3,zs:WebGL2RenderingContext.TRIANGLES,_s:16,ds:{fs:{size:2,offset:0},ps:{size:2,offset:8}}};class Bt extends G{constructor(t,i){super(t,i,w.TRIANGLE,Ft)}Es(t,i){const r=Math.min(t.x1,t.x2,t.x3),n=Math.max(t.x1,t.x2,t.x3),o=Math.min(t.y1,t.y2,t.y3),h=n-r,a=Math.max(t.y1,t.y2,t.y3)-o,u=this.Ce(r,o,h,a,i),f=r+.5*h,g=o+a*(1/3);return this.xe(u,f,g),this.ve.Es(u)}}function nt(l,t,i,r,n){const o=1-l,h=o*o,a=l*l;return h*o*t+3*h*l*i+3*o*a*r+a*l*n}const Pt={ye:function(l=16){const t=[];for(let i=0;i<l;i++){const r=i/l,n=(i+1)/l;t.push(r,-.5,r,0),t.push(n,-.5,n,0),t.push(r,.5,r,1),t.push(r,.5,r,1),t.push(n,-.5,n,0),t.push(n,.5,n,1)}return new Float32Array(t)}(16),Rs:96,zs:WebGL2RenderingContext.TRIANGLES,_s:16,ds:{fs:{size:2,offset:0},ps:{size:2,offset:8}}};class Lt extends G{constructor(t,i){super(t,i,w.BEZIER_CURVE,Pt)}Es(t,i){const r=i.I||1,n=nt(.5,t.x1,t.cp1x,t.cp2x,t.x2),o=nt(.5,t.y1,t.cp1y,t.cp2y,t.y2),h=this.Ce(0,0,1,r,i);return this.xe(h,n,o),h.se=[t.x1,t.y1],h.Js=[t.cp1x,t.cp1y],h.te=[t.cp2x,t.cp2y],h.ee=[t.x2,t.y2],this.ve.Es(h)}}class Ot{constructor(t){c(this,"gt");c(this,"Me",null);c(this,"Fe");c(this,"ze",null);c(this,"Re",{});c(this,"Te",null);c(this,"Pe",new Map);c(this,"Se");c(this,"Ee");c(this,"$e");c(this,"G",[]);this.gt=t,this.Fe=new mt(t),this.$e=new st,this.Se=new pt(t,this),this.Ee=new vt,this.Te=t.createBuffer(),k(this.gt,[0,0,this.gt.canvas.width,this.gt.canvas.height])}De(t){let i=this.Pe.get(t);if(i)return i;const r=new yt(this.gt);return i=(0,{[w.RECTANGLE]:()=>new xt(this.gt,r),[w.LINE]:()=>new Tt(this.gt,r),[w.ELLIPSE]:()=>new bt(this.gt,r),[w.ARC]:()=>new Ut(this.gt,r),[w.TRIANGLE]:()=>new Bt(this.gt,r),[w.BEZIER_CURVE]:()=>new Lt(this.gt,r)}[t])(),this.Pe.set(t,i),i}ke(t){this.Me!==t&&(this.Me=t,t.Nt())}cs(t,i){return this.Fe.cs(t,i)}es(){return this.Fe.es()}Pt(){return this.Fe.Pt()}rs(){return this.Fe.rs()}ns(){return this.Fe.ns()}Be(t){this.ze=t,t&&(this.Re={})}Kt(t,i){this.Re[t]=i}Oe(t){Object.assign(this.Re,t)}hs(t){return this.Fe.hs(t)}Le(t,i,r,n,o){const h=this.es(),a={Ue:t.textures[0],Uf:t.textures[1],Ug:t.textures[2],Uh:t.textures[3],Ui:t.textures[4],Uj:[t.width,t.height]};this.Ee.Is(i,r,n,o,h,a,this.$e)}Ge(t,i,r,n,o){const h=this.ns(),a=t.He(),u={Uk:a.texture,Ul:!!a.invert,Um:!!a.flipX,Un:!!a.flipY,Uo:a.charRotation,Up:a.charColorFixed,Uq:a.charColor,Ur:a.cellColorFixed,Us:a.cellColor,Ut:a.backgroundColor,Uu:a.charCount,Uv:a.charList};this.Ee.Is(i,r,n,o,h,u,this.$e)}Ie(t,i,r,n){var m;const o=this.gt,h=o.canvas.width,a=o.canvas.height,u=t/h*2-1,f=(t+r)/h*2-1,g=1-i/a*2,d=1-(i+n)/a*2,p=new Float32Array([u,d,f,d,u,g,f,d,f,g,u,g]);o.bindBuffer(o.ARRAY_BUFFER,this.Te),o.bufferData(o.ARRAY_BUFFER,p,o.DYNAMIC_DRAW);const y=((m=this.Me)==null?void 0:m.Zt)||o.getParameter(o.CURRENT_PROGRAM),A=y?o.getAttribLocation(y,"a_position"):-1;A!==-1&&(o.enableVertexAttribArray(A),o.vertexAttribPointer(A,2,o.FLOAT,!1,8,0)),o.drawArrays(o.TRIANGLES,0,6),A!==-1&&o.disableVertexAttribArray(A)}Ne(t,i,r,n){this.ze?(this.Ee.Is(t,i,r,n,this.ze,{...this.Re},this.$e),this.ze=null,this.Re={}):this.Ee.Hs(t,i,r,n,this.$e)}Xe(t,i,r,n){this.Ee.Ns(t,i,r,n,this.$e.lineWeight,this.$e)}We(t,i,r,n){this.Ee.Xs(t,i,r,n,this.$e)}Ke(t,i,r,n,o,h){this.Ee.Ks(t,i,r,n,o,h,this.$e)}je(t,i,r,n,o,h,a,u){const f=this.$e.lineWeight;this.Ee.js(t,i,r,n,o,h,a,u,f,this.$e)}Ye(t,i,r=1,n={}){return new j(this.gt,t,i,r,n,this,!0)}Ve(t,i,r,n,o,h){this.Ee.Ws(t,i,r,n,o,h,this.$e)}qe(t,i=t,r=t,n=255){this.$e.ft(t,i,r,n),this.Ys(t/255,i/255,r/255,n/255)}Ys(t=0,i=0,r=0,n=0){this.gt.clearColor(t,i,r,n),this.gt.clear(this.gt.COLOR_BUFFER_BIT)}Ze(){this.gt.viewport(0,0,this.gt.canvas.width,this.gt.canvas.height),k(this.gt,[0,0,this.gt.canvas.width,this.gt.canvas.height])}get context(){return this.gt}get state(){return this.$e}Et(t){this.G.push(this.$e),this.$e=t}$t(){const t=this.G.pop();t&&(this.$e=t)}St(t){const i=t,r=V(this.gt)??this.gt.getParameter(this.gt.VIEWPORT),n={shader:i,gl:this.gt,viewport:r};this.ke(i);const o=new Set;for(const h of this.Ee)h.type===w.CUSTOM?o.add(w.RECTANGLE):o.add(h.type);for(const h of o)h!==w.CUSTOM&&this.De(h);this.Se.ws(n,this.Ee,this.Pe),this.Ee.Ys()}Dt(){this.gt.deleteBuffer(this.Te),this.Ee.Ys();for(const t of this.Pe.values())t.Dt();this.Fe.Dt(),this.Se.Dt()}}const C={readShort:(l,t)=>(C.t.uint16[0]=l[t]<<8|l[t+1],C.t.int16[0]),readUshort:(l,t)=>l[t]<<8|l[t+1],readUshorts(l,t,i){const r=[];for(let n=0;n<i;n++)r.push(C.readUshort(l,t+2*n));return r},readUint(l,t){const i=C.t.uint8;return i[3]=l[t],i[2]=l[t+1],i[1]=l[t+2],i[0]=l[t+3],C.t.uint32[0]},readASCII(l,t,i){let r="";for(let n=0;n<i;n++)r+=String.fromCharCode(l[t+n]);return r},writeUshort(l,t,i){l[t]=i>>>8&255,l[t+1]=255&i},writeUint(l,t,i){l[t]=i>>>24&255,l[t+1]=i>>>16&255,l[t+2]=i>>>8&255,l[t+3]=255&i},writeASCII(l,t,i){for(let r=0;r<i.length;r++)l[t+r]=255&i.charCodeAt(r)},t:(()=>{const l=new ArrayBuffer(8);return{uint8:new Uint8Array(l),int16:new Int16Array(l),uint16:new Uint16Array(l),uint32:new Uint32Array(l)}})()};function Z(l){return l+3&-4}function $(l,t,i){const r=t+i;let n=0;const o=C.t;for(let h=t;h<r;h+=4)o.uint8[3]=l[h]||0,o.uint8[2]=l[h+1]||0,o.uint8[1]=l[h+2]||0,o.uint8[0]=l[h+3]||0,n=n+(o.uint32[0]>>>0)>>>0;return n>>>0}class Mt{constructor(t){c(this,"b");c(this,"p",0);c(this,"bitbuf",0);c(this,"bitcnt",0);this.b=t}readBits(t){for(;this.bitcnt<t;){const r=this.b[this.p++]||0;this.bitbuf|=r<<this.bitcnt,this.bitcnt+=8}const i=this.bitbuf&(1<<t)-1;return this.bitbuf>>>=t,this.bitcnt-=t,i}alignToByte(){this.bitbuf=0,this.bitcnt=0}get offset(){return this.p}}function W(l){let t=32,i=0;for(const a of l)a&&(a<t&&(t=a),a>i&&(i=a));if(i===0)return{min:0,max:0,table:new Map};const r=new Uint32Array(i+1);for(const a of l)a&&r[a]++;const n=new Uint32Array(i+1);let o=0;r[0]=0;for(let a=1;a<=i;a++)o=o+r[a-1]<<1,n[a]=o;const h=new Map;for(let a=0;a<l.length;a++){const u=l[a];if(!u)continue;const f=n[u]++;let g=h.get(u);g||(g=[],h.set(u,g)),g[_t(f,u)]=a}return{min:t,max:i,table:h}}function tt(l,t){let i=0;for(let r=1;r<=t.max;r++){i|=l.readBits(1)<<r-1;const n=t.table.get(r);if(n&&i<n.length){const o=n[i];if(o!==void 0)return o}}throw Error("Invalid Huffman code")}function _t(l,t){let i=0;for(let r=0;r<t;r++)i=i<<1|1&l,l>>>=1;return i>>>0}function St(l){if(l.length<2)throw Error("ZLIB data too short");const t=l[0],i=l[1];if((15&t)!=8)throw Error("Unsupported ZLIB compression method");if(((t<<8)+i)%31!=0)throw Error("Bad ZLIB header check");let r=2;32&i&&(r+=4);const n=[];return function(o,h){const a=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258],u=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],f=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],g=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13];let d=0;for(;!d;){d=o.readBits(1);const p=o.readBits(2);if(p===0){o.alignToByte();const y=o.readBits(16);if((65535&(65535^y))!==o.readBits(16))throw Error("DEFLATE uncompressed LEN/NLEN mismatch");for(let A=0;A<y;A++)h.push(o.readBits(8))}else{if(p!==1&&p!==2)throw Error("Unsupported DEFLATE type");{let y,A;if(p===1){const m=Array(288).fill(0);for(let E=0;E<=143;E++)m[E]=8;for(let E=144;E<=255;E++)m[E]=9;for(let E=256;E<=279;E++)m[E]=7;for(let E=280;E<=287;E++)m[E]=8;y=W(m),A=W(Array(32).fill(5))}else{const m=o.readBits(5)+257,E=o.readBits(5)+1,v=o.readBits(4)+4,T=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],x=Array(19).fill(0);for(let L=0;L<v;L++)x[T[L]]=o.readBits(3);const P=W(x),F=[];for(;F.length<m+E;){const L=tt(o,P);if(L<=15)F.push(L);else if(L===16){const H=o.readBits(2)+3,z=F[F.length-1]||0;for(let gt=0;gt<H;gt++)F.push(z)}else if(L===17){const H=o.readBits(3)+3;for(let z=0;z<H;z++)F.push(0)}else{if(L!==18)throw Error("Invalid code length symbol");{const H=o.readBits(7)+11;for(let z=0;z<H;z++)F.push(0)}}}const B=F.slice(0,m),O=F.slice(m,m+E);y=W(B),A=W(O)}for(;;){const m=tt(o,y);if(m<256)h.push(m);else{if(m===256)break;if(m>256&&m<286){const E=m-257;let v=a[E];const T=u[E];T&&(v+=o.readBits(T));const x=tt(o,A);if(x>=30)throw Error("Invalid distance symbol");let P=f[x];const F=g[x];F&&(P+=o.readBits(F));const B=h.length-P;if(B<0)throw Error("Invalid distance");for(let O=0;O<v;O++)h.push(h[B+O]||0)}else if(m===286||m===287)throw Error("Reserved length symbol")}}}}}}(new Mt(l.subarray(r)),n),new Uint8Array(n)}function Dt(l){const t=C,i=new Uint8Array(l);if(t.readASCII(i,0,4)!=="wOFF")throw Error("Invalid WOFF signature");const r=t.readUint(i,4),n=t.readUshort(i,12),o=t.readUint(i,16),h=[];let a=44;for(let v=0;v<n;v++){const T=t.readASCII(i,a,4),x=t.readUint(i,a+4),P=t.readUint(i,a+8),F=t.readUint(i,a+12),B=t.readUint(i,a+16);h.push({tag:T,offset:x,compLength:P,origLength:F,checksum:B}),a+=20}for(const v of h){const T=new Uint8Array(i.buffer,v.offset,v.compLength);if(v.compLength===v.origLength)v.data=new Uint8Array(T);else if(v.data=St(T),v.data.length!==v.origLength)if(v.data.length<v.origLength){const x=new Uint8Array(v.origLength);x.set(v.data),v.data=x}else v.data=v.data.subarray(0,v.origLength)}const u=n;let f=1,g=0;for(;f<<1<=u;)f<<=1,g++;const d=16*f,p=16*u-d;let y=12+16*u;const A={};for(const v of h)A[v.tag]=y,y=Z(y+v.data.length);const m=new Uint8Array(Math.max(o||0,y));t.writeUint(m,0,r),t.writeUshort(m,4,u),t.writeUshort(m,6,d),t.writeUshort(m,8,g),t.writeUshort(m,10,p);let E=12;for(const v of h){t.writeASCII(m,E,v.tag),E+=4;let T=v.data;if(v.tag==="head"&&T.length>=12){const x=new Uint8Array(T);t.writeUint(x,8,0);const P=$(x,0,Z(x.length));t.writeUint(m,E,P),E+=4}else{const x=$(T,0,Z(T.length));t.writeUint(m,E,x),E+=4}t.writeUint(m,E,A[v.tag]),E+=4,t.writeUint(m,E,v.data.length),E+=4}for(const v of h){const T=A[v.tag];m.set(v.data,T)}if(h.find(v=>v.tag==="head")){const v=A.head,T=function(x,P){const F=C,B=P+8,O=[x[B],x[B+1],x[B+2],x[B+3]];F.writeUint(x,B,0);const L=2981146554-($(x,0,Z(x.length))>>>0)>>>0;return x[B]=O[0],x[B+1]=O[1],x[B+2]=O[2],x[B+3]=O[3],L>>>0}(m,v);t.writeUint(m,v+8,T)}return m.buffer}const It={parseTab(l,t,i){const r={tables:[],ids:{},off:t};l=new Uint8Array(l.buffer,t,i),t=0;const n=C,o=n.readUshort,h=o(l,t+=2);t+=2;const a=[];for(let u=0;u<h;u++){const f=o(l,t),g=o(l,t+=2);t+=2;const d=n.readUint(l,t);t+=4;const p=`p${f}e${g}`;let y=a.indexOf(d);if(y===-1){let A;y=r.tables.length,a.push(d);const m=o(l,d);A=m===4?this.parse4(l,d):m===12?this.parse12(l,d):{format:m},r.tables.push(A)}r.ids[p]=y}return r},parse4(l,t){const i=C,r=i.readUshort,n=i.readUshorts,o=t,h=r(l,t+=2);t+=2;const a=r(l,t+=2)>>>1,u={format:4,searchRange:r(l,t+=2),entrySelector:0,rangeShift:0,endCount:[],startCount:[],idDelta:[],idRangeOffset:[],glyphIdArray:[]};t+=2,u.entrySelector=r(l,t),t+=2,u.rangeShift=r(l,t),t+=2,u.endCount=n(l,t,a),t+=2*a,t+=2,u.startCount=n(l,t,a),t+=2*a;for(let f=0;f<a;f++)u.idDelta.push(i.readShort(l,t)),t+=2;return u.idRangeOffset=n(l,t,a),t+=2*a,u.glyphIdArray=n(l,t,o+h-t>>1),u},parse12(l,t){const i=C.readUint;i(l,t+=4),i(l,t+=4);const r=i(l,t+=4);t+=4;const n=new Uint32Array(3*r);for(let o=0;o<3*r;o+=3)n[o]=i(l,t+(o<<2)),n[o+1]=i(l,t+(o<<2)+4),n[o+2]=i(l,t+(o<<2)+8);return{format:12,groups:n}}},zt={parseTab(l,t,i){const r=C;t+=18;const n=r.readUshort(l,t);t+=2,t+=16;const o=r.readShort(l,t);t+=2;const h=r.readShort(l,t);t+=2;const a=r.readShort(l,t);t+=2;const u=r.readShort(l,t);return t+=2,t+=6,{unitsPerEm:n,xMin:o,yMin:h,xMax:a,yMax:u,indexToLocFormat:r.readShort(l,t)}}},Nt={parseTab(l,t,i){const r=C;t+=4;const n=["ascender","descender","lineGap","advanceWidthMax","minLeftSideBearing","minRightSideBearing","xMaxExtent","caretSlopeRise","caretSlopeRun","caretOffset","res0","res1","res2","res3","metricDataFormat","numberOfHMetrics"],o={};for(let h=0;h<n.length;h++){const a=n[h],u=a==="advanceWidthMax"||a==="numberOfHMetrics"?r.readUshort:r.readShort;o[a]=u(l,t+2*h)}return o}},Gt={parseTab(l,t,i,r){const n=C,o=[],h=[],a=r.maxp.numGlyphs,u=r.hhea.numberOfHMetrics;let f=0,g=0,d=0;for(;d<u;)f=n.readUshort(l,t+(d<<2)),g=n.readShort(l,t+(d<<2)+2),o.push(f),h.push(g),d++;for(;d<a;)o.push(f),h.push(g),d++;return{aWidth:o,lsBearing:h}}},ot={cmap:It,head:zt,hhea:Nt,maxp:{parseTab(l,t,i){const r=C;return r.readUint(l,t),t+=4,{numGlyphs:r.readUshort(l,t)}}},hmtx:Gt,loca:{parseTab(l,t,i,r){const n=C,o=[],h=r.head.indexToLocFormat,a=r.maxp.numGlyphs+1;if(h===0)for(let u=0;u<a;u++)o.push(n.readUshort(l,t+(u<<1))<<1);else if(h===1)for(let u=0;u<a;u++)o.push(n.readUint(l,t+(u<<2)));return o}},glyf:{parseTab(l,t,i,r){const n=[],o=r.maxp.numGlyphs;for(let h=0;h<o;h++)n.push(null);return n},Qe(l,t){const i=C,r=l.Je,n=l.loca;if(n[t]===n[t+1])return null;const o=M.findTable(r,"glyf",l.ti);if(!o)return null;let h=o[0]+n[t];const a={};if(a.noc=i.readShort(r,h),h+=2,a.xMin=i.readShort(r,h),h+=2,a.yMin=i.readShort(r,h),h+=2,a.xMax=i.readShort(r,h),h+=2,a.yMax=i.readShort(r,h),h+=2,a.xMin>=a.xMax||a.yMin>=a.yMax)return null;if(a.noc>0){a.endPts=[];for(let p=0;p<a.noc;p++)a.endPts.push(i.readUshort(r,h)),h+=2;const u=i.readUshort(r,h);if(h+=2,r.length-h<u)return null;h+=u;const f=a.endPts[a.noc-1]+1;a.flags=[];for(let p=0;p<f;p++){const y=r[h];if(h++,a.flags.push(y),8&y){const A=r[h];h++;for(let m=0;m<A;m++)a.flags.push(y),p++}}a.xs=[];for(let p=0;p<f;p++){const y=a.flags[p],A=!!(16&y);2&y?(a.xs.push(A?r[h]:-r[h]),h++):A?a.xs.push(0):(a.xs.push(i.readShort(r,h)),h+=2)}a.ys=[];for(let p=0;p<f;p++){const y=a.flags[p],A=!!(32&y);4&y?(a.ys.push(A?r[h]:-r[h]),h++):A?a.ys.push(0):(a.ys.push(i.readShort(r,h)),h+=2)}let g=0,d=0;for(let p=0;p<f;p++)g+=a.xs[p],d+=a.ys[p],a.xs[p]=g,a.ys[p]=d}else a.parts=[],a.endPts=[],a.flags=[],a.xs=[],a.ys=[];return a}}},M={parse(l){const t=new Uint8Array(l),i=C.readASCII(t,0,4);if(i==="wOFF")l=Dt(l);else if(i==="wOF2")throw Error("WOFF2 is not supported in this build (Brotli + WOFF2 transforms required)");return[((r,n,o,h)=>{const a=ot,u={Je:r,si:n,ti:o};for(const f in a){const g=f,d=M.findTable(r,g,o);if(d){const[p,y]=d;let A=h[p];A==null&&(A=a[g].parseTab(r,p,y,u),h[p]=A),u[g]=A}}return u})(new Uint8Array(l),0,0,{})]},findTable(l,t,i){const r=C,n=r.readUshort(l,i+4);let o=i+12;for(let h=0;h<n;h++){const a=r.readASCII(l,o,4);r.readUint(l,o+4);const u=r.readUint(l,o+8),f=r.readUint(l,o+12);if(a===t)return[u,f];o+=16}return null},T:ot,B:C};class Yt{ei(t){var r;const i=[];return(r=t.cmap)!=null&&r.tables?(t.cmap.tables.forEach(n=>{if(n.format===4){const o=this.ii(n);i.push(...o)}else if(n.format===12){const o=this.ri(n);i.push(...o)}}),[...new Set(i)]):[]}ni(t){return t.filter(i=>this.oi(i))}ii(t){const i=[];if(!(t.startCount&&t.endCount&&t.idRangeOffset&&t.idDelta))return i;for(let r=0;r<t.startCount.length;r++){const n=t.startCount[r],o=t.endCount[r];if(n!==65535||o!==65535){for(let h=n;h<=o;h++)if(this.hi(t,h,r)>0)try{const a=String.fromCodePoint(h);i.push(a)}catch{}}}return i}ri(t){const i=[];if(!t.groups)return i;for(let r=0;r<t.groups.length;r+=3){const n=t.groups[r],o=t.groups[r+1],h=t.groups[r+2];for(let a=n;a<=o;a++)if(h+(a-n)>0)try{const u=String.fromCodePoint(a);i.push(u)}catch{}}return i}hi(t,i,r){if(t.idRangeOffset[r]===0)return i+t.idDelta[r]&65535;{const n=t.idRangeOffset[r]/2+(i-t.startCount[r])-(t.startCount.length-r);if(n>=0&&t.glyphIdArray&&n<t.glyphIdArray.length){const o=t.glyphIdArray[n];if(o!==0)return o+t.idDelta[r]&65535}}return 0}oi(t){const i=t.codePointAt(0)||0;return!(i>=0&&i<=31&&i!==9&&i!==10&&i!==13||i>=127&&i<=159)}}class et{constructor(){c(this,"ai",new Map);c(this,"ci",new Map)}li(t,i){const r=`${this.ui(t)}_${i}`;if(this.ai.has(r))return this.ai.get(r);const n=t.cmap;if(!n||!n.tables)return this.ai.set(r,0),0;let o=0;for(const h of n.tables)if(h.format===4?o=this.fi(i,h):h.format===12&&(o=this.di(i,h)),o>0)break;return this.ai.set(r,o),o}_i(t,i){const r=i.codePointAt(0);return r===void 0?0:this.li(t,r)}pi(t,i){const r=t.hmtx;return r&&r.aWidth&&r.aWidth.length!==0?i<r.aWidth.length?r.aWidth[i]:r.aWidth[r.aWidth.length-1]:0}mi(t,i){const r=i/t.head.unitsPerEm,n=t.hhea.ascender*r,o=t.hhea.descender*r,h=t.hhea.lineGap*r;return{ascender:n,descender:o,lineGap:h,lineHeight:n-o+h,unitsPerEm:t.head.unitsPerEm,scale:r}}gi(){this.ai.clear(),this.ci.clear()}ui(t){return`${t.ti}_${t.Je.length}`}fi(t,i){const r=i.endCount.length;let n=-1;for(let o=0;o<r;o++)if(t<=i.endCount[o]){n=o;break}if(n===-1||t<i.startCount[n])return 0;if(i.idRangeOffset[n]===0)return t+i.idDelta[n]&65535;{const o=i.idRangeOffset[n]/2+(t-i.startCount[n])-(r-n);if(o>=0&&o<i.glyphIdArray.length){const h=i.glyphIdArray[o];return h===0?0:h+i.idDelta[n]&65535}}return 0}di(t,i){const r=i.groups.length/3;for(let n=0;n<r;n++){const o=i.groups[3*n],h=i.groups[3*n+1],a=i.groups[3*n+2];if(t>=o&&t<=h)return a+(t-o)}return 0}}class Xt{constructor(t){c(this,"Ai");c(this,"yi");c(this,"xt");c(this,"Ci");this.xt=t,this.Ci=new et,this.Ai=document.createElement("canvas"),this.yi=this.Ai.getContext("2d",{willReadFrequently:!0,alpha:!0})}createTextureAtlas(t,i,r,n){const o=t.length,h=Math.ceil(Math.sqrt(o)),a=Math.ceil(o/h),u=i.width*h,f=i.height*a,g=typeof n=="object"?n:null;this.wi(u,f),this.bi(t,i,h,r,g);const d=this.xt.Ye(u,f,1,{filter:"nearest"});return d.Tt(this.Ai),{framebuffer:d,columns:h,rows:a}}wi(t,i){this.Ai.width=t,this.Ai.height=i,this.Ai.style.width=t+"px",this.Ai.style.height=i+"px",this.yi.imageSmoothingEnabled=!1,this.Ai.style.imageRendering="pixelated",this.yi.clearRect(0,0,t,i),this.yi.textBaseline="top",this.yi.textAlign="left",this.yi.fillStyle="white"}bi(t,i,r,n,o){const h=n/o.head.unitsPerEm;for(let a=0;a<t.length;a++){const u=a%r,f=Math.floor(a/r),g=t[a].character,d=this.xi(o,g);if(!d)continue;const p=g.codePointAt(0)||0,y=this.Ci.li(o,p),A=this.Mi(o,y)*h,m=u*i.width,E=f*i.height,v=m+.5*i.width,T=E+.5*i.height,x=Math.round(v-.5*i.width),P=Math.round(T-.5*n),F=x+.5*(i.width-A),B=P+o.hhea.ascender*h;this.Fi(d,F,B,h)}}xi(t,i){const r=i.codePointAt(0)||0,n=this.Ci.li(t,r);if(n===0)return null;if(t.glyf&&t.glyf[n]!==null)return t.glyf[n];if(M&&M.T&&M.T.glyf){const o=M.T.glyf.Qe(t,n);return t.glyf&&o&&(t.glyf[n]=o),o}return null}Mi(t,i){const r=t.hmtx;return r&&r.aWidth?i<r.aWidth.length?r.aWidth[i]:r.aWidth[r.aWidth.length-1]:0}Fi(t,i,r,n){if(!t||!t.xs||t.noc===0)return;const{xs:o,ys:h,endPts:a,flags:u}=t;if(!(o&&h&&a&&u))return;this.yi.beginPath();let f=0;for(let g=0;g<a.length;g++){const d=a[g];if(!(d<f)){if(d>=f){const p=i+o[f]*n,y=r-h[f]*n;this.yi.moveTo(p,y);let A=f+1;for(;A<=d;)if(1&u[A]){const m=i+o[A]*n,E=r-h[A]*n;this.yi.lineTo(m,E),A++}else{const m=i+o[A]*n,E=r-h[A]*n;let v=A+1>d?f:A+1;if(1&u[v]){const T=i+o[v]*n,x=r-h[v]*n;this.yi.quadraticCurveTo(m,E,T,x),A=v+1}else{const T=(m+(i+o[v]*n))/2,x=(E+(r-h[v]*n))/2;this.yi.quadraticCurveTo(m,E,T,x),A=v}}this.yi.closePath()}f=d+1}}this.yi.fill()}}class Wt{constructor(){c(this,"zi");this.zi=new et}Ri(t,i,r){let n=0;const o=this.zi.mi(r,i),h=o.lineHeight;for(const a of t){const u=this.zi._i(r,a);if(u===0)continue;const f=this.zi.pi(r,u)*o.scale;n=Math.max(n,f)}return{width:Math.ceil(n),height:Math.ceil(h)}}gi(){this.zi.gi()}}class Ht{constructor(){c(this,"Ci");this.Ci=new et}createCharacterObjects(t,i){return t.map((r,n)=>{const o=r.codePointAt(0)||0,h=this.Ti(n);let a=0;if(i.hmtx&&i.hmtx.aWidth){const u=this.Ci.li(i,o);u>0&&i.hmtx.aWidth[u]!==void 0&&(a=i.hmtx.aWidth[u])}return{character:r,unicode:o,color:h,advanceWidth:a}})}Ti(t){return[t%256/255,Math.floor(t/256)%256/255,Math.floor(t/65536)%256/255]}Pi(t,i){if(!X.m(typeof t=="string","Character must be a string.",{method:"getCharacterColor",providedValue:t}))return[0,0,0];const r=i.find(n=>n.character===t);return r?r.color:[0,0,0]}Si(t,i){return X.m(typeof t=="string"&&t.length>0,"Characters must be a string with at least one character.",{method:"getCharacterColors",providedValue:t})?Array.from(t).map(r=>this.Pi(r,i)||[0,0,0]):[[0,0,0]]}}class ht{constructor(t,i=16){c(this,"Ei");c(this,"$i",[]);c(this,"Di");c(this,"ki",16);c(this,"Bi",0);c(this,"Oi",0);c(this,"Li",{width:0,height:0});c(this,"Gi");c(this,"Hi");c(this,"Ii");c(this,"Ni");c(this,"Xi");this.ki=i,this.Hi=new Yt,this.Ii=new Xt(t),this.Ni=new Wt,this.Xi=new Ht}async Wi(t){let i;if(t){const r=await fetch(t);if(!r.ok)throw new R(`Failed to load font file: ${r.status} ${r.statusText}`);i=await r.arrayBuffer()}else i=await(await fetch("data:font/woff;base64,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")).arrayBuffer();await this.Ki(i),this.Ei=M.parse(i)[0],await this.ji()}Yi(t){if(t===void 0)return this.ki;this.ki=t,this.Li=this.Ni.Ri(this.$i.map(r=>r.character),this.ki,this.Ei);const i=this.Ii.createTextureAtlas(this.$i,this.Li,this.ki,this.Ei);this.Di=i.framebuffer,this.Bi=i.columns,this.Oi=i.rows}async Vi(t){try{const i=await fetch(t);if(!i.ok)throw new R(`Failed to load font file: ${i.status} ${i.statusText}`);const r=await i.arrayBuffer();await this.Ki(r);const n=M.parse(r);if(!n||n.length===0)throw Error("Failed to parse font file");this.Ei=n[0],await this.ji()}catch(i){throw new R("Failed to load font: "+(i instanceof Error?i.message:"Unknown error"),i)}}async Ki(t){const i=Date.now();this.Gi=new FontFace("CustomFont_"+i,t),await this.Gi.load(),document.fonts.add(this.Gi)}async ji(){const t=this.Hi.ei(this.Ei),i=this.Hi.ni(t);this.$i=this.Xi.createCharacterObjects(i,this.Ei),this.Li=this.Ni.Ri(i,this.ki,this.Ei);const r=this.Ii.createTextureAtlas(this.$i,this.Li,this.ki,this.Ei);this.Di=r.framebuffer,this.Bi=r.columns,this.Oi=r.rows}Pi(t){return this.Xi.Pi(t,this.$i)}Si(t){return this.Xi.Si(t,this.$i)}Dt(){this.Di.Dt(),document.fonts.delete(this.Gi)}get fontFramebuffer(){return this.Di}get characters(){return this.$i}get textureColumns(){return this.Bi}get textureRows(){return this.Oi}get maxGlyphDimensions(){return this.Li}get fontSize(){return this.ki}get font(){return this.Ei}}class at{constructor(t,i,r){c(this,"qi");c(this,"Zi");c(this,"dt");c(this,"_t");c(this,"Qi");c(this,"Ji");c(this,"tr");c(this,"sr");c(this,"er");this.tr=t,this.sr=i,this.er=r,this.ir()}ir(){this.qi=Math.floor(this.tr.width/this.sr),this.Zi=Math.floor(this.tr.height/this.er),this.dt=this.qi*this.sr,this._t=this.Zi*this.er,this.Qi=Math.floor((this.tr.width-this.dt)/2),this.Ji=Math.floor((this.tr.height-this._t)/2)}rr(t,i){this.sr=t,this.er=i,this.ir()}get cellWidth(){return this.sr}get cellHeight(){return this.er}get cols(){return this.qi}get rows(){return this.Zi}get width(){return this.dt}get height(){return this._t}get offsetX(){return this.Qi}get offsetY(){return this.Ji}}class ct{constructor(t={}){c(this,"tr");c(this,"nr",null);c(this,"hr",!1);c(this,"ar");c(this,"cr");this.hr=t.overlay??!1,this.hr&&t.canvas?(this.nr=t.canvas,this.tr=this.lr(),this.cr=!0,this.ur()):t.canvas?(this.tr=t.canvas,this.cr=!1):(this.tr=this.dr(t.width,t.height),this.cr=!0),this.tr.style.imageRendering="pixelated"}dr(t,i){const r=document.createElement("canvas");return r.className="textmodeCanvas",r.style.imageRendering="pixelated",r.width=t||800,r.height=i||600,document.body.appendChild(r),r}lr(){const t=document.createElement("canvas");t.className="textmodeCanvas",t.style.imageRendering="pixelated";const i=this.nr.getBoundingClientRect();let r=Math.round(i.width),n=Math.round(i.height);if(this.nr instanceof HTMLVideoElement){const a=this.nr;(r===0||n===0)&&a.videoWidth>0&&a.videoHeight>0&&(r=a.videoWidth,n=a.videoHeight)}t.width=r,t.height=n,t.style.position="absolute",t.style.pointerEvents="none";const o=window.getComputedStyle(this.nr);let h=parseInt(o.zIndex||"0",10);return isNaN(h)&&(h=0),t.style.zIndex=""+(h+1),t}ur(){var t;this._r(),(t=this.nr.parentNode)==null||t.insertBefore(this.tr,this.nr.nextSibling),window.ResizeObserver&&(this.ar=new ResizeObserver(()=>{this.pr()}),this.ar.observe(this.nr)),window.addEventListener("resize",()=>{this.pr()})}_r(){if(!this.nr)return;const t=this.nr.getBoundingClientRect();let i=this.nr.offsetParent;if(i&&i!==document.body){const r=i.getBoundingClientRect();this.tr.style.top=t.top-r.top+"px",this.tr.style.left=t.left-r.left+"px"}else this.tr.style.top=t.top+window.scrollY+"px",this.tr.style.left=t.left+window.scrollX+"px"}pr(t,i){if(this.hr){const r=this.nr.getBoundingClientRect();let n=Math.round(r.width),o=Math.round(r.height);if(this.nr instanceof HTMLVideoElement){const h=this.nr;(n===0||o===0)&&h.videoWidth>0&&h.videoHeight>0&&(n=h.videoWidth,o=h.videoHeight)}this.tr.width=n,this.tr.height=o,this._r()}else this.tr.width=t??this.tr.width,this.tr.height=i??this.tr.height}vr(){const t=this.tr.getContext("webgl2",{alpha:!0,premultipliedAlpha:!1,preserveDrawingBuffer:!0,antialias:!1,depth:!1,stencil:!1,powerPreference:"high-performance"});if(!t)throw new R("`textmode.js` requires WebGL2 support.");return t}Dt(){this.ar&&this.ar.disconnect();const t=this.tr.getContext("webgl")||this.tr.getContext("webgl2");if(t){const i=t.getExtension("WEBGL_lose_context");i&&i.loseContext()}this.cr&&this.tr.parentNode&&this.tr.parentNode.removeChild(this.tr)}get canvas(){return this.tr}get targetCanvas(){return this.nr}get width(){return this.tr.width}get height(){return this.tr.height}}class Y{constructor(t,i,r,n){c(this,"mr");c(this,"dt");c(this,"_t");c(this,"gt");c(this,"k",0);c(this,"K",0);c(this,"j",0);c(this,"O",[0,0]);c(this,"gr","sampled");c(this,"Ar","fixed");c(this,"V",[1,1,1,1]);c(this,"q",[0,0,0,1]);c(this,"yr",[0,0,0,1]);c(this,"Cr",[[.1,0,0]]);c(this,"wr");this.gt=t,this.mr=i,this.dt=r,this._t=n}Dt(){this.gt.deleteTexture(this.mr)}br(t){return typeof t=="boolean"?t?1:0:(t==null?0:Number(t))>0?1:0}invert(t=!0){return this.k=this.br(t),this}flipX(t=!0){return this.K=this.br(t),this}flipY(t=!0){return this.j=this.br(t),this}charRotation(t){const i=255*t/360,r=Math.floor(i)/255,n=Math.round(i-Math.floor(i));return this.O=[r,n],this}He(){return{texture:this.mr,invert:this.k,flipX:this.K,flipY:this.j,charRotation:this.O,charColorFixed:this.gr==="fixed",charColor:this.V,cellColorFixed:this.Ar==="fixed",cellColor:this.q,backgroundColor:this.yr,charCount:this.Cr.length,charList:this.Cr}}charColorMode(t){return this.gr=t,this}cellColorMode(t){return this.Ar=t,this}charColor(t,i,r,n){return this.V=[(t??0)/255,(i??t??0)/255,(r??t??0)/255,(n??255)/255],this}cellColor(t,i,r,n){return this.q=[(t??0)/255,(i??t??0)/255,(r??t??0)/255,(n??255)/255],this}background(t,i,r,n){return this.yr=[(t??0)/255,(i??t??0)/255,(r??t??0)/255,(n??255)/255],this}characters(t){const i=this.wr(t).filter(r=>Array.isArray(r)).slice(0,64);return this.Cr=i,this}static Mr(t,i,r){const n=t.context,o=n.createTexture();n.bindTexture(n.TEXTURE_2D,o),n.pixelStorei(n.UNPACK_FLIP_Y_WEBGL,1),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MIN_FILTER,n.NEAREST),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MAG_FILTER,n.NEAREST),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_S,n.CLAMP_TO_EDGE),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_T,n.CLAMP_TO_EDGE),n.texImage2D(n.TEXTURE_2D,0,n.RGBA,n.RGBA,n.UNSIGNED_BYTE,i),n.bindTexture(n.TEXTURE_2D,null);const h=i.naturalWidth??i.width??i.videoWidth??0,a=i.naturalHeight??i.height??i.videoHeight??0,u=new Y(n,o,h,a);return u.wr=r,u}get texture(){return this.mr}get width(){return this.dt}get height(){return this._t}}class kt{constructor(t=60){c(this,"Fr");c(this,"zr");c(this,"Rr",null);c(this,"Tr",0);c(this,"Pr",!0);c(this,"Sr",0);c(this,"Er",0);c(this,"$r",[]);c(this,"Dr",10);c(this,"kr",0);this.Fr=t,this.zr=1e3/t}start(t){if(!this.Pr)return;this.Tr=performance.now();const i=r=>{if(!this.Pr)return void(this.Rr=null);const n=r-this.Tr;n>=this.zr&&(t(),this.Tr=r-n%this.zr),this.Pr&&(this.Rr=requestAnimationFrame(i))};this.Rr=requestAnimationFrame(i)}stop(){this.Rr&&(cancelAnimationFrame(this.Rr),this.Rr=null)}pause(){this.Pr&&(this.Pr=!1,this.stop())}resume(t){this.Pr||(this.Pr=!0,this.start(t))}frameRate(t,i){if(t===void 0)return this.Sr;this.Fr=t,this.zr=1e3/t,this.Pr&&i&&(this.stop(),this.start(i))}measureFrameRate(){const t=performance.now();if(this.Er>0){const i=t-this.Er;this.$r.push(i),this.$r.length>this.Dr&&this.$r.shift();const r=this.$r.reduce((n,o)=>n+o,0)/this.$r.length;this.Sr=1e3/r}this.Er=t}get isLooping(){return this.Pr}get frameRateLimit(){return this.Fr}get currentFrameRate(){return this.Sr}get frameCount(){return this.kr}set frameCount(t){this.kr=t}incrementFrame(){this.kr++}resetFrameCount(){this.kr=0}}class lt{constructor(t){c(this,"tr");c(this,"Br");c(this,"Or",{x:-1,y:-1});c(this,"Lr",{x:-1,y:-1});c(this,"Gr",null);c(this,"Hr",0);c(this,"Ir");c(this,"Nr");c(this,"Xr");c(this,"Wr");c(this,"Kr");c(this,"jr");c(this,"Yr",!1);c(this,"Vr");c(this,"qr");c(this,"Zr");c(this,"Qr");c(this,"Jr");this.tr=t}tn(t){const i=performance.now()+Math.max(0,t);i>this.Hr&&(this.Hr=i)}sn(){return performance.now()<this.Hr}en(t){const i=this.tr.canvas;i.style.cursor=t==null||t===""?"":t}Wi(t){this.Br=t,this.rn()}nn(){if(this.Yr)return;const t=this.tr.canvas;this.Ir=i=>{this.hn(i),this.an(i)},this.Nr=()=>{this.Lr={...this.Or},this.Or.x=-1,this.Or.y=-1,this.Gr=null},this.Xr=i=>{this.hn(i),this.cn(i)},this.Wr=i=>{this.hn(i),this.ln(i)},this.Kr=i=>{this.hn(i),this.un(i)},this.jr=i=>{this.hn(i),this.fn(i)},t.addEventListener("mousemove",this.Ir,{passive:!0}),t.addEventListener("mouseleave",this.Nr,{passive:!0}),t.addEventListener("mousedown",this.Xr,{passive:!0}),t.addEventListener("mouseup",this.Wr,{passive:!0}),t.addEventListener("click",this.Kr,{passive:!0}),t.addEventListener("wheel",this.jr,{passive:!1}),this.Yr=!0}dn(){if(!this.Yr)return;const t=this.tr.canvas;t.removeEventListener("mousemove",this.Ir),t.removeEventListener("mouseleave",this.Nr),t.removeEventListener("mousedown",this.Xr),t.removeEventListener("mouseup",this.Wr),t.removeEventListener("click",this.Kr),t.removeEventListener("wheel",this.jr),this.Yr=!1}rn(){if(this.Yr)try{if(this.Gr){const t=new MouseEvent("mousemove",{clientX:this.Gr.x,clientY:this.Gr.y,bubbles:!1,cancelable:!1});this.hn(t)}else this.Or.x!==-1&&this.Or.y!==-1&&(this.Or.x>=this.Br.cols||this.Or.y>=this.Br.rows)&&(this.Or.x=-1,this.Or.y=-1)}catch{this.Or.x=-1,this.Or.y=-1}}_n(t){this.Vr=t}pn(t){this.qr=t}vn(t){this.Zr=t}mn(t){this.Qr=t}gn(t){this.Jr=t}An(){return{x:this.Or.x,y:this.Or.y}}an(t){if(this.Qr&&!this.sn()){const i={position:{...this.Or},previousPosition:{...this.Lr},originalEvent:t};this.Qr(i)}}cn(t){if(this.qr&&!this.sn()){const i={position:{...this.Or},previousPosition:{...this.Lr},button:t.button,originalEvent:t};this.qr(i)}}ln(t){if(this.Zr&&!this.sn()){const i={position:{...this.Or},previousPosition:{...this.Lr},button:t.button,originalEvent:t};this.Zr(i)}}un(t){if(this.Vr&&!this.sn()){const i={position:{...this.Or},previousPosition:{...this.Lr},button:t.button,originalEvent:t};this.Vr(i)}}fn(t){if(this.Jr&&!this.sn()){const i={position:{...this.Or},previousPosition:{...this.Lr},delta:{x:t.deltaX,y:t.deltaY},originalEvent:t};this.Jr(i)}}hn(t){const i=this.tr.canvas;this.Lr={...this.Or},this.Gr={x:t.clientX,y:t.clientY};const r=i.getBoundingClientRect(),n=t.clientX-r.left,o=t.clientY-r.top,h=i.width/r.width,a=o*(i.height/r.height),u=n*h-this.Br.offsetX,f=a-this.Br.offsetY,g=Math.floor(u/this.Br.cellWidth),d=Math.floor(f/this.Br.cellHeight);g>=0&&g<this.Br.cols&&d>=0&&d<this.Br.rows?(this.Or.x=g,this.Or.y=d):(this.Or.x=-1,this.Or.y=-1)}}const Vt=Object.freeze(Object.defineProperty({__proto__:null,MouseManager:lt},Symbol.toStringTag,{value:"Module"}));class ut{constructor(){c(this,"yn",new Map);c(this,"Cn",null);c(this,"wn",null);c(this,"bn");c(this,"xn");c(this,"Yr",!1);c(this,"Mn");c(this,"Fn");c(this,"zn",{ArrowUp:"UP_ARROW",ArrowDown:"DOWN_ARROW",ArrowLeft:"LEFT_ARROW",ArrowRight:"RIGHT_ARROW",F1:"F1",F2:"F2",F3:"F3",F4:"F4",F5:"F5",F6:"F6",F7:"F7",F8:"F8",F9:"F9",F10:"F10",F11:"F11",F12:"F12",Enter:"ENTER",Return:"RETURN",Tab:"TAB",Escape:"ESCAPE",Backspace:"BACKSPACE",Delete:"DELETE",Insert:"INSERT",Home:"HOME",End:"END",PageUp:"PAGE_UP",PageDown:"PAGE_DOWN",Shift:"SHIFT",Control:"CONTROL",Alt:"ALT",Meta:"META"," ":"SPACE"})}nn(){this.Yr||(this.bn=t=>{this.Rn(t)},this.xn=t=>{this.Tn(t)},window.addEventListener("keydown",this.bn,{passive:!1}),window.addEventListener("keyup",this.xn,{passive:!1}),this.Yr=!0)}dn(){this.Yr&&(window.removeEventListener("keydown",this.bn),window.removeEventListener("keyup",this.xn),this.Yr=!1,this.yn.clear(),this.Cn=null,this.wn=null)}pn(t){this.Mn=t}vn(t){this.Fn=t}Pn(t){const i=this.Sn(t),r=this.yn.get(t)||this.yn.get(i);return(r==null?void 0:r.isPressed)||!1}En(){return this.Cn}$n(){return this.wn}Dn(){const t=[];for(const[i,r]of this.yn)r.isPressed&&t.push(i);return t}kn(){return{ctrl:this.Pn("Control"),shift:this.Pn("Shift"),alt:this.Pn("Alt"),meta:this.Pn("Meta")}}Bn(){this.yn.clear(),this.Cn=null,this.wn=null}Rn(t){const i=t.key,r=Date.now();this.yn.has(i)||this.yn.set(i,{isPressed:!1,lastPressTime:0,lastReleaseTime:0});const n=this.yn.get(i);if(!n.isPressed&&(n.isPressed=!0,n.lastPressTime=r,this.Cn=i,this.Mn)){const o={key:i,keyCode:t.keyCode,ctrlKey:t.ctrlKey,shiftKey:t.shiftKey,altKey:t.altKey,metaKey:t.metaKey,isPressed:!0,originalEvent:t};this.Mn(o)}}Tn(t){const i=t.key,r=Date.now();this.yn.has(i)||this.yn.set(i,{isPressed:!1,lastPressTime:0,lastReleaseTime:0});const n=this.yn.get(i);if(n.isPressed=!1,n.lastReleaseTime=r,this.wn=i,this.Fn){const o={key:i,keyCode:t.keyCode,ctrlKey:t.ctrlKey,shiftKey:t.shiftKey,altKey:t.altKey,metaKey:t.metaKey,isPressed:!1,originalEvent:t};this.Fn(o)}}Sn(t){return this.zn[t]||t.toLowerCase()}}const jt=Object.freeze(Object.defineProperty({__proto__:null,KeyboardManager:ut},Symbol.toStringTag,{value:"Module"}));class ft{constructor(t,i){c(this,"tr");c(this,"On");c(this,"Br");c(this,"Ln",new Map);c(this,"Gn",new Map);c(this,"Hn",new Map);c(this,"In",null);c(this,"Nn");c(this,"Xn");c(this,"Wn");c(this,"Kn");c(this,"jn");c(this,"Yn");c(this,"Yr",!1);c(this,"Vn");c(this,"qn");c(this,"Zn");c(this,"Qn");c(this,"Jn");c(this,"so");c(this,"eo");c(this,"io");c(this,"ro");c(this,"no");c(this,"oo",320);c(this,"ho",350);c(this,"ao",10);c(this,"co",550);c(this,"lo",14);c(this,"uo",48);c(this,"fo",650);c(this,"do",.02);c(this,"_o",2);c(this,"po",600);c(this,"vo",0);c(this,"mo",null);this.tr=t,this.On=i;const r=this.tr.canvas;this.Nn=r.style.touchAction,this.Xn=r.style.userSelect,r.style.touchAction||(r.style.touchAction="none"),r.style.userSelect||(r.style.userSelect="none")}Wi(t){this.Br=t,this.Ao()}nn(){if(this.Yr)return;const t=this.tr.canvas;this.Wn=i=>{this.yo(i)},this.Kn=i=>{this.Co(i)},this.jn=i=>{this.wo(i)},this.Yn=i=>{this.bo(i)},t.addEventListener("touchstart",this.Wn,{passive:!1}),t.addEventListener("touchmove",this.Kn,{passive:!1}),t.addEventListener("touchend",this.jn,{passive:!1}),t.addEventListener("touchcancel",this.Yn,{passive:!1}),this.Yr=!0}dn(){if(!this.Yr)return;const t=this.tr.canvas;t.removeEventListener("touchstart",this.Wn),t.removeEventListener("touchmove",this.Kn),t.removeEventListener("touchend",this.jn),t.removeEventListener("touchcancel",this.Yn),this.Yr=!1,this.In=null,this.Ln.clear(),this.Gn.clear(),this.Hn.forEach(i=>{i.longPressTimer!==null&&window.clearTimeout(i.longPressTimer)}),this.Hn.clear(),this.mo=null,this.vo=0,t.style.touchAction=this.Nn,t.style.userSelect=this.Xn}Ao(){if(!this.Br||this.Ln.size===0)return;const t=new Map;for(const i of this.Ln.values()){const r=this.xo(i.clientX,i.clientY,i.id,i);t.set(i.id,r)}this.Ln=t}Mo(){return Array.from(this.Ln.values()).map(t=>({...t}))}Fo(t){this.Vn=t}mn(t){this.qn=t}zo(t){this.Zn=t}Ro(t){this.Qn=t}To(t){this.Jn=t}Po(t){this.so=t}So(t){this.eo=t}Eo(t){this.io=t}$o(t){this.ro=t}Do(t){this.no=t}yo(t){var n;if(!this.Br)return;t.preventDefault(),(n=this.On)==null||n.tn(this.po);const i=performance.now(),r=this.ko(t.changedTouches);for(const o of r){const h=this.Ln.get(o.id);h&&this.Gn.set(o.id,this.Bo(h)),this.Ln.set(o.id,o);const a={id:o.id,startPosition:o,lastPosition:o,startTime:i,lastTime:i,longPressTimer:null,longPressFired:!1};this.eo&&(a.longPressTimer=window.setTimeout(()=>{const u=this.Ln.get(o.id);u&&(a.longPressFired=!0,this.eo({touch:this.Bo(u),duration:performance.now()-a.startTime,originalEvent:t}))},this.co)),this.Hn.set(o.id,a),this.Vn&&this.Vn(this.Oo(o,t,void 0,i))}this.Ln.size===2&&this.Lo()}Co(t){var n;if(!this.Br)return;t.preventDefault(),(n=this.On)==null||n.tn(this.po);const i=performance.now(),r=this.ko(t.changedTouches);for(const o of r){const h=this.Ln.get(o.id),a=h?this.Bo(h):void 0;a&&this.Gn.set(o.id,a),this.Ln.set(o.id,o);const u=this.Hn.get(o.id);u&&(u.lastPosition=o,u.lastTime=i,a)&&this.Go(a,o,!0)>this.lo&&u.longPressTimer!==null&&(window.clearTimeout(u.longPressTimer),u.longPressTimer=null),this.qn&&this.qn(this.Oo(o,t,a,i))}this.Ln.size===2?this.Ho(t):this.In=null}wo(t){if(!this.Br)return;t.preventDefault();const i=performance.now(),r=this.ko(t.changedTouches);for(const n of r){const o=this.Ln.get(n.id),h=o?this.Bo(o):void 0,a=this.Hn.get(n.id);a&&a.longPressTimer!==null&&(window.clearTimeout(a.longPressTimer),a.longPressTimer=null),this.Zn&&this.Zn(this.Oo(n,t,h,i)),a&&this.Io(a,t),this.Hn.delete(n.id),this.Gn.delete(n.id),this.Ln.delete(n.id)}this.Ln.size<2&&(this.In=null)}bo(t){if(!this.Br)return;t.preventDefault();const i=performance.now(),r=this.ko(t.changedTouches);for(const n of r){const o=this.Ln.get(n.id),h=o?this.Bo(o):void 0,a=this.Hn.get(n.id);a&&a.longPressTimer!==null&&(window.clearTimeout(a.longPressTimer),a.longPressTimer=null),this.Qn&&this.Qn(this.Oo(n,t,h,i)),this.Hn.delete(n.id),this.Gn.delete(n.id),this.Ln.delete(n.id)}this.Ln.size<2&&(this.In=null)}ko(t){const i=[];for(let r=0;r<t.length;r+=1){const n=t.item(r);n&&i.push(this.No(n))}return i}No(t){return this.xo(t.clientX,t.clientY,t.identifier,{id:t.identifier,x:-1,y:-1,clientX:t.clientX,clientY:t.clientY,pressure:t.force,radiusX:t.radiusX,radiusY:t.radiusY,rotationAngle:t.rotationAngle})}xo(t,i,r,n){const o=this.tr.canvas,h=o.getBoundingClientRect(),a=t-h.left,u=i-h.top,f=o.width/h.width,g=u*(o.height/h.height),d=a*f-this.Br.offsetX,p=g-this.Br.offsetY,y=Math.floor(d/this.Br.cellWidth),A=Math.floor(p/this.Br.cellHeight),m=y>=0&&y<this.Br.cols&&A>=0&&A<this.Br.rows;return{id:r,x:m?y:-1,y:m?A:-1,clientX:t,clientY:i,pressure:n.pressure,radiusX:n.radiusX,radiusY:n.radiusY,rotationAngle:n.rotationAngle}}Oo(t,i,r,n){const o=this.Hn.get(t.id),h=Array.from(this.Gn.values()).map(f=>this.Bo(f)),a=Array.from(this.Ln.values()).map(f=>this.Bo(f)),u=this.ko(i.changedTouches);return{touch:this.Bo(t),previousTouch:r?this.Bo(r):void 0,touches:a,previousTouches:h,changedTouches:u,deltaTime:o?n-o.lastTime:0,originalEvent:i}}Lo(){if(this.Ln.size!==2)return void(this.In=null);const t=Array.from(this.Ln.values()),[i,r]=t,n=this.Go(i,r,!1),o=this.Xo(i,r);this.In={ids:[i.id,r.id],initialDistance:Math.max(n,1e-4),initialAngle:o,lastScale:1,lastRotation:0}}Ho(t){if(this.In||this.Lo(),!this.In)return;const[i,r]=this.In.ids,n=this.Ln.get(i),o=this.Ln.get(r);if(!n||!o)return;const h=this.Go(n,o,!1)/this.In.initialDistance,a=h-this.In.lastScale;this.ro&&Math.abs(a)>this.do&&(this.ro({touches:[this.Bo(n),this.Bo(o)],scale:h,deltaScale:a,center:this.Wo(n,o),originalEvent:t}),this.In.lastScale=h);let u=this.Xo(n,o)-this.In.initialAngle;u=(u+180)%360-180;const f=u-this.In.lastRotation;this.no&&Math.abs(f)>this._o&&(this.no({touches:[this.Bo(n),this.Bo(o)],rotation:u,deltaRotation:f,center:this.Wo(n,o),originalEvent:t}),this.In.lastRotation=u)}Wo(t,i){const r=(t.clientX+i.clientX)/2,n=(t.clientY+i.clientY)/2,o=this.xo(r,n,-1,{id:-1,x:-1,y:-1,clientX:r,clientY:n});return{x:o.x,y:o.y}}Io(t,i){const r=performance.now(),n=r-t.startTime,o=this.Go(t.startPosition,t.lastPosition,!0);if(!t.longPressFired&&n<=this.oo&&o<=this.ao)this.Ko(t.lastPosition,r)&&this.so?this.so({touch:this.Bo(t.lastPosition),taps:2,originalEvent:i}):this.Jn&&this.Jn({touch:this.Bo(t.lastPosition),taps:1,originalEvent:i});else if(!t.longPressFired&&n<=this.fo&&o>=this.uo){const h={x:t.lastPosition.clientX-t.startPosition.clientX,y:t.lastPosition.clientY-t.startPosition.clientY},a=Math.max(Math.hypot(h.x,h.y),1e-4),u={x:h.x/a,y:h.y/a},f={x:h.x/n,y:h.y/n};this.io&&this.io({touch:this.Bo(t.lastPosition),direction:u,distance:a,velocity:f,originalEvent:i})}this.vo=r,this.mo=this.Bo(t.lastPosition)}Ko(t,i){return!!this.mo&&!(i-this.vo>this.ho)&&this.Go(t,this.mo,!0)<=this.ao}Bo(t){return{...t}}Go(t,i,r){return r?Math.hypot(t.clientX-i.clientX,t.clientY-i.clientY):Math.hypot(t.x-i.x,t.y-i.y)}Xo(t,i){return 180*Math.atan2(i.clientY-t.clientY,i.clientX-t.clientX)/Math.PI}}const qt=Object.freeze(Object.defineProperty({__proto__:null,TouchManager:ft},Symbol.toStringTag,{value:"Module"})),Kt=l=>class extends l{rotate(t=0,i=0,r=0){this.xt.state.st(t),this.xt.state.et(i),this.xt.state.it(r)}rotateX(t){this.xt.state.st(t)}rotateY(t){this.xt.state.et(t)}rotateZ(t){this.xt.state.it(t)}push(){this.xt.state.H()}pop(){this.xt.state.Z()}rect(t,i,r=1,n=1){this.xt.Ne(t,i,r,n)}point(t,i){this.xt.Ne(t,i,1,1)}line(t,i,r,n){this.xt.Xe(t,i,r,n)}lineWeight(t){this.xt.state.tt(t)}background(t,i=t,r=t,n=255){this.xt.qe(t,i,r,n)}char(t){this.xt.state.rt(this.Ei.Pi(t))}charColor(t,i,r,n=255){this.xt.state.nt(t,i,r,n)}cellColor(t,i,r,n=255){this.xt.state.ot(t,i,r,n)}flipX(t){this.xt.state.ht(t)}flipY(t){this.xt.state.ct(t)}charRotation(t){this.xt.state.ut(t)}invert(t){this.xt.state.lt(t)}clear(){this.xt.qe(0,0,0,0)}ellipse(t,i,r,n){this.xt.We(t,i,r/2,n/2)}triangle(t,i,r,n,o,h){this.xt.Ke(t,i,r,n,o,h)}bezierCurve(t,i,r,n,o,h,a,u){this.xt.je(t,i,r,n,o,h,a,u)}arc(t,i,r,n,o,h){this.xt.Ve(t,i,r,n,o,h)}shader(t){this.xt.Be(t)}setUniform(t,i){this.xt.Kt(t,i)}setUniforms(t){this.xt.Oe(t)}createFilterShader(t){return this.xt.hs(t)}createFramebuffer(t){return this.xt.Ye(t.width,t.height,5,{filter:"nearest",wrap:"clamp",format:"rgba",type:"unsigned_byte"})}image(t,i,r,n,o){if(t.textures){const h=t;this.xt.Le(h,i,r,n??h.width,o??h.height)}else{const h=t;this.xt.Ge(h,i,r,n??Math.floor(this.Br.cols/2),o??Math.floor(this.Br.rows/2))}}async loadImage(t){if(typeof t!="string")return Y.Mr(this.xt,t,n=>this.Ei.Si(n));const i=t,r=await new Promise((n,o)=>{const h=new Image;h.crossOrigin="anonymous",h.onload=()=>n(h),h.onerror=a=>o(a),h.src=i});return Y.Mr(this.xt,r,n=>this.Ei.Si(n))}},Zt=l=>class extends l{async loadFont(t){return this.Ei.Vi(t).then(()=>{const i=this.Ei.maxGlyphDimensions;this.Br.rr(i.width,i.height),this.jo.resize(this.Br.cols,this.Br.rows),this.xt.Ze(),this.On.rn()})}fontSize(t){if(!X.m(typeof t=="number"&&t>0,"Font size must be a positive number greater than 0.",{method:"fontSize",providedValue:t})||this.Ei.fontSize===t)return;this.Ei.Yi(t);const i=this.Ei.maxGlyphDimensions;this.Br.rr(i.width,i.height),this.jo.resize(this.Br.cols,this.Br.rows),this.xt.Ze(),this.On.rn()}glyphColor(t){return this.Ei.Pi(t)}glyphColors(t){return this.Ei.Si(t)}},Qt=l=>class extends l{get frameCount(){return this.Yo.frameCount}set frameCount(t){this.Yo.frameCount=t}frameRate(t){return t===void 0?this.Yo.currentFrameRate:this.Yo.frameRate(t,()=>this.Vo())}noLoop(){this.Yo.pause()}loop(){this.Yo.resume(()=>this.Vo())}redraw(t=1){if(X.m(typeof t=="number"&&t>0&&Number.isInteger(t),"Redraw count must be a positive integer.",{method:"redraw",providedValue:t}))for(let i=0;i<t;i++)this.Vo()}isLooping(){return this.Yo.isLooping}},Jt=l=>class extends l{constructor(...t){super(...t)}mouseClicked(t){this.On._n(t)}mousePressed(t){this.On.pn(t)}mouseReleased(t){this.On.vn(t)}mouseMoved(t){this.On.mn(t)}mouseScrolled(t){this.On.gn(t)}get mouse(){return this.On.An()}cursor(t){this.On.en(t)}},$t=l=>class extends l{constructor(...t){super(...t)}touchStarted(t){this.qo.Fo(t)}touchMoved(t){this.qo.mn(t)}touchEnded(t){this.qo.zo(t)}touchCancelled(t){this.qo.Ro(t)}tap(t){this.qo.To(t)}doubleTap(t){this.qo.Po(t)}longPress(t){this.qo.So(t)}swipe(t){this.qo.Eo(t)}pinch(t){this.qo.$o(t)}rotateGesture(t){this.qo.Do(t)}get touches(){return this.qo.Mo()}},te=l=>class extends l{constructor(...t){super(...t)}keyPressed(t){this.Zo.pn(t)}keyReleased(t){this.Zo.vn(t)}isKeyPressed(t){return this.Zo.Pn(t)}get lastKeyPressed(){return this.Zo.En()}get lastKeyReleased(){return this.Zo.$n()}get pressedKeys(){return this.Zo.Dn()}get modifierState(){return this.Zo.kn()}};class ee{constructor(){c(this,"xt");c(this,"Ei");c(this,"tr");c(this,"Br");c(this,"Yo");c(this,"On");c(this,"qo");c(this,"Zo");c(this,"Qo");c(this,"jo");c(this,"Jo");c(this,"th");c(this,"sh")}Vo(){}}class dt extends function(i,...r){return r.reduce((n,o)=>o(n),i)}(ee,Kt,Zt,Qt,Jt,$t,te){constructor(i={}){var r;super();c(this,"eh",new Map);c(this,"ih");c(this,"rh",!1);c(this,"nh",!1);c(this,"oh",()=>{});c(this,"hh",()=>{});c(this,"ah",()=>{});c(this,"uh");c(this,"ar");c(this,"hr",!1);c(this,"fh");this.ih=((r=i.plugins)==null?void 0:r.slice())??[],this.hr=i.overlay??!1,this.tr=new ct(i),this.xt=new Ot(this.tr.vr()),this.Ei=new ht(this.xt,i.fontSize??16),this.Yo=new kt(i.frameRate??60),this.On=new lt(this.tr),this.qo=new ft(this.tr,this.On),this.Zo=new ut,this.Qo=this.xt.Pt(),this.Jo=this.xt.rs(),this.dh(i)}async dh(i){await this.Ei.Wi(i.fontSource);const r=this.Ei.maxGlyphDimensions;this.Br=new at(this.tr.canvas,r.width,r.height),this.On.Wi(this.Br),this.qo.Wi(this.Br),this.jo=this.xt.Ye(this.Br.cols,this.Br.rows,5),this.th=this.xt.Ye(this.Br.width,this.Br.height,1),this.hr&&(this.fh=Y.Mr(this.xt,this.tr.targetCanvas,n=>this.Ei.Si(n))),this.sh=this.xt.cs(rt,"precision mediump float;uniform sampler2D Ua;uniform vec2 Ub;uniform vec2 Uc;uniform vec2 Ud;void main(){vec2 A=gl_FragCoord.xy-Uc;vec2 B=A*(Ub/Ud);vec2 C=(floor(B)+0.5)/Ub;gl_FragColor=texture2D(Ua,C);}"),this._h(),await this.ph(this.ih),this.ih=[],this.rh=!0,this.oh(),this.Yo.start(()=>this.Vo())}async ph(i){if(i.length)for(const r of i)this.eh.has(r.name)?console.warn(`[textmode.js] Plugin "${r.name}" is already installed.`):(await r.install(this,this.mh()),this.eh.set(r.name,r))}async gh(i){const r=this.eh.get(i);r&&(r.uninstall&&await r.uninstall(this,this.mh()),this.eh.delete(i))}async use(i){return this.rh?await this.ph([i]):this.ih.push(i),this}async unuse(i){return this.rh?(await this.gh(i),this):(this.ih=this.ih.filter(r=>r.name!==i),this)}hasPlugin(i){return this.rh?this.eh.has(i):this.ih.some(r=>r.name===i)||this.eh.has(i)}mh(){return{renderer:this.xt,font:this.Ei,grid:this.Br,canvas:this.tr,drawFramebuffer:this.jo,asciiFramebuffer:this.th,flushDrawCommands:()=>{this.xt.St(this.Qo)}}}_h(){this.uh=()=>{this.hr&&this.resizeCanvas(this.tr.targetCanvas.width,this.tr.targetCanvas.height),this.ah()},window.addEventListener("resize",this.uh),this.On.nn(),this.qo.nn(),this.Zo.nn(),window.addEventListener("blur",()=>{this.Zo.Bn()}),window.ResizeObserver&&this.hr&&(this.ar=new ResizeObserver(()=>{this.resizeCanvas(this.tr.targetCanvas.width,this.tr.targetCanvas.height)}),this.ar.observe(this.tr.targetCanvas))}Vo(){if(this.Yo.measureFrameRate(),this.Yo.incrementFrame(),this.nh)return;if(this.hr){const r=this.xt.context;r.bindTexture(r.TEXTURE_2D,this.fh.texture),r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,1),r.texImage2D(r.TEXTURE_2D,0,r.RGBA,r.RGBA,r.UNSIGNED_BYTE,this.tr.targetCanvas),r.bindTexture(r.TEXTURE_2D,null)}this.jo.begin(),this.xt.ke(this.Qo),this.hh(),this.xt.St(this.Qo),this.jo.end(),this.th.begin(),this.xt.ke(this.Jo),this.Jo.Wt({U0:this.Ei.fontFramebuffer,U1:[this.Ei.textureColumns,this.Ei.textureRows],U2:this.jo.textures[0],U3:this.jo.textures[1],U4:this.jo.textures[2],U5:this.jo.textures[4],U6:this.jo.textures[3],U7:[this.Br.cols,this.Br.rows],U8:[this.th.width,this.th.height],U9:this.th.width/this.th.height}),this.xt.Ie(0,0,this.tr.width,this.tr.height),this.th.end();const i=this.xt.state.canvasBackgroundColor;this.xt.Ys(i[0],i[1],i[2],i[3]),this.xt.ke(this.sh),this.sh.Wt({Ua:this.th.textures[0],Ub:[this.th.width,this.th.height],Uc:[this.Br.offsetX,this.Br.offsetY],Ud:[this.Br.width,this.Br.height]}),this.xt.Ie(this.Br.offsetX,this.Br.offsetY,this.Br.width,this.Br.height)}setup(i){this.oh=i}draw(i){this.hh=i}windowResized(i){this.ah=i}resizeCanvas(i,r){this.tr.pr(i,r),this.Br.ir(),this.jo.resize(this.Br.cols,this.Br.rows),this.th.resize(this.Br.width,this.Br.height),this.xt.Ze(),this.On.rn(),this.qo.Ao(),this.Vo()}destroy(){this.nh||(this.Yo.stop(),window.removeEventListener("resize",this.uh),this.On.dn(),this.qo.dn(),this.Zo.dn(),this.Ei.Dt(),this.xt.Dt(),this.th.Dt(),this.sh.Dt(),this.fh&&this.fh.Dt(),this.nh=!0)}get grid(){return this.Br}get font(){return this.Ei}get width(){return this.tr.width}get height(){return this.tr.height}get canvas(){return this.tr.canvas}get isDisposed(){return this.nh}get overlay(){return this.fh}}class Q{constructor(){}static create(t={}){return new dt(t)}static setErrorLevel(t){X.A(t)}static get version(){return"0.3.2-beta.2"}}const ie=Object.freeze(Object.defineProperty({__proto__:null},Symbol.toStringTag,{value:"Module"})),se=Object.freeze(Object.defineProperty({__proto__:null,keyboard:jt,mouse:Vt,touch:qt},Symbol.toStringTag,{value:"Module"})),re=Q.create,ne=Q.setErrorLevel,oe=Q.version;b.TextmodeCanvas=ct,b.TextmodeErrorLevel=S,b.TextmodeFont=ht,b.TextmodeFramebuffer=j,b.TextmodeGrid=at,b.TextmodeImage=Y,b.Textmodifier=dt,b.create=re,b.export=ie,b.input=se,b.setErrorLevel=ne,b.textmode=Q,b.version=oe,Object.defineProperty(b,Symbol.toStringTag,{value:"Module"})},typeof exports=="object"&&typeof module<"u"?e(exports):typeof define=="function"&&define.amd?define(["exports"],e):e((s=typeof globalThis<"u"?globalThis:s||self).textmode={});
|