@layoutit/polycss-core 0.0.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -40,6 +40,7 @@ npm install @layoutit/polycss-core
40
40
  | `CameraState` | Camera target, angles, zoom, and dolly distance |
41
41
  | `CameraHandle` | Mutable camera object from `createIsometricCamera` |
42
42
  | `AutoRotateOption` | `boolean | number | { axis, speed, pauseOnInteraction }` |
43
+ | `BoxPolygonsOptions` | Options for `boxPolygons`: size/center or min/max bounds, materials, face overrides |
43
44
 
44
45
  ### Functions
45
46
 
@@ -47,13 +48,15 @@ npm install @layoutit/polycss-core
47
48
  |---|---|
48
49
  | `normalizePolygons(input)` | Validates polygons. Drops degenerate ones, auto-triangulates non-coplanar N-gons, strips mismatched UVs. Returns `{ polygons, warnings }`. |
49
50
  | `mergePolygons(polygons)` | Coplanar same-material adjacent merge. Reduces DOM element count on flat surfaces. |
51
+ | `optimizeMeshPolygons(polygons, options?)` | Applies lossless or lossy mesh-resolution optimization and chooses the smallest accepted candidate; defaults to `meshResolution: "lossy"`. |
50
52
  | `computeSceneBbox(polygons)` | Computes min/max bounds across all polygon vertices. |
51
53
  | `createIsometricCamera(initial?)` | Creates a mutable camera handle with `state`, `update(partial)`, and `getStyle()`. |
54
+ | `boxPolygons(options?)` | Creates six quad `Polygon`s for an axis-aligned box/cuboid. Supports per-face material/data overrides and omitted faces. |
52
55
  | `parseObj(text, options?)` | Parses OBJ text into `ParseResult`. Supports UV (`vt`), materials, `map_Kd` textures. |
53
56
  | `parseMtl(text)` | Parses MTL text into `{ colors, textures }`. |
54
57
  | `parseGltf(buffer, options?)` | Parses GLB or glTF `ArrayBuffer` into `ParseResult`. Extracts embedded textures as blob URLs. |
55
- | `parseVox(buffer, options?)` | Parses MagicaVoxel `.vox` `ArrayBuffer` into `ParseResult`. Face-culls interior voxel faces and fan-triangulates exposed quads. |
56
- | `loadMesh(url, options?)` | Fetches a URL, dispatches to the right parser by extension (`.obj`, `.glb`, `.gltf`, `.vox`). Returns `Promise<ParseResult>`. |
58
+ | `parseVox(buffer, options?)` | Parses MagicaVoxel `.vox` `ArrayBuffer` into `ParseResult`. Face-culls interior voxel faces and emits exposed quads. `targetSize` snaps to integer voxel CSS cells for the fast-path renderer. |
59
+ | `loadMesh(url, options?)` | Fetches a URL, dispatches to the right parser by extension (`.obj`, `.glb`, `.gltf`, `.vox`). Returns `Promise<ParseResult>` and defaults to `meshResolution: "lossy"`. |
57
60
  | `parseColor(input)` | Parse any CSS color string to `{ r, g, b, a }`. |
58
61
  | `shadeColor(input, lambert, ...)` | Apply Lambert shading factor to a color. |
59
62
  | `computeShapeLighting(normal, baseColor, light?)` | Compute shaded color for a polygon face given a directional light and surface normal. |
@@ -110,3 +113,23 @@ console.log(`${polygons.length} triangles → ${merged.length} merged polygons`)
110
113
 
111
114
  dispose(); // always revoke GLB blob URLs when done
112
115
  ```
116
+
117
+ ### Create a box shape
118
+
119
+ ```ts
120
+ import { boxPolygons } from "@layoutit/polycss-core";
121
+
122
+ const polygons = boxPolygons({
123
+ min: [0, 0, 0],
124
+ max: [2, 1, 0.5],
125
+ color: "#d8d2c7",
126
+ data: { tileId: "tile-1" },
127
+ faces: {
128
+ top: {
129
+ texture: "/tile.png",
130
+ data: { face: "top" },
131
+ },
132
+ bottom: false,
133
+ },
134
+ });
135
+ ```
package/dist/index.cjs CHANGED
@@ -1,3 +1,3 @@
1
- "use strict";var ct=Object.defineProperty;var Un=Object.getOwnPropertyDescriptor;var Nn=Object.getOwnPropertyNames;var _n=Object.prototype.hasOwnProperty;var $n=(e,t)=>{for(var r in t)ct(e,r,{get:t[r],enumerable:!0})},zn=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Nn(t))!_n.call(e,o)&&o!==r&&ct(e,o,{get:()=>t[o],enumerable:!(n=Un(t,o))||n.enumerable});return e};var Fn=e=>zn(ct({},"__esModule",{value:!0}),e);var Ao={};$n(Ao,{BASE_TILE:()=>Jt,DEFAULT_CAMERA_STATE:()=>de,DEFAULT_PROJECTION:()=>kt,LoopOnce:()=>dn,LoopPingPong:()=>xn,LoopRepeat:()=>pn,arrowPolygons:()=>Vt,axesHelperPolygons:()=>At,bakeSolidTextureSampledPolygons:()=>En,bakeSolidTextureSamples:()=>Ze,buildSceneContext:()=>jt,clampChannel:()=>fe,computeSceneBbox:()=>mt,computeShapeLighting:()=>Ft,computeTexturePaintMetrics:()=>Yt,coverPlanarPolygons:()=>un,createIsometricCamera:()=>qt,createPolyAnimationMixer:()=>hn,cullInteriorPolygons:()=>Ge,formatColor:()=>Se,inverseRotateVec3:()=>Wt,loadMesh:()=>kn,mergePolygons:()=>Ve,normalizeInvertMultiplier:()=>Qt,normalizePolygons:()=>_e,octahedronPolygons:()=>Mt,parseColor:()=>ge,parseGltf:()=>We,parseHexColor:()=>at,parseMtl:()=>je,parseObj:()=>De,parsePureColor:()=>ke,parseRgbColor:()=>ft,parseVox:()=>Ke,polygonFaces:()=>Xt,ringPolygons:()=>vt,rotateVec3:()=>Ht,shadeColor:()=>zt});module.exports=Fn(Ao);var kt="cubic";function at(e){let t=e.replace("#","");if(t.length===3){let r=parseInt(t[0]+t[0],16),n=parseInt(t[1]+t[1],16),o=parseInt(t[2]+t[2],16);return Number.isNaN(r)||Number.isNaN(n)||Number.isNaN(o)?null:{rgb:[r,n,o],alpha:1}}if(t.length===6){let r=parseInt(t.slice(0,2),16),n=parseInt(t.slice(2,4),16),o=parseInt(t.slice(4,6),16);return Number.isNaN(r)||Number.isNaN(n)||Number.isNaN(o)?null:{rgb:[r,n,o],alpha:1}}return null}function ft(e){let t=e.match(/rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*([\d.]+)\s*)?\)/i);return t?{rgb:[Number(t[1]),Number(t[2]),Number(t[3])],alpha:t[4]?Number(t[4]):1}:null}function ke(e){if(!e)return null;let t=e.trim(),r=at(t);return r||ft(t)}function fe(e){return Math.max(0,Math.min(255,Math.round(e)))}function Se(e){let[t,r,n]=e.rgb.map(fe);return e.alpha<1?`rgba(${t}, ${r}, ${n}, ${e.alpha})`:`rgb(${t}, ${r}, ${n})`}var ut={rgb:[204,204,204],alpha:1},Ut=new Map;function ge(e){if(!e)return null;let t=e.trim(),r=Ut.get(t);if(r)return r;let n=ke(t);return n?(Ut.set(t,n),n):null}function zt(e,t){let r=ge(e)??ut,n=[fe(r.rgb[0]+t),fe(r.rgb[1]+t),fe(r.rgb[2]+t)];return Se({rgb:n,alpha:r.alpha})}var lt={direction:[0,0,-1],color:"#ffffff",intensity:1},Nt={color:"#ffffff",intensity:.4};function _t(e){let t=Math.hypot(e[0],e[1],e[2]);return t<1e-12?[0,0,0]:[e[0]/t,e[1]/t,e[2]/t]}function $t(e,t,r){let n=ge(t)??ut;return e*(n.rgb[r]/255)}function Ft(e,t,r,n){let o=ge(t)??ut,i=_t(r?.direction??lt.direction),s=r?.color??lt.color,a=Math.max(0,r?.intensity??lt.intensity),c=n?.color??Nt.color,f=Math.max(0,n?.intensity??Nt.intensity),l=_t(e),u=Math.max(0,-(l[0]*i[0]+l[1]*i[1]+l[2]*i[2])),g=a*u,m=[0,0,0];for(let p=0;p<3;p=p+1){let h=o.rgb[p],b=$t(h,c,p)*f,y=$t(h,s,p)*g;m[p]=fe(b+y)}return Se({rgb:m,alpha:o.alpha})}var Gt="#cccccc",Ue=(e,t)=>[e[0]-t[0],e[1]-t[1],e[2]-t[2]],Bt=(e,t)=>[e[1]*t[2]-e[2]*t[1],e[2]*t[0]-e[0]*t[2],e[0]*t[1]-e[1]*t[0]],Dt=(e,t)=>e[0]*t[0]+e[1]*t[1]+e[2]*t[2],Ne=e=>Math.hypot(e[0],e[1],e[2]);function Gn(e){let t=1/0,r=1/0,n=1/0,o=-1/0,i=-1/0,s=-1/0;for(let l of e)l[0]<t&&(t=l[0]),l[0]>o&&(o=l[0]),l[1]<r&&(r=l[1]),l[1]>i&&(i=l[1]),l[2]<n&&(n=l[2]),l[2]>s&&(s=l[2]);let a=o-t,c=i-r,f=s-n;return Math.hypot(a,c,f)}function Bn(){let e=globalThis;if(e.__POLYCSS_DEV__===!0)return!0;if(e.__POLYCSS_DEV__===!1)return!1;let t=e.process?.env?.NODE_ENV;return typeof t=="string"?t!=="production":!1}function _e(e){let t=[],r=[];if(!e||e.length===0)return{polygons:t,warnings:r};for(let n=0;n<e.length;n++){let o=e[n];if(!o||!Array.isArray(o.vertices)){r.push(`Polygon ${n}: missing vertices, dropped`);continue}let i=o.vertices;if(i.length<3){r.push(`Polygon ${n}: ${i.length} vertices (need >= 3), dropped`);continue}let s=Ue(i[1],i[0]),a=Ue(i[2],i[0]),c=Bt(s,a),f=Ne(c);if(i.length===3){if(f<1e-12){Ne(s)<1e-12||Ne(a)<1e-12?r.push(`Polygon ${n}: zero-area triangle (coincident vertices), dropped`):r.push(`Polygon ${n}: vertices collinear, dropped`);continue}}else if(f<1e-12){r.push(`Polygon ${n}: first 3 vertices collinear, dropped`);continue}let l=[{...o,vertices:i.slice()}];if(i.length>=4){let u=[c[0]/f,c[1]/f,c[2]/f],g=Dt(u,i[0]),m=Gn(i),p=Math.max(1e-6,m*.001),h=0;for(let b=3;b<i.length;b++){let y=Math.abs(Dt(u,i[b])-g);y>h&&(h=y)}if(h>p){let b=[],y=o.uvs&&o.uvs.length===i.length?o.uvs:void 0;for(let M=1;M<i.length-1;M++){let C=[i[0].slice(),i[M].slice(),i[M+1].slice()],v=Bt(Ue(C[1],C[0]),Ue(C[2],C[0]));if(Ne(v)<1e-12)continue;let x={...o,vertices:C};y&&(x.uvs=[y[0].slice(),y[M].slice(),y[M+1].slice()]),b.push(x)}if(b.length===0){r.push(`Polygon ${n}: ${i.length} non-coplanar vertices, fan-triangulation produced no valid triangles, dropped`);continue}r.push(`Polygon ${n}: ${i.length} non-coplanar vertices, fan-triangulated to ${b.length} triangles`),l=b}}for(let u of l){let g=Dn(u,n,r);g&&t.push(g)}}return{polygons:t,warnings:r}}function Dn(e,t,r){let n={vertices:e.vertices},o=e.texture;if(typeof o=="string"&&o===""&&(o=void 0),e.color!==void 0&&o!==void 0&&Bn()&&r.push(`Polygon ${t}: color and texture both set; texture wins`),e.color!==void 0&&(ge(e.color)?n.color=e.color:(r.push(`Polygon ${t}: invalid color "${e.color}", replaced with ${Gt}`),n.color=Gt)),o!==void 0&&(n.texture=o),e.uvs!==void 0&&(!Array.isArray(e.uvs)||e.uvs.length!==e.vertices.length?r.push(`Polygon ${t}: uvs length ${Array.isArray(e.uvs)?e.uvs.length:"?"} != vertices length ${e.vertices.length}, uvs stripped`):n.uvs=e.uvs),e.data!==void 0&&e.data!==null&&typeof e.data=="object"){let i={},s=!1;for(let a of Object.keys(e.data)){let c=e.data[a];typeof c=="string"||typeof c=="number"||typeof c=="boolean"?i[a]=c:(s=!0,r.push(`Polygon ${t}: data["${a}"] has non-primitive value, key dropped`))}Object.keys(i).length>0&&(n.data=i)}return n}function mt(e){if(!e||e.length===0)return{min:[0,0,0],max:[0,0,0]};let t=1/0,r=1/0,n=1/0,o=-1/0,i=-1/0,s=-1/0,a=!1;for(let c of e)if(c?.vertices)for(let f of c.vertices)f&&(a=!0,f[0]<t&&(t=f[0]),f[0]>o&&(o=f[0]),f[1]<r&&(r=f[1]),f[1]>i&&(i=f[1]),f[2]<n&&(n=f[2]),f[2]>s&&(s=f[2]));return a?{min:[t,r,n],max:[o,i,s]}:{min:[0,0,0],max:[0,0,0]}}function jt(e){let t=e.polygons??[],r,n;if(e.skipNormalize)r=t,n=[];else{let a=_e(t);r=a.polygons,n=a.warnings}let o=mt(r),i=[o.max[0]-o.min[0],o.max[1]-o.min[1],o.max[2]-o.min[2]];return{context:{polygons:r,sceneBbox:o,warnings:n},dimensions:{sceneBbox:o,size:i},warnings:n}}function Xt(e){return!e.vertices||e.vertices.length<3?[]:[{v:e.vertices.map(t=>[t[0],t[1],t[2]]),color:e.color}]}function jn(e){let t=e[0],r=e[1],n=e[2],o=[r[0]-t[0],r[1]-t[1],r[2]-t[2]],i=[n[0]-t[0],n[1]-t[1],n[2]-t[2]],s=o[1]*i[2]-o[2]*i[1],a=o[2]*i[0]-o[0]*i[2],c=o[0]*i[1]-o[1]*i[0],f=Math.hypot(s,a,c);return f<=1e-9?null:[s/f,a/f,c/f]}function Xn(e){let t=0;for(let r=0;r<e.length;r++){let[n,o]=e[r],[i,s]=e[(r+1)%e.length];t+=n*s-i*o}return Math.abs(t)/2}function Yn(e,t,r){if(!e||e.length<3)return null;let n=e.map(a=>[a[1]*t,a[0]*t,a[2]*r]),o=jn(n);if(!o)return null;let i=1/0,s=0;for(let a=0;a<n.length;a++){let c=n[a],f=n[(a+1)%n.length],l=[f[0]-c[0],f[1]-c[1],f[2]-c[2]],u=l[0]*o[0]+l[1]*o[1]+l[2]*o[2],g=[l[0]-u*o[0],l[1]-u*o[1],l[2]-u*o[2]],m=Math.hypot(g[0],g[1],g[2]);if(m<=1e-9)continue;let p=[g[0]/m,g[1]/m,g[2]/m],h=[o[1]*p[2]-o[2]*p[1],o[2]*p[0]-o[0]*p[2],o[0]*p[1]-o[1]*p[0]],b=Math.hypot(h[0],h[1],h[2]);if(b<=1e-9)continue;let y=[h[0]/b,h[1]/b,h[2]/b],M=n.map(R=>{let F=R[0]-c[0],O=R[1]-c[1],z=R[2]-c[2];return[F*p[0]+O*p[1]+z*p[2],F*y[0]+O*y[1]+z*y[2]]}),C=1/0,v=1/0,x=-1/0,V=-1/0;for(let[R,F]of M)C=Math.min(C,R),v=Math.min(v,F),x=Math.max(x,R),V=Math.max(V,F);let I=x-C,S=V-v,E=Math.max(1,Math.ceil(I))*Math.max(1,Math.ceil(S)),U=Xn(M);U<=1e-9||E<i&&(i=E,s=U)}return!Number.isFinite(i)||s<=1e-9?null:{elementArea:i,polygonArea:s}}function Yt(e,t={}){let r=t.tileSize??100,n=t.layerElevation??r,o=t.texturedOnly??!0,i=0,s=0,a=0,c=0,f=0;for(let u of e){let g=!!u.texture;if(o&&!g)continue;let m=Yn(u.vertices,r,n);m&&(i+=1,g&&(s+=1),a+=m.elementArea,c+=m.polygonArea,f=Math.max(f,Math.max(0,m.elementArea-m.polygonArea)/m.elementArea))}let l=Math.max(0,a-c);return{totalPolygons:e.length,measuredPolygons:i,texturedPolygons:s,elementArea:a,polygonArea:c,transparentArea:l,transparentRatio:a>0?l/a:0,overdrawRatio:c>0?a/c:0,worstTransparentRatio:f}}function Ht(e,t,r,n){let o=t*Math.PI/180,i=r*Math.PI/180,s=n*Math.PI/180,[a,c,f]=e;if(s!==0){let l=Math.cos(s),u=Math.sin(s);[a,c]=[a*l-c*u,a*u+c*l]}if(i!==0){let l=Math.cos(i),u=Math.sin(i);[a,f]=[a*l+f*u,-a*u+f*l]}if(o!==0){let l=Math.cos(o),u=Math.sin(o);[c,f]=[c*l-f*u,c*u+f*l]}return[a,c,f]}function Wt(e,t){let r=-t[0]*Math.PI/180,n=-t[1]*Math.PI/180,o=-t[2]*Math.PI/180,[i,s,a]=e;if(r!==0){let c=Math.cos(r),f=Math.sin(r);[s,a]=[s*c-a*f,s*f+a*c]}if(n!==0){let c=Math.cos(n),f=Math.sin(n);[i,a]=[i*c+a*f,-i*f+a*c]}if(o!==0){let c=Math.cos(o),f=Math.sin(o);[i,s]=[i*c-s*f,i*f+s*c]}return[i,s,a]}var Jt=50;function Qt(e){if(typeof e=="number")return e===0?void 0:e<0?-1:1;if(typeof e=="boolean")return e?-1:1}var de={target:[0,0,0],rotX:65,rotY:45,zoom:.65,distance:0},Zt=100,Kt=1e4,Ae=e=>Math.round(e*Zt)/Zt,Hn=e=>Math.round(e*Kt)/Kt;function qt(e={}){let t={target:e.target??[...de.target],rotX:e.rotX??de.rotX,rotY:e.rotY??de.rotY,zoom:e.zoom??de.zoom,distance:e.distance??de.distance};function r(o){o.target!==void 0&&(t.target=[Ae(o.target[0]),Ae(o.target[1]),Ae(o.target[2])]),o.rotX!==void 0&&(t.rotX=Ae(o.rotX)),o.rotY!==void 0&&(t.rotY=Ae(o.rotY)),o.zoom!==void 0&&(t.zoom=Hn(o.zoom)),o.distance!==void 0&&(t.distance=Ae(o.distance))}function n(o={}){let s=(o.cols??0)*50,a=(o.rows??0)*50,[c,f,l]=t.target,u=f*50,g=c*50,m=l*50;return{transform:`${t.distance!==0?` translateZ(${-t.distance}px)`:""}scale(${t.zoom}) rotateX(${t.rotX}deg) rotate(${t.rotY}deg) translate3d(${-u}px, ${-g}px, ${-m}px)`,width:`${s}px`,height:`${a}px`}}return{state:t,update:r,getStyle:n}}var ue=(e,t)=>[e[0]-t[0],e[1]-t[1],e[2]-t[2]],$e=(e,t)=>[e[1]*t[2]-e[2]*t[1],e[2]*t[0]-e[0]*t[2],e[0]*t[1]-e[1]*t[0]],Ie=(e,t)=>e[0]*t[0]+e[1]*t[1]+e[2]*t[2],gt=e=>Math.hypot(e[0],e[1],e[2]),le=(e,t)=>e[0]===t[0]&&e[1]===t[1]&&e[2]===t[2];function Wn(e,t){let r=`${e[0]},${e[1]},${e[2]}`,n=`${t[0]},${t[1]},${t[2]}`;return r<n?`${r}|${n}`:`${n}|${r}`}function en(e){if(e.length<3)return null;let t=ue(e[1],e[0]),r=ue(e[2],e[0]),n=$e(t,r),o=gt(n);if(o<1e-12)return null;let i=[n[0]/o,n[1]/o,n[2]/o],s=Ie(i,e[0]);return{normal:i,d:s}}function Zn(e,t){return Ie(e.normal,t.normal)<1-.001?!1:Math.abs(e.d-t.d)<.05}function Kn(e,t){return Ie(e.normal,t.normal)<1-.001?!1:Math.abs(e.d-t.d)<.001}function Jn(e,t,r,n){let o=e.vertices.findIndex(S=>le(S,r)),i=e.vertices.findIndex(S=>le(S,n)),s=t.vertices.findIndex(S=>le(S,r)),a=t.vertices.findIndex(S=>le(S,n));if(o<0||i<0||s<0||a<0)return null;let c=e.vertices.length,f=t.vertices.length,l=(o+1)%c===i,u=(s+1)%f===a;if(l===u)return null;let g=l?i:o,m=l?o:i,p=u?a:s,h=u?s:a,b=!!(e.uvs&&t.uvs),y=[],M=b?[]:void 0,C=g;for(;y.push(e.vertices[C]),M&&M.push(e.uvs[C]),C!==m;)C=(C+1)%c;for(C=p;y.push(t.vertices[C]),M&&M.push(t.uvs[C]),C!==h;)C=(C+1)%f;let v=[],x=M?[]:void 0;for(let S=0;S<y.length;S++)(v.length===0||!le(y[S],v[v.length-1]))&&(v.push(y[S]),x&&M&&x.push(M[S]));if(v.length>1&&le(v[0],v[v.length-1])&&(v.pop(),x?.pop()),b)return nr(v,x);let V=[],I=x?[]:void 0;for(let S=0;S<v.length;S++){let E=v[(S-1+v.length)%v.length],U=v[S],R=v[(S+1)%v.length],F=$e(ue(U,E),ue(R,E));gt(F)>1e-9&&(V.push(U),I&&x&&I.push(x[S]))}return V.length<3?null:{vertices:V,uvs:I}}function Qn(e,t){let r=e.length,n=0;for(let o=0;o<r;o++){let i=e[o],s=e[(o+1)%r],a=e[(o+2)%r],c=ue(s,i),f=ue(a,s),l=Ie($e(c,f),t);if(Math.abs(l)<1e-9)continue;let u=l>0?1:-1;if(n===0)n=u;else if(u!==n)return!1}return!0}function qn(e){if(e.length<3)return!1;let t=en(e);if(!t)return!1;for(let r of e)if(Math.abs(Ie(t.normal,r)-t.d)>.001)return!1;return!0}function er(e){return e.map(t=>({vertices:t.vertices.map(r=>[...r]),uvs:t.uvs.map(r=>[...r])}))}function tr(e,t){let r=[];for(let n=1;n<e.length-1;n++)r.push({vertices:[[...e[0]],[...e[n]],[...e[n+1]]],uvs:[[...t[0]],[...t[n]],[...t[n+1]]]});return r}function nr(e,t){for(let r=0;r<e.length;r++){let n=e[r],o=e[(r+1)%e.length],i=e[(r+2)%e.length];if(!(gt($e(ue(o,n),ue(i,n)))<=1e-9))return r===0?{vertices:e,uvs:t}:{vertices:[...e.slice(r),...e.slice(0,r)],uvs:t?[...t.slice(r),...t.slice(0,r)]:void 0}}return{vertices:e,uvs:t}}function Ve(e){let t=[],r=[];for(let o of e??[]){if(!o||!o.vertices||o.vertices.length<3){o&&t.push(o);continue}let i=o.vertices.map(f=>[f[0],f[1],f[2]]),s=en(i);if(!s){t.push(o);continue}let a=o.texture&&o.uvs&&o.uvs.length===i.length?o.uvs.map(f=>[f[0],f[1]]):void 0,c=o.texture&&a?o.textureTriangles?.length?er(o.textureTriangles):tr(i,a):void 0;r.push({vertices:i,uvs:a,color:o.color??"#cccccc",texture:o.texture,textureTriangles:c,normal:s.normal,d:s.d,alive:!0,data:o.data})}let n=()=>{let o=new Map;for(let a=0;a<r.length;a++){let c=r[a];if(!c.alive)continue;let f=c.vertices.length;for(let l=0;l<f;l++){let u=c.vertices[l],g=c.vertices[(l+1)%f],m=Wn(u,g),p=o.get(m);p||(p=[],o.set(m,p)),p.push(a)}}let i=!1,s=(a,c)=>{for(let f=0;f<a.vertices.length;f++){let l=a.vertices[f],u=a.vertices[(f+1)%a.vertices.length];for(let g=0;g<c.vertices.length;g++){let m=c.vertices[g],p=c.vertices[(g+1)%c.vertices.length];if(le(l,p)&&le(u,m))return[l,u]}}return null};for(let[,a]of o){if(a.length<2)continue;let[c,f]=a;if(c===f)continue;let l=r[c],u=r[f];if(!l.alive||!u.alive||l.color!==u.color||l.texture!==u.texture)continue;let g=!!(l.texture||u.texture);if(g&&(!l.textureTriangles||!u.textureTriangles)||!!l.uvs!=!!u.uvs||(g?!Kn(l,u):!Zn(l,u)))continue;let m=s(l,u);if(!m)continue;let[p,h]=m,b=Jn(l,u,p,h);b&&(g&&!qn(b.vertices)||Qn(b.vertices,l.normal)&&(l.vertices=b.vertices,l.uvs=b.uvs,l.textureTriangles=g?[...l.textureTriangles??[],...u.textureTriangles??[]]:void 0,u.alive=!1,i=!0))}return i};for(;n(););for(let o of r){if(!o.alive)continue;let i={vertices:o.vertices,color:o.color};o.texture&&(i.texture=o.texture),o.uvs&&(i.uvs=o.uvs),o.textureTriangles?.length&&(i.textureTriangles=o.textureTriangles),o.data&&(i.data=o.data),t.push(i)}return t}var rr=4,or=8,ir=.001,sr=1e-9,cr=1e6,ar=1e6,pe=(e,t)=>[e[0]-t[0],e[1]-t[1],e[2]-t[2]],xt=(e,t)=>[e[0]+t[0],e[1]+t[1],e[2]+t[2]],Ee=(e,t)=>[e[0]*t,e[1]*t,e[2]*t],xe=(e,t)=>e[0]*t[0]+e[1]*t[1]+e[2]*t[2],sn=(e,t)=>[e[1]*t[2]-e[2]*t[1],e[2]*t[0]-e[0]*t[2],e[0]*t[1]-e[1]*t[0]],cn=e=>Math.hypot(e[0],e[1],e[2]);function Oe(e){let t=cn(e);return t<=sr?null:[e[0]/t,e[1]/t,e[2]/t]}function Te(e,t){return Math.round(e*t)/t}function se(e){return Te(e,cr)}function dt(e){return Te(e,ar)}function pt(e,t){return Math.abs(e[0]-t[0])<=1e-7&&Math.abs(e[1]-t[1])<=1e-7}function ce(e){return`${se(e[0])},${se(e[1])}`}function fr(e){let t=ce(e.a),r=ce(e.b);return t<r?`${t}|${r}`:`${r}|${t}`}function ve(e){return`${e[0]},${e[1]},${e[2]}`}function an(e,t){let r=ve(e),n=ve(t);return r<n?`${r}|${n}`:`${n}|${r}`}function ht(e){return e?Object.keys(e).sort().map(t=>`${t}:${String(e[t])}`).join("|"):""}function tn(e){return[e.color??"#cccccc",e.texture??"",e.uvs?"uv":"plain",ht(e.data)].join("|")}function fn(e){let t=e.vertices;if(!t||t.length<3)return null;let r=t[0],n=[0,0,0];for(let i=1;i<t.length-1;i++)n=xt(n,sn(pe(t[i],r),pe(t[i+1],r)));let o=Oe(n);return o?{normal:o,d:xe(o,r)}:null}function lr(e,t,r){return xe(e.normal,t.normal)>1-r&&Math.abs(e.d-t.d)<=r}function ur(e){return!e.texture&&!e.uvs&&!e.textureTriangles}function mr(e,t){let r=t[e[0]]?.data,n=ht(r);for(let o of e)if(ht(t[o].data)!==n)return;return r?{...r}:void 0}function gr(e,t){let r=e.map(c=>ur(c)?fn(c):null),n=r.map(Boolean),o=new Map;for(let c=0;c<e.length;c++){if(!r[c])continue;let f=e[c].vertices;for(let l=0;l<f.length;l++){let u=an(f[l],f[(l+1)%f.length]),g=o.get(u),m={polygon:c,edge:l};g?g.push(m):o.set(u,[m])}}let i=e.map(()=>new Set);for(let c of o.values())if(!(c.length<2))for(let f=0;f<c.length;f++)for(let l=f+1;l<c.length;l++){let u=c[f].polygon,g=c[l].polygon,m=r[u],p=r[g];!m||!p||tn(e[u])===tn(e[g])&&lr(m,p,t)&&(i[u].add(g),i[g].add(u))}let s=new Set,a=[];for(let c=0;c<e.length;c++){if(!n[c]||s.has(c))continue;let f=[],l=[c];for(s.add(c);l.length>0;){let u=l.shift();f.push(u);for(let g of i[u])s.has(g)||(s.add(g),l.push(g))}a.push(f)}return{groups:a}}function dr(e,t){let r=new Set(e),n=new Map;for(let i of e){let s=t[i].vertices;for(let a=0;a<s.length;a++){let c=an(s[a],s[(a+1)%s.length]),f=n.get(c),l={polygon:i,edge:a};f?f.push(l):n.set(c,[l])}}let o=[];for(let i of n.values()){let s=i.filter(a=>r.has(a.polygon));if(s.length===1){let a=s[0],c=t[a.polygon].vertices;o.push({a:c[a.edge],b:c[(a.edge+1)%c.length]})}else if(s.length!==2)return null}return o}function pr(e){let t=new Map;for(let r of e)t.set(ve(r.a),(t.get(ve(r.a))??0)+1),t.set(ve(r.b),(t.get(ve(r.b))??0)+1);for(let r of t.values())if(r%2!==0)return!1;return!0}function ln(e){let t=[e[0],e[1],e[2]],r=Math.abs(t[0])>=Math.abs(t[1])&&Math.abs(t[0])>=Math.abs(t[2])?0:Math.abs(t[1])>=Math.abs(t[2])?1:2;return t[r]<0?[-t[0],-t[1],-t[2]]:t}function xr(e){let t=ln(e);return`${Te(t[0],1e3)},${Te(t[1],1e3)},${Te(t[2],1e3)}`}function hr(e){let t=Math.abs(e[0])<.9?[1,0,0]:[0,1,0],r=pe(t,Ee(e,xe(t,e)));return Oe(r)??[1,0,0]}function br(e,t,r){let n=new Map;for(let i of e){let s=pe(i.b,i.a),a=pe(s,Ee(t,xe(s,t))),c=Oe(a);if(!c)continue;let f=ln(c),l=xr(f),u=cn(a),g=n.get(l);g?g.weight+=u:n.set(l,{axis:f,weight:u})}let o=[...n.values()].sort((i,s)=>s.weight-i.weight).slice(0,r).map(i=>i.axis);return o.length===0&&o.push(hr(t)),o}function nn(e,t,r,n){let o=pe(e,t);return[se(xe(o,r)),se(xe(o,n))]}function yr(e){let t=[...e].sort((n,o)=>n-o),r=[];for(let n of t)(r.length===0||Math.abs(n-r[r.length-1])>1e-7)&&r.push(n);return r}function Ce(e,t){let[r,n]=e.a,[o,i]=e.b,s=(t-r)/(o-r);return se(n+(i-n)*s)}function bt(e){let t=[];for(let n of e)(t.length===0||Math.abs(n[0]-t[t.length-1][0])>1e-7||Math.abs(n[1]-t[t.length-1][1])>1e-7)&&t.push(n);t.length>1&&Math.abs(t[0][0]-t[t.length-1][0])<=1e-7&&Math.abs(t[0][1]-t[t.length-1][1])<=1e-7&&t.pop();let r=[];for(let n=0;n<t.length;n++){let o=t[(n-1+t.length)%t.length],i=t[n],s=t[(n+1)%t.length],a=(i[0]-o[0])*(s[1]-i[1])-(i[1]-o[1])*(s[0]-i[0]);Math.abs(a)>1e-8&&r.push(i)}return r}function Fe(e){let t=0;for(let r=0;r<e.length;r++){let n=e[r],o=e[(r+1)%e.length];t+=n[0]*o[1]-o[0]*n[1]}return t/2}function rn(e){let t=1/0,r=1/0,n=-1/0,o=-1/0;for(let[i,s]of e)t=Math.min(t,i),r=Math.min(r,s),n=Math.max(n,i),o=Math.max(o,s);return{minX:t,minY:r,maxX:n,maxY:o}}function Pr(e,t){let r=rn(e),n=rn(t);return!(r.maxX<n.minX-1e-7||n.maxX<r.minX-1e-7||r.maxY<n.minY-1e-7||n.maxY<r.minY-1e-7)}function ze(e){return Math.abs(Fe(e))}function Ar(e){if(e.length<3)return!1;let t=0;for(let r=0;r<e.length;r++){let n=e[r],o=e[(r+1)%e.length],i=e[(r+2)%e.length],s=(o[0]-n[0])*(i[1]-o[1])-(o[1]-n[1])*(i[0]-o[0]);if(Math.abs(s)<=1e-8)continue;let a=s>0?1:-1;if(t===0)t=a;else if(t!==a)return!1}return!0}function Vr(e,t,r){let n=r[0]-t[0],o=r[1]-t[1],i=e[0]-t[0],s=e[1]-t[1],a=n*s-o*i,c=Math.hypot(n,o);if(c<=1e-9||Math.abs(a)>Math.max(1e-8,c*1e-8))return!1;let f=i*n+s*o;return f>=-1e-8&&f<=n*n+o*o+1e-8}function vr(e,t,r){let n=r[0]-t[0],o=r[1]-t[1],i=n*n+o*o;return i<=1e-12?0:((e[0]-t[0])*n+(e[1]-t[1])*o)/i}function on(e,t){let r=[];for(let n=0;n<e.length;n++){let o=e[n],i=e[(n+1)%e.length],s=[{t:0,point:o},{t:1,point:i}];for(let c of t)pt(c,o)||pt(c,i)||Vr(c,o,i)&&s.push({t:vr(c,o,i),point:c});s.sort((c,f)=>c.t-f.t);let a=[];for(let c of s)a.some(f=>Math.abs(f.t-c.t)<=1e-8||pt(f.point,c.point))||a.push(c);for(let c=0;c<a.length-1;c++){let f=a[c].point,l=a[c+1].point;Math.hypot(l[0]-f[0],l[1]-f[1])<=1e-8||r.push({a:[se(f[0]),se(f[1])],b:[se(l[0]),se(l[1])]})}}return r}function Mr(e,t){if(!Pr(e,t))return null;let r=[...on(e,t),...on(t,e)],n=new Map;for(let h of r){let b=fr(h),y=n.get(b);y?y.push(h):n.set(b,[h])}let o=!1,i=[];for(let h of n.values()){if(h.length===1){i.push(h[0]);continue}o=!0;let b=h.filter(M=>ce(M.a)<ce(M.b)).length,y=h.length-b;if(b!==y)return null}if(!o||i.length<3)return null;let s=new Map;for(let h of i){let b=ce(h.a);if(s.has(b))return null;s.set(b,h)}let a=i[0],c=ce(a.a),f=[],l=new Set,u=c;for(let h=0;h<=i.length;h++){let b=s.get(u);if(!b)return null;let y=`${ce(b.a)}>${ce(b.b)}`;if(l.has(y))return null;if(l.add(y),f.push(b.a),u=ce(b.b),u===c)break}if(u!==c||l.size!==i.length)return null;let g=bt(f);if(g.length<3||!Ar(g))return null;let m=ze(g),p=ze(e)+ze(t);return Math.abs(m-p)>Math.max(1e-5,p*1e-5)?null:Fe(g)>=0?g:[...g].reverse()}function wr(e){let t=e.map(bt).filter(n=>n.length>=3&&ze(n)>1e-8),r=!0;for(;r;){r=!1;for(let n=0;n<t.length;n++){for(let o=n+1;o<t.length;o++){let i=Mr(t[n],t[o]);if(i){t[n]=i,t.splice(o,1),r=!0;break}}if(r)break}}return t}function Sr(e,t,r){let n=new Map;return o=>{let i=se(o[0]),s=se(o[1]),a=`${i},${s}`,c=n.get(a);if(c)return[c[0],c[1],c[2]];let f=xt(e,xt(Ee(t,i),Ee(r,s))),l=[dt(f[0]),dt(f[1]),dt(f[2])];return n.set(a,l),[l[0],l[1],l[2]]}}function Ir(e,t,r,n,o){let i=r[0]?.a;if(!i)return null;let s=Oe(pe(o,Ee(n,xe(o,n))));if(!s)return null;let a=Oe(sn(n,s));if(!a)return null;let c=[],f=[];for(let b of r){let y=nn(b.a,i,s,a),M=nn(b.b,i,s,a);Math.hypot(y[0]-M[0],y[1]-M[1])<=1e-7||(c.push({a:y,b:M}),f.push(y[0],M[0]))}let l=yr(f);if(c.length<3||l.length<2)return null;let u=t[e[0]].color,g=mr(e,t),m=[];for(let b=0;b<l.length-1;b++){let y=l[b],M=l[b+1];if(M-y<=1e-7)continue;let C=(y+M)/2,v=c.filter(x=>{let V=Math.min(x.a[0],x.b[0]),I=Math.max(x.a[0],x.b[0]);return V<C&&C<I&&Math.abs(x.a[0]-x.b[0])>1e-7}).map(x=>({segment:x,yMid:Ce(x,C)})).sort((x,V)=>x.yMid-V.yMid);if(v.length!==0){if(v.length%2!==0)return null;for(let x=0;x<v.length;x+=2){let V=v[x].segment,I=v[x+1].segment,S=Ce(V,y),E=Ce(V,M),U=Ce(I,y),R=Ce(I,M),F=bt([[y,S],[M,E],[M,R],[y,U]]);if(F.length<3||Math.abs(Fe(F))<=1e-8)continue;let O=Fe(F)>0?F:[...F].reverse();m.push(O)}}}if(m.length===0)return null;let p=Sr(i,s,a),h=wr(m).map(b=>({vertices:b.map(p),...u?{color:u}:{},...g?{data:g}:{}}));return Ve(h)}function Cr(e,t,r){let n=dr(e,t);if(!n||n.length<3||!pr(n))return null;let o=fn(t[e[0]]);if(!o)return null;let i=null;for(let s of br(n,o.normal,r)){let a=Ir(e,t,n,o.normal,s);a&&(!i||a.length<i.length)&&(i=a)}return!i||i.length>=e.length?null:i}function un(e,t={}){let r=t.minGroupPolygons??rr,n=t.maxCandidateAxes??or,o=t.planeEpsilon??ir,i=e??[];if(i.length<r)return i;let{groups:s}=gr(i,o);if(s.length===0)return i;let a=new Map,c=new Set;for(let l of s){if(l.length<r)continue;let u=Cr(l,i,n);if(u){a.set(l[0],u);for(let g of l)c.add(g)}}if(a.size===0)return i;let f=[];for(let l=0;l<i.length;l++){let u=a.get(l);if(u){f.push(...u);continue}c.has(l)||f.push(i[l])}return f}function Tr(e){let t=e.vertices;if(!t||t.length<3)return null;let r=0,n=0,o=0;for(let[O,z,L]of t)r+=O,n+=z,o+=L;let i=1/t.length;r*=i,n*=i,o*=i;let s=t[0],a=t[1],c=t[2],f=a[0]-s[0],l=a[1]-s[1],u=a[2]-s[2],g=c[0]-s[0],m=c[1]-s[1],p=c[2]-s[2],h=l*p-u*m,b=u*g-f*p,y=f*m-l*g,M=Math.hypot(h,b,y);if(M<1e-9)return null;h/=M,b/=M,y/=M;let C=t.length-2,v=new Float64Array(C*9),x=0;for(let O=1;O<t.length-1;O++){let z=t[0],L=t[O],_=t[O+1];v[x++]=z[0],v[x++]=z[1],v[x++]=z[2],v[x++]=L[0],v[x++]=L[1],v[x++]=L[2],v[x++]=_[0],v[x++]=_[1],v[x++]=_[2]}let V=0,I=1/0,S=1/0,E=1/0,U=-1/0,R=-1/0,F=-1/0;for(let[O,z,L]of t){let _=O-r,T=z-n,P=L-o,d=_*_+T*T+P*P;d>V&&(V=d),O<I&&(I=O),O>U&&(U=O),z<S&&(S=z),z>R&&(R=z),L<E&&(E=L),L>F&&(F=L)}return{centroid:[r,n,o],normal:[h,b,y],vertices:t,triFlat:v,bcx:r,bcy:n,bcz:o,br2:V,minX:I,minY:S,minZ:E,maxX:U,maxY:R,maxZ:F}}function Er(e,t,r,n,o,i,s,a){let c=s[a],f=s[a+1],l=s[a+2],u=s[a+3]-c,g=s[a+4]-f,m=s[a+5]-l,p=s[a+6]-c,h=s[a+7]-f,b=s[a+8]-l,y=o*b-i*h,M=i*p-n*b,C=n*h-o*p,v=u*y+g*M+m*C;if(v>-1e-9&&v<1e-9)return!1;let x=1/v,V=e-c,I=t-f,S=r-l,E=x*(V*y+I*M+S*C);if(E<0||E>1)return!1;let U=I*m-S*g,R=S*u-V*m,F=V*g-I*u,O=x*(n*U+o*R+i*F);return O<0||E+O>1?!1:x*(p*U+h*R+b*F)>.001}function Or(e,t,r,n,o,i,s){let a=s.bcx-e,c=s.bcy-t,f=s.bcz-r,l=a*n+c*o+f*i,u=a-l*n,g=c-l*o,m=f-l*i;if(u*u+g*g+m*m>s.br2)return!1;let p=s.triFlat,h=p.length;for(let b=0;b<h;b+=9)if(Er(e,t,r,n,o,i,p,b))return!0;return!1}var Re=9,Rr=6,ee=12;function yt(e,t,r,n,o,i){let s=n-e,a=o-t,c=i-r;return s*a+a*c+c*s}function Lr(e){let t=[];for(let V=0;V<e.length;V++)e[V]&&t.push(V);let r=t.length,n=new Int32Array(r);for(let V=0;V<r;V++)n[V]=t[V];let o=new Float64Array(r),i=new Float64Array(r),s=new Float64Array(r);for(let V=0;V<r;V++){let I=e[n[V]];o[V]=(I.minX+I.maxX)*.5,i[V]=(I.minY+I.maxY)*.5,s[V]=(I.minZ+I.maxZ)*.5}let a=2*Math.max(1,r)+1,c=new Float64Array(a*Re),f=0,l=new Float64Array(ee),u=new Float64Array(ee),g=new Float64Array(ee),m=new Float64Array(ee),p=new Float64Array(ee),h=new Float64Array(ee),b=new Int32Array(ee),y=new Float64Array(ee-1),M=new Int32Array(ee-1),C=new Float64Array(ee-1),v=new Int32Array(ee-1);function x(V,I){let S=f++,E=S*Re,U=I-V,R=1/0,F=1/0,O=1/0,z=-1/0,L=-1/0,_=-1/0;for(let B=V;B<I;B++){let Y=e[n[B]];Y.minX<R&&(R=Y.minX),Y.maxX>z&&(z=Y.maxX),Y.minY<F&&(F=Y.minY),Y.maxY>L&&(L=Y.maxY),Y.minZ<O&&(O=Y.minZ),Y.maxZ>_&&(_=Y.maxZ)}if(c[E]=R,c[E+1]=F,c[E+2]=O,c[E+3]=z,c[E+4]=L,c[E+5]=_,U<=Rr)return c[E+6]=1,c[E+7]=V,c[E+8]=I,S;let T=1/0,P=1/0,d=1/0,A=-1/0,w=-1/0,N=-1/0;for(let B=V;B<I;B++)o[B]<T&&(T=o[B]),o[B]>A&&(A=o[B]),i[B]<P&&(P=i[B]),i[B]>w&&(w=i[B]),s[B]<d&&(d=s[B]),s[B]>N&&(N=s[B]);let k=A-T,G=w-P,$=N-d;if(k===0&&G===0&&$===0)return c[E+6]=1,c[E+7]=V,c[E+8]=I,S;let X=yt(R,F,O,z,L,_),H=X>0?1/X:0,Z=U+1,K=0,q=0;for(let B=0;B<3;B++){let Y=B===0?T:B===1?P:d,re=B===0?k:B===1?G:$;if(re===0)continue;let ae=B===0?o:B===1?i:s,me=ee/re;l.fill(1/0),u.fill(1/0),g.fill(1/0),m.fill(-1/0),p.fill(-1/0),h.fill(-1/0),b.fill(0);for(let D=V;D<I;D++){let j=(ae[D]-Y)*me|0;j>=ee&&(j=ee-1);let oe=e[n[D]];oe.minX<l[j]&&(l[j]=oe.minX),oe.maxX>m[j]&&(m[j]=oe.maxX),oe.minY<u[j]&&(u[j]=oe.minY),oe.maxY>p[j]&&(p[j]=oe.maxY),oe.minZ<g[j]&&(g[j]=oe.minZ),oe.maxZ>h[j]&&(h[j]=oe.maxZ),b[j]++}let ye=1/0,Pe=1/0,Je=1/0,Qe=-1/0,qe=-1/0,et=-1/0,Rt=0;for(let D=0;D<ee-1;D++)l[D]<ye&&(ye=l[D]),m[D]>Qe&&(Qe=m[D]),u[D]<Pe&&(Pe=u[D]),p[D]>qe&&(qe=p[D]),g[D]<Je&&(Je=g[D]),h[D]>et&&(et=h[D]),Rt+=b[D],y[D]=yt(ye,Pe,Je,Qe,qe,et),M[D]=Rt;let tt=1/0,nt=1/0,rt=1/0,ot=-1/0,it=-1/0,st=-1/0,Lt=0;for(let D=ee-2;D>=0;D--){let j=D+1;l[j]<tt&&(tt=l[j]),m[j]>ot&&(ot=m[j]),u[j]<nt&&(nt=u[j]),p[j]>it&&(it=p[j]),g[j]<rt&&(rt=g[j]),h[j]>st&&(st=h[j]),Lt+=b[j],C[D]=yt(tt,nt,rt,ot,it,st),v[D]=Lt}for(let D=0;D<ee-1;D++){if(M[D]===0||v[D]===0)continue;let j=.125+(y[D]*M[D]+C[D]*v[D])*H;j<Z&&(Z=j,K=B,q=Y+(D+1)/me)}}let ne=K===0?o:K===1?i:s,J=V,Q=I-1;for(;J<=Q;)if(ne[J]<q)J++;else{let B=n[J];n[J]=n[Q],n[Q]=B;let Y=o[J];o[J]=o[Q],o[Q]=Y;let re=i[J];i[J]=i[Q],i[Q]=re;let ae=s[J];s[J]=s[Q],s[Q]=ae,Q--}let ie=J;(ie===V||ie===I)&&(ie=V+I>>1),c[E+6]=0;let te=x(V,ie),W=x(ie,I);return c[S*Re+7]=te,c[S*Re+8]=W,S}return r>0&&x(0,r),{data:c,nodeCount:f,polyIndices:n,meta:e}}function mn(e,t,r,n,o,i,s,a,c){if(a.nodeCount===0)return!1;let{data:f,polyIndices:l,meta:u}=a,g=n!==0?1/n:n>=0?1/0:-1/0,m=o!==0?1/o:o>=0?1/0:-1/0,p=i!==0?1/i:i>=0?1/0:-1/0,h=0;for(c[h++]=0;h>0;){let y=c[--h]*Re,M=(f[y]-e)*g,C=(f[y+3]-e)*g,v=M<C?M:C,x=M<C?C:M,V=(f[y+1]-t)*m,I=(f[y+4]-t)*m,S=V<I?V:I,E=V<I?I:V;if(v>E||S>x)continue;S>v&&(v=S),E<x&&(x=E);let U=(f[y+2]-r)*p,R=(f[y+5]-r)*p,F=U<R?U:R,O=U<R?R:U;if(!(v>O||F>x)&&(O<x&&(x=O),!(x<.001)))if(f[y+6]===1){let z=f[y+7]|0,L=f[y+8]|0;for(let _=z;_<L;_++){let T=l[_];if(T===s)continue;let P=u[T];if(P&&Or(e,t,r,n,o,i,P))return!0}}else c[h++]=f[y+7]|0,c[h++]=f[y+8]|0}return!1}function kr(e){let t=(1+Math.sqrt(5))/2,r=new Float64Array(e*3);for(let n=0;n<e;n++){let o=(n+.5)/e,i=Math.sqrt(Math.max(0,1-o*o)),s=2*Math.PI*(n/t);r[n*3]=i*Math.cos(s),r[n*3+1]=i*Math.sin(s),r[n*3+2]=o}return r}function Ur(e){let t=Math.abs(e[0])>.9?0:1,r=Math.abs(e[0])>.9?1:0,n=r*e[2],o=-t*e[2],i=t*e[1]-r*e[0],s=Math.hypot(n,o,i);n/=s,o/=s,i/=s;let a=e[1]*i-e[2]*o,c=e[2]*n-e[0]*i,f=e[0]*o-e[1]*n;return{ux:n,uy:o,uz:i,vx:a,vy:c,vz:f}}function Ge(e,t){let r=t?.samples??8;if(e.length<4||r<1)return e;let n=e.map(Tr),o=kr(r),i=[],s=Lr(n),a=new Int32Array(Math.max(64,s.nodeCount)),c=192,f=new Float64Array(c);for(let l=0;l<e.length;l++){let u=n[l];if(!u){i.push(e[l]);continue}let g=u.normal[0],m=u.normal[1],p=u.normal[2],h=.001*g,b=.001*m,y=.001*p;{let L=u.centroid[0]+h,_=u.centroid[1]+b,T=u.centroid[2]+y;if(!mn(L,_,T,g,m,p,l,s,a)){i.push(e[l]);continue}}let{ux:M,uy:C,uz:v,vx:x,vy:V,vz:I}=Ur(u.normal),S=u.centroid[0],E=u.centroid[1],U=u.centroid[2],R=u.vertices,F=R.length,O=0;f[O++]=S+h,f[O++]=E+b,f[O++]=U+y;for(let L=0;L<F;L++){let _=R[L];f[O++]=_[0]+(S-_[0])*.08+h,f[O++]=_[1]+(E-_[1])*.08+b,f[O++]=_[2]+(U-_[2])*.08+y}for(let L=0;L<F;L++){let _=R[L],T=R[(L+1)%F],P=(_[0]+T[0])*.5,d=(_[1]+T[1])*.5,A=(_[2]+T[2])*.5;f[O++]=P+(S-P)*.08+h,f[O++]=d+(E-d)*.08+b,f[O++]=A+(U-A)*.08+y}let z=!1;e:for(let L=0;L<o.length;L+=3){let _=o[L],T=o[L+1],P=o[L+2],d=_*M+T*x+P*g,A=_*C+T*V+P*m,w=_*v+T*I+P*p;for(let N=0;N<O;N+=3){let k=f[N],G=f[N+1],$=f[N+2];if(!mn(k,G,$,d,A,w,l,s,a)){z=!0;break e}}}z&&i.push(e[l])}return i}function Pt(e,t,r,n,o){let i=(p,h,b)=>{let y=[0,0,0];return y[e]=p,y[(e+1)%3]=h,y[(e+2)%3]=b,y},s=i(t,-n,-n),a=i(t,n,-n),c=i(t,n,n),f=i(t,-n,n),l=i(r,-n,-n),u=i(r,n,-n),g=i(r,n,n),m=i(r,-n,n);return[{vertices:[s,a,c,f],color:o},{vertices:[l,u,g,m],color:o},{vertices:[s,a,u,l],color:o},{vertices:[a,c,g,u],color:o},{vertices:[c,f,m,g],color:o},{vertices:[f,s,l,m],color:o}]}function At(e={}){let t=e.size??5,r=e.thickness??.025,n=e.negative??!1,o=e.xColor??"#ff3a3a",i=e.yColor??"#3aff3a",s=e.zColor??"#3a8aff",a=t*r/2,c=n?-t:0;return[...Pt(0,c,t,a,o),...Pt(1,c,t,a,i),...Pt(2,c,t,a,s)]}function gn(e,t,r,n){let o=[0,0,0];return o[e]=t,o[(e+1)%3]=r,o[(e+2)%3]=n,o}function Nr(e,t,r,n,o){let i=(p,h,b)=>gn(e,p,h,b),s=i(t,-n,-n),a=i(t,n,-n),c=i(t,n,n),f=i(t,-n,n),l=i(r,-n,-n),u=i(r,n,-n),g=i(r,n,n),m=i(r,-n,n);return[{vertices:[s,a,c,f],color:o},{vertices:[l,u,g,m],color:o},{vertices:[s,a,u,l],color:o},{vertices:[a,c,g,u],color:o},{vertices:[c,f,m,g],color:o},{vertices:[f,s,l,m],color:o}]}function _r(e,t,r,n,o){let i=(u,g,m)=>gn(e,u,g,m),s=i(t,-n,-n),a=i(t,n,-n),c=i(t,n,n),f=i(t,-n,n),l=i(r,0,0);return[{vertices:[s,a,c,f],color:o},{vertices:[s,a,l],color:o},{vertices:[a,c,l],color:o},{vertices:[c,f,l],color:o},{vertices:[f,s,l],color:o}]}function $r(e){return e.map(t=>({...t,vertices:[...t.vertices].reverse()}))}function Vt(e){let t=e.axis,r=e.sign??1,n=e.shaftLength??4,o=e.shaftHalfThickness??.05,i=e.headLength??.8,s=e.headHalfThickness??.2,a=e.color??"#ffffff",c=n*r,f=Math.min(0,c),l=Math.max(0,c),u=c,g=(n+i)*r,m=_r(t,u,g,s,a);return[...Nr(t,f,l,o,a),...r===-1?$r(m):m]}function Be(e,t,r){let n=[0,0,0],o=(e+1)%3,i=(e+2)%3;return n[o]=Math.cos(r)*t,n[i]=Math.sin(r)*t,n}function vt(e){let t=e.axis,r=e.radius,n=e.halfThickness??Math.max(.05,r*.04),o=e.segments??32,i=e.color??"#ffffff",s=r-n,a=r+n,c=[];for(let f=0;f<o;f++){let l=f/o*Math.PI*2,u=(f+1)/o*Math.PI*2,g=Be(t,s,l),m=Be(t,s,u),p=Be(t,a,l),h=Be(t,a,u);c.push({vertices:[g,p,h,m],color:i})}return c}function Mt(e){let{center:t,size:r,color:n="#ffffff"}=e,[o,i,s]=t,a=[[o+r,i,s],[o-r,i,s],[o,i+r,s],[o,i-r,s],[o,i,s+r],[o,i,s-r]];return[[0,2,4],[2,1,4],[1,3,4],[3,0,4],[2,0,5],[1,2,5],[3,1,5],[0,3,5]].map(f=>({vertices:[a[f[0]],a[f[1]],a[f[2]]],color:n}))}var dn=2200,pn=2201,xn=2202;function zr(e,t){let r=0,n=1,o=1,i=2201,s=1/0,a=0,c=!1,f=null,l=!0,u=!1,g={clampWhenFinished:!1,get timeScale(){return o},set timeScale(m){o=m},get weight(){return n},set weight(m){n=m},get time(){return r},set time(m){r=m},get isRunning(){return c},get enabled(){return l},set enabled(m){l=m},get paused(){return u},set paused(m){u=m},play(){return c=!0,g},stop(){return c=!1,r=0,a=0,f=null,g},reset(){return r=0,a=0,g},fadeIn(m){return f={from:0,to:1,elapsed:0,duration:m},n=0,g},fadeOut(m){return f={from:n,to:0,elapsed:0,duration:m},g},crossFadeTo(m,p){return g.fadeOut(p),m.fadeIn(p),g},crossFadeFrom(m,p){return m.fadeOut(p),g.fadeIn(p),g},setLoop(m,p){return i=m,s=p,g},setEffectiveTimeScale(m){return o=m,g},setEffectiveWeight(m){return n=m,g}};return g._internal={get clip(){return e},get time(){return r},get weight(){return n},get enabled(){return l},get paused(){return u},get running(){return c},get loopMode(){return i},get repetitions(){return s},get completedReps(){return a},set completedReps(m){a=m},get clampWhenFinished(){return g.clampWhenFinished},get timeScale(){return o},get fade(){return f},advance(m){if(!c)return;if(f){f.elapsed+=m;let h=f.duration>0?Math.min(f.elapsed/f.duration,1):1;if(n=f.from+(f.to-f.from)*h,h>=1&&(n=f.to,f=null,n<=0)){c=!1;return}}if(u)return;let p=e.duration;if(!(p<=0)){if(r+=m*o,i===2200)r>=p&&(r=g.clampWhenFinished?p:0,c=!1);else if(i===2201){if(r>=p){let h=r%p,b=Math.floor(r/p);a+=b,r=h,s!==1/0&&a>=s&&(r=g.clampWhenFinished?p:0,c=!1)}}else if(p>0){let h=p*2,b=r%h;if(r>=h){let y=Math.floor(r/h);a+=y,s!==1/0&&a>=s?(r=g.clampWhenFinished?p:0,c=!1):r=b}}}},sampleTime(){if(i===2202){let m=e.duration,p=m*2,h=r%p;return h<=m?h:p-h}return r}},g}function Fr(e){return e._internal}function wt(e,t){return typeof t=="number"?e[t]:e.find(r=>r.name===t)}function hn(e,t){let r=new Map;function n(f){let l=wt(t.clips,f);if(!l)throw new Error(`PolyAnimationMixer: no clip found for key "${f}". Available: ${t.clips.map(g=>g.name).join(", ")}`);let u=r.get(l.index);return u||(u=zr(l,t),r.set(l.index,u)),u}function o(f){let l=wt(t.clips,f);return l?r.get(l.index)??null:null}function i(f){let l=[];for(let h of r.values()){let b=Fr(h);b.advance(f),b.running&&b.enabled&&l.push({internal:b,clip:b.clip})}if(l.length===0)return;if(l.length===1){let{internal:h,clip:b}=l[0],y=t.sample(b.name,h.sampleTime());e.setPolygons(y);return}let u=0;for(let{internal:h}of l)u+=h.weight;if(u<=0)return;let g=l.map(({internal:h,clip:b})=>({polygons:t.sample(b.name,h.sampleTime()),weight:h.weight/u})),m=g[0].polygons;if(m.length===0)return;let p=m.map((h,b)=>{let y=h.vertices.map((M,C)=>{let v=0,x=0,V=0;for(let{polygons:I,weight:S}of g){let E=I[b];if(!E)continue;let U=E.vertices[C];U&&(v+=U[0]*S,x+=U[1]*S,V+=U[2]*S)}return[v,x,V]});return{...h,vertices:y}});e.setPolygons(p)}function s(){for(let f of r.values())f.stop()}function a(f){let l=wt(t.clips,f);l&&r.delete(l.index)}function c(){r.clear()}return{clipAction:n,existingAction:o,update:i,stopAllAction:s,uncacheClip:a,uncacheRoot:c}}var Gr=/^[0-9A-Fa-f]{6}$/,Br=["#3b82f6","#ef4444","#22c55e","#eab308","#a855f7","#06b6d4","#f97316","#ec4899"];function De(e,t){let r=t?.targetSize??60,n=t?.gridShift??1,o=t?.defaultColor??"#888888",i=t?.palette??Br,s=t?.materialColors??{},a=t?.materialTextures??{},c=[],f=[],l=[],u=[],g=new Map,m=o,p,h=t?.includeObjects?new Set(t.includeObjects):null,b=t?.excludeObjects?new Set(t.excludeObjects):null,y=null,M=()=>y===null?h===null:!(h&&!h.has(y)||b&&b.has(y)),C=T=>T in s?s[T]:Gr.test(T)?`#${T}`:(g.has(T)||(g.set(T,i[u.length%i.length]),u.push(T)),g.get(T)),v=e.split(`
2
- `);for(let T of v)if(!(T.length===0||T.charCodeAt(0)===35)){if(T.startsWith("v ")){let P=T.trim().split(/\s+/);c.push([parseFloat(P[1]),parseFloat(P[2]),parseFloat(P[3])])}else if(T.startsWith("vt ")){let P=T.trim().split(/\s+/);f.push([parseFloat(P[1]),parseFloat(P[2])])}else if(T.startsWith("o "))y=T.trim().slice(2).trim();else if(T.startsWith("usemtl ")){let P=T.trim().split(/\s+/)[1];m=C(P),p=a[P]}else if(T.startsWith("f ")){if(!M())continue;let P=T.trim().split(/\s+/).slice(1),d=[],A=[];for(let w of P){let N=w.split("/");d.push(parseInt(N[0],10)-1);let k=N[1];if(k&&k.length>0){let G=parseInt(k,10)-1;A.push(Number.isFinite(G)?G:null)}else A.push(null)}l.push({idx:d,uvIdx:A,color:m,texture:p})}}if(c.length===0||l.length===0)return Dr(u,e.length);let x=new Set;for(let T of l)for(let P of T.idx)x.add(P);let V=1/0,I=1/0,S=1/0,E=-1/0,U=-1/0,R=-1/0;for(let T of x){let P=c[T];P&&(P[0]<V&&(V=P[0]),P[0]>E&&(E=P[0]),P[1]<I&&(I=P[1]),P[1]>U&&(U=P[1]),P[2]<S&&(S=P[2]),P[2]>R&&(R=P[2]))}let F=Math.max(E-V,U-I,R-S),O=F>0?r/F:1,z=T=>Math.round(T*1e3)/1e3,L=c.map(([T,P,d])=>[z((d-S)*O+n),z((T-V)*O+n),z((P-I)*O+n)]),_=[];for(let{idx:T,uvIdx:P,color:d,texture:A}of l)for(let w=1;w<T.length-1;w++){let N=T[0],k=T[w],G=T[w+1],$=L[N],X=L[k],H=L[G];if(!$||!X||!H||$[0]===X[0]&&$[1]===X[1]&&$[2]===X[2]||$[0]===H[0]&&$[1]===H[1]&&$[2]===H[2]||X[0]===H[0]&&X[1]===H[1]&&X[2]===H[2])continue;let Z;if(A){let q=P[0],ne=P[w],J=P[w+1];if(q!=null&&ne!=null&&J!=null){let Q=f[q],ie=f[ne],te=f[J];Q&&ie&&te&&(Z=[Q,ie,te])}}let K={vertices:[$,X,H],color:d};A&&(K.texture=A),Z&&(K.uvs=Z),_.push(K)}return{polygons:_,objectUrls:[],dispose:()=>{},warnings:[],metadata:{triangleCount:_.length,materials:u,sourceBytes:e.length}}}function Dr(e,t){return{polygons:[],objectUrls:[],dispose:()=>{},warnings:[],metadata:{triangleCount:0,materials:e,sourceBytes:t}}}var St=e=>Math.round(Math.max(0,Math.min(1,e))*255).toString(16).padStart(2,"0");function je(e){let t={},r={},n=null;for(let o of e.split(`
3
- `)){let i=o.trim();if(!(i.length===0||i.charCodeAt(0)===35)){if(i.startsWith("newmtl ")){n=i.slice(7).trim();continue}if(n){if(i.startsWith("Kd ")){let s=i.split(/\s+/),a=parseFloat(s[1]),c=parseFloat(s[2]),f=parseFloat(s[3]);Number.isFinite(a)&&Number.isFinite(c)&&Number.isFinite(f)&&(t[n]=`#${St(a)}${St(c)}${St(f)}`)}else if(i.startsWith("map_Kd ")){let s=i.split(/\s+/),a=s[s.length-1]?.replace(/\\+/g,"/");a&&a!=="map_Kd"&&(r[n]=a)}}}}return{colors:t,textures:r}}var Vn={5120:1,5121:1,5122:2,5123:2,5125:4,5126:4},vn={SCALAR:1,VEC2:2,VEC3:3,VEC4:4,MAT2:4,MAT3:9,MAT4:16};function Mn(e){let t=globalThis.TextDecoder;return new t().decode(e)}function jr(e){let t=e.indexOf(",");if(t<0)throw new Error("parseGltf: malformed data: URI");let r=e.slice(5,t),n=e.slice(t+1);if(!r.includes(";base64")){let s=decodeURIComponent(n),a=new Uint8Array(s.length);for(let c=0;c<s.length;c++)a[c]=s.charCodeAt(c)&255;return a}let o=globalThis.atob(n),i=new Uint8Array(o.length);for(let s=0;s<o.length;s++)i[s]=o.charCodeAt(s);return i}function Xr(e,t){let r=e.buffers?.[0];if(!r)throw new Error("parseGltf: JSON doc has no buffers[0]");let n=r.uri;if(!n)throw new Error("parseGltf: JSON doc buffer has no uri (and there's no GLB BIN chunk)");if(n.startsWith("data:"))return jr(n);if(t){let o=t(n);if(o instanceof Uint8Array)return o;throw new Error("parseGltf: resolveBuffer returned a Promise; use parseGltf via async if your buffers are external")}throw new Error(`parseGltf: external buffer URI "${n}" \u2014 provide options.resolveBuffer`)}function Yr(e){let t=new DataView(e);if(t.getUint32(0,!0)!==1179937895)throw new Error("parseGltf: not a GLB (bad magic)");let r=t.getUint32(4,!0);if(r!==2)throw new Error(`parseGltf: only glTF v2 supported (got v${r})`);let n=12,o=null,i=null;for(;n<e.byteLength;){let s=t.getUint32(n,!0),a=t.getUint32(n+4,!0),c=n+8;if(a===1313821514){let f=new Uint8Array(e,c,s);o=JSON.parse(Mn(f))}else a===5130562&&(i=new Uint8Array(e,c,s));n=c+s}if(!o)throw new Error("parseGltf: no JSON chunk in GLB");return{doc:o,bin:i}}function It(e,t,r){let n=e.accessors?.[r],o=e.bufferViews?.[n?.bufferView??-1];if(!n||!o)throw new Error(`parseGltf: bad accessor/bufferView ${r}`);let i=Vn[n.componentType],s=vn[n.type];if(!i||!s)throw new Error(`parseGltf: unsupported accessor type ${n.type}/${n.componentType}`);let a=(o.byteOffset??0)+(n.byteOffset??0),c=n.count*s,f=t.buffer.slice(t.byteOffset+a,t.byteOffset+a+c*i),l;switch(n.componentType){case 5126:l=new Float32Array(f);break;case 5123:l=new Uint16Array(f);break;case 5125:l=new Uint32Array(f);break;case 5121:l=new Uint8Array(f);break;default:throw new Error(`parseGltf: unhandled componentType ${n.componentType}`)}return{array:l,count:n.count,componentCount:s}}function Hr(e,t,r){switch(r){case 5120:return e.getInt8(t);case 5121:return e.getUint8(t);case 5122:return e.getInt16(t,!0);case 5123:return e.getUint16(t,!0);case 5125:return e.getUint32(t,!0);case 5126:return e.getFloat32(t,!0);default:throw new Error(`parseGltf: unhandled componentType ${r}`)}}function Wr(e,t){switch(t){case 5120:return Math.max(e/127,-1);case 5121:return e/255;case 5122:return Math.max(e/32767,-1);case 5123:return e/65535;default:return e}}function He(e,t,r){let n=e.accessors?.[r],o=e.bufferViews?.[n?.bufferView??-1];if(!n||!o)throw new Error(`parseGltf: bad accessor/bufferView ${r}`);let i=Vn[n.componentType],s=vn[n.type];if(!i||!s)throw new Error(`parseGltf: unsupported accessor type ${n.type}/${n.componentType}`);let a=t.byteOffset+(o.byteOffset??0)+(n.byteOffset??0),c=o.byteStride??i*s,f=new DataView(t.buffer),l=new Array(n.count*s),u=0;for(let g=0;g<n.count;g++){let m=a+g*c;for(let p=0;p<s;p++){let h=Hr(f,m+p*i,n.componentType);l[u++]=n.normalized?Wr(h,n.componentType):h}}return{values:l,count:n.count,componentCount:s}}function Zr(e,t,r){let n=[],o=[],i=globalThis;for(let s of e.images??[]){if(s.uri){if(r&&!s.uri.startsWith("data:"))try{n.push(new i.URL(s.uri,r).href)}catch{n.push(s.uri)}else n.push(s.uri);continue}if(s.bufferView!==void 0){let a=e.bufferViews?.[s.bufferView];if(!a){n.push("");continue}let c=a.byteOffset??0,f=t.subarray(c,c+a.byteLength),l=s.mimeType??"image/png",u=new i.Blob([f],{type:l}),g=i.URL.createObjectURL(u);n.push(g),o.push(g)}else n.push("")}return{urls:n,objectUrls:o}}function Kr(e,t){let r=new Map,n=e.materials??[];for(let o=0;o<n.length;o++){let i=n[o].pbrMetallicRoughness?.baseColorTexture?.index;if(i===void 0)continue;let s=e.textures?.[i]?.source;if(s===void 0)continue;let a=t[s];a&&r.set(o,a)}return r}function Jr(e,t){let r=e?.pbrMetallicRoughness?.baseColorFactor;if(!r||r.length<3)return t;let n=o=>Math.round(Math.max(0,Math.min(1,o))*255).toString(16).padStart(2,"0");return`#${n(r[0])}${n(r[1])}${n(r[2])}`}var Me=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];function Ct(e,t){let r=new Array(16);for(let n=0;n<4;n++)for(let o=0;o<4;o++)r[o*4+n]=e[0+n]*t[o*4+0]+e[4+n]*t[o*4+1]+e[8+n]*t[o*4+2]+e[12+n]*t[o*4+3];return r}function Ye(e,t){return[e[0]*t[0]+e[4]*t[1]+e[8]*t[2]+e[12],e[1]*t[0]+e[5]*t[1]+e[9]*t[2]+e[13],e[2]*t[0]+e[6]*t[1]+e[10]*t[2]+e[14]]}function wn(e,t,r){let n=e?.[0]??0,o=e?.[1]??0,i=e?.[2]??0,s=t?.[0]??0,a=t?.[1]??0,c=t?.[2]??0,f=t?.[3]??1,l=r?.[0]??1,u=r?.[1]??1,g=r?.[2]??1,m=s+s,p=a+a,h=c+c,b=s*m,y=s*p,M=s*h,C=a*p,v=a*h,x=c*h,V=f*m,I=f*p,S=f*h;return[(1-(C+x))*l,(y+S)*l,(M-I)*l,0,(y-S)*u,(1-(b+x))*u,(v+V)*u,0,(M+I)*g,(v-V)*g,(1-(b+C))*g,0,n,o,i,1]}function Qr(e){return e.matrix&&e.matrix.length===16?e.matrix.slice():wn(e.translation,e.rotation,e.scale)}function qr(e,t){return[e[0]+t[0],e[1]+t[1],e[2]+t[2]]}function bn(e,t){return[e[0]*t,e[1]*t,e[2]*t]}function Sn(e,t,r){let n=new Array(Math.min(e.length,t.length));for(let o=0;o<n.length;o++)n[o]=e[o]+(t[o]-e[o])*r;return n}function Le(e){let t=Math.hypot(e[0]??0,e[1]??0,e[2]??0,e[3]??1)||1;return[(e[0]??0)/t,(e[1]??0)/t,(e[2]??0)/t,(e[3]??1)/t]}function eo(e,t,r){let n=Le(e),o=Le(t),i=n[0]*o[0]+n[1]*o[1]+n[2]*o[2]+n[3]*o[3];if(i<0&&(i=-i,o=[-o[0],-o[1],-o[2],-o[3]]),i>.9995)return Le(Sn(n,o,r));let s=Math.acos(Math.max(-1,Math.min(1,i))),a=Math.sin(s),c=Math.sin((1-r)*s)/a,f=Math.sin(r*s)/a;return Le([n[0]*c+o[0]*f,n[1]*c+o[1]*f,n[2]*c+o[2]*f,n[3]*c+o[3]*f])}function to(e){return{translation:e?.translation?.slice()??[0,0,0],rotation:e?.rotation?.slice()??[0,0,0,1],scale:e?.scale?.slice()??[1,1,1],matrix:e?.matrix&&e.matrix.length===16?e.matrix.slice():void 0}}function yn(e){return e.matrix?e.matrix.slice():wn(e.translation,e.rotation,e.scale)}function no(e){let t=e.scene??0,r=e.scenes?.[t]?.nodes;return r&&r.length>0?r:[]}function Pn(e,t){let r=e.nodes??[],n=new Array(r.length),o=new Set,i=(a,c)=>{if(a<0||a>=r.length)return;let f=Ct(c,t[a]??Me);n[a]=f,o.add(a);for(let l of r[a].children??[])i(l,f)},s=no(e);if(s.length>0)for(let a of s)i(a,Me);for(let a=0;a<r.length;a++)o.has(a)||i(a,Me);return n}function An(e,t,r,n,o){if(r===void 0)return;let{values:i,count:s,componentCount:a}=He(e,t,r);if(s!==o||a<1)return;let c=[];for(let f=0;f<s;f++){let l=[];for(let u=0;u<n;u++)l.push(i[f*a+u]??0);c.push(l)}return c}function ro(e,t,r,n){if(r===void 0)return Array.from({length:n},()=>Me.slice());let{values:o,componentCount:i,count:s}=He(e,t,r);if(i!==16)throw new Error(`parseGltf: inverseBindMatrices accessor ${r} is not MAT4`);let a=[];for(let c=0;c<n;c++){let f=Math.min(c,s-1);a.push(o.slice(f*16,f*16+16))}return a}function Xe(e,t){let r=e.componentCount,n=e.interpolation==="CUBICSPLINE"?(t*3+1)*r:t*r;return e.output.slice(n,n+r)}function oo(e,t,r){let n=e.input;if(n.length===0)return[];if(n.length===1||t<=n[0])return Xe(e,0);let o=n.length-1;if(t>=n[o])return Xe(e,o);let i=0,s=o;for(;i+1<s;){let g=i+s>>1;n[g]<=t?i=g:s=g}let a=n[i],c=n[i+1],f=c>a?(t-a)/(c-a):0,l=Xe(e,i),u=Xe(e,i+1);return e.interpolation==="STEP"?l:r==="rotation"?eo(l,u,f):Sn(l,u,f)}function io(e,t,r,n){let o=e.animations??[];if(o.length===0||r.length===0)return;let i=(e.nodes??[]).map(m=>to(m)),s=i.map(yn),a=Pn(e,s),c=(e.skins??[]).map(m=>({joints:m.joints??[],inverseBindMatrices:ro(e,t,m.inverseBindMatrices,m.joints?.length??0)})),f=[];for(let m=0;m<o.length;m++){let p=o[m],h=(p.samplers??[]).map(M=>{let C=He(e,t,M.input),v=He(e,t,M.output);return{input:C.values,output:v.values,componentCount:v.componentCount,interpolation:M.interpolation??"LINEAR"}}),b=[];for(let M of p.channels??[]){let C=M.target.node,v=M.target.path,x=h[M.sampler];C===void 0||!v||!x||v==="weights"||b.push({sampler:x,targetNode:C,path:v})}let y=b.reduce((M,C)=>{let v=C.sampler.input;return Math.max(M,v[v.length-1]??0)},0);f.push({info:{index:m,name:p.name??`animation_${m}`,duration:y,channelCount:b.length},channels:b})}let l=f.map(m=>m.info);if(l.length===0)return;let u=(m,p,h,b,y,M)=>{let C=n(m),v=n(p),x=n(h);if(C[0]===v[0]&&C[1]===v[1]&&C[2]===v[2]||C[0]===x[0]&&C[1]===x[1]&&C[2]===x[2]||v[0]===x[0]&&v[1]===x[1]&&v[2]===x[2])return null;let V={vertices:[C,v,x],color:b};return y&&(V.texture=y),M&&(V.uvs=M),V};return{clips:l,sample:(m,p)=>{let h=typeof m=="number"?f[m]:f.find(x=>x.info.name===m);if(!h)return[];let b=h.info.duration,y=b>0?(p%b+b)%b:Math.max(0,p),M=i.map(x=>({translation:x.translation.slice(),rotation:x.rotation.slice(),scale:x.scale.slice(),matrix:x.matrix?x.matrix.slice():void 0}));for(let x of h.channels){let V=M[x.targetNode];if(!V)continue;let I=oo(x.sampler,y,x.path);V.matrix=void 0,x.path==="translation"?V.translation=I.slice(0,3):x.path==="rotation"?V.rotation=Le(I.slice(0,4)):x.path==="scale"&&(V.scale=I.slice(0,3))}let C=Pn(e,M.map(yn)),v=[];for(let x of r){let V=[];if(x.skinIndex!==void 0&&x.joints&&x.weights&&c[x.skinIndex]){let I=c[x.skinIndex];for(let S=0;S<x.positions.length;S++){let E=x.positions[S],U=[0,0,0],R=0,F=x.joints[S]??[],O=x.weights[S]??[];for(let z=0;z<4;z++){let L=O[z]??0;if(L<=0)continue;let _=Math.round(F[z]??0),T=I.joints[_],P=C[T],d=I.inverseBindMatrices[_];if(!P||!d)continue;let A=Ct(P,d);U=qr(U,bn(Ye(A,E),L)),R+=L}V.push(R>0?bn(U,1/R):Ye(x.meshBindWorld,E))}}else{let I=x.meshNode!==null?C[x.meshNode]??x.meshBindWorld:x.meshBindWorld;for(let S of x.positions)V.push(Ye(I,S))}for(let I=0;I+2<x.indices.length;I+=3){let S=x.indices[I],E=x.indices[I+1],U=x.indices[I+2],R=V[S],F=V[E],O=V[U];if(!R||!F||!O)continue;let z;if(x.uvs&&x.texture){let _=x.uvs[S],T=x.uvs[E],P=x.uvs[U];_&&T&&P&&(z=[_,T,P])}let L=u(R,F,O,x.color,x.texture,z);L&&v.push(L)}}return v}}}function We(e,t){let r=t?.targetSize??60,n=t?.gridShift??1,o=t?.defaultColor??"#888888",i=t?.materialColors??{},s=e instanceof Uint8Array?e.buffer.slice(e.byteOffset,e.byteOffset+e.byteLength):e,a=s.byteLength,c,f;if(s.byteLength>=4&&new DataView(s).getUint32(0,!0)===1179937895){let d=Yr(s);if(c=d.doc,!d.bin)throw new Error("parseGltf: GLB has no binary chunk");f=d.bin}else c=JSON.parse(Mn(new Uint8Array(s))),f=Xr(c,t?.resolveBuffer);let{urls:l,objectUrls:u}=Zr(c,f,t?.baseUrl),g=Kr(c,l),m=[],p=[],h=(c.meshes??[]).map((d,A)=>d.name??`mesh_${A}`),b=(c.materials??[]).map((d,A)=>d.name??`material_${A}`);function y(d,A,w){let N=c.meshes?.[d];if(N)for(let k of N.primitives){if((k.mode??4)!==4)continue;let $=k.material!==void 0?c.materials?.[k.material]?.name:void 0,H=($?i[$]:void 0)??Jr(k.material!==void 0?c.materials?.[k.material]:void 0,o),Z=k.material!==void 0?g.get(k.material):void 0,{array:K,count:q}=It(c,f,k.attributes.POSITION);if(!(K instanceof Float32Array))continue;let ne=[],J=[];for(let W=0;W<q;W++){let B=[K[W*3],K[W*3+1],K[W*3+2]];ne.push(B),J.push(Ye(A,B))}let Q=null,ie=k.attributes.TEXCOORD_0;if(Z&&ie!==void 0){let{array:W,count:B}=It(c,f,ie);Q=[];let Y=1;W instanceof Uint8Array?Y=1/255:W instanceof Uint16Array&&(Y=1/65535);for(let re=0;re<B;re++){let ae=W[re*2]*Y,me=W[re*2+1]*Y;Q.push([ae,1-me])}}let te;if(k.indices!==void 0){let{array:W,count:B}=It(c,f,k.indices);te=[];for(let Y=0;Y<B;Y++)te.push(Number(W[Y]))}else te=J.map((W,B)=>B);if((c.animations?.length??0)>0){let W=An(c,f,k.attributes.JOINTS_0,4,q),B=An(c,f,k.attributes.WEIGHTS_0,4,q);p.push({meshNode:w,meshBindWorld:A,skinIndex:w!==null?c.nodes?.[w]?.skin:void 0,positions:ne,indices:te,color:H,texture:Z,uvs:Q??void 0,joints:W,weights:B})}for(let W=0;W+2<te.length;W+=3){let B=J[te[W]],Y=J[te[W+1]],re=J[te[W+2]];if(!B||!Y||!re)continue;let ae;if(Q&&Z){let me=Q[te[W]],ye=Q[te[W+1]],Pe=Q[te[W+2]];me&&ye&&Pe&&(ae=[me,ye,Pe])}m.push({v0:B,v1:Y,v2:re,color:H,texture:Z,uvs:ae})}}}function M(d,A){let w=c.nodes?.[d];if(!w)return;let N=Ct(A,Qr(w));typeof w.mesh=="number"&&y(w.mesh,N,d);for(let k of w.children??[])M(k,N)}let C=c.scene??0,v=c.scenes?.[C]?.nodes;if(v&&v.length>0)for(let d of v)M(d,Me);else for(let d=0;d<(c.meshes?.length??0);d++)y(d,Me,null);let x=so(u);if(m.length===0)return{polygons:[],objectUrls:u,dispose:x,warnings:[],metadata:{triangleCount:0,meshes:h,materials:b,sourceBytes:a}};let V=1/0,I=1/0,S=1/0,E=-1/0,U=-1/0,R=-1/0;for(let d of m)for(let A of[d.v0,d.v1,d.v2])A[0]<V&&(V=A[0]),A[0]>E&&(E=A[0]),A[1]<I&&(I=A[1]),A[1]>U&&(U=A[1]),A[2]<S&&(S=A[2]),A[2]>R&&(R=A[2]);let F=Math.max(E-V,U-I,R-S),O=F>0?r/F:1,z=d=>Math.round(d*1e3)/1e3,_=(t?.upAxis??"y")==="z"?([d,A,w])=>[z((d-V)*O+n),z((A-I)*O+n),z((w-S)*O+n)]:([d,A,w])=>[z((w-S)*O+n),z((d-V)*O+n),z((A-I)*O+n)],T=io(c,f,p,_),P=[];for(let d of m){let A=_(d.v0),w=_(d.v1),N=_(d.v2);if(A[0]===w[0]&&A[1]===w[1]&&A[2]===w[2]||A[0]===N[0]&&A[1]===N[1]&&A[2]===N[2]||w[0]===N[0]&&w[1]===N[1]&&w[2]===N[2])continue;let k={vertices:[A,w,N],color:d.color};d.texture&&(k.texture=d.texture),d.uvs&&(k.uvs=d.uvs),P.push(k)}return{polygons:P,animation:T,objectUrls:u,dispose:x,warnings:[],metadata:{triangleCount:P.length,meshes:h,materials:b,animations:T?.clips,sourceBytes:a}}}function so(e){let t=!1;return()=>{if(t)return;t=!0;let r=globalThis.URL;if(r?.revokeObjectURL)for(let n of e)try{r.revokeObjectURL(n)}catch{}}}function Tt(e){return e.material?.texture??e.texture}function co(){let e=globalThis;return typeof e.Image!="function"||typeof e.document?.createElement!="function"?null:{Image:e.Image,createCanvas(){return e.document.createElement("canvas")}}}function ao(e,t){return new Promise((r,n)=>{let o=new t,i=!1,s=a=>{i||(i=!0,a())};o.decoding="async",o.onload=()=>s(()=>r(o)),o.onerror=()=>s(()=>n(new Error(`texture load failed: ${e}`))),o.src=e,typeof o.decode=="function"&&o.decode().then(()=>s(()=>r(o)),()=>{})})}async function fo(e,t,r){try{let n=await ao(e,t.Image),o=Math.max(0,Math.floor(n.naturalWidth||n.width||0)),i=Math.max(0,Math.floor(n.naturalHeight||n.height||0));if(o<=0||i<=0||o*i>r)return null;let s=t.createCanvas();s.width=o,s.height=i;let a=s.getContext("2d",{willReadFrequently:!0});return a?(a.drawImage(n,0,0,o,i),{width:o,height:i,data:a.getImageData(0,0,o,i).data}):null}catch{return null}}function In(e,t,r){return Math.max(t,Math.min(r,e))}function lo(e,t){let r=t[0],n=1-t[1];if(!Number.isFinite(r)||!Number.isFinite(n))return null;let o=In(Math.floor(r*e.width),0,e.width-1),s=(In(Math.floor(n*e.height),0,e.height-1)*e.width+o)*4;return{r:e.data[s]??0,g:e.data[s+1]??0,b:e.data[s+2]??0,a:e.data[s+3]??255}}function he(e,t,r,n,o,i){return[e[0]*n+t[0]*o+r[0]*i,e[1]*n+t[1]*o+r[1]*i]}function uo(e){let[t,r,n]=e;return[he(t,r,n,1/3,1/3,1/3),he(t,r,n,.8,.1,.1),he(t,r,n,.1,.8,.1),he(t,r,n,.1,.1,.8),he(t,r,n,.45,.45,.1),he(t,r,n,.45,.1,.45),he(t,r,n,.1,.45,.45)]}function Cn(e){if(e.textureTriangles?.length)return e.textureTriangles;let t=e.uvs;if(!t||t.length!==e.vertices.length||t.length<3)return[];let r=[];for(let n=1;n+1<t.length;n++)r.push({uvs:[t[0],t[n],t[n+1]]});return r}function mo(e,t,r){return Math.abs(e.r-t.r)<=r&&Math.abs(e.g-t.g)<=r&&Math.abs(e.b-t.b)<=r&&Math.abs(e.a-t.a)<=r}function go(e){let t=n=>Math.round(Math.max(0,Math.min(255,n))).toString(16).padStart(2,"0");if(e.a>=255)return`#${t(e.r)}${t(e.g)}${t(e.b)}`;let r=Math.round(Math.max(0,Math.min(255,e.a))/255*1e3)/1e3;return`rgba(${Math.round(e.r)}, ${Math.round(e.g)}, ${Math.round(e.b)}, ${r})`}function po(e,t,r){let n=Cn(e);if(n.length===0)return null;let o=null;for(let i of n)for(let s of uo(i.uvs)){let a=lo(t,s);if(!a)return null;if(!o)o=a;else if(!mo(o,a,r))return null}return o?go(o):null}function xo(e,t){let{texture:r,material:n,uvs:o,textureTriangles:i,...s}=e;return{...s,color:t}}async function Tn(e,t={}){if(t.enabled===!1)return null;let r=co();if(!r)return null;let n=e.filter(a=>Tt(a)&&Cn(a).length>0);if(n.length===0)return null;let o=t.maxTexturePixels??16777216,i=new Map;await Promise.all(Array.from(new Set(n.map(a=>Tt(a)))).map(async a=>{i.set(a,await fo(a,r,o))}));let s=t.colorTolerance??2;return{bake(a){let c=!1,f=a.map(l=>{let u=Tt(l);if(!u)return l;let g=i.get(u);if(!g)return l;let m=po(l,g,s);return m?(c=!0,xo(l,m)):l});return{polygons:c?f:a,changed:c}}}}async function En(e,t={}){let r=await Tn(e,t);return r?r.bake(e).polygons:e}async function Ze(e,t={}){let r=await Tn(e.polygons,t);if(!r)return e;let n=r.bake(e.polygons);return!n.changed&&!e.animation?e:{...e,polygons:n.polygons,animation:e.animation?{...e.animation,sample(o,i){return r.bake(e.animation.sample(o,i)).polygons}}:e.animation}}var ho=[0,4294967295,4291624959,4288282623,4284940287,4281597951,4278255615,4294954239,4291611903,4288269567,4284927231,4281584895,4278242559,4294941183,4291598847,4288256511,4284914175,4281571839,4278229503,4294928127,4291585791,4288243455,4284901119,4281558783,4278216447,4294915071,4291572735,4288230399,4284888063,4281545727,4278203391,4294902015,4291559679,4288217343,4284875007,4281532671,4278190335,4294967244,4291624908,4288282572,4284940236,4281597900,4278255564,4294954188,4291611852,4288269516,4284927180,4281584844,4278242508,4294941132,4291598796,4288256460,4284914124,4281571788,4278229452,4294928076,4291585740,4288243404,4284901068,4281558732,4278216396,4294915020,4291572684,4288230348,4284888012,4281545676,4278203340,4294901964,4291559628,4288217292,4284874956,4281532620,4278190284,4294967193,4291624857,4288282521,4284940185,4281597849,4278255513,4294954137,4291611801,4288269465,4284927129,4281584793,4278242457,4294941081,4291598745,4288256409,4284914073,4281571737,4278229401,4294928025,4291585689,4288243353,4284901017,4281558681,4278216345,4294914969,4291572633,4288230297,4284887961,4281545625,4278203289,4294901913,4291559577,4288217241,4284874905,4281532569,4278190233,4294967142,4291624806,4288282470,4284940134,4281597798,4278255462,4294954086,4291611750,4288269414,4284927078,4281584742,4278242406,4294941030,4291598694,4288256358,4284914022,4281571686,4278229350,4294927974,4291585638,4288243302,4284900966,4281558630,4278216294,4294914918,4291572582,4288230246,4284887910,4281545574,4278203238,4294901862,4291559526,4288217190,4284874854,4281532518,4278190182,4294967091,4291624755,4288282419,4284940083,4281597747,4278255411,4294954035,4291611699,4288269363,4284927027,4281584691,4278242355,4294940979,4291598643,4288256307,4284913971,4281571635,4278229299,4294927923,4291585587,4288243251,4284900915,4281558579,4278216243,4294914867,4291572531,4288230195,4284887859,4281545523,4278203187,4294901811,4291559475,4288217139,4284874803,4281532467,4278190131,4294967040,4291624704,4288282368,4284940032,4281597696,4278255360,4294953984,4291611648,4288269312,4284926976,4281584640,4278242304,4294940928,4291598592,4288256256,4284913920,4281571584,4278229248,4294927872,4291585536,4288243200,4284900864,4281558528,4278216192,4294914816,4291572480,4288230144,4284887808,4281545472,4278203136,4294901760,4291559424,4288217088,4284874752,4281532416,4278190318,4278190301,4278190267,4278190250,4278190216,4278190199,4278190165,4278190148,4278190114,4278190097,4278251008,4278246656,4278237952,4278233600,4278224896,4278220544,4278211840,4278207488,4278198784,4278194432,4293787648,4292673536,4290445312,4289331200,4287102976,4285988864,4283760640,4282646528,4280418304,4279304192,4293848814,4292730333,4290493371,4289374890,4287137928,4286019447,4283782485,4282664004,4280427042,4279308561];function bo(e){let t=e>>0&255,r=e>>8&255,n=e>>16&255;return[t,r,n]}function Et(e){return(e&255).toString(16).padStart(2,"0")}function On(e,t,r){return`#${Et(e)}${Et(t)}${Et(r)}`}var yo=542658390;function Ke(e,t){let r=t?.targetSize??60,n=t?.gridShift??0,o=e.byteLength;if(e.byteLength<8)return we(o,["parseVox: buffer too small to be a valid .vox file"]);let i=new DataView(e);if(i.getUint32(0,!0)!==yo)return we(o,["parseVox: not a .vox file (bad magic)"]);if(e.byteLength<20)return we(o,["parseVox: buffer too small for MAIN chunk"]);if(Rn(i,8)!=="MAIN")return we(o,["parseVox: expected MAIN chunk at offset 8"]);let f=20+i.getUint32(12,!0),l=f+i.getUint32(16,!0),u=[],g=[],m=null;for(;f<l&&f+12<=e.byteLength;){let P=Rn(i,f),d=i.getUint32(f+4,!0),A=i.getUint32(f+8,!0),w=f+12,N=w+d+A;if(P==="SIZE"){if(d>=12&&w+12<=e.byteLength){let k=i.getUint32(w,!0),G=i.getUint32(w+4,!0),$=i.getUint32(w+8,!0);u.push({sx:k,sy:G,sz:$})}}else if(P==="XYZI"){if(d>=4&&w+4<=e.byteLength){let k=i.getUint32(w,!0),G=[],$=Math.min(k,Math.floor((d-4)/4));for(let X=0;X<$;X++){let H=w+4+X*4;G.push({x:i.getUint8(H),y:i.getUint8(H+1),z:i.getUint8(H+2),colorIndex:i.getUint8(H+3)})}g.push(G)}}else if(P==="RGBA"&&d>=1024&&w+1024<=e.byteLength){m=[];for(let k=0;k<256;k++){let G=w+k*4,$=i.getUint8(G),X=i.getUint8(G+1),H=i.getUint8(G+2);m.push(On($,X,H))}}f=N}let p=[],h=new Set;for(let P of g)for(let d of P){if(d.colorIndex===0)continue;let A=`${d.x},${d.y},${d.z}`;h.has(A)||(h.add(A),p.push(d))}if(p.length===0)return we(o,[]);let b=P=>{let d=P-1;if(m!==null)return m[d]??"#888888";let A=ho[P]??0,[w,N,k]=bo(A);return On(w,N,k)},y=(P,d,A)=>h.has(`${P},${d},${A}`),M=new Map,C=(P,d,A,w,N)=>{let k=`${P}:${d}:${N}`,G=M.get(k);G||(G=new Set,M.set(k,G)),G.add(`${A},${w}`)};for(let P of p){let{x:d,y:A,z:w}=P,N=b(P.colorIndex);y(d+1,A,w)||C(0,d+1,A,w,N),y(d-1,A,w)||C(1,d,A,w,N),y(d,A+1,w)||C(2,A+1,d,w,N),y(d,A-1,w)||C(3,A,d,w,N),y(d,A,w+1)||C(4,w+1,d,A,N),y(d,A,w-1)||C(5,w,d,A,N)}function v(P){let d=new Set,A=[],w=1/0,N=-1/0,k=1/0,G=-1/0;for(let $ of P){let[X,H]=$.split(","),Z=+X,K=+H;Z<w&&(w=Z),Z>N&&(N=Z),K<k&&(k=K),K>G&&(G=K)}for(let $=k;$<=G;$++)for(let X=w;X<=N;X++){let H=`${X},${$}`;if(!P.has(H)||d.has(H))continue;let Z=1;for(;X+Z<=N;){let q=`${X+Z},${$}`;if(!P.has(q)||d.has(q))break;Z++}let K=1;e:for(;$+K<=G;){for(let q=0;q<Z;q++){let ne=`${X+q},${$+K}`;if(!P.has(ne)||d.has(ne))break e}K++}for(let q=0;q<K;q++)for(let ne=0;ne<Z;ne++)d.add(`${X+ne},${$+q}`);A.push({u:X,v:$,w:Z,h:K})}return A}let x=(P,d,A,w,N,k)=>{let G=A+N,$=w+k;switch(P){case 0:return[[d,A,w],[d,G,w],[d,G,$],[d,A,$]];case 1:return[[d,G,w],[d,A,w],[d,A,$],[d,G,$]];case 2:return[[A,d,w],[A,d,$],[G,d,$],[G,d,w]];case 3:return[[G,d,w],[G,d,$],[A,d,$],[A,d,w]];case 4:return[[A,w,d],[G,w,d],[G,$,d],[A,$,d]];default:return[[A,$,d],[G,$,d],[G,w,d],[A,w,d]]}},V=[];for(let[P,d]of M){let A=P.indexOf(":"),w=P.indexOf(":",A+1),N=+P.slice(0,A),k=+P.slice(A+1,w),G=P.slice(w+1);for(let{u:$,v:X,w:H,h:Z}of v(d))V.push({vertices:x(N,k,$,X,H,Z),color:G})}if(V.length===0)return we(o,[]);let I=1/0,S=1/0,E=1/0,U=-1/0,R=-1/0,F=-1/0;for(let P of V)for(let d of P.vertices)d[0]<I&&(I=d[0]),d[0]>U&&(U=d[0]),d[1]<S&&(S=d[1]),d[1]>R&&(R=d[1]),d[2]<E&&(E=d[2]),d[2]>F&&(F=d[2]);let O=Math.max(U-I,R-S,F-E),z=O>0?r/O:1,L=P=>Math.round(P*1e3)/1e3,_=P=>[L((P[0]-I)*z+n),L((P[1]-S)*z+n),L((P[2]-E)*z+n)],T=V.map(({vertices:P,color:d})=>({vertices:P.map(_),color:d}));return{polygons:T,objectUrls:[],dispose:()=>{},warnings:[],metadata:{triangleCount:T.length,sourceBytes:o,voxelCount:p.length}}}function Rn(e,t){return String.fromCharCode(e.getUint8(t))+String.fromCharCode(e.getUint8(t+1))+String.fromCharCode(e.getUint8(t+2))+String.fromCharCode(e.getUint8(t+3))}function we(e,t){return{polygons:[],objectUrls:[],dispose:()=>{},warnings:t,metadata:{triangleCount:0,sourceBytes:e}}}var be="loadMesh";function Ot(e){let t=Ge(e.polygons),r=Ve(t);return r.length===e.polygons.length?e:{...e,polygons:r}}async function Ln(e,t){let r=t?.solidTextureSamples;return r===!1?e:Ze(e,typeof r=="object"?r:void 0)}function Po(e){let t=e.split("?")[0].split("#")[0],r=t.lastIndexOf(".");return r<0?"":t.slice(r+1).toLowerCase()}async function kn(e,t){let r=Po(e);if(r==="mtl")throw new Error(`${be}: .mtl is a material file, not a mesh \u2014 use parseMtl directly`);let n=globalThis.fetch;if(!n)throw new Error(`${be}: no fetch() in this environment`);let o=t?.baseUrl??e;if(r==="obj"){let i=await n(e);if(!i.ok)throw new Error(`${be}: ${e} \u2192 ${i.status}`);let s=await i.text(),a=t?.objOptions;if(t?.mtlUrl){let f=await n(t.mtlUrl);if(!f.ok)throw new Error(`${be}: ${t.mtlUrl} \u2192 ${f.status}`);let l=await f.text(),{colors:u,textures:g}=je(l),m={},p=globalThis.URL,h=globalThis.document?.baseURI,b=t.mtlUrl;if(p&&h)try{b=new p(t.mtlUrl,h).toString()}catch{}for(let[y,M]of Object.entries(g)){if(p)try{m[y]=new p(M,b).toString();continue}catch{}let C=t.mtlUrl.lastIndexOf("/"),v=C>=0?t.mtlUrl.slice(0,C+1):"";m[y]=M.startsWith("/")||/^https?:\/\//.test(M)?M:v+M}a={...a??{},materialColors:{...u,...a?.materialColors??{}},materialTextures:{...m,...a?.materialTextures??{}}}}let c=De(s,a);return Ot(await Ln(c,t))}if(r==="glb"||r==="gltf"){let i=await n(e);if(!i.ok)throw new Error(`${be}: ${e} \u2192 ${i.status}`);let s=await i.arrayBuffer(),a=We(s,{baseUrl:o,...t?.gltfOptions??{}});return Ot(await Ln(a,t))}if(r==="vox"){let i=await n(e);if(!i.ok)throw new Error(`${be}: ${e} \u2192 ${i.status}`);let s=await i.arrayBuffer();return Ot(Ke(s,t?.voxOptions))}throw new Error(`${be}: unsupported extension ".${r}" (supported: obj, glb, gltf, vox)`)}0&&(module.exports={BASE_TILE,DEFAULT_CAMERA_STATE,DEFAULT_PROJECTION,LoopOnce,LoopPingPong,LoopRepeat,arrowPolygons,axesHelperPolygons,bakeSolidTextureSampledPolygons,bakeSolidTextureSamples,buildSceneContext,clampChannel,computeSceneBbox,computeShapeLighting,computeTexturePaintMetrics,coverPlanarPolygons,createIsometricCamera,createPolyAnimationMixer,cullInteriorPolygons,formatColor,inverseRotateVec3,loadMesh,mergePolygons,normalizeInvertMultiplier,normalizePolygons,octahedronPolygons,parseColor,parseGltf,parseHexColor,parseMtl,parseObj,parsePureColor,parseRgbColor,parseVox,polygonFaces,ringPolygons,rotateVec3,shadeColor});
1
+ "use strict";var Wn=Object.defineProperty;var ss=Object.getOwnPropertyDescriptor;var is=Object.getOwnPropertyNames;var cs=Object.prototype.hasOwnProperty;var as=(e,n)=>{for(var t in n)Wn(e,t,{get:n[t],enumerable:!0})},ls=(e,n,t,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let o of is(n))!cs.call(e,o)&&o!==t&&Wn(e,o,{get:()=>n[o],enumerable:!(r=ss(n,o))||r.enumerable});return e};var us=e=>ls(Wn({},"__esModule",{value:!0}),e);var nl={};as(nl,{BASE_TILE:()=>$e,CAMERA_BACKFACE_CULL_EPS:()=>Je,DEFAULT_CAMERA_STATE:()=>Ae,DEFAULT_PROJECTION:()=>Xt,LoopOnce:()=>lo,LoopPingPong:()=>fo,LoopRepeat:()=>uo,POLY_VOXEL_NEXT_LAYER_STEP:()=>Ko,QUAT_IDENTITY:()=>or,VOXEL_CAMERA_CULL_AXIS_EPS:()=>yt,VOXEL_CAMERA_CULL_NORMAL_LIMIT:()=>bt,arrowPolygons:()=>It,axesHelperPolygons:()=>Vt,bakeSolidTextureSampledPolygons:()=>To,bakeSolidTextureSamples:()=>_n,boxPolygons:()=>wt,buildPolyVoxelFaceData:()=>ts,buildPolyVoxelSlicePlan:()=>ns,buildSceneContext:()=>er,cameraCullNormalGroups:()=>Ct,cameraCullNormalGroupsFromPolygons:()=>oo,cameraCullNormalKey:()=>Mt,cameraCullVisibleSignature:()=>io,cameraFacingDepth:()=>Pt,clampChannel:()=>he,computeSceneBbox:()=>et,computeShapeLighting:()=>Zt,computeTexturePaintMetrics:()=>tr,coverPlanarPolygons:()=>un,createIsometricCamera:()=>mr,createPolyAnimationMixer:()=>mo,cullInteriorPolygons:()=>we,dedupeOverlappingPolygons:()=>yr,eulerXYZFromQuat:()=>ar,findOverlappingPolygonDuplicates:()=>je,formatColor:()=>ze,inverseRotateVec3:()=>rr,isAxisAlignedSurfaceNormal:()=>vt,isVoxelCameraCullableNormalGroups:()=>so,loadMesh:()=>os,mergePolygons:()=>ie,normalFacesCamera:()=>Sn,normalizeInvertMultiplier:()=>fr,normalizePolygons:()=>on,octahedronPolygons:()=>Ot,optimizeMeshPolygons:()=>Pn,parseColor:()=>ve,parseGltf:()=>kn,parseHexColor:()=>Zn,parseMtl:()=>Rn,parseObj:()=>In,parsePureColor:()=>nn,parseRgbColor:()=>Qn,parseVox:()=>Ln,planePolygons:()=>Et,polygonCssSurfaceNormal:()=>Vn,polygonFaces:()=>nr,polygonFacesCamera:()=>ro,quatFromAxisAngle:()=>ir,quatFromEulerXYZ:()=>cr,quatMultiply:()=>sr,ringPolygons:()=>Rt,ringQuadPolygons:()=>Tt,rotateVec3:()=>Ge,shadeColor:()=>Wt});module.exports=us(nl);var Xt="cubic";function Zn(e){let n=e.replace("#","");if(n.length===3){let t=parseInt(n[0]+n[0],16),r=parseInt(n[1]+n[1],16),o=parseInt(n[2]+n[2],16);return Number.isNaN(t)||Number.isNaN(r)||Number.isNaN(o)?null:{rgb:[t,r,o],alpha:1}}if(n.length===6){let t=parseInt(n.slice(0,2),16),r=parseInt(n.slice(2,4),16),o=parseInt(n.slice(4,6),16);return Number.isNaN(t)||Number.isNaN(r)||Number.isNaN(o)?null:{rgb:[t,r,o],alpha:1}}return null}function Qn(e){let n=e.match(/rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*([\d.]+)\s*)?\)/i);return n?{rgb:[Number(n[1]),Number(n[2]),Number(n[3])],alpha:n[4]?Number(n[4]):1}:null}function nn(e){if(!e)return null;let n=e.trim(),t=Zn(n);return t||Qn(n)}function he(e){return Math.max(0,Math.min(255,Math.round(e)))}function ze(e){let[n,t,r]=e.rgb.map(he);return e.alpha<1?`rgba(${n}, ${t}, ${r}, ${e.alpha})`:`rgb(${n}, ${t}, ${r})`}var Jn={rgb:[204,204,204],alpha:1},jt=new Map;function ve(e){if(!e)return null;let n=e.trim(),t=jt.get(n);if(t)return t;let r=nn(n);return r?(jt.set(n,r),r):null}function Wt(e,n){let t=ve(e)??Jn,r=[he(t.rgb[0]+n),he(t.rgb[1]+n),he(t.rgb[2]+n)];return ze({rgb:r,alpha:t.alpha})}var qn={direction:[0,0,-1],color:"#ffffff",intensity:1},Yt={color:"#ffffff",intensity:.4};function Ht(e){let n=Math.hypot(e[0],e[1],e[2]);return n<1e-12?[0,0,0]:[e[0]/n,e[1]/n,e[2]/n]}function Kt(e,n,t){let r=ve(n)??Jn;return e*(r.rgb[t]/255)}function Zt(e,n,t,r){let o=ve(n)??Jn,s=Ht(t?.direction??qn.direction),i=t?.color??qn.color,a=Math.max(0,t?.intensity??qn.intensity),l=r?.color??Yt.color,c=Math.max(0,r?.intensity??Yt.intensity),u=Ht(e),f=Math.max(0,-(u[0]*s[0]+u[1]*s[1]+u[2]*s[2])),g=a*f,m=[0,0,0];for(let d=0;d<3;d=d+1){let p=o.rgb[d],h=Kt(p,l,d)*c,x=Kt(p,i,d)*g;m[d]=he(h+x)}return ze({rgb:m,alpha:o.alpha})}var Qt="#cccccc",tn=(e,n)=>[e[0]-n[0],e[1]-n[1],e[2]-n[2]],qt=(e,n)=>[e[1]*n[2]-e[2]*n[1],e[2]*n[0]-e[0]*n[2],e[0]*n[1]-e[1]*n[0]],Jt=(e,n)=>e[0]*n[0]+e[1]*n[1]+e[2]*n[2],rn=e=>Math.hypot(e[0],e[1],e[2]);function fs(e){let n=1/0,t=1/0,r=1/0,o=-1/0,s=-1/0,i=-1/0;for(let u of e)u[0]<n&&(n=u[0]),u[0]>o&&(o=u[0]),u[1]<t&&(t=u[1]),u[1]>s&&(s=u[1]),u[2]<r&&(r=u[2]),u[2]>i&&(i=u[2]);let a=o-n,l=s-t,c=i-r;return Math.hypot(a,l,c)}function ms(){let e=globalThis;if(e.__POLYCSS_DEV__===!0)return!0;if(e.__POLYCSS_DEV__===!1)return!1;let n=e.process?.env?.NODE_ENV;return typeof n=="string"?n!=="production":!1}function on(e){let n=[],t=[];if(!e||e.length===0)return{polygons:n,warnings:t};for(let r=0;r<e.length;r++){let o=e[r];if(!o||!Array.isArray(o.vertices)){t.push(`Polygon ${r}: missing vertices, dropped`);continue}let s=o.vertices;if(s.length<3){t.push(`Polygon ${r}: ${s.length} vertices (need >= 3), dropped`);continue}let i=tn(s[1],s[0]),a=tn(s[2],s[0]),l=qt(i,a),c=rn(l);if(s.length===3){if(c<1e-12){rn(i)<1e-12||rn(a)<1e-12?t.push(`Polygon ${r}: zero-area triangle (coincident vertices), dropped`):t.push(`Polygon ${r}: vertices collinear, dropped`);continue}}else if(c<1e-12){t.push(`Polygon ${r}: first 3 vertices collinear, dropped`);continue}let u=[{...o,vertices:s.slice()}];if(s.length>=4){let f=[l[0]/c,l[1]/c,l[2]/c],g=Jt(f,s[0]),m=fs(s),d=Math.max(1e-6,m*.001),p=0;for(let h=3;h<s.length;h++){let x=Math.abs(Jt(f,s[h])-g);x>p&&(p=x)}if(p>d){let h=[],x=o.uvs&&o.uvs.length===s.length?o.uvs:void 0;for(let y=1;y<s.length-1;y++){let M=[s[0].slice(),s[y].slice(),s[y+1].slice()],P=qt(tn(M[1],M[0]),tn(M[2],M[0]));if(rn(P)<1e-12)continue;let b={...o,vertices:M};x&&(b.uvs=[x[0].slice(),x[y].slice(),x[y+1].slice()]),h.push(b)}if(h.length===0){t.push(`Polygon ${r}: ${s.length} non-coplanar vertices, fan-triangulation produced no valid triangles, dropped`);continue}t.push(`Polygon ${r}: ${s.length} non-coplanar vertices, fan-triangulated to ${h.length} triangles`),u=h}}for(let f of u){let g=gs(f,r,t);g&&n.push(g)}}return{polygons:n,warnings:t}}function gs(e,n,t){let r={vertices:e.vertices},o=e.texture;if(typeof o=="string"&&o===""&&(o=void 0),e.color!==void 0&&o!==void 0&&ms()&&t.push(`Polygon ${n}: color and texture both set; texture wins`),e.color!==void 0&&(ve(e.color)?r.color=e.color:(t.push(`Polygon ${n}: invalid color "${e.color}", replaced with ${Qt}`),r.color=Qt)),o!==void 0&&(r.texture=o),e.uvs!==void 0&&(!Array.isArray(e.uvs)||e.uvs.length!==e.vertices.length?t.push(`Polygon ${n}: uvs length ${Array.isArray(e.uvs)?e.uvs.length:"?"} != vertices length ${e.vertices.length}, uvs stripped`):r.uvs=e.uvs),e.data!==void 0&&e.data!==null&&typeof e.data=="object"){let s={},i=!1;for(let a of Object.keys(e.data)){let l=e.data[a];typeof l=="string"||typeof l=="number"||typeof l=="boolean"?s[a]=l:(i=!0,t.push(`Polygon ${n}: data["${a}"] has non-primitive value, key dropped`))}Object.keys(s).length>0&&(r.data=s)}return r}function et(e){if(!e||e.length===0)return{min:[0,0,0],max:[0,0,0]};let n=1/0,t=1/0,r=1/0,o=-1/0,s=-1/0,i=-1/0,a=!1;for(let l of e)if(l?.vertices)for(let c of l.vertices)c&&(a=!0,c[0]<n&&(n=c[0]),c[0]>o&&(o=c[0]),c[1]<t&&(t=c[1]),c[1]>s&&(s=c[1]),c[2]<r&&(r=c[2]),c[2]>i&&(i=c[2]));return a?{min:[n,t,r],max:[o,s,i]}:{min:[0,0,0],max:[0,0,0]}}function er(e){let n=e.polygons??[],t,r;if(e.skipNormalize)t=n,r=[];else{let a=on(n);t=a.polygons,r=a.warnings}let o=et(t),s=[o.max[0]-o.min[0],o.max[1]-o.min[1],o.max[2]-o.min[2]];return{context:{polygons:t,sceneBbox:o,warnings:r},dimensions:{sceneBbox:o,size:s},warnings:r}}function nr(e){return!e.vertices||e.vertices.length<3?[]:[{v:e.vertices.map(n=>[n[0],n[1],n[2]]),color:e.color}]}function ds(e){let n=e[0],t=e[1],r=e[2],o=[t[0]-n[0],t[1]-n[1],t[2]-n[2]],s=[r[0]-n[0],r[1]-n[1],r[2]-n[2]],i=o[1]*s[2]-o[2]*s[1],a=o[2]*s[0]-o[0]*s[2],l=o[0]*s[1]-o[1]*s[0],c=Math.hypot(i,a,l);return c<=1e-9?null:[i/c,a/c,l/c]}function ps(e){let n=0;for(let t=0;t<e.length;t++){let[r,o]=e[t],[s,i]=e[(t+1)%e.length];n+=r*i-s*o}return Math.abs(n)/2}function hs(e,n,t){if(!e||e.length<3)return null;let r=e.map(a=>[a[1]*n,a[0]*n,a[2]*t]),o=ds(r);if(!o)return null;let s=1/0,i=0;for(let a=0;a<r.length;a++){let l=r[a],c=r[(a+1)%r.length],u=[c[0]-l[0],c[1]-l[1],c[2]-l[2]],f=u[0]*o[0]+u[1]*o[1]+u[2]*o[2],g=[u[0]-f*o[0],u[1]-f*o[1],u[2]-f*o[2]],m=Math.hypot(g[0],g[1],g[2]);if(m<=1e-9)continue;let d=[g[0]/m,g[1]/m,g[2]/m],p=[o[1]*d[2]-o[2]*d[1],o[2]*d[0]-o[0]*d[2],o[0]*d[1]-o[1]*d[0]],h=Math.hypot(p[0],p[1],p[2]);if(h<=1e-9)continue;let x=[p[0]/h,p[1]/h,p[2]/h],y=r.map(V=>{let R=V[0]-l[0],E=V[1]-l[1],F=V[2]-l[2];return[R*d[0]+E*d[1]+F*d[2],R*x[0]+E*x[1]+F*x[2]]}),M=1/0,P=1/0,b=-1/0,A=-1/0;for(let[V,R]of y)M=Math.min(M,V),P=Math.min(P,R),b=Math.max(b,V),A=Math.max(A,R);let w=b-M,I=A-P,C=Math.max(1,Math.ceil(w))*Math.max(1,Math.ceil(I)),v=ps(y);v<=1e-9||C<s&&(s=C,i=v)}return!Number.isFinite(s)||i<=1e-9?null:{elementArea:s,polygonArea:i}}function tr(e,n={}){let t=n.tileSize??100,r=n.layerElevation??t,o=n.texturedOnly??!0,s=0,i=0,a=0,l=0,c=0;for(let f of e){let g=!!f.texture;if(o&&!g)continue;let m=hs(f.vertices,t,r);m&&(s+=1,g&&(i+=1),a+=m.elementArea,l+=m.polygonArea,c=Math.max(c,Math.max(0,m.elementArea-m.polygonArea)/m.elementArea))}let u=Math.max(0,a-l);return{totalPolygons:e.length,measuredPolygons:s,texturedPolygons:i,elementArea:a,polygonArea:l,transparentArea:u,transparentRatio:a>0?u/a:0,overdrawRatio:l>0?a/l:0,worstTransparentRatio:c}}function Ge(e,n,t,r){let o=n*Math.PI/180,s=t*Math.PI/180,i=r*Math.PI/180,[a,l,c]=e;if(i!==0){let u=Math.cos(i),f=Math.sin(i);[a,l]=[a*u-l*f,a*f+l*u]}if(s!==0){let u=Math.cos(s),f=Math.sin(s);[a,c]=[a*u+c*f,-a*f+c*u]}if(o!==0){let u=Math.cos(o),f=Math.sin(o);[l,c]=[l*u-c*f,l*f+c*u]}return[a,l,c]}function rr(e,n){let t=-n[0]*Math.PI/180,r=-n[1]*Math.PI/180,o=-n[2]*Math.PI/180,[s,i,a]=e;if(t!==0){let l=Math.cos(t),c=Math.sin(t);[i,a]=[i*l-a*c,i*c+a*l]}if(r!==0){let l=Math.cos(r),c=Math.sin(r);[s,a]=[s*l+a*c,-s*c+a*l]}if(o!==0){let l=Math.cos(o),c=Math.sin(o);[s,i]=[s*l-i*c,s*c+i*l]}return[s,i,a]}var nt=Math.PI/180,Ue=180/Math.PI,or=[1,0,0,0];function sr(e,n){let[t,r,o,s]=e,[i,a,l,c]=n;return[t*i-r*a-o*l-s*c,t*a+r*i+o*c-s*l,t*l-r*c+o*i+s*a,t*c+r*l-o*a+s*i]}function ir(e,n){let t=n*.5,r=Math.sin(t);return[Math.cos(t),e[0]*r,e[1]*r,e[2]*r]}function cr(e){let n=e[0]*nt,t=e[1]*nt,r=e[2]*nt,o=Math.cos(n*.5),s=Math.sin(n*.5),i=Math.cos(t*.5),a=Math.sin(t*.5),l=Math.cos(r*.5),c=Math.sin(r*.5);return[o*i*l-s*a*c,s*i*l+o*a*c,o*a*l-s*i*c,o*i*c+s*a*l]}function ar(e){let[n,t,r,o]=e,s=2*(t*o+n*r),i=2*(r*o-n*t),a=1-2*(t*t+r*r),l=2*(t*r-n*o),c=1-2*(r*r+o*o),u=Math.max(-1,Math.min(1,s)),f=Math.asin(u);return Math.abs(u)<.99999?[Math.atan2(-i,a)*Ue,f*Ue,Math.atan2(-l,c)*Ue]:[Math.atan2(2*(r*o+n*t),1-2*(t*t+o*o))*Ue,f*Ue,0]}var $e=50;function fr(e){if(typeof e=="number")return e===0?void 0:e<0?-1:1;if(typeof e=="boolean")return e?-1:1}var Ae={target:[0,0,0],rotX:65,rotY:45,zoom:.65,distance:0},lr=100,ur=1e4,Ee=e=>Math.round(e*lr)/lr,xs=e=>Math.round(e*ur)/ur;function mr(e={}){let n={target:e.target??[...Ae.target],rotX:e.rotX??Ae.rotX,rotY:e.rotY??Ae.rotY,zoom:e.zoom??Ae.zoom,distance:e.distance??Ae.distance};function t(o){o.target!==void 0&&(n.target=[Ee(o.target[0]),Ee(o.target[1]),Ee(o.target[2])]),o.rotX!==void 0&&(n.rotX=Ee(o.rotX)),o.rotY!==void 0&&(n.rotY=Ee(o.rotY)),o.zoom!==void 0&&(n.zoom=xs(o.zoom)),o.distance!==void 0&&(n.distance=Ee(o.distance))}function r(o={}){let i=(o.cols??0)*50,a=(o.rows??0)*50,[l,c,u]=n.target,f=c*50,g=l*50,m=u*50;return{transform:`${n.distance!==0?` translateZ(${-n.distance}px)`:""}scale(${n.zoom}) rotateX(${n.rotX}deg) rotate(${n.rotY}deg) translate3d(${-f}px, ${-g}px, ${-m}px)`,width:`${i}px`,height:`${a}px`}}return{state:n,update:t,getStyle:r}}var ye=(e,n)=>[e[0]-n[0],e[1]-n[1],e[2]-n[2]],sn=(e,n)=>[e[1]*n[2]-e[2]*n[1],e[2]*n[0]-e[0]*n[2],e[0]*n[1]-e[1]*n[0]],Xe=(e,n)=>e[0]*n[0]+e[1]*n[1]+e[2]*n[2],tt=e=>Math.hypot(e[0],e[1],e[2]),xe=(e,n)=>e[0]===n[0]&&e[1]===n[1]&&e[2]===n[2];function ys(e,n){let t=`${e[0]},${e[1]},${e[2]}`,r=`${n[0]},${n[1]},${n[2]}`;return t<r?`${t}|${r}`:`${r}|${t}`}function dr(e){if(e.length<3)return null;let n=ye(e[1],e[0]),t=ye(e[2],e[0]),r=sn(n,t),o=tt(r);if(o<1e-12)return null;let s=[r[0]/o,r[1]/o,r[2]/o],i=Xe(s,e[0]);return{normal:s,d:i}}function bs(e,n){return Xe(e.normal,n.normal)<1-.001?!1:Math.abs(e.d-n.d)<.05}function Ps(e,n){return Xe(e.normal,n.normal)<1-.001?!1:Math.abs(e.d-n.d)<.001}function Ms(e,n,t,r){let o=e.vertices.findIndex(I=>xe(I,t)),s=e.vertices.findIndex(I=>xe(I,r)),i=n.vertices.findIndex(I=>xe(I,t)),a=n.vertices.findIndex(I=>xe(I,r));if(o<0||s<0||i<0||a<0)return null;let l=e.vertices.length,c=n.vertices.length,u=(o+1)%l===s,f=(i+1)%c===a;if(u===f)return null;let g=u?s:o,m=u?o:s,d=f?a:i,p=f?i:a,h=!!(e.uvs&&n.uvs),x=[],y=h?[]:void 0,M=g;for(;x.push(e.vertices[M]),y&&y.push(e.uvs[M]),M!==m;)M=(M+1)%l;for(M=d;x.push(n.vertices[M]),y&&y.push(n.uvs[M]),M!==p;)M=(M+1)%c;let P=[],b=y?[]:void 0;for(let I=0;I<x.length;I++)(P.length===0||!xe(x[I],P[P.length-1]))&&(P.push(x[I]),b&&y&&b.push(y[I]));if(P.length>1&&xe(P[0],P[P.length-1])&&(P.pop(),b?.pop()),h)return gr(P,b);let A=[],w=b?[]:void 0;for(let I=0;I<P.length;I++){let C=P[(I-1+P.length)%P.length],v=P[I],V=P[(I+1)%P.length],R=sn(ye(v,C),ye(V,C));tt(R)>1e-9&&(A.push(v),w&&b&&w.push(b[I]))}return A.length<3?null:gr(A,w)}function Cs(e,n){let t=e.length,r=0;for(let o=0;o<t;o++){let s=e[o],i=e[(o+1)%t],a=e[(o+2)%t],l=ye(i,s),c=ye(a,i),u=Xe(sn(l,c),n);if(Math.abs(u)<1e-9)continue;let f=u>0?1:-1;if(r===0)r=f;else if(f!==r)return!1}return!0}function vs(e,n){if(e.length<3)return!1;let t=dr(e);if(!t)return!1;for(let r of e)if(Math.abs(Xe(t.normal,r)-t.d)>n)return!1;return!0}function As(e){return e.map(n=>({vertices:n.vertices.map(t=>[...t]),uvs:n.uvs.map(t=>[...t])}))}function Vs(e,n){let t=[];for(let r=1;r<e.length-1;r++)t.push({vertices:[[...e[0]],[...e[r]],[...e[r+1]]],uvs:[[...n[0]],[...n[r]],[...n[r+1]]]});return t}function gr(e,n){for(let t=0;t<e.length;t++){let r=e[t],o=e[(t+1)%e.length],s=e[(t+2)%e.length];if(!(tt(sn(ye(o,r),ye(s,r)))<=1e-9))return t===0?{vertices:e,uvs:n}:{vertices:[...e.slice(t),...e.slice(0,t)],uvs:n?[...n.slice(t),...n.slice(0,t)]:void 0}}return{vertices:e,uvs:n}}function ie(e){let n=[],t=[];for(let o of e??[]){if(!o||!o.vertices||o.vertices.length<3){o&&n.push(o);continue}let s=o.vertices.map(c=>[c[0],c[1],c[2]]),i=dr(s);if(!i){n.push(o);continue}let a=o.texture&&o.uvs&&o.uvs.length===s.length?o.uvs.map(c=>[c[0],c[1]]):void 0,l=o.texture&&a?o.textureTriangles?.length?As(o.textureTriangles):Vs(s,a):void 0;t.push({vertices:s,uvs:a,color:o.color??"#cccccc",texture:o.texture,textureTriangles:l,normal:i.normal,d:i.d,alive:!0,data:o.data})}let r=()=>{let o=new Map;for(let a=0;a<t.length;a++){let l=t[a];if(!l.alive)continue;let c=l.vertices.length;for(let u=0;u<c;u++){let f=l.vertices[u],g=l.vertices[(u+1)%c],m=ys(f,g),d=o.get(m);d||(d=[],o.set(m,d)),d.push(a)}}let s=!1,i=(a,l)=>{for(let c=0;c<a.vertices.length;c++){let u=a.vertices[c],f=a.vertices[(c+1)%a.vertices.length];for(let g=0;g<l.vertices.length;g++){let m=l.vertices[g],d=l.vertices[(g+1)%l.vertices.length];if(xe(u,d)&&xe(f,m))return[u,f]}}return null};for(let[,a]of o){if(a.length<2)continue;let[l,c]=a;if(l===c)continue;let u=t[l],f=t[c];if(!u.alive||!f.alive||u.color!==f.color||u.texture!==f.texture)continue;let g=!!(u.texture||f.texture);if(g&&(!u.textureTriangles||!f.textureTriangles)||!!u.uvs!=!!f.uvs||(g?!Ps(u,f):!bs(u,f)))continue;let m=i(u,f);if(!m)continue;let[d,p]=m,h=Ms(u,f,d,p);h&&vs(h.vertices,.001)&&Cs(h.vertices,u.normal)&&(u.vertices=h.vertices,u.uvs=h.uvs,u.textureTriangles=g?[...u.textureTriangles??[],...f.textureTriangles??[]]:void 0,f.alive=!1,s=!0)}return s};for(;r(););for(let o of t){if(!o.alive)continue;let s={vertices:o.vertices,color:o.color};o.texture&&(s.texture=o.texture),o.uvs&&(s.uvs=o.uvs),o.textureTriangles?.length&&(s.textureTriangles=o.textureTriangles),o.data&&(s.data=o.data),n.push(s)}return n}var Ss=(e,n)=>[e[0]-n[0],e[1]-n[1],e[2]-n[2]],ws=(e,n)=>[e[1]*n[2]-e[2]*n[1],e[2]*n[0]-e[0]*n[2],e[0]*n[1]-e[1]*n[0]],me=(e,n)=>e[0]*n[0]+e[1]*n[1]+e[2]*n[2];function Is(e,n){let t=e.vertices;if(!t||t.length<3)return null;let r=0,o=0,s=0;for(let p=0;p<t.length;p++){let h=t[p],x=t[(p+1)%t.length];r+=(h[1]-x[1])*(h[2]+x[2]),o+=(h[2]-x[2])*(h[0]+x[0]),s+=(h[0]-x[0])*(h[1]+x[1])}let i=Math.hypot(r,o,s);if(i<1e-12)return null;let a=[r/i,o/i,s/i],l=0,c=0,u=0;for(let p of t)l+=p[0],c+=p[1],u+=p[2];let f=1/t.length,g=[l*f,c*f,u*f],m=me(a,g),d=i*.5;return{index:n,polygon:e,normal:a,d:m,centroid:g,area:d,local2D:null,bbox2D:null,basis:null}}function Rs(e){let n=Math.abs(e[0])<.9?[1,0,0]:[0,1,0],t=n[0]-e[0]*me(n,e),r=n[1]-e[1]*me(n,e),o=n[2]-e[2]*me(n,e),s=Math.hypot(t,r,o);t/=s,r/=s,o/=s;let i=[t,r,o],a=ws(e,i);return{u:i,v:a}}function Ts(e){if(e.local2D)return;let n=Rs(e.normal),t=[],r=1/0,o=1/0,s=-1/0,i=-1/0;for(let a of e.polygon.vertices){let l=me(a,n.u),c=me(a,n.v);t.push([l,c]),l<r&&(r=l),l>s&&(s=l),c<o&&(o=c),c>i&&(i=c)}e.local2D=t,e.bbox2D={min:[r,o],max:[s,i]},e.basis=n}function Es(e,n){let t=[],r=1/0,o=1/0,s=-1/0,i=-1/0;for(let a of e.vertices){let l=me(a,n.u),c=me(a,n.v);t.push([l,c]),l<r&&(r=l),l>s&&(s=l),c<o&&(o=c),c>i&&(i=c)}return{local2D:t,bbox2D:{min:[r,o],max:[s,i]}}}function Os(e,n){return e.max[0]>=n.min[0]&&e.min[0]<=n.max[0]&&e.max[1]>=n.min[1]&&e.min[1]<=n.max[1]}function pr(e,n){let t=!1;for(let r=0,o=n.length-1;r<n.length;o=r++){let s=n[r],i=n[o];s[1]>e[1]!=i[1]>e[1]&&e[0]<(i[0]-s[0])*(e[1]-s[1])/(i[1]-s[1]+1e-30)+s[0]&&(t=!t)}return t}function hr(e){let n=0,t=0;for(let r of e)n+=r[0],t+=r[1];return[n/e.length,t/e.length]}function ks(e,n){let t=hr(e),r=hr(n),o=1e-4,s=0;for(let c of e){let u=[c[0]+(t[0]-c[0])*o,c[1]+(t[1]-c[1])*o];pr(u,n)&&s++}let i=0;for(let c of n){let u=[c[0]+(r[0]-c[0])*o,c[1]+(r[1]-c[1])*o];pr(u,e)&&i++}let a=s/e.length,l=i/n.length;return Math.max(a,l)}function _s(e,n){let t=e.normal[0],r=e.normal[1],o=e.normal[2],s=Math.abs(t),i=Math.abs(r),a=Math.abs(o),l=t;i>s&&i>a?l=r:a>s&&a>i&&(l=o),l<0&&(t=-t,r=-r,o=-o);let c=Math.round(t/.05),u=Math.round(r/.05),f=Math.round(o/.05),g=e.d*(e.normal[0]===t&&e.normal[1]===r&&e.normal[2]===o?1:-1),m=Math.round(g/(n*2));return`${c},${u},${f}|${m}`}function Ls(e,n,t,r){let o=me(e.normal,n.normal);if(Math.abs(o)<1-t)return!1;let s=o>0?1:-1;return Math.abs(e.d-s*n.d)<r}function xr(e,n){let t=Ss(n,e.centroid);return me(e.normal,t)>0}function je(e,n){if(!e||e.length<2)return new Set;let t=n?.normalTolerance??.001,r=n?.distanceTolerance??.05,o=n?.overlapFraction??.7,s=[];for(let m=0;m<e.length;m++){let d=Is(e[m],m);d&&s.push(d)}if(s.length<2)return new Set;let i=0,a=0,l=0,c=0;for(let m of s)i+=m.centroid[0]*m.area,a+=m.centroid[1]*m.area,l+=m.centroid[2]*m.area,c+=m.area;let u=c>0?[i/c,a/c,l/c]:[0,0,0],f=new Map;for(let m of s){let d=_s(m,r),p=f.get(d);p||(p=[],f.set(d,p)),p.push(m)}let g=new Set;for(let m of f.values())if(!(m.length<2))for(let d=0;d<m.length;d++){let p=m[d];if(!g.has(p.index))for(let h=d+1;h<m.length;h++){let x=m[h];if(g.has(x.index)||!Ls(p,x,t,r))continue;Ts(p);let y=Es(x.polygon,p.basis);if(!Os(p.bbox2D,y.bbox2D)||ks(p.local2D,y.local2D)<o)continue;let P=xr(p,u),b=xr(x,u),A;if(P&&!b?A=p:b&&!P?A=x:A=p.area<x.area?p:x,g.add(A.index),A===p)break}}return g}function yr(e,n){if(!e||e.length<2)return e??[];let t=je(e,n);if(t.size===0)return e;let r=[];for(let o=0;o<e.length;o++)t.has(o)||r.push(e[o]);return r}var Bs=4,Ns=8,Fs=.001,Ds=1e-9,zs=1e6,Gs=1e6,Ve=(e,n)=>[e[0]-n[0],e[1]-n[1],e[2]-n[2]],st=(e,n)=>[e[0]+n[0],e[1]+n[1],e[2]+n[2]],Ke=(e,n)=>[e[0]*n,e[1]*n,e[2]*n],Se=(e,n)=>e[0]*n[0]+e[1]*n[1]+e[2]*n[2],Cr=(e,n)=>[e[1]*n[2]-e[2]*n[1],e[2]*n[0]-e[0]*n[2],e[0]*n[1]-e[1]*n[0]],vr=e=>Math.hypot(e[0],e[1],e[2]);function We(e){let n=vr(e);return n<=Ds?null:[e[0]/n,e[1]/n,e[2]/n]}function He(e,n){return Math.round(e*n)/n}function ue(e){return He(e,zs)}function rt(e){return He(e,Gs)}function ot(e,n){return Math.abs(e[0]-n[0])<=1e-7&&Math.abs(e[1]-n[1])<=1e-7}function ge(e){return`${ue(e[0])},${ue(e[1])}`}function Us(e){let n=ge(e.a),t=ge(e.b);return n<t?`${n}|${t}`:`${t}|${n}`}function Oe(e){return`${e[0]},${e[1]},${e[2]}`}function Ar(e,n){let t=Oe(e),r=Oe(n);return t<r?`${t}|${r}`:`${r}|${t}`}function it(e){return e?Object.keys(e).sort().map(n=>`${n}:${String(e[n])}`).join("|"):""}function br(e){return[e.color??"#cccccc",e.texture??"",e.uvs?"uv":"plain",it(e.data)].join("|")}function Vr(e){let n=e.vertices;if(!n||n.length<3)return null;let t=n[0],r=[0,0,0];for(let s=1;s<n.length-1;s++)r=st(r,Cr(Ve(n[s],t),Ve(n[s+1],t)));let o=We(r);return o?{normal:o,d:Se(o,t)}:null}function $s(e,n,t){return Se(e.normal,n.normal)>1-t&&Math.abs(e.d-n.d)<=t}function Xs(e){return!e.texture&&!e.uvs&&!e.textureTriangles}function js(e,n){let t=n[e[0]]?.data,r=it(t);for(let o of e)if(it(n[o].data)!==r)return;return t?{...t}:void 0}function Ys(e,n){let t=e.map(l=>Xs(l)?Vr(l):null),r=t.map(Boolean),o=new Map;for(let l=0;l<e.length;l++){if(!t[l])continue;let c=e[l].vertices;for(let u=0;u<c.length;u++){let f=Ar(c[u],c[(u+1)%c.length]),g=o.get(f),m={polygon:l,edge:u};g?g.push(m):o.set(f,[m])}}let s=e.map(()=>new Set);for(let l of o.values())if(!(l.length<2))for(let c=0;c<l.length;c++)for(let u=c+1;u<l.length;u++){let f=l[c].polygon,g=l[u].polygon,m=t[f],d=t[g];!m||!d||br(e[f])===br(e[g])&&$s(m,d,n)&&(s[f].add(g),s[g].add(f))}let i=new Set,a=[];for(let l=0;l<e.length;l++){if(!r[l]||i.has(l))continue;let c=[],u=[l];for(i.add(l);u.length>0;){let f=u.shift();c.push(f);for(let g of s[f])i.has(g)||(i.add(g),u.push(g))}a.push(c)}return{groups:a}}function Hs(e,n){let t=new Set(e),r=new Map;for(let s of e){let i=n[s].vertices;for(let a=0;a<i.length;a++){let l=Ar(i[a],i[(a+1)%i.length]),c=r.get(l),u={polygon:s,edge:a};c?c.push(u):r.set(l,[u])}}let o=[];for(let s of r.values()){let i=s.filter(a=>t.has(a.polygon));if(i.length===1){let a=i[0],l=n[a.polygon].vertices;o.push({a:l[a.edge],b:l[(a.edge+1)%l.length]})}else if(i.length!==2)return null}return o}function Ks(e){let n=new Map;for(let t of e)n.set(Oe(t.a),(n.get(Oe(t.a))??0)+1),n.set(Oe(t.b),(n.get(Oe(t.b))??0)+1);for(let t of n.values())if(t%2!==0)return!1;return!0}function Sr(e){let n=[e[0],e[1],e[2]],t=Math.abs(n[0])>=Math.abs(n[1])&&Math.abs(n[0])>=Math.abs(n[2])?0:Math.abs(n[1])>=Math.abs(n[2])?1:2;return n[t]<0?[-n[0],-n[1],-n[2]]:n}function Ws(e){let n=Sr(e);return`${He(n[0],1e3)},${He(n[1],1e3)},${He(n[2],1e3)}`}function Zs(e){let n=Math.abs(e[0])<.9?[1,0,0]:[0,1,0],t=Ve(n,Ke(e,Se(n,e)));return We(t)??[1,0,0]}function Qs(e,n,t){let r=new Map;for(let s of e){let i=Ve(s.b,s.a),a=Ve(i,Ke(n,Se(i,n))),l=We(a);if(!l)continue;let c=Sr(l),u=Ws(c),f=vr(a),g=r.get(u);g?g.weight+=f:r.set(u,{axis:c,weight:f})}let o=[...r.values()].sort((s,i)=>i.weight-s.weight).slice(0,t).map(s=>s.axis);return o.length===0&&o.push(Zs(n)),o}function Pr(e,n,t,r){let o=Ve(e,n);return[ue(Se(o,t)),ue(Se(o,r))]}function qs(e){let n=[...e].sort((r,o)=>r-o),t=[];for(let r of n)(t.length===0||Math.abs(r-t[t.length-1])>1e-7)&&t.push(r);return t}function Ye(e,n){let[t,r]=e.a,[o,s]=e.b,i=(n-t)/(o-t);return ue(r+(s-r)*i)}function ct(e){let n=[];for(let r of e)(n.length===0||Math.abs(r[0]-n[n.length-1][0])>1e-7||Math.abs(r[1]-n[n.length-1][1])>1e-7)&&n.push(r);n.length>1&&Math.abs(n[0][0]-n[n.length-1][0])<=1e-7&&Math.abs(n[0][1]-n[n.length-1][1])<=1e-7&&n.pop();let t=[];for(let r=0;r<n.length;r++){let o=n[(r-1+n.length)%n.length],s=n[r],i=n[(r+1)%n.length],a=(s[0]-o[0])*(i[1]-s[1])-(s[1]-o[1])*(i[0]-s[0]);Math.abs(a)>1e-8&&t.push(s)}return t}function an(e){let n=0;for(let t=0;t<e.length;t++){let r=e[t],o=e[(t+1)%e.length];n+=r[0]*o[1]-o[0]*r[1]}return n/2}function ln(e){let n=1/0,t=1/0,r=-1/0,o=-1/0;for(let[s,i]of e)n=Math.min(n,s),t=Math.min(t,i),r=Math.max(r,s),o=Math.max(o,i);return{minX:n,minY:t,maxX:r,maxY:o}}function Js(e,n){return!(e.maxX<n.minX-1e-7||n.maxX<e.minX-1e-7||e.maxY<n.minY-1e-7||n.maxY<e.minY-1e-7)}function cn(e){return Math.abs(an(e))}function ei(e){if(e.length<3)return!1;let n=0;for(let t=0;t<e.length;t++){let r=e[t],o=e[(t+1)%e.length],s=e[(t+2)%e.length],i=(o[0]-r[0])*(s[1]-o[1])-(o[1]-r[1])*(s[0]-o[0]);if(Math.abs(i)<=1e-8)continue;let a=i>0?1:-1;if(n===0)n=a;else if(n!==a)return!1}return!0}function ni(e,n,t){let r=t[0]-n[0],o=t[1]-n[1],s=e[0]-n[0],i=e[1]-n[1],a=r*i-o*s,l=Math.hypot(r,o);if(l<=1e-9||Math.abs(a)>Math.max(1e-8,l*1e-8))return!1;let c=s*r+i*o;return c>=-1e-8&&c<=r*r+o*o+1e-8}function ti(e,n,t){let r=t[0]-n[0],o=t[1]-n[1],s=r*r+o*o;return s<=1e-12?0:((e[0]-n[0])*r+(e[1]-n[1])*o)/s}function ri(e,n,t,r){let o=n[0]-e[0],s=n[1]-e[1],i=r[0]-t[0],a=r[1]-t[1],l=Math.hypot(o,s),c=Math.hypot(i,a);if(l<=1e-9||c<=1e-9)return!1;let u=o*(t[1]-e[1])-s*(t[0]-e[0]),f=o*(r[1]-e[1])-s*(r[0]-e[0]),g=o*a-s*i,m=Math.max(1e-8,Math.max(l,c)*1e-8);if(Math.abs(u)>m||Math.abs(f)>m||Math.abs(g)>m)return!1;let d=Math.abs(o)>=Math.abs(s),p=Math.min(d?e[0]:e[1],d?n[0]:n[1]),h=Math.max(d?e[0]:e[1],d?n[0]:n[1]),x=Math.min(d?t[0]:t[1],d?r[0]:r[1]),y=Math.max(d?t[0]:t[1],d?r[0]:r[1]);return Math.min(h,y)-Math.max(p,x)>1e-8}function oi(e,n){for(let t=0;t<e.length;t++){let r=e[t],o=e[(t+1)%e.length];for(let s=0;s<n.length;s++)if(ri(r,o,n[s],n[(s+1)%n.length]))return!0}return!1}function Mr(e,n){let t=[];for(let r=0;r<e.length;r++){let o=e[r],s=e[(r+1)%e.length],i=[{t:0,point:o},{t:1,point:s}];for(let l of n)ot(l,o)||ot(l,s)||ni(l,o,s)&&i.push({t:ti(l,o,s),point:l});i.sort((l,c)=>l.t-c.t);let a=[];for(let l of i)a.some(c=>Math.abs(c.t-l.t)<=1e-8||ot(c.point,l.point))||a.push(l);for(let l=0;l<a.length-1;l++){let c=a[l].point,u=a[l+1].point;Math.hypot(u[0]-c[0],u[1]-c[1])<=1e-8||t.push({a:[ue(c[0]),ue(c[1])],b:[ue(u[0]),ue(u[1])]})}}return t}function si(e,n,t=ln(e),r=ln(n)){if(!Js(t,r)||!oi(e,n))return null;let o=[...Mr(e,n),...Mr(n,e)],s=new Map;for(let x of o){let y=Us(x),M=s.get(y);M?M.push(x):s.set(y,[x])}let i=!1,a=[];for(let x of s.values()){if(x.length===1){a.push(x[0]);continue}i=!0;let y=x.filter(P=>ge(P.a)<ge(P.b)).length,M=x.length-y;if(y!==M)return null}if(!i||a.length<3)return null;let l=new Map;for(let x of a){let y=ge(x.a);if(l.has(y))return null;l.set(y,x)}let c=a[0],u=ge(c.a),f=[],g=new Set,m=u;for(let x=0;x<=a.length;x++){let y=l.get(m);if(!y)return null;let M=`${ge(y.a)}>${ge(y.b)}`;if(g.has(M))return null;if(g.add(M),f.push(y.a),m=ge(y.b),m===u)break}if(m!==u||g.size!==a.length)return null;let d=ct(f);if(d.length<3||!ei(d))return null;let p=cn(d),h=cn(e)+cn(n);return Math.abs(p-h)>Math.max(1e-5,h*1e-5)?null:an(d)>=0?d:[...d].reverse()}function ii(e){let n=e.map(ct).filter(o=>o.length>=3&&cn(o)>1e-8),t=n.map(ln),r=!0;for(;r;){r=!1;for(let o=0;o<n.length;o++){for(let s=o+1;s<n.length;s++){let i=si(n[o],n[s],t[o],t[s]);if(i){n[o]=i,t[o]=ln(i),n.splice(s,1),t.splice(s,1),r=!0;break}}if(r)break}}return n}function ci(e,n,t){let r=new Map;return o=>{let s=ue(o[0]),i=ue(o[1]),a=`${s},${i}`,l=r.get(a);if(l)return[l[0],l[1],l[2]];let c=st(e,st(Ke(n,s),Ke(t,i))),u=[rt(c[0]),rt(c[1]),rt(c[2])];return r.set(a,u),[u[0],u[1],u[2]]}}function ai(e,n,t,r,o){let s=t[0]?.a;if(!s)return null;let i=We(Ve(o,Ke(r,Se(o,r))));if(!i)return null;let a=We(Cr(r,i));if(!a)return null;let l=[],c=[];for(let h of t){let x=Pr(h.a,s,i,a),y=Pr(h.b,s,i,a);Math.hypot(x[0]-y[0],x[1]-y[1])<=1e-7||(l.push({a:x,b:y}),c.push(x[0],y[0]))}let u=qs(c);if(l.length<3||u.length<2)return null;let f=n[e[0]].color,g=js(e,n),m=[];for(let h=0;h<u.length-1;h++){let x=u[h],y=u[h+1];if(y-x<=1e-7)continue;let M=(x+y)/2,P=l.filter(b=>{let A=Math.min(b.a[0],b.b[0]),w=Math.max(b.a[0],b.b[0]);return A<M&&M<w&&Math.abs(b.a[0]-b.b[0])>1e-7}).map(b=>({segment:b,yMid:Ye(b,M)})).sort((b,A)=>b.yMid-A.yMid);if(P.length!==0){if(P.length%2!==0)return null;for(let b=0;b<P.length;b+=2){let A=P[b].segment,w=P[b+1].segment,I=Ye(A,x),C=Ye(A,y),v=Ye(w,x),V=Ye(w,y),R=ct([[x,I],[y,C],[y,V],[x,v]]);if(R.length<3||Math.abs(an(R))<=1e-8)continue;let E=an(R)>0?R:[...R].reverse();m.push(E)}}}if(m.length===0)return null;let d=ci(s,i,a),p=ii(m).map(h=>({vertices:h.map(d),...f?{color:f}:{},...g?{data:g}:{}}));return ie(p)}function li(e,n,t){let r=Hs(e,n);if(!r||r.length<3||!Ks(r))return null;let o=Vr(n[e[0]]);if(!o)return null;let s=null;for(let i of Qs(r,o.normal,t)){let a=ai(e,n,r,o.normal,i);a&&(!s||a.length<s.length)&&(s=a)}return!s||s.length>=e.length?null:s}function un(e,n={}){let t=n.minGroupPolygons??Bs,r=n.maxCandidateAxes??Ns,o=n.planeEpsilon??Fs,s=e??[];if(s.length<t)return s;let{groups:i}=Ys(s,o);if(i.length===0)return s;let a=new Map,l=new Set;for(let u of i){if(u.length<t)continue;let f=li(u,s,r);if(f){a.set(u[0],f);for(let g of u)l.add(g)}}if(a.size===0)return s;let c=[];for(let u=0;u<s.length;u++){let f=a.get(u);if(f){c.push(...f);continue}l.has(u)||c.push(s[u])}return c}function ui(e){let n=e.vertices;if(!n||n.length<3)return null;let t=0,r=0,o=0;for(let[E,F,D]of n)t+=E,r+=F,o+=D;let s=1/n.length;t*=s,r*=s,o*=s;let i=n[0],a=n[1],l=n[2],c=a[0]-i[0],u=a[1]-i[1],f=a[2]-i[2],g=l[0]-i[0],m=l[1]-i[1],d=l[2]-i[2],p=u*d-f*m,h=f*g-c*d,x=c*m-u*g,y=Math.hypot(p,h,x);if(y<1e-9)return null;p/=y,h/=y,x/=y;let M=n.length-2,P=new Float64Array(M*9),b=0;for(let E=1;E<n.length-1;E++){let F=n[0],D=n[E],z=n[E+1];P[b++]=F[0],P[b++]=F[1],P[b++]=F[2],P[b++]=D[0],P[b++]=D[1],P[b++]=D[2],P[b++]=z[0],P[b++]=z[1],P[b++]=z[2]}let A=0,w=1/0,I=1/0,C=1/0,v=-1/0,V=-1/0,R=-1/0;for(let[E,F,D]of n){let z=E-t,_=F-r,L=D-o,T=z*z+_*_+L*L;T>A&&(A=T),E<w&&(w=E),E>v&&(v=E),F<I&&(I=F),F>V&&(V=F),D<C&&(C=D),D>R&&(R=D)}return{centroid:[t,r,o],normal:[p,h,x],vertices:n,triFlat:P,bcx:t,bcy:r,bcz:o,br2:A,minX:w,minY:I,minZ:C,maxX:v,maxY:V,maxZ:R}}function fi(e,n,t,r,o,s,i,a){let l=i[a],c=i[a+1],u=i[a+2],f=i[a+3]-l,g=i[a+4]-c,m=i[a+5]-u,d=i[a+6]-l,p=i[a+7]-c,h=i[a+8]-u,x=o*h-s*p,y=s*d-r*h,M=r*p-o*d,P=f*x+g*y+m*M;if(P>-1e-9&&P<1e-9)return!1;let b=1/P,A=e-l,w=n-c,I=t-u,C=b*(A*x+w*y+I*M);if(C<0||C>1)return!1;let v=w*m-I*g,V=I*f-A*m,R=A*g-w*f,E=b*(r*v+o*V+s*R);return E<0||C+E>1?!1:b*(d*v+p*V+h*R)>.001}function mi(e,n,t,r,o,s,i){let a=i.bcx-e,l=i.bcy-n,c=i.bcz-t,u=a*r+l*o+c*s,f=a-u*r,g=l-u*o,m=c-u*s;if(f*f+g*g+m*m>i.br2)return!1;let d=i.triFlat,p=d.length;for(let h=0;h<p;h+=9)if(fi(e,n,t,r,o,s,d,h))return!0;return!1}var Ze=9,gi=6,re=12;function at(e,n,t,r,o,s){let i=r-e,a=o-n,l=s-t;return i*a+a*l+l*i}function di(e){let n=[];for(let A=0;A<e.length;A++)e[A]&&n.push(A);let t=n.length,r=new Int32Array(t);for(let A=0;A<t;A++)r[A]=n[A];let o=new Float64Array(t),s=new Float64Array(t),i=new Float64Array(t);for(let A=0;A<t;A++){let w=e[r[A]];o[A]=(w.minX+w.maxX)*.5,s[A]=(w.minY+w.maxY)*.5,i[A]=(w.minZ+w.maxZ)*.5}let a=2*Math.max(1,t)+1,l=new Float64Array(a*Ze),c=0,u=new Float64Array(re),f=new Float64Array(re),g=new Float64Array(re),m=new Float64Array(re),d=new Float64Array(re),p=new Float64Array(re),h=new Int32Array(re),x=new Float64Array(re-1),y=new Int32Array(re-1),M=new Float64Array(re-1),P=new Int32Array(re-1);function b(A,w){let I=c++,C=I*Ze,v=w-A,V=1/0,R=1/0,E=1/0,F=-1/0,D=-1/0,z=-1/0;for(let X=A;X<w;X++){let Q=e[r[X]];Q.minX<V&&(V=Q.minX),Q.maxX>F&&(F=Q.maxX),Q.minY<R&&(R=Q.minY),Q.maxY>D&&(D=Q.maxY),Q.minZ<E&&(E=Q.minZ),Q.maxZ>z&&(z=Q.maxZ)}if(l[C]=V,l[C+1]=R,l[C+2]=E,l[C+3]=F,l[C+4]=D,l[C+5]=z,v<=gi)return l[C+6]=1,l[C+7]=A,l[C+8]=w,I;let _=1/0,L=1/0,T=1/0,B=-1/0,O=-1/0,S=-1/0;for(let X=A;X<w;X++)o[X]<_&&(_=o[X]),o[X]>B&&(B=o[X]),s[X]<L&&(L=s[X]),s[X]>O&&(O=s[X]),i[X]<T&&(T=i[X]),i[X]>S&&(S=i[X]);let k=B-_,N=O-L,U=S-T;if(k===0&&N===0&&U===0)return l[C+6]=1,l[C+7]=A,l[C+8]=w,I;let Y=at(V,R,E,F,D,z),G=Y>0?1/Y:0,$=v+1,W=0,q=0;for(let X=0;X<3;X++){let Q=X===0?_:X===1?L:T,ae=X===0?k:X===1?N:U;if(ae===0)continue;let pe=X===0?o:X===1?s:i,Ce=re/ae;u.fill(1/0),f.fill(1/0),g.fill(1/0),m.fill(-1/0),d.fill(-1/0),p.fill(-1/0),h.fill(0);for(let j=A;j<w;j++){let Z=(pe[j]-Q)*Ce|0;Z>=re&&(Z=re-1);let le=e[r[j]];le.minX<u[Z]&&(u[Z]=le.minX),le.maxX>m[Z]&&(m[Z]=le.maxX),le.minY<f[Z]&&(f[Z]=le.minY),le.maxY>d[Z]&&(d[Z]=le.maxY),le.minZ<g[Z]&&(g[Z]=le.minZ),le.maxZ>p[Z]&&(p[Z]=le.maxZ),h[Z]++}let Re=1/0,Te=1/0,Dn=1/0,zn=-1/0,Gn=-1/0,Un=-1/0,Ut=0;for(let j=0;j<re-1;j++)u[j]<Re&&(Re=u[j]),m[j]>zn&&(zn=m[j]),f[j]<Te&&(Te=f[j]),d[j]>Gn&&(Gn=d[j]),g[j]<Dn&&(Dn=g[j]),p[j]>Un&&(Un=p[j]),Ut+=h[j],x[j]=at(Re,Te,Dn,zn,Gn,Un),y[j]=Ut;let $n=1/0,Xn=1/0,jn=1/0,Yn=-1/0,Hn=-1/0,Kn=-1/0,$t=0;for(let j=re-2;j>=0;j--){let Z=j+1;u[Z]<$n&&($n=u[Z]),m[Z]>Yn&&(Yn=m[Z]),f[Z]<Xn&&(Xn=f[Z]),d[Z]>Hn&&(Hn=d[Z]),g[Z]<jn&&(jn=g[Z]),p[Z]>Kn&&(Kn=p[Z]),$t+=h[Z],M[j]=at($n,Xn,jn,Yn,Hn,Kn),P[j]=$t}for(let j=0;j<re-1;j++){if(y[j]===0||P[j]===0)continue;let Z=.125+(x[j]*y[j]+M[j]*P[j])*G;Z<$&&($=Z,W=X,q=Q+(j+1)/Ce)}}let ee=W===0?o:W===1?s:i,H=A,K=w-1;for(;H<=K;)if(ee[H]<q)H++;else{let X=r[H];r[H]=r[K],r[K]=X;let Q=o[H];o[H]=o[K],o[K]=Q;let ae=s[H];s[H]=s[K],s[K]=ae;let pe=i[H];i[H]=i[K],i[K]=pe,K--}let te=H;(te===A||te===w)&&(te=A+w>>1),l[C+6]=0;let se=b(A,te),J=b(te,w);return l[I*Ze+7]=se,l[I*Ze+8]=J,I}return t>0&&b(0,t),{data:l,nodeCount:c,polyIndices:r,meta:e}}function wr(e,n,t,r,o,s,i,a,l){if(a.nodeCount===0)return!1;let{data:c,polyIndices:u,meta:f}=a,g=r!==0?1/r:r>=0?1/0:-1/0,m=o!==0?1/o:o>=0?1/0:-1/0,d=s!==0?1/s:s>=0?1/0:-1/0,p=0;for(l[p++]=0;p>0;){let x=l[--p]*Ze,y=(c[x]-e)*g,M=(c[x+3]-e)*g,P=y<M?y:M,b=y<M?M:y,A=(c[x+1]-n)*m,w=(c[x+4]-n)*m,I=A<w?A:w,C=A<w?w:A;if(P>C||I>b)continue;I>P&&(P=I),C<b&&(b=C);let v=(c[x+2]-t)*d,V=(c[x+5]-t)*d,R=v<V?v:V,E=v<V?V:v;if(!(P>E||R>b)&&(E<b&&(b=E),!(b<.001)))if(c[x+6]===1){let F=c[x+7]|0,D=c[x+8]|0;for(let z=F;z<D;z++){let _=u[z];if(_===i)continue;let L=f[_];if(L&&mi(e,n,t,r,o,s,L))return!0}}else l[p++]=c[x+7]|0,l[p++]=c[x+8]|0}return!1}function pi(e){let n=(1+Math.sqrt(5))/2,t=new Float64Array(e*3);for(let r=0;r<e;r++){let o=(r+.5)/e,s=Math.sqrt(Math.max(0,1-o*o)),i=2*Math.PI*(r/n);t[r*3]=s*Math.cos(i),t[r*3+1]=s*Math.sin(i),t[r*3+2]=o}return t}function hi(e){let n=Math.abs(e[0])>.9?0:1,t=Math.abs(e[0])>.9?1:0,r=t*e[2],o=-n*e[2],s=n*e[1]-t*e[0],i=Math.hypot(r,o,s);r/=i,o/=i,s/=i;let a=e[1]*s-e[2]*o,l=e[2]*r-e[0]*s,c=e[0]*o-e[1]*r;return{ux:r,uy:o,uz:s,vx:a,vy:l,vz:c}}function we(e,n){let t=n?.samples??8;if(e.length<4||t<1)return e;let r=e.map(ui),o=pi(t),s=[],i=di(r),a=new Int32Array(Math.max(64,i.nodeCount)),l=192,c=new Float64Array(l);for(let u=0;u<e.length;u++){let f=r[u];if(!f){s.push(e[u]);continue}let g=f.normal[0],m=f.normal[1],d=f.normal[2],p=.001*g,h=.001*m,x=.001*d;{let D=f.centroid[0]+p,z=f.centroid[1]+h,_=f.centroid[2]+x;if(!wr(D,z,_,g,m,d,u,i,a)){s.push(e[u]);continue}}let{ux:y,uy:M,uz:P,vx:b,vy:A,vz:w}=hi(f.normal),I=f.centroid[0],C=f.centroid[1],v=f.centroid[2],V=f.vertices,R=V.length,E=0;c[E++]=I+p,c[E++]=C+h,c[E++]=v+x;for(let D=0;D<R;D++){let z=V[D];c[E++]=z[0]+(I-z[0])*.08+p,c[E++]=z[1]+(C-z[1])*.08+h,c[E++]=z[2]+(v-z[2])*.08+x}for(let D=0;D<R;D++){let z=V[D],_=V[(D+1)%R],L=(z[0]+_[0])*.5,T=(z[1]+_[1])*.5,B=(z[2]+_[2])*.5;c[E++]=L+(I-L)*.08+p,c[E++]=T+(C-T)*.08+h,c[E++]=B+(v-B)*.08+x}let F=!1;e:for(let D=0;D<o.length;D+=3){let z=o[D],_=o[D+1],L=o[D+2],T=z*y+_*b+L*g,B=z*M+_*A+L*m,O=z*P+_*w+L*d;for(let S=0;S<E;S+=3){let k=c[S],N=c[S+1],U=c[S+2];if(!wr(k,N,U,T,B,O,u,i,a)){F=!0;break e}}}F&&s.push(e[u])}return s}var xi=3,yi=.03,bi=.02,Qe={maxAngleDeg:xi,maxPlaneDisplacement:yi,maxBoundaryDisplacement:bi,isolatedPairs:!1},ke={maxAngleDeg:15,maxPlaneDisplacement:.35,maxBoundaryDisplacement:.0725,isolatedPairs:!0},gn=[{maxAngleDeg:15,maxPlaneDisplacement:.35,maxBoundaryDisplacement:.02},{maxAngleDeg:15,maxPlaneDisplacement:.35,maxBoundaryDisplacement:.0725},{maxAngleDeg:45,maxPlaneDisplacement:1,maxBoundaryDisplacement:.0725}],Pi=[4,8,12],Mi=300,Ci=.3,vi=300,Ai=16,Vi=.015,Ir=2.6,Si=3,wi=96,Ii=1800,Ri=.65,Ti=900,Ei=300,Rr=1e-5,be={minGroupPolygons:2,maxCandidateAxes:24},Oi={...be,maxCandidateAxes:1},ki={maxGap:0,internalBoundaryLength:0,excessBoundaryLength:0};function Pn(e,n={}){let t=n.meshResolution??"lossy",r={},o=lt(e,!1,r),s=o,i=oe(o),a=(u,f=oe(u))=>f>=i?!1:(s=u,i=f,!0),l=t==="lossy"&&n.rectCover===void 0?nc(o):n.rectCover,c=mn(o,l);if(c!==o&&a(c),t==="lossy"&&n.approximateMerge!==!1){let u=[],f=s,g=null,m=null,d=()=>(g??(g=Hi(e)),g),p=()=>(m??(m=fn(d(),f,ke.maxBoundaryDisplacement).metrics),m),h=n.approximateMerge===void 0||n.approximateMerge===!0,x=(v,V=!0)=>!ji(d(),v.metrics,v.tolerance,V?p():null),y=(v,V,R=!0)=>{let E=d(),F=pn(E,V);return fn(E,v,V,Br(E,F,R?p():null))},M=(v,V)=>{a(v,V)},P=(v,V,R=ke.maxBoundaryDisplacement,E)=>{!h||V>i+Lr(i)||u.push({polygons:v,cost:V,maxBoundaryDisplacement:R,metrics:E})},b=n.rectCover!==void 0&&n.rectCover!==!1,A=h&&zi(o),w=A?[]:Tr(n.approximateMerge,h?o:void 0),I=h?_i(e):[];for(let v=0;v<w.length;v++){let V=w[v],R=lt(e,V,r),E=oe(R),F=null,D,z=T=>(F??(F=y(R,V.maxBoundaryDisplacement,T)),F),_=!!V.allowReferenceCracks,L=!0;if(h||V.guard){let T=z(_);D=T.metrics,L=x(T,_)}if(!(!L&&E<i)&&(L&&(M(R,E),P(R,E,V.maxBoundaryDisplacement,D)),b)){let T=mn(R,n.rectCover),B=oe(T),O=null,S,k=N=>(O??(O=y(T,V.maxBoundaryDisplacement,N)),O);if(T!==R&&B<i){let N=!0;if(h||V.guard){let U=k(_);S=U.metrics,N=x(U,_)}N&&(M(T,B),P(T,B,V.maxBoundaryDisplacement,S))}}}if(h&&I.length===0&&Di(o))return s;if(h)for(let v of I){let V=tc(v,r),R=V.baseline,E=oe(R),F=!0,D=null,z,_=()=>(D??(D=y(R,ke.maxBoundaryDisplacement)),D);if(E<i){let T=_();z=T.metrics,F=x(T)}if(F&&(M(R,E),P(R,E,void 0,z)),b){let T=mn(R,n.rectCover);if(T!==R){let B=oe(T),O=null,S,k=()=>(O??(O=y(T,ke.maxBoundaryDisplacement)),O),N=()=>{let U=k();return S=U.metrics,x(U)};(B>=i||N())&&(M(T,B),P(T,B,void 0,S))}}let L=A?[]:Tr(n.approximateMerge,V.baseline);for(let T of L){let B=lt(v,T,V),O=oe(B),S=null,k,N=G=>(S??(S=y(B,T.maxBoundaryDisplacement,G)),S),U=!!T.allowReferenceCracks,Y=!0;if(h||T.guard){let G=N(U);k=G.metrics,Y=x(G,U)}if(!(!Y&&O<i)&&(Y&&(M(B,O),P(B,O,T.maxBoundaryDisplacement,k)),b)){let G=mn(B,n.rectCover),$=oe(G),W=null,q,ee=H=>(W??(W=y(G,T.maxBoundaryDisplacement,H)),W);if(G!==B&&$<i){let H=!0;if(h||T.guard){let K=ee(U);q=K.metrics,H=x(K,U)}H&&(M(G,$),P(G,$,T.maxBoundaryDisplacement,q))}}}}if(h&&!A)for(let v of gn){let V=Xr({...v,isolatedPairs:!0}),R=lc(s,V);if(R===s)continue;let E=oe(R);if(E>=i)continue;let F=y(R,V.maxBoundaryDisplacement);x(F)&&(M(R,E),P(R,E,V.maxBoundaryDisplacement,F.metrics))}let C=Ui(u,s,i,v=>(v.metrics??(v.metrics=fn(d(),v.polygons,v.maxBoundaryDisplacement).metrics),v.metrics),()=>fn(d(),s,ke.maxBoundaryDisplacement).metrics);C&&(s=C.polygons,i=C.cost)}return s}function _i(e){let n=Li(e);if(n.eligiblePolygons<24||n.colorCount<8)return[];let t=[],r=new Set;for(let o of Pi){let s=Bi(e,o,n.colorCount);if(!s)continue;let i=Fi(s);r.has(i)||(r.add(i),t.push(s))}return t}function Li(e){let n=new Set,t=0;for(let r of e)r.texture||r.material?.texture||r.uvs||r.textureTriangles?.length||kr(r.color)&&(t+=1,n.add(r.color??"#cccccc"));return{eligiblePolygons:t,colorCount:n.size}}function Bi(e,n,t){let r=!1,o=new Set,s=e.map(i=>{if(i.texture||i.material?.texture||i.uvs||i.textureTriangles?.length)return i;let a=kr(i.color);if(!a)return i;let l=Ni([Math.round(a[0]/n)*n,Math.round(a[1]/n)*n,Math.round(a[2]/n)*n]);return o.add(l),l===i.color?i:(r=!0,{...i,color:l})});return!r||o.size>=t?null:s}function kr(e){let n=e??"#cccccc",t=/^#([0-9a-f])([0-9a-f])([0-9a-f])$/i.exec(n);if(t)return[parseInt(t[1]+t[1],16),parseInt(t[2]+t[2],16),parseInt(t[3]+t[3],16)];let r=/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(n);return r?[parseInt(r[1],16),parseInt(r[2],16),parseInt(r[3],16)]:null}function Ni(e){return`#${e.map(n=>Math.max(0,Math.min(255,Math.round(n))).toString(16).padStart(2,"0")).join("")}`}function Fi(e){return e.map(n=>n.color??"").join("|")}function Tr(e,n){if(e&&e!==!0)return typeof e.isolatedPairs=="boolean"?[{...e,guard:e.isolatedPairs===!1}]:[{...e,isolatedPairs:!0,guard:!1},{...e,isolatedPairs:!1,guard:!0}];if(n&&_r(n))return[{...gn[0],isolatedPairs:!0,guard:!1,allowReferenceCracks:!0}];let t=[],r=new Set,o=n&&n.length>vi?[!0]:[!0,!1];for(let s=0;s<gn.length;s++){let i=gn[s];for(let a of o){let l={...i,isolatedPairs:a,guard:s>0||a===!1,allowReferenceCracks:!0},c=[l.maxAngleDeg,l.maxPlaneDisplacement,l.maxBoundaryDisplacement,l.isolatedPairs].join("|");r.has(c)||(r.add(c),t.push(l))}}return t.length===0?[{...ke,guard:!1}]:t}function _r(e){return e.length<Mi?!1:mt(e)/e.length<=Ci}function Di(e){return e.length>=Ti&&_r(e)}function zi(e){if(e.length<Ei)return!1;for(let n of e){if(n.vertices.length!==4||n.texture||n.material?.texture||n.textureTriangles?.length)return!1;let t=_e(n);if(!t||!Gi(t.normal))return!1}return!0}function Gi(e){let n=Math.abs(e[0]),t=Math.abs(e[1]),r=Math.abs(e[2]),o=Math.max(n,t,r);return o>=1-Rr&&n+t+r-o<=Rr}function oe(e){let n=0;for(let t of e){let r=t.vertices.length,o=r<=4?0:Math.min(4,r-4)*.12,s=t.texture||t.material?.texture||t.textureTriangles?.length?.15:0;n+=1+o+s}return n}function Lr(e){return Math.max(Ai,e*Vi)}function Ui(e,n,t,r,o){if(e.length===0)return null;let s=Lr(t),i=e.find(u=>u.polygons===n),a=null,l=null,c=null;for(let u of e){if(u.polygons===n||u.cost>t+s)continue;let f=r(u);a??(a=i?r(i):o()),Xi(f,a)&&(!l||!c||$i(u,f,l,c)<0)&&(l=u,c=f)}return l}function $i(e,n,t,r){return n.maxGap-r.maxGap||n.internalBoundaryLength-r.internalBoundaryLength||n.excessBoundaryLength-r.excessBoundaryLength||e.cost-t.cost}function Xi(e,n){let t=Math.max(5e-4,n.maxGap*.02);if(e.maxGap<n.maxGap-t)return!0;if(e.maxGap>n.maxGap+t)return!1;let r=Math.max(8,n.internalBoundaryLength*.01);if(e.internalBoundaryLength<n.internalBoundaryLength-r)return!0;if(e.internalBoundaryLength>n.internalBoundaryLength+r)return!1;let o=Math.max(8,n.excessBoundaryLength*.01);return e.excessBoundaryLength<n.excessBoundaryLength-o}function ji(e,n,t,r=null){return dn(n,Br(e,t,r))}function Br(e,n,t=null){if(!t)return{maxGap:1/0,internalBoundaryLength:0,excessBoundaryLength:n};let r=Math.max(n*.1,1e-6),o=t.maxGap+r,s=n<=.08?Math.max(o,Math.min(n*.75,.04)):o,i=Math.max(n*2,t.internalBoundaryLength*.15),a=Math.max(n*2,t.excessBoundaryLength*.15);return{maxGap:s,internalBoundaryLength:t.internalBoundaryLength+i,excessBoundaryLength:t.excessBoundaryLength+a}}function dn(e,n){return e.maxGap>n.maxGap||e.internalBoundaryLength>n.internalBoundaryLength||e.excessBoundaryLength>n.excessBoundaryLength}function Yi(e,n,t=0,r=pn(e,t),o){let s=e.edges,i=Nr(n),a=pn(e,t),l=r>0?Wi(e,r):null,c={...ki,excessBoundaryLength:Math.max(0,i.boundaryLength-s.boundaryLength)};if(o&&dn(c,o))return{metrics:c,tolerance:a};for(let u of i.boundarySegments){let f=Le(u.a,u.b);if(s.boundaryKeys.has(f))continue;if(s.internalKeys.has(f)){if(c.internalBoundaryLength+=de(u.a,u.b),o&&dn(c,o))break;continue}let g=l?qi(u,l,r):null;if(g!==null&&(c.maxGap=Math.max(c.maxGap,g),c.internalBoundaryLength+=de(u.a,u.b),o&&dn(c,o)))break}return{metrics:c,tolerance:a}}function fn(e,n,t=0,r){return Yi(e,n,t,Ki(e,t),r)}function Hi(e){let n=Zi(e),t=n>0?Math.min(.08,Math.max(.001,n*.001)):0;return{edges:Nr(e),baseTolerance:t,polygonCount:e.length,indexes:new Map}}function pn(e,n=0){return Math.max(e.baseTolerance,n*1.05)}function Ki(e,n=0){return Math.max(pn(e,n),e.baseTolerance*Ir,n*Ir)}function Wi(e,n){let t=n.toFixed(6),r=e.indexes.get(t);if(r)return r;let o=Qi(e.edges.internalSegments,n);return e.indexes.set(t,o),o}function Nr(e){let n=new Map;for(let a of e)for(let l=0;l<a.vertices.length;l++){let c=a.vertices[l],u=a.vertices[(l+1)%a.vertices.length],f=Le(c,u),g=n.get(f);g?g.count+=1:n.set(f,{count:1,a:c,b:u})}let t=new Set,r=new Set,o=[],s=[],i=0;for(let[a,l]of n){let c={a:l.a,b:l.b};l.count===1?(t.add(a),o.push(c),i+=de(c.a,c.b)):(r.add(a),s.push(c))}return{boundaryKeys:t,internalKeys:r,boundarySegments:o,internalSegments:s,boundaryLength:i}}function Zi(e){let n=1/0,t=1/0,r=1/0,o=-1/0,s=-1/0,i=-1/0;for(let a of e)for(let[l,c,u]of a.vertices)n=Math.min(n,l),t=Math.min(t,c),r=Math.min(r,u),o=Math.max(o,l),s=Math.max(s,c),i=Math.max(i,u);return Number.isFinite(n)?Math.hypot(o-n,s-t,i-r):0}function Qi(e,n){let t=Math.max(n*2,1e-6),r=new Map;for(let o of e){let[s,i,a]=Fr(o,t),l=Dr(s,i,a),c=r.get(l);c?c.push(o):r.set(l,[o])}return{cellSize:t,cells:r}}function qi(e,n,t){let[r,o,s]=Fr(e,n.cellSize),i=null;for(let a=-1;a<=1;a++)for(let l=-1;l<=1;l++)for(let c=-1;c<=1;c++){let u=n.cells.get(Dr(r+a,o+l,s+c));if(u)for(let f of u){let g=Ji(e,f);g<=t&&(i=i===null?g:Math.min(i,g))}}return i}function Fr(e,n){return[Math.floor((e.a[0]+e.b[0])/2/n),Math.floor((e.a[1]+e.b[1])/2/n),Math.floor((e.a[2]+e.b[2])/2/n)]}function Dr(e,n,t){return`${e},${n},${t}`}function Ji(e,n){return Math.min(Math.max(de(e.a,n.a),de(e.b,n.b)),Math.max(de(e.a,n.b),de(e.b,n.a)))}function mn(e,n){if(n===!1)return e;let t=ec(e,n);if(!t)return e;let r=un(e,t);return r.length<e.length?r:e}function ec(e,n){if(n&&n!==!0)return n;let t=e.length;return t>2200?null:t>1200?{...be,maxCandidateAxes:Math.min(be.maxCandidateAxes??24,2)}:t>300&&mt(e)<=wi?{...be,maxCandidateAxes:Math.min(be.maxCandidateAxes??24,2)}:t>900?{...be,maxCandidateAxes:Math.min(be.maxCandidateAxes??24,4)}:be}function nc(e){return e.length>Ii||e.length===0||mt(e)/e.length<Ri?!1:Oi}function mt(e){let n=0;for(let t of e)t.vertices.length===3&&(n+=1);return n}function gt(e,n){return n==null?e:n.map(t=>e[t]).filter(t=>!!t)}function zr(e,n){if(n===e||n.length===e.length&&n.every((o,s)=>o===e[s]))return null;let t=new Set(n),r=[];for(let o=0;o<e.length;o++)t.has(e[o])&&r.push(o);return r.length===e.length?null:r}function Gr(e,n){if(n?.deduped)return n.deduped;let t=n?.dedupedIndices;if(t===void 0){let o=je(e);if(o.size===0)t=null;else{t=[];for(let s=0;s<e.length;s++)o.has(s)||t.push(s)}n&&(n.dedupedIndices=t)}let r=gt(e,t);return n&&(n.deduped=r),r}function Ur(e,n){if(n?.interior)return n.interior;let t=n?.interiorIndices;if(t===void 0){let o=we(e);t=zr(e,o),n&&(n.interiorIndices=t)}let r=gt(e,t);return n&&(n.interior=r),r}function tc(e,n){let t={dedupedIndices:n.dedupedIndices,interiorIndices:n.interiorIndices,snappedInteriorIndices:n.snappedInteriorIndices},r=Gr(e,t);n.snapped&&n.snapped.length===r.length&&(t.snapped=rc(r,n.snapped));let o=Ur(r,t);return t.baseline=ie(o),t}function rc(e,n){return e.map((t,r)=>{let o=n[r];return o?{...t,vertices:o.vertices,...o.uvs?{uvs:o.uvs}:{},...o.textureTriangles?{textureTriangles:o.textureTriangles}:{}}:t})}function lt(e,n,t){let r=Gr(e,t),o=Ur(r,t),s=t?.baseline??ie(o);if(t&&!t.baseline&&(t.baseline=s),!n)return s;let i=n===!0?Qe:Xr(n);if(i.isolatedPairs){let l=sc(oc(r,t),i),c=ie(l);return c.length<s.length?c:s}let a=ie(we(bc(r,i,t)));return a.length<s.length?a:s}function $r(e,n){return n?(n.snapped||(n.snapped=xn(e)),n.snapped):xn(e)}function oc(e,n){if(!n)return we(xn(e));if(!n.snappedInterior){let t=$r(e,n);if(n.snappedInteriorIndices===void 0){let r=we(t);n.snappedInteriorIndices=zr(t,r),n.snappedInterior=r}else n.snappedInterior=gt(t,n.snappedInteriorIndices)}return n.snappedInterior}function Xr(e){return{maxAngleDeg:e.maxAngleDeg??Qe.maxAngleDeg,maxPlaneDisplacement:e.maxPlaneDisplacement??Qe.maxPlaneDisplacement,maxBoundaryDisplacement:e.maxBoundaryDisplacement??Qe.maxBoundaryDisplacement,isolatedPairs:e.isolatedPairs??Qe.isolatedPairs}}function sc(e,n){let t=e.map(f=>{let g=_e(f);return g?{polygon:f,normal:g.normal,area:g.area,materialKey:pt(f)}:null}),r=new Map;for(let f=0;f<e.length;f++){let g=e[f];if(!(g.vertices.length!==3||!t[f]))for(let m=0;m<g.vertices.length;m++){let d=Le(g.vertices[m],g.vertices[(m+1)%g.vertices.length]),p=r.get(d);p?p.push(f):r.set(d,[f])}}let o=[];for(let f of r.values()){if(f.length!==2)continue;let[g,m]=f,d=yc(g,m,e,t,n);d&&o.push(d)}let s=new Set,i=new Map,a=new Set,l=ic(o),c=Mn(l.flatMap(f=>f.vertexMoves));for(let f of l){s.add(f.a),s.add(f.b);let g=Math.min(f.a,f.b);i.set(g,f.polygon),a.add(Math.max(f.a,f.b))}let u=[];for(let f=0;f<e.length;f++){let g=i.get(f);if(g){u.push(g);continue}a.has(f)||u.push(e[f])}return c.size>0?Cn(u,c):u}function ic(e){return e.length>3e3?cc(e):ac(e)}function cc(e){let n=new Map;for(let s of e)n.set(s.a,(n.get(s.a)??0)+1),n.set(s.b,(n.get(s.b)??0)+1);let t=[...e].sort((s,i)=>{let a=(n.get(s.a)??0)+(n.get(s.b)??0),l=(n.get(i.a)??0)+(n.get(i.b)??0);return a-l||s.score-i.score}),r=new Set,o=[];for(let s of t)r.has(s.a)||r.has(s.b)||(r.add(s.a),r.add(s.b),o.push(s));return o}function ac(e){let n=new Map;for(let c=0;c<e.length;c++){let u=e[c],f=n.get(u.a);f?f.push(c):n.set(u.a,[c]);let g=n.get(u.b);g?g.push(c):n.set(u.b,[c])}let t=[],r=new Array(e.length).fill(!0),o=new Map,s=new ft;for(let[c,u]of n)o.set(c,u.length);let i=c=>(o.get(c.a)??0)+(o.get(c.b)??0),a=c=>{let u=e[c];s.push({degree:i(u),score:u.score,index:c})},l=(c,u)=>{if(!r[c])return;r[c]=!1;let f=e[c];for(let g of[f.a,f.b])o.set(g,(o.get(g)??0)-1),u.add(g)};for(let c=0;c<e.length;c++)a(c);for(;s.size()>0;){let c=s.pop();if(!r[c.index])continue;let u=e[c.index];if(i(u)!==c.degree){a(c.index);continue}t.push(u);let g=new Set;for(let m of[u.a,u.b])for(let d of n.get(m)??[])l(d,g);for(let m of g)for(let d of n.get(m)??[])r[d]&&a(d)}return t}var ft=class{constructor(){this.items=[]}size(){return this.items.length}push(n){this.items.push(n);let t=this.items.length-1;for(;t>0;){let r=t-1>>1;if(ut(this.items[r],this.items[t])<=0)break;[this.items[r],this.items[t]]=[this.items[t],this.items[r]],t=r}}pop(){if(this.items.length===0)return null;let n=this.items[0],t=this.items.pop();if(this.items.length>0){this.items[0]=t;let r=0;for(;;){let o=r*2+1,s=o+1,i=r;if(o<this.items.length&&ut(this.items[o],this.items[i])<0&&(i=o),s<this.items.length&&ut(this.items[s],this.items[i])<0&&(i=s),i===r)break;[this.items[r],this.items[i]]=[this.items[i],this.items[r]],r=i}}return n}};function ut(e,n){return e.degree-n.degree||e.score-n.score||e.index-n.index}function lc(e,n){let t=e,r=oe(t),o=gc(t);for(let s=0;s<Si;s++){let i=uc(t,n,o);if(!i)break;let a=oe(i.polygons);if(a>=r)break;t=i.polygons,r=a,o=i.origins}return t===e?e:t}function uc(e,n,t){let r=e.map(g=>{let m=_e(g);return m?{polygon:g,normal:m.normal,area:m.area,materialKey:pt(g)}:null}),o=new Map;for(let g=0;g<e.length;g++){let m=e[g];if(!(!r[g]||m.vertices.length<3))for(let d=0;d<m.vertices.length;d++){let p=Le(m.vertices[d],m.vertices[(d+1)%m.vertices.length]),h=o.get(p);h?h.push({polygon:g,edge:d}):o.set(p,[{polygon:g,edge:d}])}}let s=[];for(let g of o.values()){if(g.length!==2)continue;let[m,d]=g,p=fc(m.polygon,m.edge,d.polygon,d.edge,e,r,n);p&&s.push(p)}if(s.length===0)return null;s.sort((g,m)=>m.score-g.score);let i=new Set,a=[];for(let g of s)i.has(g.a)||i.has(g.b)||(i.add(g.a),i.add(g.b),a.push(g));if(a.length===0)return null;let l=Mn(a.flatMap(g=>g.vertexMoves));if(!mc(l,t,n.maxBoundaryDisplacement))return null;let c=Cn(e,l),u=dc(e,l,t),f=ie(c);return oe(f)<oe(e)?{polygons:f,origins:pc(f,u)}:null}function fc(e,n,t,r,o,s,i){let a=o[e],l=o[t],c=s[e],u=s[t];if(!c||!u||a.vertices.length===3&&l.vertices.length===3||!Qr(a,l,c,u))return null;let f=Math.abs(fe(c.normal,u.normal)),g=Math.cos(i.maxAngleDeg*Math.PI/180);if(f<g)return null;let m=Er(a,l,n)??Er(l,a,r);if(!m||m.length<4||m.length>10)return null;let d=Yr(m);if(!d)return null;let p=0,h=0;for(let I of m){let C=Math.abs(vn(I,d));p=Math.max(p,C),h+=C*C}if(p>Math.min(i.maxPlaneDisplacement,i.maxBoundaryDisplacement))return null;let x=m.map(I=>An(I,d));if(!Hr(x,d.normal))return null;let y=_e({vertices:x});if(!y||fe(y.normal,c.normal)<.2||fe(y.normal,u.normal)<.2)return null;let M=[...m.map((I,C)=>({key:ne(I),target:x[C]})),...jr([a,l],d)],P=Cn([a,l],Mn(M)),b=oe([a,l]),A=oe(ie(P));if(A>=b)return null;let w=b-A-(h/m.length+p*.25+(1-f)*.1);return w<=0?null:{a:e,b:t,vertexMoves:M,score:w}}function Er(e,n,t){let r=e.vertices,o=n.vertices,s=r[t],i=r[(t+1)%r.length],a=-1;for(let u=0;u<o.length;u++)if(Pe(o[u],i)&&Pe(o[(u+1)%o.length],s)){a=u;break}if(a<0)return null;let l=[],c=(t+1)%r.length;for(l.push(r[c]);c!==t;)c=(c+1)%r.length,l.push(r[c]);for(c=(a+2)%o.length;c!==a;){let u=o[c];Pe(u,l[l.length-1])||l.push(u),c=(c+1)%o.length}return l.length>1&&Pe(l[0],l[l.length-1])&&l.pop(),l}function mc(e,n,t){for(let[r,o]of e){let s=hc(r),i=n.get(r)??(s?[s]:[]);if(i.length===0)return!1;for(let a of i)if(de(a,o)>t+1e-6)return!1}return!0}function gc(e){let n=new Map;for(let t of e){for(let r of t.vertices)hn(n,ne(r),r);for(let r of t.textureTriangles??[])for(let o of r.vertices)hn(n,ne(o),o)}return n}function dc(e,n,t){let r=new Map;for(let o of e){let s=[...o.vertices,...(o.textureTriangles??[]).flatMap(i=>i.vertices)];for(let i of s){let a=ne(i),l=n.get(a)??i,c=ne(l);for(let u of t.get(a)??[i])hn(r,c,u)}}return r}function pc(e,n){let t=new Map;for(let r of e){let o=[...r.vertices,...(r.textureTriangles??[]).flatMap(s=>s.vertices)];for(let s of o){let i=ne(s);for(let a of n.get(i)??[s])hn(t,i,a)}}return t}function hn(e,n,t){let r=e.get(n);if(!r){e.set(n,[t]);return}let o=ne(t);r.some(s=>ne(s)===o)||r.push(t)}function hc(e){let n=e.split(",").map(Number);return n.length===3&&n.every(Number.isFinite)?[n[0],n[1],n[2]]:null}function Mn(e){let n=new Map;for(let r of e){let o=n.get(r.key);o?(o.x+=r.target[0],o.y+=r.target[1],o.z+=r.target[2],o.count+=1):n.set(r.key,{x:r.target[0],y:r.target[1],z:r.target[2],count:1})}let t=new Map;for(let[r,o]of n)t.set(r,[o.x/o.count,o.y/o.count,o.z/o.count]);return t}function xc(e,n){let t=[];for(let r=0;r<e.length;r++){let o=e[r].vertices,s=n[r]?.vertices;if(!s||s.length!==o.length)continue;for(let l=0;l<o.length;l++)t.push({key:ne(o[l]),target:s[l]});let i=e[r].textureTriangles??[],a=n[r]?.textureTriangles??[];for(let l=0;l<i.length;l++){let c=a[l];if(c)for(let u=0;u<i[l].vertices.length;u++)t.push({key:ne(i[l].vertices[u]),target:c.vertices[u]})}}return t}function jr(e,n){let t=[];for(let r of e)for(let o of r.textureTriangles??[])for(let s of o.vertices)t.push({key:ne(s),target:An(s,n)});return t}function Cn(e,n){return e.map(t=>{let r=!1,o=a=>{let l=n.get(ne(a));return l?(r=!0,l):a},s=t.vertices.map(o),i=dt(t.textureTriangles,o);return r?{...t,vertices:s,...i?{textureTriangles:i}:{}}:t})}function yc(e,n,t,r,o){let s=t[e],i=t[n],a=r[e],l=r[n];if(!a||!l||s.vertices.length!==3||i.vertices.length!==3||!Qr(s,i,a,l))return null;let c=xt(s,i);if(!c)return null;let[u,f,g,m]=c;if((g+1)%i.vertices.length===m)return null;let p=Math.abs(fe(a.normal,l.normal)),h=Math.cos(o.maxAngleDeg*Math.PI/180);if(p<h)return null;let x=(f+1)%s.vertices.length,y=3-g-m,M=[s.vertices[f],s.vertices[x],s.vertices[u],i.vertices[y]],P=Yr(M);if(!P)return null;let b=0,A=0;for(let v of M){let V=Math.abs(vn(v,P));b=Math.max(b,V),A+=V*V}if(b>Math.min(o.maxPlaneDisplacement,o.maxBoundaryDisplacement))return null;let w=M.map(v=>An(v,P));if(!Hr(w,P.normal))return null;let I=_e({vertices:w});if(!I||fe(I.normal,a.normal)<.2||fe(I.normal,l.normal)<.2)return null;let C={vertices:M,color:s.color,...s.data?{data:{...s.data}}:{}};if(ht(s,i)&&s.uvs&&i.uvs&&s.texture){C.texture=s.texture,C.uvs=[[...s.uvs[f]],[...s.uvs[x]],[...s.uvs[u]],[...i.uvs[y]]];let v=Pc([s,i]);v?.length&&(C.textureTriangles=v)}return{a:e,b:n,polygon:C,vertexMoves:[...M.map((v,V)=>({key:ne(v),target:w[V]})),...jr([s,i],P)],score:A/M.length+b*.25+(1-p)*.1}}function Yr(e){if(e.length<3)return null;let n=0,t=0,r=0,o=0,s=0,i=0;for(let l=0;l<e.length;l++){let c=e[l],u=e[(l+1)%e.length];n+=(c[1]-u[1])*(c[2]+u[2]),t+=(c[2]-u[2])*(c[0]+u[0]),r+=(c[0]-u[0])*(c[1]+u[1]),o+=c[0],s+=c[1],i+=c[2]}let a=to([n,t,r]);return a?{normal:a,point:[o/e.length,s/e.length,i/e.length]}:null}function Hr(e,n){let t=0;for(let r=0;r<e.length;r++){let o=e[r],s=e[(r+1)%e.length],i=e[(r+2)%e.length],a=fe(no(qe(s,o),qe(i,s)),n);if(Math.abs(a)<=1e-9)continue;let l=a>0?1:-1;if(t===0)t=l;else if(t!==l)return!1}return!0}function bc(e,n,t){let r=$r(e,t),o=Sc(r,n);if(o<=0)return r;let s=r.map(m=>{let d=_e(m);return d?{polygon:m,normal:d.normal,area:d.area,materialKey:pt(m)}:null}),i=Rc(r,s),a=new Set,l=Array(r.length),c=[],u=(m,d)=>{l[m]=d};for(let m=0;m<r.length;m++){let d=s[m];if(a.has(m))continue;if(!d){u(m,r[m]);continue}let p=Ec(m,s,i,a,o,n);for(let x of p)a.add(x);if(p.length<2){u(m,r[m]);continue}let h=vc(p,r,s,i,o,n);c.push(...h.vertexMoves);for(let x of p)u(x,h.polygons.get(x)??r[x])}let f=l.flatMap(m=>m?[m]:[]),g=c.length>0?Cn(f,Mn(c)):f;return xn(g)}function xn(e){let n=Zr(e),t=1e-4;if(n<=0)return e;let r=wc(n),o=Ic(t);return e.map(s=>{let i=f=>r.snap(f),a=s.vertices.map(i),l=s.uvs&&s.uvs.length===s.vertices.length?s.uvs.map(f=>o.snap(f)):void 0,c=dt(s.textureTriangles,i),u={...s,vertices:a,...l?{uvs:l}:{},...c?{textureTriangles:c}:{}};return{...u,...u.texture?{textureTriangles:Kr(u)}:{}}})}function Kr(e){if(e.texture){if(e.textureTriangles?.length)return Cc(e.textureTriangles);if(e.uvs&&e.uvs.length===e.vertices.length)return Mc(e.vertices,e.uvs)}}function Pc(e){let n=e.flatMap(t=>Kr(t)??[]);return n.length>0?n:void 0}function Mc(e,n){let t=[];for(let r=1;r<e.length-1;r++)t.push({vertices:[[...e[0]],[...e[r]],[...e[r+1]]],uvs:[[...n[0]],[...n[r]],[...n[r+1]]]});return t}function Cc(e){return e.map(n=>({vertices:n.vertices.map(t=>[...t]),uvs:n.uvs.map(t=>[...t])}))}function dt(e,n){if(e?.length)return e.map(t=>({vertices:t.vertices.map(n),uvs:t.uvs.map(r=>[...r])}))}function vc(e,n,t,r,o,s){let i=Wr(e,n,t,o,s);return i?Vc(i):Ac(e,n,t,r,o,s)}function Ac(e,n,t,r,o,s){let i=new Set(e),a=[];for(let f of e)for(let g of r.get(f)??[]){if(f>=g||!i.has(g))continue;let m=Wr([f,g],n,t,o,s);m&&a.push(m)}a.sort((f,g)=>g.score-f.score);let l=new Set,c=new Map,u=[];for(let f of a)if(!f.indices.some(g=>l.has(g))){u.push(...f.vertexMoves);for(let g=0;g<f.indices.length;g++){let m=f.indices[g];l.add(m),c.set(m,n[m])}}return{polygons:c,vertexMoves:u}}function Vc(e){let n=new Map;for(let t=0;t<e.indices.length;t++)n.set(e.indices[t],e.source[t]);return{polygons:n,vertexMoves:e.vertexMoves}}function Wr(e,n,t,r,o){let s=qr(e,t);if(!s||!Jr(e,t,s,r,o))return null;let i=e.map(u=>n[u]),a=i.map(u=>_c(u,s)),l=oe(ie(i)),c=oe(ie(a));return c>=l?null:{indices:e,source:i,projected:a,vertexMoves:xc(i,a),score:l-c}}function Sc(e,n){return Zr(e)<=0?0:n.maxPlaneDisplacement}function Zr(e){let n=1/0,t=1/0,r=1/0,o=-1/0,s=-1/0,i=-1/0;for(let l of e)for(let[c,u,f]of l.vertices)n=Math.min(n,c),t=Math.min(t,u),r=Math.min(r,f),o=Math.max(o,c),s=Math.max(s,u),i=Math.max(i,f);if(!Number.isFinite(n))return 0;let a=Math.hypot(o-n,s-t,i-r);return a<=0?0:Math.min(.025,Math.max(1e-4,a*25e-5))}function wc(e){let n=new Map,t=o=>Math.floor(o/e),r=(o,s,i)=>`${o},${s},${i}`;return{snap(o){let s=t(o[0]),i=t(o[1]),a=t(o[2]);for(let f=-1;f<=1;f++)for(let g=-1;g<=1;g++)for(let m=-1;m<=1;m++){let d=n.get(r(s+f,i+g,a+m));if(d){for(let p of d)if(de(o,p)<=e)return[p[0],p[1],p[2]]}}let l=[o[0],o[1],o[2]],c=r(s,i,a),u=n.get(c);return u?u.push(l):n.set(c,[l]),l}}}function Ic(e){let n=new Map,t=o=>Math.floor(o/e),r=(o,s)=>`${o},${s}`;return{snap(o){let s=t(o[0]),i=t(o[1]);for(let u=-1;u<=1;u++)for(let f=-1;f<=1;f++){let g=n.get(r(s+u,i+f));if(g){for(let m of g)if(Math.hypot(o[0]-m[0],o[1]-m[1])<=e)return[m[0],m[1]]}}let a=[o[0],o[1]],l=r(s,i),c=n.get(l);return c?c.push(a):n.set(l,[a]),a}}}function pt(e){return`${e.color??"#cccccc"}|${e.texture??""}|${e.uvs?"uv":"plain"}`}function _e(e){let n=e.vertices;if(!n||n.length<3)return null;let t=0,r=0,o=0,s=n[0];for(let a=1;a<n.length-1;a++){let l=qe(n[a],s),c=qe(n[a+1],s),u=no(l,c);t+=u[0],r+=u[1],o+=u[2]}let i=Math.hypot(t,r,o);return i<=1e-10?null:{normal:[t/i,r/i,o/i],area:i/2}}function Rc(e,n){let t=new Map,r=new Map;for(let o=0;o<e.length;o++){let s=e[o];if(!(!n[o]||s.vertices.length<3))for(let i=0;i<s.vertices.length;i++){let a=Le(s.vertices[i],s.vertices[(i+1)%s.vertices.length]),l=t.get(a);l?l.push(o):t.set(a,[o])}}for(let o of t.values())for(let s=0;s<o.length;s++)for(let i=s+1;i<o.length;i++){let a=o[s],l=o[i];Tc(e[a],e[l],n[a],n[l])&&(Or(r,a,l),Or(r,l,a))}return r}function Tc(e,n,t,r){if(!t||!r||t.materialKey!==r.materialKey||!!e.uvs!=!!n.uvs)return!1;if(yn(e)||yn(n))return ht(e,n);if(!e.uvs||!n.uvs)return!0;let o=xt(e,n);if(!o)return!1;let[s,i,a,l]=o;return bn(e.uvs[s],n.uvs[a])&&bn(e.uvs[i],n.uvs[l])}function Qr(e,n,t,r){return t.materialKey!==r.materialKey?!1:yn(e)||yn(n)?ht(e,n):!e.uvs&&!n.uvs&&!e.textureTriangles?.length&&!n.textureTriangles?.length}function yn(e){return!!(e.texture||e.material?.texture||e.textureTriangles?.length)}function ht(e,n){if(!e.texture||!n.texture||e.texture!==n.texture||e.material?.texture||n.material?.texture||!e.uvs||!n.uvs||e.uvs.length!==e.vertices.length||n.uvs.length!==n.vertices.length)return!1;let t=xt(e,n);if(!t)return!1;let[r,o,s,i]=t;return bn(e.uvs[r],n.uvs[s])&&bn(e.uvs[o],n.uvs[i])}function Or(e,n,t){let r=e.get(n);r?r.add(t):e.set(n,new Set([t]))}function Ec(e,n,t,r,o,s){let i=[e],a=new Set([e]),l=[e];for(;l.length>0;){let c=l.shift();for(let u of t.get(c)??[]){if(r.has(u)||a.has(u))continue;let f=n[u],g=n[e];!f||!g||f.materialKey===g.materialKey&&Oc([...i,u],n,o,s)&&(i.push(u),a.add(u),l.push(u))}}return i}function Oc(e,n,t,r){let o=qr(e,n);return!!o&&Jr(e,n,o,t,r)}function qr(e,n){let t=n[e[0]];if(!t)return null;let r=0,o=0,s=0,i=0,a=0,l=0,c=0;for(let m of e){let d=n[m];if(!d)return null;let p=fe(t.normal,d.normal)<0?-1:1,h=Math.max(d.area,1e-6);r+=d.normal[0]*p*h,o+=d.normal[1]*p*h,s+=d.normal[2]*p*h;for(let x of d.polygon.vertices)i+=x[0],a+=x[1],l+=x[2],c+=1}let u=to([r,o,s]);if(!u||c===0)return null;let f=eo(e,n),g=kc(e,n,u,f);if(g){let m=(g.min+g.max)/2;return{normal:u,point:[u[0]*m,u[1]*m,u[2]*m]}}return{normal:u,point:[i/c,a/c,l/c]}}function kc(e,n,t,r){let o=1/0,s=-1/0;for(let i of e){let a=n[i];if(a)for(let l of a.polygon.vertices){if(!r.has(ne(l)))continue;let c=fe(l,t);o=Math.min(o,c),s=Math.max(s,c)}}return Number.isFinite(o)&&Number.isFinite(s)?{min:o,max:s}:null}function Jr(e,n,t,r,o){let s=Math.cos(o.maxAngleDeg*Math.PI/180),i=eo(e,n);for(let a of e){let l=n[a];if(!l||Math.abs(fe(l.normal,t.normal))<s)return!1;for(let c of l.polygon.vertices){let u=i.has(ne(c))?o.maxBoundaryDisplacement:r;if(Math.abs(vn(c,t))>u)return!1}}return!0}function eo(e,n){let t=new Map;for(let o of e){let s=n[o];if(!s)continue;let i=s.polygon.vertices;for(let a=0;a<i.length;a++){let l=i[a],c=i[(a+1)%i.length],u=Le(l,c),f=t.get(u);f?f.count+=1:t.set(u,{count:1,a:l,b:c})}}let r=new Set;for(let o of t.values())o.count===1&&(r.add(ne(o.a)),r.add(ne(o.b)));return r}function _c(e,n){let t=o=>An(o,n),r=dt(e.textureTriangles,t);return{...e,vertices:e.vertices.map(t),...r?{textureTriangles:r}:{}}}function xt(e,n){for(let t=0;t<e.vertices.length;t++){let r=(t+1)%e.vertices.length;for(let o=0;o<n.vertices.length;o++){let s=(o+1)%n.vertices.length;if(Pe(e.vertices[t],n.vertices[o])&&Pe(e.vertices[r],n.vertices[s]))return[t,r,o,s];if(Pe(e.vertices[t],n.vertices[s])&&Pe(e.vertices[r],n.vertices[o]))return[t,r,s,o]}}return null}function Le(e,n){let t=ne(e),r=ne(n);return t<r?`${t}|${r}`:`${r}|${t}`}function ne(e){return`${e[0]},${e[1]},${e[2]}`}function Pe(e,n){return e[0]===n[0]&&e[1]===n[1]&&e[2]===n[2]}function bn(e,n){return Math.abs(e[0]-n[0])<=1e-4&&Math.abs(e[1]-n[1])<=1e-4}function qe(e,n){return[e[0]-n[0],e[1]-n[1],e[2]-n[2]]}function no(e,n){return[e[1]*n[2]-e[2]*n[1],e[2]*n[0]-e[0]*n[2],e[0]*n[1]-e[1]*n[0]]}function fe(e,n){return e[0]*n[0]+e[1]*n[1]+e[2]*n[2]}function de(e,n){return Math.hypot(e[0]-n[0],e[1]-n[1],e[2]-n[2])}function to(e){let n=Math.hypot(e[0],e[1],e[2]);return n<=1e-10?null:[e[0]/n,e[1]/n,e[2]/n]}function vn(e,n){return fe(qe(e,n.point),n.normal)}function An(e,n){let t=vn(e,n);return[e[0]-n.normal[0]*t,e[1]-n.normal[1]*t,e[2]-n.normal[2]*t]}var Je=1e-5,yt=.001,bt=6;function Vn(e){let n=e.vertices;if(n.length<3)return null;let t=n[0],r=0,o=0,s=0;for(let a=1;a+1<n.length;a++){let l=n[a],c=n[a+1],u=l[1]-t[1],f=l[0]-t[0],g=l[2]-t[2],m=c[1]-t[1],d=c[0]-t[0],p=c[2]-t[2];r-=f*p-g*d,o-=g*m-u*p,s-=u*d-f*m}let i=Math.hypot(r,o,s);return i<1e-9?null:[r/i,o/i,s/i]}function Pt(e,n){let t=n.meshRotation,r=t?Ge(e,t[0]??0,t[1]??0,t[2]??0):e;return Ge(r,n.rotX,0,n.rotY)[2]}function Sn(e,n,t=Je){return Pt(e,n)>t}function ro(e,n,t=Je){let r=Vn(e);return r===null||Sn(r,n,t)}function Mt(e){return`${e[0].toFixed(4)},${e[1].toFixed(4)},${e[2].toFixed(4)}`}function Ct(e){let n=new Map;for(let t of e){if(!t)continue;let r=Mt(t);n.has(r)||n.set(r,t)}return Array.from(n,([t,r])=>({key:t,normal:r}))}function oo(e){return Ct(e.map(Vn))}function vt(e,n=yt){let t=Math.abs(e[0]),r=Math.abs(e[1]),o=Math.abs(e[2]),s=Math.max(t,r,o);return s>1-n&&t+r+o-s<n}function so(e){return e.length<=bt&&e.every(({normal:n})=>vt(n))}function io(e,n,t=Je){let r=[];for(let{key:o,normal:s}of e)Sn(s,n,t)&&r.push(o);return r.sort(),r.join("|")}function At(e,n,t,r,o){let s=(d,p,h)=>{let x=[0,0,0];return x[e]=d,x[(e+1)%3]=p,x[(e+2)%3]=h,x},i=s(n,-r,-r),a=s(n,r,-r),l=s(n,r,r),c=s(n,-r,r),u=s(t,-r,-r),f=s(t,r,-r),g=s(t,r,r),m=s(t,-r,r);return[{vertices:[i,a,l,c],color:o},{vertices:[u,f,g,m],color:o},{vertices:[i,a,f,u],color:o},{vertices:[a,l,g,f],color:o},{vertices:[l,c,m,g],color:o},{vertices:[c,i,u,m],color:o}]}function Vt(e={}){let n=e.size??5,t=e.thickness??.025,r=e.negative??!1,o=e.xColor??"#ff3a3a",s=e.yColor??"#3aff3a",i=e.zColor??"#3a8aff",a=n*t/2,l=r?-n:0;return[...At(0,l,n,a,o),...At(1,l,n,a,s),...At(2,l,n,a,i)]}var Lc=["right","left","front","back","top","bottom"];function St(e){return[e[0],e[1],e[2]]}function co(e,n){return{min:[Math.min(e[0],n[0]),Math.min(e[1],n[1]),Math.min(e[2],n[2])],max:[Math.max(e[0],n[0]),Math.max(e[1],n[1]),Math.max(e[2],n[2])]}}function Bc(e){if(e.min&&e.max)return co(e.min,e.max);let n=e.center?St(e.center):[0,0,0],t;typeof e.size=="number"?t=[e.size,e.size,e.size]:e.size?t=St(e.size):t=[1,1,1];let r=[t[0]/2,t[1]/2,t[2]/2];return co([n[0]-r[0],n[1]-r[1],n[2]-r[2]],[n[0]+r[0],n[1]+r[1],n[2]+r[2]])}function Nc(e,n){let[t,r,o]=e,[s,i,a]=n;return[{name:"right",vertices:[[s,r,o],[s,i,o],[s,i,a],[s,r,a]]},{name:"left",vertices:[[t,i,o],[t,r,o],[t,r,a],[t,i,a]]},{name:"front",vertices:[[s,i,o],[t,i,o],[t,i,a],[s,i,a]]},{name:"back",vertices:[[t,r,o],[s,r,o],[s,r,a],[t,r,a]]},{name:"top",vertices:[[t,r,a],[s,r,a],[s,i,a],[t,i,a]]},{name:"bottom",vertices:[[t,i,o],[s,i,o],[s,r,o],[t,r,o]]}]}function Fc(e,n){let t={...e,...n};return(e.data!==void 0||n?.data!==void 0)&&(t.data={...e.data??{},...n?.data??{}}),t}function Dc(e,n){let t={vertices:e.vertices.map(St)};return n.color!==void 0&&(t.color=n.color),n.texture!==void 0&&(t.texture=n.texture),n.material!==void 0&&(t.material=n.material),n.uvs!==void 0&&(t.uvs=n.uvs.map(r=>[r[0],r[1]])),n.data!==void 0&&(t.data={...n.data}),t}function wt(e={}){let{min:n,max:t}=Bc(e);if(n[0]===t[0]||n[1]===t[1]||n[2]===t[2])return[];let r={color:e.color??"#ffffff",texture:e.texture,material:e.material,uvs:e.uvs,data:e.data},o=Nc(n,t),s=new Map(o.map(a=>[a.name,a])),i=[];for(let a of Lc){let l=e.faces?.[a];if(l===!1)continue;let c=s.get(a);c&&i.push(Dc(c,Fc(r,l)))}return i}function ao(e,n,t,r){let o=[0,0,0];return o[e]=n,o[(e+1)%3]=t,o[(e+2)%3]=r,o}function zc(e,n,t,r,o){let s=(d,p,h)=>ao(e,d,p,h),i=s(n,-r,-r),a=s(n,r,-r),l=s(n,r,r),c=s(n,-r,r),u=s(t,-r,-r),f=s(t,r,-r),g=s(t,r,r),m=s(t,-r,r);return[{vertices:[i,a,l,c],color:o},{vertices:[u,f,g,m],color:o},{vertices:[i,a,f,u],color:o},{vertices:[a,l,g,f],color:o},{vertices:[l,c,m,g],color:o},{vertices:[c,i,u,m],color:o}]}function Gc(e,n,t,r,o){let s=(f,g,m)=>ao(e,f,g,m),i=s(n,-r,-r),a=s(n,r,-r),l=s(n,r,r),c=s(n,-r,r),u=s(t,0,0);return[{vertices:[i,a,l,c],color:o},{vertices:[i,a,u],color:o},{vertices:[a,l,u],color:o},{vertices:[l,c,u],color:o},{vertices:[c,i,u],color:o}]}function Uc(e){return e.map(n=>({...n,vertices:[...n.vertices].reverse()}))}function It(e){let n=e.axis,t=e.sign??1,r=e.shaftLength??4,o=e.shaftHalfThickness??.05,s=e.headLength??.8,i=e.headHalfThickness??.2,a=e.color??"#ffffff",l=e.shaft??!0,c=r*t,u=Math.min(0,c),f=Math.max(0,c),g=c,m=(r+s)*t,d=Gc(n,g,m,i,a),p=t===-1?Uc(d):d;return l?[...zc(n,u,f,o,a),...p]:p}function wn(e,n,t){let r=[0,0,0],o=(e+1)%3,s=(e+2)%3;return r[o]=Math.cos(t)*n,r[s]=Math.sin(t)*n,r}function Rt(e){let n=e.axis,t=e.radius,r=e.halfThickness??Math.max(.05,t*.04),o=e.segments??32,s=e.color??"#ffffff",i=t-r,a=t+r,l=[];for(let c=0;c<o;c++){let u=c/o*Math.PI*2,f=(c+1)/o*Math.PI*2,g=wn(n,i,u),m=wn(n,i,f),d=wn(n,a,u),p=wn(n,a,f);l.push({vertices:[g,d,p,m],color:s})}return l}function Tt(e){let n=e.axis,t=e.outerRadius,r=e.color??"#ffffff",o=(n+1)%3,s=(n+2)%3,i=(a,l)=>{let c=[0,0,0];return c[n]=0,c[o]=a,c[s]=l,c};return[{vertices:[i(-t,-t),i(t,-t),i(t,t),i(-t,t)],color:r}]}function Et(e){let n=e.axis,t=e.size??.4,r=e.offset??t*2,o=typeof r=="number"?r:r[0],s=typeof r=="number"?r:r[1],i=e.along??0,a=e.color??"#ffffff",l=(n+1)%3,c=(n+2)%3,u=(f,g)=>{let m=[0,0,0];return m[n]=i,m[l]=o+f,m[c]=s+g,m};return[{vertices:[u(-t,-t),u(t,-t),u(t,t),u(-t,t)],color:a}]}function Ot(e){let{center:n,size:t,color:r="#ffffff"}=e,[o,s,i]=n,a=[[o+t,s,i],[o-t,s,i],[o,s+t,i],[o,s-t,i],[o,s,i+t],[o,s,i-t]];return[[0,2,4],[2,1,4],[1,3,4],[3,0,4],[2,0,5],[1,2,5],[3,1,5],[0,3,5]].map(c=>({vertices:[a[c[0]],a[c[1]],a[c[2]]],color:r}))}var lo=2200,uo=2201,fo=2202;function $c(e,n){let t=0,r=1,o=1,s=2201,i=1/0,a=0,l=!1,c=null,u=!0,f=!1,g={clampWhenFinished:!1,get timeScale(){return o},set timeScale(m){o=m},get weight(){return r},set weight(m){r=m},get time(){return t},set time(m){t=m},get isRunning(){return l},get enabled(){return u},set enabled(m){u=m},get paused(){return f},set paused(m){f=m},play(){return l=!0,g},stop(){return l=!1,t=0,a=0,c=null,g},reset(){return t=0,a=0,g},fadeIn(m){return c={from:0,to:1,elapsed:0,duration:m},r=0,g},fadeOut(m){return c={from:r,to:0,elapsed:0,duration:m},g},crossFadeTo(m,d){return g.fadeOut(d),m.fadeIn(d),g},crossFadeFrom(m,d){return m.fadeOut(d),g.fadeIn(d),g},setLoop(m,d){return s=m,i=d,g},setEffectiveTimeScale(m){return o=m,g},setEffectiveWeight(m){return r=m,g}};return g._internal={get clip(){return e},get time(){return t},get weight(){return r},get enabled(){return u},get paused(){return f},get running(){return l},get loopMode(){return s},get repetitions(){return i},get completedReps(){return a},set completedReps(m){a=m},get clampWhenFinished(){return g.clampWhenFinished},get timeScale(){return o},get fade(){return c},advance(m){if(!l)return;if(c){c.elapsed+=m;let p=c.duration>0?Math.min(c.elapsed/c.duration,1):1;if(r=c.from+(c.to-c.from)*p,p>=1&&(r=c.to,c=null,r<=0)){l=!1;return}}if(f)return;let d=e.duration;if(!(d<=0)){if(t+=m*o,s===2200)t>=d&&(t=g.clampWhenFinished?d:0,l=!1);else if(s===2201){if(t>=d){let p=t%d,h=Math.floor(t/d);a+=h,t=p,i!==1/0&&a>=i&&(t=g.clampWhenFinished?d:0,l=!1)}}else if(d>0){let p=d*2,h=t%p;if(t>=p){let x=Math.floor(t/p);a+=x,i!==1/0&&a>=i?(t=g.clampWhenFinished?d:0,l=!1):t=h}}}},sampleTime(){if(s===2202){let m=e.duration,d=m*2,p=t%d;return p<=m?p:d-p}return t}},g}function Xc(e){return e._internal}function kt(e,n){return typeof n=="number"?e[n]:e.find(t=>t.name===n)}function mo(e,n){let t=new Map;function r(c){let u=kt(n.clips,c);if(!u)throw new Error(`PolyAnimationMixer: no clip found for key "${c}". Available: ${n.clips.map(g=>g.name).join(", ")}`);let f=t.get(u.index);return f||(f=$c(u,n),t.set(u.index,f)),f}function o(c){let u=kt(n.clips,c);return u?t.get(u.index)??null:null}function s(c){let u=[];for(let p of t.values()){let h=Xc(p);h.advance(c),h.running&&h.enabled&&u.push({internal:h,clip:h.clip})}if(u.length===0)return;if(u.length===1){let{internal:p,clip:h}=u[0],x=n.sample(h.name,p.sampleTime());e.setPolygons(x);return}let f=0;for(let{internal:p}of u)f+=p.weight;if(f<=0)return;let g=u.map(({internal:p,clip:h})=>({polygons:n.sample(h.name,p.sampleTime()),weight:p.weight/f})),m=g[0].polygons;if(m.length===0)return;let d=m.map((p,h)=>{let x=p.vertices.map((y,M)=>{let P=0,b=0,A=0;for(let{polygons:w,weight:I}of g){let C=w[h];if(!C)continue;let v=C.vertices[M];v&&(P+=v[0]*I,b+=v[1]*I,A+=v[2]*I)}return[P,b,A]});return{...p,vertices:x}});e.setPolygons(d)}function i(){for(let c of t.values())c.stop()}function a(c){let u=kt(n.clips,c);u&&t.delete(u.index)}function l(){t.clear()}return{clipAction:r,existingAction:o,update:s,stopAllAction:i,uncacheClip:a,uncacheRoot:l}}var jc=/^[0-9A-Fa-f]{6}$/,Yc=["#3b82f6","#ef4444","#22c55e","#eab308","#a855f7","#06b6d4","#f97316","#ec4899"];function In(e,n){let t=n?.targetSize??60,r=n?.gridShift??1,o=n?.defaultColor??"#888888",s=n?.palette??Yc,i=n?.materialColors??{},a=n?.materialTextures??{},l=[],c=[],u=[],f=[],g=new Map,m=o,d,p=n?.includeObjects?new Set(n.includeObjects):null,h=n?.excludeObjects?new Set(n.excludeObjects):null,x=null,y=()=>x===null?p===null:!(p&&!p.has(x)||h&&h.has(x)),M=_=>_ in i?i[_]:jc.test(_)?`#${_}`:(g.has(_)||(g.set(_,s[f.length%s.length]),f.push(_)),g.get(_)),P=e.split(`
2
+ `);for(let _ of P)if(!(_.length===0||_.charCodeAt(0)===35)){if(_.startsWith("v ")){let L=_.trim().split(/\s+/);l.push([parseFloat(L[1]),parseFloat(L[2]),parseFloat(L[3])])}else if(_.startsWith("vt ")){let L=_.trim().split(/\s+/);c.push([parseFloat(L[1]),parseFloat(L[2])])}else if(_.startsWith("o "))x=_.trim().slice(2).trim();else if(_.startsWith("usemtl ")){let L=_.trim().split(/\s+/)[1];m=M(L),d=a[L]}else if(_.startsWith("f ")){if(!y())continue;let L=_.trim().split(/\s+/).slice(1),T=[],B=[];for(let O of L){let S=O.split("/");T.push(parseInt(S[0],10)-1);let k=S[1];if(k&&k.length>0){let N=parseInt(k,10)-1;B.push(Number.isFinite(N)?N:null)}else B.push(null)}u.push({idx:T,uvIdx:B,color:m,texture:d})}}if(l.length===0||u.length===0)return Hc(f,e.length);let b=new Set;for(let _ of u)for(let L of _.idx)b.add(L);let A=1/0,w=1/0,I=1/0,C=-1/0,v=-1/0,V=-1/0;for(let _ of b){let L=l[_];L&&(L[0]<A&&(A=L[0]),L[0]>C&&(C=L[0]),L[1]<w&&(w=L[1]),L[1]>v&&(v=L[1]),L[2]<I&&(I=L[2]),L[2]>V&&(V=L[2]))}let R=Math.max(C-A,v-w,V-I),E=R>0?t/R:1,F=_=>Math.round(_*1e3)/1e3,D=l.map(([_,L,T])=>[F((T-I)*E+r),F((_-A)*E+r),F((L-w)*E+r)]),z=[];for(let{idx:_,uvIdx:L,color:T,texture:B}of u)for(let O=1;O<_.length-1;O++){let S=_[0],k=_[O],N=_[O+1],U=D[S],Y=D[k],G=D[N];if(!U||!Y||!G||U[0]===Y[0]&&U[1]===Y[1]&&U[2]===Y[2]||U[0]===G[0]&&U[1]===G[1]&&U[2]===G[2]||Y[0]===G[0]&&Y[1]===G[1]&&Y[2]===G[2])continue;let $;if(B){let q=L[0],ee=L[O],H=L[O+1];if(q!=null&&ee!=null&&H!=null){let K=c[q],te=c[ee],se=c[H];K&&te&&se&&($=[K,te,se])}}let W={vertices:[U,Y,G],color:T};B&&(W.texture=B),$&&(W.uvs=$),z.push(W)}return{polygons:z,objectUrls:[],dispose:()=>{},warnings:[],metadata:{triangleCount:z.length,materials:f,sourceBytes:e.length}}}function Hc(e,n){return{polygons:[],objectUrls:[],dispose:()=>{},warnings:[],metadata:{triangleCount:0,materials:e,sourceBytes:n}}}var _t=e=>Math.round(Math.max(0,Math.min(1,e))*255).toString(16).padStart(2,"0");function Rn(e){let n={},t={},r=null;for(let o of e.split(`
3
+ `)){let s=o.trim();if(!(s.length===0||s.charCodeAt(0)===35)){if(s.startsWith("newmtl ")){r=s.slice(7).trim();continue}if(r){if(s.startsWith("Kd ")){let i=s.split(/\s+/),a=parseFloat(i[1]),l=parseFloat(i[2]),c=parseFloat(i[3]);Number.isFinite(a)&&Number.isFinite(l)&&Number.isFinite(c)&&(n[r]=`#${_t(a)}${_t(l)}${_t(c)}`)}else if(s.startsWith("map_Kd ")){let i=s.split(/\s+/),a=i[i.length-1]?.replace(/\\+/g,"/");a&&a!=="map_Kd"&&(t[r]=a)}}}}return{colors:n,textures:t}}var yo={5120:1,5121:1,5122:2,5123:2,5125:4,5126:4},bo={SCALAR:1,VEC2:2,VEC3:3,VEC4:4,MAT2:4,MAT3:9,MAT4:16};function Po(e){let n=globalThis.TextDecoder;return new n().decode(e)}function Kc(e){let n=e.indexOf(",");if(n<0)throw new Error("parseGltf: malformed data: URI");let t=e.slice(5,n),r=e.slice(n+1);if(!t.includes(";base64")){let i=decodeURIComponent(r),a=new Uint8Array(i.length);for(let l=0;l<i.length;l++)a[l]=i.charCodeAt(l)&255;return a}let o=globalThis.atob(r),s=new Uint8Array(o.length);for(let i=0;i<o.length;i++)s[i]=o.charCodeAt(i);return s}function Wc(e,n){let t=e.buffers?.[0];if(!t)throw new Error("parseGltf: JSON doc has no buffers[0]");let r=t.uri;if(!r)throw new Error("parseGltf: JSON doc buffer has no uri (and there's no GLB BIN chunk)");if(r.startsWith("data:"))return Kc(r);if(n){let o=n(r);if(o instanceof Uint8Array)return o;throw new Error("parseGltf: resolveBuffer returned a Promise; use parseGltf via async if your buffers are external")}throw new Error(`parseGltf: external buffer URI "${r}" \u2014 provide options.resolveBuffer`)}function Zc(e){let n=new DataView(e);if(n.getUint32(0,!0)!==1179937895)throw new Error("parseGltf: not a GLB (bad magic)");let t=n.getUint32(4,!0);if(t!==2)throw new Error(`parseGltf: only glTF v2 supported (got v${t})`);let r=12,o=null,s=null;for(;r<e.byteLength;){let i=n.getUint32(r,!0),a=n.getUint32(r+4,!0),l=r+8;if(a===1313821514){let c=new Uint8Array(e,l,i);o=JSON.parse(Po(c))}else a===5130562&&(s=new Uint8Array(e,l,i));r=l+i}if(!o)throw new Error("parseGltf: no JSON chunk in GLB");return{doc:o,bin:s}}function Lt(e,n,t){let r=e.accessors?.[t],o=e.bufferViews?.[r?.bufferView??-1];if(!r||!o)throw new Error(`parseGltf: bad accessor/bufferView ${t}`);let s=yo[r.componentType],i=bo[r.type];if(!s||!i)throw new Error(`parseGltf: unsupported accessor type ${r.type}/${r.componentType}`);let a=(o.byteOffset??0)+(r.byteOffset??0),l=r.count*i,c=n.buffer.slice(n.byteOffset+a,n.byteOffset+a+l*s),u;switch(r.componentType){case 5126:u=new Float32Array(c);break;case 5123:u=new Uint16Array(c);break;case 5125:u=new Uint32Array(c);break;case 5121:u=new Uint8Array(c);break;default:throw new Error(`parseGltf: unhandled componentType ${r.componentType}`)}return{array:u,count:r.count,componentCount:i}}function Qc(e,n,t){switch(t){case 5120:return e.getInt8(n);case 5121:return e.getUint8(n);case 5122:return e.getInt16(n,!0);case 5123:return e.getUint16(n,!0);case 5125:return e.getUint32(n,!0);case 5126:return e.getFloat32(n,!0);default:throw new Error(`parseGltf: unhandled componentType ${t}`)}}function qc(e,n){switch(n){case 5120:return Math.max(e/127,-1);case 5121:return e/255;case 5122:return Math.max(e/32767,-1);case 5123:return e/65535;default:return e}}function On(e,n,t){let r=e.accessors?.[t],o=e.bufferViews?.[r?.bufferView??-1];if(!r||!o)throw new Error(`parseGltf: bad accessor/bufferView ${t}`);let s=yo[r.componentType],i=bo[r.type];if(!s||!i)throw new Error(`parseGltf: unsupported accessor type ${r.type}/${r.componentType}`);let a=n.byteOffset+(o.byteOffset??0)+(r.byteOffset??0),l=o.byteStride??s*i,c=new DataView(n.buffer),u=new Array(r.count*i),f=0;for(let g=0;g<r.count;g++){let m=a+g*l;for(let d=0;d<i;d++){let p=Qc(c,m+d*s,r.componentType);u[f++]=r.normalized?qc(p,r.componentType):p}}return{values:u,count:r.count,componentCount:i}}function Jc(e,n,t){let r=[],o=[],s=globalThis;for(let i of e.images??[]){if(i.uri){if(t&&!i.uri.startsWith("data:"))try{r.push(new s.URL(i.uri,t).href)}catch{r.push(i.uri)}else r.push(i.uri);continue}if(i.bufferView!==void 0){let a=e.bufferViews?.[i.bufferView];if(!a){r.push("");continue}let l=a.byteOffset??0,c=n.subarray(l,l+a.byteLength),u=i.mimeType??"image/png",f=new s.Blob([c],{type:u}),g=s.URL.createObjectURL(f);r.push(g),o.push(g)}else r.push("")}return{urls:r,objectUrls:o}}function ea(e,n){let t=new Map,r=e.materials??[];for(let o=0;o<r.length;o++){let s=r[o].pbrMetallicRoughness?.baseColorTexture?.index;if(s===void 0)continue;let i=e.textures?.[s]?.source;if(i===void 0)continue;let a=n[i];a&&t.set(o,a)}return t}function na(e,n){let t=e?.pbrMetallicRoughness?.baseColorFactor;if(!t||t.length<3)return n;let r=a=>Math.max(0,Math.min(1,a)),o=a=>Math.round(r(a)*255).toString(16).padStart(2,"0"),s=a=>Math.round(r(a)*255),i=r(t[3]??1);return i<1?`rgba(${s(t[0])}, ${s(t[1])}, ${s(t[2])}, ${Math.round(i*1e3)/1e3})`:`#${o(t[0])}${o(t[1])}${o(t[2])}`}var Be=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];function Bt(e,n){let t=new Array(16);for(let r=0;r<4;r++)for(let o=0;o<4;o++)t[o*4+r]=e[0+r]*n[o*4+0]+e[4+r]*n[o*4+1]+e[8+r]*n[o*4+2]+e[12+r]*n[o*4+3];return t}function En(e,n){return[e[0]*n[0]+e[4]*n[1]+e[8]*n[2]+e[12],e[1]*n[0]+e[5]*n[1]+e[9]*n[2]+e[13],e[2]*n[0]+e[6]*n[1]+e[10]*n[2]+e[14]]}function Mo(e,n,t){let r=e?.[0]??0,o=e?.[1]??0,s=e?.[2]??0,i=n?.[0]??0,a=n?.[1]??0,l=n?.[2]??0,c=n?.[3]??1,u=t?.[0]??1,f=t?.[1]??1,g=t?.[2]??1,m=i+i,d=a+a,p=l+l,h=i*m,x=i*d,y=i*p,M=a*d,P=a*p,b=l*p,A=c*m,w=c*d,I=c*p;return[(1-(M+b))*u,(x+I)*u,(y-w)*u,0,(x-I)*f,(1-(h+b))*f,(P+A)*f,0,(y+w)*g,(P-A)*g,(1-(h+M))*g,0,r,o,s,1]}function ta(e){return e.matrix&&e.matrix.length===16?e.matrix.slice():Mo(e.translation,e.rotation,e.scale)}function ra(e,n){return[e[0]+n[0],e[1]+n[1],e[2]+n[2]]}function go(e,n){return[e[0]*n,e[1]*n,e[2]*n]}function Co(e,n,t){let r=new Array(Math.min(e.length,n.length));for(let o=0;o<r.length;o++)r[o]=e[o]+(n[o]-e[o])*t;return r}function en(e){let n=Math.hypot(e[0]??0,e[1]??0,e[2]??0,e[3]??1)||1;return[(e[0]??0)/n,(e[1]??0)/n,(e[2]??0)/n,(e[3]??1)/n]}function oa(e,n,t){let r=en(e),o=en(n),s=r[0]*o[0]+r[1]*o[1]+r[2]*o[2]+r[3]*o[3];if(s<0&&(s=-s,o=[-o[0],-o[1],-o[2],-o[3]]),s>.9995)return en(Co(r,o,t));let i=Math.acos(Math.max(-1,Math.min(1,s))),a=Math.sin(i),l=Math.sin((1-t)*i)/a,c=Math.sin(t*i)/a;return en([r[0]*l+o[0]*c,r[1]*l+o[1]*c,r[2]*l+o[2]*c,r[3]*l+o[3]*c])}function sa(e){return{translation:e?.translation?.slice()??[0,0,0],rotation:e?.rotation?.slice()??[0,0,0,1],scale:e?.scale?.slice()??[1,1,1],matrix:e?.matrix&&e.matrix.length===16?e.matrix.slice():void 0}}function po(e){return e.matrix?e.matrix.slice():Mo(e.translation,e.rotation,e.scale)}function ia(e){let n=e.scene??0,t=e.scenes?.[n]?.nodes;return t&&t.length>0?t:[]}function ho(e,n){let t=e.nodes??[],r=new Array(t.length),o=new Set,s=(a,l)=>{if(a<0||a>=t.length)return;let c=Bt(l,n[a]??Be);r[a]=c,o.add(a);for(let u of t[a].children??[])s(u,c)},i=ia(e);if(i.length>0)for(let a of i)s(a,Be);for(let a=0;a<t.length;a++)o.has(a)||s(a,Be);return r}function xo(e,n,t,r,o){if(t===void 0)return;let{values:s,count:i,componentCount:a}=On(e,n,t);if(i!==o||a<1)return;let l=[];for(let c=0;c<i;c++){let u=[];for(let f=0;f<r;f++)u.push(s[c*a+f]??0);l.push(u)}return l}function ca(e,n,t,r){if(t===void 0)return Array.from({length:r},()=>Be.slice());let{values:o,componentCount:s,count:i}=On(e,n,t);if(s!==16)throw new Error(`parseGltf: inverseBindMatrices accessor ${t} is not MAT4`);let a=[];for(let l=0;l<r;l++){let c=Math.min(l,i-1);a.push(o.slice(c*16,c*16+16))}return a}function Tn(e,n){let t=e.componentCount,r=e.interpolation==="CUBICSPLINE"?(n*3+1)*t:n*t;return e.output.slice(r,r+t)}function aa(e,n,t){let r=e.input;if(r.length===0)return[];if(r.length===1||n<=r[0])return Tn(e,0);let o=r.length-1;if(n>=r[o])return Tn(e,o);let s=0,i=o;for(;s+1<i;){let g=s+i>>1;r[g]<=n?s=g:i=g}let a=r[s],l=r[s+1],c=l>a?(n-a)/(l-a):0,u=Tn(e,s),f=Tn(e,s+1);return e.interpolation==="STEP"?u:t==="rotation"?oa(u,f,c):Co(u,f,c)}function la(e,n,t,r){let o=e.animations??[];if(o.length===0||t.length===0)return;let s=(e.nodes??[]).map(m=>sa(m)),i=s.map(po),a=ho(e,i),l=(e.skins??[]).map(m=>({joints:m.joints??[],inverseBindMatrices:ca(e,n,m.inverseBindMatrices,m.joints?.length??0)})),c=[];for(let m=0;m<o.length;m++){let d=o[m],p=(d.samplers??[]).map(y=>{let M=On(e,n,y.input),P=On(e,n,y.output);return{input:M.values,output:P.values,componentCount:P.componentCount,interpolation:y.interpolation??"LINEAR"}}),h=[];for(let y of d.channels??[]){let M=y.target.node,P=y.target.path,b=p[y.sampler];M===void 0||!P||!b||P==="weights"||h.push({sampler:b,targetNode:M,path:P})}let x=h.reduce((y,M)=>{let P=M.sampler.input;return Math.max(y,P[P.length-1]??0)},0);c.push({info:{index:m,name:d.name??`animation_${m}`,duration:x,channelCount:h.length},channels:h})}let u=c.map(m=>m.info);if(u.length===0)return;let f=(m,d,p,h,x,y)=>{let M=r(m),P=r(d),b=r(p);if(M[0]===P[0]&&M[1]===P[1]&&M[2]===P[2]||M[0]===b[0]&&M[1]===b[1]&&M[2]===b[2]||P[0]===b[0]&&P[1]===b[1]&&P[2]===b[2])return null;let A={vertices:[M,P,b],color:h};return x&&(A.texture=x),y&&(A.uvs=y),A};return{clips:u,sample:(m,d)=>{let p=typeof m=="number"?c[m]:c.find(b=>b.info.name===m);if(!p)return[];let h=p.info.duration,x=h>0?(d%h+h)%h:Math.max(0,d),y=s.map(b=>({translation:b.translation.slice(),rotation:b.rotation.slice(),scale:b.scale.slice(),matrix:b.matrix?b.matrix.slice():void 0}));for(let b of p.channels){let A=y[b.targetNode];if(!A)continue;let w=aa(b.sampler,x,b.path);A.matrix=void 0,b.path==="translation"?A.translation=w.slice(0,3):b.path==="rotation"?A.rotation=en(w.slice(0,4)):b.path==="scale"&&(A.scale=w.slice(0,3))}let M=ho(e,y.map(po)),P=[];for(let b of t){let A=[];if(b.skinIndex!==void 0&&b.joints&&b.weights&&l[b.skinIndex]){let w=l[b.skinIndex];for(let I=0;I<b.positions.length;I++){let C=b.positions[I],v=[0,0,0],V=0,R=b.joints[I]??[],E=b.weights[I]??[];for(let F=0;F<4;F++){let D=E[F]??0;if(D<=0)continue;let z=Math.round(R[F]??0),_=w.joints[z],L=M[_],T=w.inverseBindMatrices[z];if(!L||!T)continue;let B=Bt(L,T);v=ra(v,go(En(B,C),D)),V+=D}A.push(V>0?go(v,1/V):En(b.meshBindWorld,C))}}else{let w=b.meshNode!==null?M[b.meshNode]??b.meshBindWorld:b.meshBindWorld;for(let I of b.positions)A.push(En(w,I))}for(let w=0;w+2<b.indices.length;w+=3){let I=b.indices[w],C=b.indices[w+1],v=b.indices[w+2],V=A[I],R=A[C],E=A[v];if(!V||!R||!E)continue;let F;if(b.uvs&&b.texture){let z=b.uvs[I],_=b.uvs[C],L=b.uvs[v];z&&_&&L&&(F=[z,_,L])}let D=f(V,R,E,b.color,b.texture,F);D&&P.push(D)}}return P}}}function kn(e,n){let t=n?.targetSize??60,r=n?.gridShift??1,o=n?.defaultColor??"#888888",s=n?.materialColors??{},i=e instanceof Uint8Array?e.buffer.slice(e.byteOffset,e.byteOffset+e.byteLength):e,a=i.byteLength,l,c;if(i.byteLength>=4&&new DataView(i).getUint32(0,!0)===1179937895){let T=Zc(i);if(l=T.doc,!T.bin)throw new Error("parseGltf: GLB has no binary chunk");c=T.bin}else l=JSON.parse(Po(new Uint8Array(i))),c=Wc(l,n?.resolveBuffer);let{urls:u,objectUrls:f}=Jc(l,c,n?.baseUrl),g=ea(l,u),m=[],d=[],p=(l.meshes??[]).map((T,B)=>T.name??`mesh_${B}`),h=(l.materials??[]).map((T,B)=>T.name??`material_${B}`);function x(T,B,O){let S=l.meshes?.[T];if(S)for(let k of S.primitives){if((k.mode??4)!==4)continue;let U=k.material!==void 0?l.materials?.[k.material]?.name:void 0,G=(U?s[U]:void 0)??na(k.material!==void 0?l.materials?.[k.material]:void 0,o),$=k.material!==void 0?g.get(k.material):void 0,{array:W,count:q}=Lt(l,c,k.attributes.POSITION);if(!(W instanceof Float32Array))continue;let ee=[],H=[];for(let J=0;J<q;J++){let X=[W[J*3],W[J*3+1],W[J*3+2]];ee.push(X),H.push(En(B,X))}let K=null,te=k.attributes.TEXCOORD_0;if($&&te!==void 0){let{array:J,count:X}=Lt(l,c,te);K=[];let Q=1;J instanceof Uint8Array?Q=1/255:J instanceof Uint16Array&&(Q=1/65535);for(let ae=0;ae<X;ae++){let pe=J[ae*2]*Q,Ce=J[ae*2+1]*Q;K.push([pe,1-Ce])}}let se;if(k.indices!==void 0){let{array:J,count:X}=Lt(l,c,k.indices);se=[];for(let Q=0;Q<X;Q++)se.push(Number(J[Q]))}else se=H.map((J,X)=>X);if((l.animations?.length??0)>0){let J=xo(l,c,k.attributes.JOINTS_0,4,q),X=xo(l,c,k.attributes.WEIGHTS_0,4,q);d.push({meshNode:O,meshBindWorld:B,skinIndex:O!==null?l.nodes?.[O]?.skin:void 0,positions:ee,indices:se,color:G,texture:$,uvs:K??void 0,joints:J,weights:X})}for(let J=0;J+2<se.length;J+=3){let X=H[se[J]],Q=H[se[J+1]],ae=H[se[J+2]];if(!X||!Q||!ae)continue;let pe;if(K&&$){let Ce=K[se[J]],Re=K[se[J+1]],Te=K[se[J+2]];Ce&&Re&&Te&&(pe=[Ce,Re,Te])}m.push({v0:X,v1:Q,v2:ae,color:G,texture:$,uvs:pe})}}}function y(T,B){let O=l.nodes?.[T];if(!O)return;let S=Bt(B,ta(O));typeof O.mesh=="number"&&x(O.mesh,S,T);for(let k of O.children??[])y(k,S)}let M=l.scene??0,P=l.scenes?.[M]?.nodes;if(P&&P.length>0)for(let T of P)y(T,Be);else for(let T=0;T<(l.meshes?.length??0);T++)x(T,Be,null);let b=ua(f);if(m.length===0)return{polygons:[],objectUrls:f,dispose:b,warnings:[],metadata:{triangleCount:0,meshes:p,materials:h,sourceBytes:a}};let A=1/0,w=1/0,I=1/0,C=-1/0,v=-1/0,V=-1/0;for(let T of m)for(let B of[T.v0,T.v1,T.v2])B[0]<A&&(A=B[0]),B[0]>C&&(C=B[0]),B[1]<w&&(w=B[1]),B[1]>v&&(v=B[1]),B[2]<I&&(I=B[2]),B[2]>V&&(V=B[2]);let R=Math.max(C-A,v-w,V-I),E=R>0?t/R:1,F=T=>Math.round(T*1e3)/1e3,z=(n?.upAxis??"y")==="z"?([T,B,O])=>[F((T-A)*E+r),F((B-w)*E+r),F((O-I)*E+r)]:([T,B,O])=>[F((O-I)*E+r),F((T-A)*E+r),F((B-w)*E+r)],_=la(l,c,d,z),L=[];for(let T of m){let B=z(T.v0),O=z(T.v1),S=z(T.v2);if(B[0]===O[0]&&B[1]===O[1]&&B[2]===O[2]||B[0]===S[0]&&B[1]===S[1]&&B[2]===S[2]||O[0]===S[0]&&O[1]===S[1]&&O[2]===S[2])continue;let k={vertices:[B,O,S],color:T.color};T.texture&&(k.texture=T.texture),T.uvs&&(k.uvs=T.uvs),L.push(k)}return{polygons:L,animation:_,objectUrls:f,dispose:b,warnings:[],metadata:{triangleCount:L.length,meshes:p,materials:h,animations:_?.clips,sourceBytes:a}}}function ua(e){let n=!1;return()=>{if(n)return;n=!0;let t=globalThis.URL;if(t?.revokeObjectURL)for(let r of e)try{t.revokeObjectURL(r)}catch{}}}function Nt(e){return e.material?.texture??e.texture}function fa(){let e=globalThis;return typeof e.Image!="function"||typeof e.document?.createElement!="function"?null:{Image:e.Image,createCanvas(){return e.document.createElement("canvas")}}}function ma(e,n){return new Promise((t,r)=>{let o=new n,s=!1,i=a=>{s||(s=!0,a())};o.decoding="async",o.onload=()=>i(()=>t(o)),o.onerror=()=>i(()=>r(new Error(`texture load failed: ${e}`))),o.src=e})}async function ga(e,n,t){try{let r=await ma(e,n.Image),o=Math.max(0,Math.floor(r.naturalWidth||r.width||0)),s=Math.max(0,Math.floor(r.naturalHeight||r.height||0));if(o<=0||s<=0||o*s>t)return null;let i=n.createCanvas();i.width=o,i.height=s;let a=i.getContext("2d",{willReadFrequently:!0});if(!a)return null;a.drawImage(r,0,0,o,s);let l=a.getImageData(0,0,o,s).data;return{width:o,height:s,data:l,lowDetail:da(o,s,l)}}catch{return null}}function vo(e,n,t,r,o,s){let i=(r*n+t)*4,a=(s*n+o)*4;return Math.max(Math.abs((e[i]??0)-(e[a]??0)),Math.abs((e[i+1]??0)-(e[a+1]??0)),Math.abs((e[i+2]??0)-(e[a+2]??0)))}function da(e,n,t){let r=Math.max(1,Math.floor(Math.max(e,n)/128)),o=0,s=0,i=0;for(let a=0;a<n;a+=r)for(let l=0;l<e;l+=r){if(l+r<e){let c=vo(t,e,l,a,l+r,a);i+=c,o++,c>32&&s++}if(a+r<n){let c=vo(t,e,l,a,l,a+r);i+=c,o++,c>32&&s++}}return o>0&&s/o<=.045&&i/o<=10}function Ao(e,n,t){return Math.max(n,Math.min(t,e))}function pa(e,n){let t=n[0],r=1-n[1];if(!Number.isFinite(t)||!Number.isFinite(r))return null;let o=Ao(Math.floor(t*e.width),0,e.width-1),i=(Ao(Math.floor(r*e.height),0,e.height-1)*e.width+o)*4;return{r:e.data[i]??0,g:e.data[i+1]??0,b:e.data[i+2]??0,a:e.data[i+3]??255}}function Me(e,n,t,r,o,s){return[e[0]*r+n[0]*o+t[0]*s,e[1]*r+n[1]*o+t[1]*s]}function ha(e){let[n,t,r]=e;return[Me(n,t,r,1/3,1/3,1/3),Me(n,t,r,.8,.1,.1),Me(n,t,r,.1,.8,.1),Me(n,t,r,.1,.1,.8),Me(n,t,r,.45,.45,.1),Me(n,t,r,.45,.1,.45),Me(n,t,r,.1,.45,.45)]}function xa(e){let[n,t,r]=e,o=ha(e);for(let s=1;s<6;s++)for(let i=1;i<6-s;i++){let a=6-s-i;a<=0||o.push(Me(n,t,r,s/6,i/6,a/6))}return o}function Io(e){if(e.textureTriangles?.length)return e.textureTriangles;let n=e.uvs;if(!n||n.length!==e.vertices.length||n.length<3)return[];let t=[];for(let r=1;r+1<n.length;r++)t.push({uvs:[n[0],n[r],n[r+1]]});return t}function Vo(e,n,t){return Math.abs(e.r-n.r)<=t&&Math.abs(e.g-n.g)<=t&&Math.abs(e.b-n.b)<=t&&Math.abs(e.a-n.a)<=t}function So(e){let n=r=>Math.round(Math.max(0,Math.min(255,r))).toString(16).padStart(2,"0");if(e.a>=255)return`#${n(e.r)}${n(e.g)}${n(e.b)}`;let t=Math.round(Math.max(0,Math.min(255,e.a))/255*1e3)/1e3;return`rgba(${Math.round(e.r)}, ${Math.round(e.g)}, ${Math.round(e.b)}, ${t})`}function ya(){return{min:{r:255,g:255,b:255,a:255},max:{r:0,g:0,b:0,a:0},sum:{r:0,g:0,b:0,a:0},count:0}}function ba(e,n){e.min.r=Math.min(e.min.r,n.r),e.min.g=Math.min(e.min.g,n.g),e.min.b=Math.min(e.min.b,n.b),e.min.a=Math.min(e.min.a,n.a),e.max.r=Math.max(e.max.r,n.r),e.max.g=Math.max(e.max.g,n.g),e.max.b=Math.max(e.max.b,n.b),e.max.a=Math.max(e.max.a,n.a),e.sum.r+=n.r,e.sum.g+=n.g,e.sum.b+=n.b,e.sum.a+=n.a,e.count++}function wo(e){return{r:e.sum.r/e.count,g:e.sum.g/e.count,b:e.sum.b/e.count,a:e.sum.a/e.count}}function Pa(e,n,t,r){let o=Io(e);if(o.length===0||!r&&!n.lowDetail)return null;let s=ya();for(let i of o)for(let a of xa(i.uvs)){let l=pa(n,a);if(!l)return null;ba(s,l)}return s.count===0?null:Vo(s.min,s.max,t)?So(wo(s)):r||!Vo(s.min,s.max,32)?null:So(wo(s))}function Ma(e,n){let{texture:t,material:r,uvs:o,textureTriangles:s,...i}=e;return{...i,color:n}}async function Ro(e,n={}){if(n.enabled===!1)return null;let t=fa();if(!t)return null;let r=e.filter(l=>Nt(l)&&Io(l).length>0);if(r.length===0)return null;let o=n.maxTexturePixels??16777216,s=new Map;await Promise.all(Array.from(new Set(r.map(l=>Nt(l)))).map(async l=>{s.set(l,await ga(l,t,o))}));let i=n.colorTolerance??2,a=n.colorTolerance!==void 0;return{bake(l){let c=!1,u=l.map(f=>{let g=Nt(f);if(!g)return f;let m=s.get(g);if(!m)return f;let d=Pa(f,m,i,a);return d?(c=!0,Ma(f,d)):f});return{polygons:c?u:l,changed:c}}}}async function To(e,n={}){let t=await Ro(e,n);return t?t.bake(e).polygons:e}async function _n(e,n={}){let t=await Ro(e.polygons,n);if(!t)return e;let r=t.bake(e.polygons);return!r.changed&&!e.animation?e:{...e,polygons:r.polygons,animation:e.animation?{...e.animation,sample(o,s){return t.bake(e.animation.sample(o,s)).polygons}}:e.animation}}var Ca=[0,4294967295,4291624959,4288282623,4284940287,4281597951,4278255615,4294954239,4291611903,4288269567,4284927231,4281584895,4278242559,4294941183,4291598847,4288256511,4284914175,4281571839,4278229503,4294928127,4291585791,4288243455,4284901119,4281558783,4278216447,4294915071,4291572735,4288230399,4284888063,4281545727,4278203391,4294902015,4291559679,4288217343,4284875007,4281532671,4278190335,4294967244,4291624908,4288282572,4284940236,4281597900,4278255564,4294954188,4291611852,4288269516,4284927180,4281584844,4278242508,4294941132,4291598796,4288256460,4284914124,4281571788,4278229452,4294928076,4291585740,4288243404,4284901068,4281558732,4278216396,4294915020,4291572684,4288230348,4284888012,4281545676,4278203340,4294901964,4291559628,4288217292,4284874956,4281532620,4278190284,4294967193,4291624857,4288282521,4284940185,4281597849,4278255513,4294954137,4291611801,4288269465,4284927129,4281584793,4278242457,4294941081,4291598745,4288256409,4284914073,4281571737,4278229401,4294928025,4291585689,4288243353,4284901017,4281558681,4278216345,4294914969,4291572633,4288230297,4284887961,4281545625,4278203289,4294901913,4291559577,4288217241,4284874905,4281532569,4278190233,4294967142,4291624806,4288282470,4284940134,4281597798,4278255462,4294954086,4291611750,4288269414,4284927078,4281584742,4278242406,4294941030,4291598694,4288256358,4284914022,4281571686,4278229350,4294927974,4291585638,4288243302,4284900966,4281558630,4278216294,4294914918,4291572582,4288230246,4284887910,4281545574,4278203238,4294901862,4291559526,4288217190,4284874854,4281532518,4278190182,4294967091,4291624755,4288282419,4284940083,4281597747,4278255411,4294954035,4291611699,4288269363,4284927027,4281584691,4278242355,4294940979,4291598643,4288256307,4284913971,4281571635,4278229299,4294927923,4291585587,4288243251,4284900915,4281558579,4278216243,4294914867,4291572531,4288230195,4284887859,4281545523,4278203187,4294901811,4291559475,4288217139,4284874803,4281532467,4278190131,4294967040,4291624704,4288282368,4284940032,4281597696,4278255360,4294953984,4291611648,4288269312,4284926976,4281584640,4278242304,4294940928,4291598592,4288256256,4284913920,4281571584,4278229248,4294927872,4291585536,4288243200,4284900864,4281558528,4278216192,4294914816,4291572480,4288230144,4284887808,4281545472,4278203136,4294901760,4291559424,4288217088,4284874752,4281532416,4278190318,4278190301,4278190267,4278190250,4278190216,4278190199,4278190165,4278190148,4278190114,4278190097,4278251008,4278246656,4278237952,4278233600,4278224896,4278220544,4278211840,4278207488,4278198784,4278194432,4293787648,4292673536,4290445312,4289331200,4287102976,4285988864,4283760640,4282646528,4280418304,4279304192,4293848814,4292730333,4290493371,4289374890,4287137928,4286019447,4283782485,4282664004,4280427042,4279308561];function va(e){let n=e>>0&255,t=e>>8&255,r=e>>16&255;return[n,t,r]}function Ft(e){return(e&255).toString(16).padStart(2,"0")}function Oo(e,n,t){return`#${Ft(e)}${Ft(n)}${Ft(t)}`}function Aa(e,n,t,r){if(r>=255)return Oo(e,n,t);let o=Math.round(Math.max(0,Math.min(255,r))/255*1e3)/1e3;return`rgba(${e}, ${n}, ${t}, ${o})`}var Va=542658390;function Ln(e,n){let t=n?.targetSize??60,r=n?.gridShift??0,o=e.byteLength;if(e.byteLength<8)return Ne(o,["parseVox: buffer too small to be a valid .vox file"]);let s=new DataView(e);if(s.getUint32(0,!0)!==Va)return Ne(o,["parseVox: not a .vox file (bad magic)"]);if(e.byteLength<20)return Ne(o,["parseVox: buffer too small for MAIN chunk"]);if(Eo(s,8)!=="MAIN")return Ne(o,["parseVox: expected MAIN chunk at offset 8"]);let c=20+s.getUint32(12,!0),u=c+s.getUint32(16,!0),f=[],g=[],m=null;for(;c<u&&c+12<=e.byteLength;){let O=Eo(s,c),S=s.getUint32(c+4,!0),k=s.getUint32(c+8,!0),N=c+12,U=N+S+k;if(O==="SIZE"){if(S>=12&&N+12<=e.byteLength){let Y=s.getUint32(N,!0),G=s.getUint32(N+4,!0),$=s.getUint32(N+8,!0);f.push({sx:Y,sy:G,sz:$})}}else if(O==="XYZI"){if(S>=4&&N+4<=e.byteLength){let Y=s.getUint32(N,!0),G=[],$=Math.min(Y,Math.floor((S-4)/4));for(let W=0;W<$;W++){let q=N+4+W*4;G.push({x:s.getUint8(q),y:s.getUint8(q+1),z:s.getUint8(q+2),colorIndex:s.getUint8(q+3)})}g.push(G)}}else if(O==="RGBA"&&S>=1024&&N+1024<=e.byteLength){m=[];for(let Y=0;Y<256;Y++){let G=N+Y*4,$=s.getUint8(G),W=s.getUint8(G+1),q=s.getUint8(G+2),ee=s.getUint8(G+3);m.push(Aa($,W,q,ee))}}c=U}let d=[],p=new Set;for(let O of g)for(let S of O){if(S.colorIndex===0)continue;let k=`${S.x},${S.y},${S.z}`;p.has(k)||(p.add(k),d.push(S))}if(d.length===0)return Ne(o,[]);let h=O=>{let S=O-1;if(m!==null)return m[S]??"#888888";let k=Ca[O]??0,[N,U,Y]=va(k);return Oo(N,U,Y)},x=(O,S,k)=>p.has(`${O},${S},${k}`),y=new Map,M=(O,S,k,N,U)=>{let Y=`${O}:${S}:${U}`,G=y.get(Y);G||(G=new Set,y.set(Y,G)),G.add(`${k},${N}`)};for(let O of d){let{x:S,y:k,z:N}=O,U=h(O.colorIndex);x(S+1,k,N)||M(0,S+1,k,N,U),x(S-1,k,N)||M(1,S,k,N,U),x(S,k+1,N)||M(2,k+1,S,N,U),x(S,k-1,N)||M(3,k,S,N,U),x(S,k,N+1)||M(4,N+1,S,k,U),x(S,k,N-1)||M(5,N,S,k,U)}function P(O){let S=new Set,k=[],N=1/0,U=-1/0,Y=1/0,G=-1/0;for(let $ of O){let[W,q]=$.split(","),ee=+W,H=+q;ee<N&&(N=ee),ee>U&&(U=ee),H<Y&&(Y=H),H>G&&(G=H)}for(let $=Y;$<=G;$++)for(let W=N;W<=U;W++){let q=`${W},${$}`;if(!O.has(q)||S.has(q))continue;let ee=1;for(;W+ee<=U;){let K=`${W+ee},${$}`;if(!O.has(K)||S.has(K))break;ee++}let H=1;e:for(;$+H<=G;){for(let K=0;K<ee;K++){let te=`${W+K},${$+H}`;if(!O.has(te)||S.has(te))break e}H++}for(let K=0;K<H;K++)for(let te=0;te<ee;te++)S.add(`${W+te},${$+K}`);k.push({u:W,v:$,w:ee,h:H})}return k}let b=(O,S,k,N,U,Y)=>{let G=k+U,$=N+Y;switch(O){case 0:return[[S,k,N],[S,G,N],[S,G,$],[S,k,$]];case 1:return[[S,G,N],[S,k,N],[S,k,$],[S,G,$]];case 2:return[[k,S,N],[k,S,$],[G,S,$],[G,S,N]];case 3:return[[G,S,N],[G,S,$],[k,S,$],[k,S,N]];case 4:return[[k,N,S],[G,N,S],[G,$,S],[k,$,S]];default:return[[k,$,S],[G,$,S],[G,N,S],[k,N,S]]}},A=[];for(let[O,S]of y){let k=O.indexOf(":"),N=O.indexOf(":",k+1),U=+O.slice(0,k),Y=+O.slice(k+1,N),G=O.slice(N+1);for(let{u:$,v:W,w:q,h:ee}of P(S))A.push({vertices:b(U,Y,$,W,q,ee),color:G})}if(A.length===0)return Ne(o,[]);let w=1/0,I=1/0,C=1/0,v=-1/0,V=-1/0,R=-1/0;for(let O of A)for(let S of O.vertices)S[0]<w&&(w=S[0]),S[0]>v&&(v=S[0]),S[1]<I&&(I=S[1]),S[1]>V&&(V=S[1]),S[2]<C&&(C=S[2]),S[2]>R&&(R=S[2]);let E=Math.max(v-w,V-I,R-C),F=E>0?t/E:1,D=F*50,z=Number.isFinite(D)&&D>0?Math.max(1,Math.round(D))/50:F,_={kind:"magica-vox",cells:d.map(O=>({x:O.x-w,y:O.y-I,z:O.z-C,color:h(O.colorIndex)})),rows:Math.max(0,v-w),cols:Math.max(0,V-I),depth:Math.max(0,R-C),scale:z,gridShift:r,sourceBytes:o},L=O=>Math.round(O*1e3)/1e3,T=O=>[L((O[0]-w)*z+r),L((O[1]-I)*z+r),L((O[2]-C)*z+r)],B=A.map(({vertices:O,color:S})=>({vertices:O.map(T),color:S}));return{polygons:B,voxelSource:_,objectUrls:[],dispose:()=>{},warnings:[],metadata:{triangleCount:B.length,sourceBytes:o,voxelCount:d.length}}}function Eo(e,n){return String.fromCharCode(e.getUint8(n))+String.fromCharCode(e.getUint8(n+1))+String.fromCharCode(e.getUint8(n+2))+String.fromCharCode(e.getUint8(n+3))}function Ne(e,n){return{polygons:[],objectUrls:[],dispose:()=>{},warnings:n,metadata:{triangleCount:0,sourceBytes:e}}}var Sa=["t","b","bl","br","fr","fl"];var ko={x:0,y:1,z:2},_o=new Map(Sa.map((e,n)=>[e,n])),Ko={t:1,fr:1,fl:1,b:-1,bl:-1,br:-1};var wa=(e,n)=>{let t=[{mask:e.mask,filledCount:e.filledCount,allowMask:null}];if(!n)return t;let{width:r,height:o}=e,s=new Uint8Array(r*o),i=n.minRow-e.minRow,a=n.minCol-e.minCol;for(let u=0;u<n.height;u+=1){let f=u+i;if(f<0||f>=o)continue;let g=f*r,m=u*n.width;for(let d=0;d<n.width;d+=1){if(!n.mask[m+d])continue;let p=d+a;if(p<0||p>=r)continue;let h=g+p;e.mask[h]||(s[h]=1)}}let l=0;for(let u=0;u<s.length;u+=1)l+=s[u]?1:0;if(!l)return t;let c=e.mask.slice();for(let u=0;u<s.length;u+=1)s[u]&&(c[u]=1);return t.push({mask:c,filledCount:e.filledCount+l,allowMask:s}),t},Nn=(e,n,t,r)=>{let{r0:o,c0:s,r1:i,c1:a}=t;if(i<=o||a<=s)return[];let l=[];if(!r){for(let c=o;c<i;c+=1){let u=c*n,f=s;for(;f<a;){for(;f<a&&!e[u+f];)f+=1;if(f>=a)break;let g=f;for(;f<a&&e[u+f];)f+=1;l.push({r0:c,c0:g,r1:c+1,c1:f})}}return l}for(let c=s;c<a;c+=1){let u=o;for(;u<i;){for(;u<i&&!e[u*n+c];)u+=1;if(u>=i)break;let f=u;for(;u<i&&e[u*n+c];)u+=1;l.push({r0:f,c0:c,r1:u,c1:c+1})}}return l},De=e=>{if(e.length<2)return e;e.sort((r,o)=>r.r0-o.r0||r.r1-o.r1||r.c0-o.c0||r.c1-o.c1);let n=[];for(let r of e){let o=n[n.length-1];if(o&&r.r0===o.r0&&r.r1===o.r1&&r.c0===o.c1){o.c1=r.c1;continue}n.push(r)}n.sort((r,o)=>r.c0-o.c0||r.c1-o.c1||r.r0-o.r0||r.r1-o.r1);let t=[];for(let r of n){let o=t[t.length-1];if(o&&r.c0===o.c0&&r.c1===o.c1&&r.r0===o.r1){o.r1=r.r1;continue}t.push(r)}return t},Fn=(e,n,t)=>{let r={r0:0,c0:0,r1:t,c1:n},o=De(Nn(e,n,r,!1)),s=De(Nn(e,n,r,!0));return!o.length||s.length&&s.length<o.length?s:o},Ia=(e,n,t,r,o,s)=>{r.fill(0);let i=null;for(let a=0;a<t;a+=1){let l=a*n;for(let u=0;u<n;u+=1)r[u]=e[l+u]?r[u]+1:0;let c=0;for(let u=0;u<=n;u+=1){let f=u<n?r[u]:0,g=u;for(;c>0&&s[c-1]>f;){c-=1;let m=s[c],d=o[c],p=m*(u-d);(!i||p>i.area)&&(i={r0:a-m+1,c0:d,r1:a+1,c1:u,area:p}),g=d}f>0&&(c===0||s[c-1]<f)&&(o[c]=g,s[c]=f,c+=1)}}return i},Wo=(e,n,t,r)=>{if(r<=1)return null;let o=new Int32Array(n),s=new Int32Array(n+1),i=new Int32Array(n+1),a=[];for(;a.length<r;){let l=Ia(e,n,t,o,s,i);if(!l||l.area<=0)return a;if(a.push({r0:l.r0,c0:l.c0,r1:l.r1,c1:l.c1}),a.length>=r)return null;for(let c=l.r0;c<l.r1;c+=1){let u=c*n;for(let f=l.c0;f<l.c1;f+=1)e[u+f]=0}}return null},Ra=(e,n,t,r)=>{if(e.length<2||r<=1)return null;let o=t,s=n,i=-1,a=-1,l=0;for(let m of e)m.r0<o&&(o=m.r0),m.c0<s&&(s=m.c0),m.r1>i&&(i=m.r1),m.c1>a&&(a=m.c1),l+=(m.r1-m.r0)*(m.c1-m.c0);let c=a-s,u=i-o;if(c<=0||u<=0)return null;if(l===c*u)return r>1?[{r0:o,c0:s,r1:i,c1:a}]:null;let f=new Uint8Array(c*u);for(let m of e)for(let d=m.r0;d<m.r1;d+=1){let p=(d-o)*c;for(let h=m.c0;h<m.c1;h+=1)f[p+h-s]=1}let g=Wo(f,c,u,r);return g?g.map(m=>({r0:m.r0+o,c0:m.c0+s,r1:m.r1+o,c1:m.c1+s})):null},Ta=(e,n,t)=>{let o=Nn(e,n,{r0:0,c0:0,r1:t,c1:n},!1);if(o.length<2)return o;let s=new Int32Array(o.length);for(let p=0;p<s.length;p+=1)s[p]=p;let i=p=>{let h=p;for(;s[h]!==h;)h=s[h];for(;s[p]!==p;){let x=s[p];s[p]=h,p=x}return h},a=(p,h)=>{let x=i(p),y=i(h);x!==y&&(s[y]=x)},l=0,c=0,u=-1,f=0;for(let p=0;p<o.length;p+=1){let h=o[p];if(h){h.r0!==u&&(h.r0===u+1?(l=f,c=p):(l=p,c=p),u=h.r0,f=p);for(let x=l;x<c;x+=1){let y=o[x];if(y&&!(y.c1<=h.c0)){if(y.c0>=h.c1)break;a(p,x)}}}}let g=new Int32Array(o.length);g.fill(-1);let m=[];for(let p=0;p<o.length;p+=1){let h=i(p),x=g[h]??-1;x<0&&(x=m.length,g[h]=x,m.push([])),m[x]?.push(p)}if(m.length<2)return o;let d=[];for(let p of m){let h=t,x=n,y=-1,M=-1,P=0;for(let C of p){let v=o[C];v&&(v.r0<h&&(h=v.r0),v.c0<x&&(x=v.c0),v.r1>y&&(y=v.r1),v.c1>M&&(M=v.c1),P+=v.c1-v.c0)}let b=M-x,A=y-h;if(P===b*A){d.push({r0:h,c0:x,r1:y,c1:M});continue}let w=new Uint8Array(b*A);for(let C of p){let v=o[C];if(!v)continue;let V=(v.r0-h)*b;for(let R=v.c0;R<v.c1;R+=1)w[V+R-x]=1}let I=Fn(w,b,A);for(let C of I)d.push({r0:C.r0+h,c0:C.c0+x,r1:C.r1+h,c1:C.c1+x})}return d},Lo=(e,n)=>{let{width:t,ids:r,palette:o}=n,s=new Map,i=e.c1-e.c0,a=e.r1-e.r0;for(let h=e.r0;h<e.r1;h+=1){let x=h*t;for(let y=e.c0;y<e.c1;y+=1){let M=r[x+y];if(!M)continue;let P=(s.get(M)??0)+1;s.set(M,P)}}if(!s.size)return[];let l=Array.from(s.keys()).sort((h,x)=>h-x),c=new Uint8Array(i*a),u=[],f=l[0]??0,g=-1,m=-1;for(let h of l){c.fill(0);for(let M=e.r0;M<e.r1;M+=1){let P=M*t,b=(M-e.r0)*i;for(let A=e.c0;A<e.c1;A+=1)r[P+A]===h&&(c[b+(A-e.c0)]=1)}let x=Fn(c,i,a);u.push({colorId:h,rects:x});let y=s.get(h)??0;(x.length>g||x.length===g&&y>m||x.length===g&&y===m&&h<f)&&(f=h,g=x.length,m=y)}let d=o[f]??"";if(!d)return[];let p=[{...e,baseColor:d}];for(let{colorId:h,rects:x}of u){if(h===f||!x.length)continue;let y=o[h]??"";if(y)for(let M of x)p.push({r0:M.r0+e.r0,c0:M.c0+e.c0,r1:M.r1+e.r0,c1:M.c1+e.c0,baseColor:y})}return p},ce=(e,n,t,r)=>{let{width:o,height:s}=n,i=new Uint32Array(o*s);for(let l of e){let c=r.get(l.baseColor);if(!c)return!1;let u=Math.max(0,l.r0),f=Math.max(0,l.c0),g=Math.min(s,l.r1),m=Math.min(o,l.c1);for(let d=u;d<g;d+=1){let p=d*o;for(let h=f;h<m;h+=1)i[p+h]=c}}let a=n.ids;for(let l=0;l<i.length;l+=1)if(i[l]!==a[l]&&!(t&&!a[l]&&t[l]))return!1;return!0},Bo=e=>{if(e.length<2)return e;let n=new Map;for(let r of e){let o=n.get(r.baseColor);o?o.push(r):n.set(r.baseColor,[r])}let t=[];for(let[,r]of n)t.push(...De(r.map(o=>({...o}))));return t},Fe=e=>Math.max(0,e.r1-e.r0)*Math.max(0,e.c1-e.c0),Ea=(e,n)=>e.r0<n.r1&&e.r1>n.r0&&e.c0<n.c1&&e.c1>n.c0,No=(e,n,t,r)=>e<r&&n>t,Zo=(e,n)=>({r0:Math.min(e.r0,n.r0),c0:Math.min(e.c0,n.c0),r1:Math.max(e.r1,n.r1),c1:Math.max(e.c1,n.c1),baseColor:e.baseColor}),Qo=(e,n,t)=>{let{width:r,height:o}=n,s=new Int32Array(r*o),i=new Int32Array(r*o),a=new Int32Array(e.length);s.fill(-1),i.fill(-1);for(let l=0;l<e.length;l+=1){let c=e[l],u=t.get(c.baseColor);if(!u)return null;a[l]=u;let f=Math.max(0,c.r0),g=Math.max(0,c.c0),m=Math.min(o,c.r1),d=Math.min(r,c.c1);for(let p=f;p<m;p+=1){let h=p*r;for(let x=g;x<d;x+=1){let y=h+x;i[y]=s[y]??-1,s[y]=l}}}return{lastPaint:s,previousPaint:i,brushColorIds:a}},Fo=(e,n,t,r,o,s,i,a,l,c)=>{let u=t.get(l.baseColor);if(!u)return!1;let f=e.ids,g=c?i:a,m=c?a:i;for(let d=l.r0;d<l.r1;d+=1){let p=d*e.width;for(let h=l.c0;h<l.c1;h+=1){let x=p+h;if(f[x]===u){if(c&&r[x]===m){let M=o[x]??-1;if(M>g&&s[M]!==u)return!1}continue}if(n&&!f[x]&&n[x])continue;let y=r[x]??-1;if(!(y>g&&y!==m))return!1}}return!0},Oa=e=>{let n=new Map,t=new Map;for(let i=0;i<e.length;i+=1){let a=e[i],l=`${a.baseColor}|r|${a.r0}|${a.r1}`,c=`${a.baseColor}|c|${a.c0}|${a.c1}`,u=n.get(l);u?u.push(i):n.set(l,[i]);let f=t.get(c);f?f.push(i):t.set(c,[i])}let r=new Set,o=[],s=(i,a)=>{let l=Math.min(i,a),c=Math.max(i,a);if(l===c)return;let u=`${l}:${c}`;if(r.has(u))return;r.add(u);let f=e[l],g=e[c];if(!f||!g||f.baseColor!==g.baseColor)return;let m=Zo(f,g),d=Fe(m)-Fe(f)-Fe(g);d<0||o.push({first:l,second:c,replacement:m,extraArea:d})};for(let i of n.values())if(!(i.length<2)){i.sort((a,l)=>e[a].c0-e[l].c0||e[a].c1-e[l].c1);for(let a=0;a<i.length-1;a+=1)s(i[a],i[a+1])}for(let i of t.values())if(!(i.length<2)){i.sort((a,l)=>e[a].r0-e[l].r0||e[a].r1-e[l].r1);for(let a=0;a<i.length-1;a+=1)s(i[a],i[a+1])}return o.sort((i,a)=>i.extraArea-a.extraArea||i.first-a.first||i.second-a.second),o},ka=e=>{let n=new Map;for(let r=0;r<e.length;r+=1){let o=e[r],s=n.get(o.baseColor);s?s.push(r):n.set(o.baseColor,[r])}let t=[];for(let r of n.values())if(!(r.length<2))for(let o=0;o<r.length-1;o+=1){let s=r[o],i=e[s];if(i)for(let a=o+1;a<r.length;a+=1){let l=r[a],c=e[l];if(!c||!No(i.r0,i.r1,c.r0,c.r1)&&!No(i.c0,i.c1,c.c0,c.c1))continue;let u=Zo(i,c),f=Fe(u)-Fe(i)-Fe(c);t.push({first:s,second:l,replacement:u,extraArea:f})}}return t.sort((r,o)=>r.extraArea-o.extraArea||r.first-o.first||r.second-o.second),t},Do=(e,n,t,r,o)=>{if(!n.length)return null;let s=Qo(e,t,o);if(!s)return null;let{lastPaint:i,previousPaint:a,brushColorIds:l}=s,c=new Uint8Array(e.length),u=new Uint8Array(e.length),f=[],g=0,m=[];for(let p of n){let{first:h,second:x,replacement:y}=p;if(c[h]||c[x])continue;let M=!1;for(let A of m)if(Ea(A,y)){M=!0;break}if(M)continue;let P=e[h],b=e[x];if(!(!P||!b||P.baseColor!==b.baseColor)){if(Fo(t,r,o,i,a,l,h,x,y,!0)){c[h]=1,c[x]=1,f[h]=y,g+=1,u[x]=1,m.push(y);continue}Fo(t,r,o,i,a,l,h,x,y,!1)&&(c[h]=1,c[x]=1,u[h]=1,f[x]=y,g+=1,m.push(y))}}if(!g)return null;let d=[];for(let p=0;p<e.length;p+=1)u[p]||d.push(f[p]??e[p]);return d},_a=(e,n,t,r)=>{if(e.length<2)return e;let o=e,s=!1;for(;;){let i=Do(o,Oa(o),n,t,r);if(i){o=i,s=!0;continue}let a=Do(o,ka(o),n,t,r);if(!a)break;o=a,s=!0}return s&&o.length<e.length&&ce(o,n,t,r)?o:e},La=(e,n,t,r,o,s)=>{let i=s[n]??0;if(!i)return!1;for(let a=e.r0;a<e.r1;a+=1){let l=a*t.width;for(let c=e.c0;c<e.c1;c+=1){let u=l+c;if(r[u]!==n)continue;let f=o[u]??-1;if(f<0||s[f]!==i)return!1}}return!0},Ba=(e,n,t,r)=>{if(e.length<2)return e;let o=e,s=!1;for(;;){let i=Qo(o,n,r);if(!i)break;let{lastPaint:a,previousPaint:l,brushColorIds:c}=i,u=-1;for(let g=0;g<o.length;g+=1){let m=o[g];if(m&&La(m,g,n,a,l,c)){u=g;break}}if(u<0)break;let f=[];for(let g=0;g<o.length;g+=1)g!==u&&f.push(o[g]);o=f,s=!0}return s&&o.length<e.length&&ce(o,n,t,r)?o:e},zt=e=>{let n=new Set;for(let t of e.ids)t&&n.add(t);return Array.from(n).sort((t,r)=>t-r)},Na=(e,n,t,r)=>{let{width:o,height:s,ids:i}=e,a=null,l=(u,f)=>!!n[u]||i[u]===f||!!r&&!i[u]&&!!r[u],c=(u,f,g,m,d)=>{let p=0;for(let x=f;x<m;x+=1){let y=x*o;for(let M=g;M<d;M+=1){let P=y+M,b=i[P];if(!l(P,u))return;!n[P]&&b===u&&(p+=1)}}if(!p)return;let h=(m-f)*(d-g);(!a||p>a.gain||p===a.gain&&h>a.area)&&(a={colorId:u,r0:f,c0:g,r1:m,c1:d,gain:p,area:h})};for(let u of t){for(let f=0;f<s;f+=1){let g=f*o,m=0;for(;m<o;){for(;m<o&&(n[g+m]||i[g+m]!==u);)m+=1;let d=m;for(;m<o&&!n[g+m]&&i[g+m]===u;)m+=1;if(d===m)continue;let p=f;e:for(;p>0;){let x=(p-1)*o;for(let y=d;y<m;y+=1){let M=x+y;if(!l(M,u))break e}p-=1}let h=f+1;e:for(;h<s;){let x=h*o;for(let y=d;y<m;y+=1){let M=x+y;if(!l(M,u))break e}h+=1}c(u,p,d,h,m)}}for(let f=0;f<o;f+=1){let g=0;for(;g<s;){for(;g<s&&(n[g*o+f]||i[g*o+f]!==u);)g+=1;let m=g;for(;g<s&&!n[g*o+f]&&i[g*o+f]===u;)g+=1;if(m===g)continue;let d=f;e:for(;d>0;){for(let h=m;h<g;h+=1){let x=h*o+d-1;if(!l(x,u))break e}d-=1}let p=f+1;e:for(;p<o;){for(let h=m;h<g;h+=1){let x=h*o+p;if(!l(x,u))break e}p+=1}c(u,m,d,g,p)}}}return a},zo=(e,n,t,r=null)=>{let o=e.palette.length-1,s=e.width*e.height,i=r?4:3;if(r){if(t<20||t>64||o<2||o>4)return null}else if(t>=45&&t<=64&&o>=4&&o<=5&&e.filledCount<=650&&s<=1200)i=5;else if(t<150||o<2||o>3)return null;let a=zt(e);if(a.length<2||a.length>i)return null;let l=new Uint8Array(e.ids.length),c=e.filledCount,u=[];for(;c>0;){if(u.length>=t-1)return null;let g=Na(e,l,a,r);if(!g)return null;let m=e.palette[g.colorId]??"";if(!m)return null;u.push({r0:g.r0,c0:g.c0,r1:g.r1,c1:g.c1,baseColor:m});for(let d=g.r0;d<g.r1;d+=1){let p=d*e.width;for(let h=g.c0;h<g.c1;h+=1){let x=p+h;!l[x]&&e.ids[x]===g.colorId&&(l[x]=1,c-=1)}}}if(u.length>=t)return null;let f=u.reverse();return ce(f,e,r,n)?f:null},Fa=(e,n,t,r)=>{if(e.palette.length!==2||r<=2||r>32)return null;let o=e.palette[1]??"";if(!o)return null;let s=Wo(n.mask.slice(),e.width,e.height,r);if(!s||s.length>=r)return null;let i=s.map(a=>({...a,baseColor:o}));return ce(i,e,n.allowMask,t)?i:null},Da=42,Go=400,za=5200,Ga=20,Ua=128,$a=80,Xa=32,Uo=160,ja=1600,Ya=256,qo=[],Bn=new Map,Jo=e=>{let n=e,t=0;for(;n;)n&=n-1n,t+=1;return t},Ha=(e,n,t,r)=>{let o=new Map,s=new Uint8Array(n),i=new Array(n).fill(0n),a=(c,u,f,g,m)=>{if(!c)return!0;let d=(g-u)*(m-f),p=o.get(c);return!((!p||d<p.area||d===p.area&&g-u>p.r1-p.r0)&&(o.set(c,{r0:u,c0:f,r1:g,c1:m,bits:c,count:Jo(c),area:d}),o.size>za))};for(let c=0;c<t;c+=1){s.fill(1),i.fill(0n);for(let u=c;u<t;u+=1){let f=u*n;for(let m=0;m<n;m+=1){if(!s[m])continue;let d=f+m;if(!e[d]){s[m]=0,i[m]=0n;continue}i[m]|=r[d]??0n}let g=0;for(;g<n;){for(;g<n&&!s[g];)g+=1;if(g>=n)break;let m=0n,d=g;for(;d<n&&s[d];)if(m|=i[d]??0n,d+=1,!a(m,c,g,u+1,d))return null;g=d+1}}}let l=Array.from(o.values());return l.sort((c,u)=>u.count-c.count||c.area-u.area||c.r0-u.r0||c.c0-u.c0),l},es=(e,n,t,r,o,s)=>{let i=Ha(e,n,t,r);if(!i||!i.length)return null;let a=[],l=o;for(;l&&a.length<s;){let c=-1,u=0;for(let f=0;f<i.length;f+=1){let g=i[f];if(!g)continue;if(g.count<=u)break;let m=Jo(g.bits&l);m>u&&(u=m,c=f)}if(c<0||!u)break;a.push(c),l&=~(i[c]?.bits??0n)}return l||a.length>=s?null:a.map(c=>{let u=i[c];return{r0:u.r0,c0:u.c0,r1:u.r1,c1:u.c1}})},$o=(e,n)=>{if(!n.length){e.push("e");return}let t=n[0]?1:0,r=1;for(let o=1;o<n.length;o+=1){let s=n[o]?1:0;if(s===t){r+=1;continue}e.push(t?"1":"0",r.toString(36),","),t=s,r=1}e.push(t?"1":"0",r.toString(36))},Ka=(e,n,t)=>{let r=[e.width.toString(36),"x",e.height.toString(36),":",t.toString(36),":"];return $o(r,e.mask),r.push(":"),$o(r,n.mask),r.join("")},Xo=(e,n)=>{Bn.size>=Ya&&Bn.clear(),Bn.set(e,n??qo)},jo=(e,n,t,r)=>{if(e.palette.length!==2||r<=2||r>Da||e.filledCount>Go)return null;if(n.allowMask){if(n.filledCount-e.filledCount<Ga)return null}else if(e.width*e.height>Ua||e.filledCount>$a)return null;let o=e.palette[1]??"";if(!o)return null;let s=Ka(e,n,r),i=Bn.get(s);if(i){if(i===qo)return null;let g=i.map(m=>({...m,baseColor:o}));return ce(g,e,n.allowMask,t)?g:null}let a=new Array(e.ids.length).fill(0n),l=0,c=0n;for(let g=0;g<e.ids.length;g+=1){if(e.ids[g]!==1)continue;let m=1n<<BigInt(l);a[g]=m,l+=1,c|=m}if(!c||l>Go)return Xo(s,null),null;let u=es(n.mask,e.width,e.height,a,c,r);if(Xo(s,u),!u)return null;let f=u.map(g=>({...g,baseColor:o}));return ce(f,e,n.allowMask,t)?f:null},Wa=(e,n,t,r)=>{if(r<=2||r>Xa||e.filledCount>Uo)return null;let o=e.width*e.height;if(o>ja)return null;let s=Math.max(1,Math.min(e.width,e.height)),i=Math.max(e.width,e.height);if(n.allowMask){if(o>800||o>64&&(o<700||e.filledCount<140))return null}else if(o>64&&(r<20||e.filledCount<100||i<s*4))return null;let a=zt(e);if(a.length!==2)return null;let l=null,c=[a,[a[1]??0,a[0]??0]];for(let u of c){let f=[];for(let g=0;g<u.length;g+=1){let m=u[g]??0,d=u.length-g-1,p=r-f.length-d;if(p<=1)break;let h=new Set(u.slice(g)),x=n.allowMask?n.allowMask.slice():new Uint8Array(e.ids.length),y=new Array(e.ids.length).fill(0n),M=0n,P=0;for(let w=0;w<e.ids.length;w+=1){let I=e.ids[w];if(!h.has(I))continue;x[w]=1;let C=1n<<BigInt(P);y[w]=C,P+=1,M|=C}if(!M||P>Uo){f.length=r;break}let b=es(x,e.width,e.height,y,M,p);if(!b){f.length=r;break}let A=e.palette[m]??"";if(!A){f.length=r;break}for(let w of b)f.push({...w,baseColor:A});if(f.length>=r)break}f.length<r&&ce(f,e,n.allowMask,t)&&(!l||f.length<l.length)&&(l=f)}return l},Yo=(e,n)=>{let t=[];for(let r of e)r!==n&&t.push(r);return t},Za=(e,n,t)=>{let r=new Set(n),o=t?t.slice():new Uint8Array(e.ids.length),s=e.ids;for(let i=0;i<s.length;i+=1)r.has(s[i])&&(o[i]=1);return o},Qa=(e,n)=>{let{width:t,height:r,ids:o}=e;for(let s=0;s<r;s+=1){let i=s*t,a=0;for(;a<t;){for(;a<t&&!n[i+a];)a+=1;let l=a;for(;a<t&&n[i+a];)a+=1;if(l===a)continue;let c=l>0?o[i+l-1]:0,u=a<t?o[i+a]:0;if(c&&c===u)return!0}}for(let s=0;s<t;s+=1){let i=0;for(;i<r;){for(;i<r&&!n[i*t+s];)i+=1;let a=i;for(;i<r&&n[i*t+s];)i+=1;if(a===i)continue;let l=a>0?o[(a-1)*t+s]:0,c=i<r?o[i*t+s]:0;if(l&&l===c)return!0}}return!1},Dt=(e,n,t,r)=>{let o=n.join(","),s=r.get(o);if(s)return s;let i=Za(e,n,t),a=Fn(i,e.width,e.height);return r.set(o,a),a},qa=(e,n,t,r)=>{let o=e.palette.length-1;if(o<3||r<=1)return null;let s=n.mask.length;if(n.filledCount*(o+2)<s*o)return null;let i=Fn(n.mask,e.width,e.height);if(i.length+o-1>=r)return null;let a=zt(e),l=new Map;l.set(a.join(","),i);let c=a.slice(),u=[];for(;c.length;){let f=Dt(e,c,n.allowMask,l),g=c.length-1;if(u.length+f.length+g>=r)return null;let m=c[0]??0,d=Number.MAX_SAFE_INTEGER,p=-1;for(let y of c){let M=Yo(c,y),P=M.length?Dt(e,M,n.allowMask,l).length:0,b=Dt(e,[y],n.allowMask,l).length;(P<d||P===d&&b>p||P===d&&b===p&&y<m)&&(m=y,d=P,p=b)}if(u.length+f.length+d+Math.max(0,c.length-2)>=r)return null;let h=e.palette[m]??"";if(!h)return null;for(let y of f)u.push({...y,baseColor:h});let x=Yo(c,m);c.length=0,c.push(...x)}return u.length<r&&ce(u,e,n.allowMask,t)?u:null},Ho=(e,n,t,r=null)=>{let o=e.palette.length-1;if(o<(r?1:2)||o>=t)return null;let{width:s,height:i,ids:a,palette:l}=e,c=[],u=[],f=[],g=[],m=[],d=[],p=[],h=0,x=C=>{let v=C;for(;m[v]!==v;)v=m[v]??v;for(;m[C]!==C;){let V=m[C]??C;m[C]=v,C=V}return v},y=(C,v)=>{let V=x(C),R=x(v);if(V!==R){m[R]=V,h-=1;let E=g[V]??g[R]??0;p[E]=Math.max(0,(p[E]??1)-1)}},M=0,P=0,b=-1,A=0;for(let C=0;C<i;C+=1){let v=C*s,V=0;for(;V<s;){let R=a[v+V];if(!R){V+=1;continue}let E=V;for(V+=1;V<s&&(a[v+V]===R||r&&r[v+V]);)V+=1;let F={r0:C,c0:E,r1:C+1,c1:V},D=f.length;f.push(F),g.push(R),m.push(D),h+=1,p[R]=(p[R]??0)+1;let z=c[R];z?z.push(F):c[R]=[F],C!==b&&(C===b+1?(M=A,P=D):(M=D,P=D),b=C,A=D);for(let _=M;_<P;_+=1){let L=f[_];if(L&&!(L.c1<=E)){if(L.c0>=V)break;g[_]===R&&y(D,_)}}}}if(h>=t)return null;for(let C=0;C<s;C+=1){let v=0;for(;v<i;){let V=a[v*s+C];if(!V){v+=1;continue}let R=v;for(v+=1;v<i&&(a[v*s+C]===V||r&&r[v*s+C]);)v+=1;let E=u[V],F={r0:R,c0:C,r1:v,c1:C+1};E?E.push(F):u[V]=[F]}}let w=[],I=0;for(let C=1;C<l.length;C+=1){let v=l[C]??"";if(!v)return null;let V=De(c[C]??[]),R=De(u[C]??[]);if(!V.length&&!R.length)continue;let E=R.length&&R.length<V.length?R:V,F=p[C]??E.length;I+=E.length,w.push({colorId:C,fill:v,rects:E,rowRects:V,componentCount:F})}if(I<t)for(let C of w){if(C.rects.length<=C.componentCount)continue;let v=Ra(C.rowRects,s,i,C.rects.length);!v||v.length>=C.rects.length||(I+=v.length-C.rects.length,C.rects=v)}if(w.sort((C,v)=>{let V=C.rects.length-C.componentCount;return v.rects.length-v.componentCount-V||v.rects.length-C.rects.length}),I>=t)return null;for(let C of w)for(let v of C.rects)d.push({...v,baseColor:C.fill});return d.length<t&&ce(d,e,r,n)?d:null},Ja=(e,n,t)=>{let r={r0:0,c0:0,r1:e.height,c1:e.width},o=null,s=-1,i=!1;for(let a of[!1,!0]){let l=De(Nn(n.mask,e.width,r,a));s<0?s=l.length:l.length!==s&&(i=!0);let c=[];for(let g of l)c.push(...Lo(g,e));if(!ce(c,e,n.allowMask,t))continue;let u=c,f=Bo(c);f.length<u.length&&ce(f,e,n.allowMask,t)&&(u=f),(!o||u.length<o.length)&&(o=u)}if(i){let a=Ta(n.mask,e.width,e.height);if(!o||a.length<o.length){let l=[];for(let c of a)l.push(...Lo(c,e));if(ce(l,e,n.allowMask,t)){let c=l,u=Bo(l);u.length<c.length&&ce(u,e,n.allowMask,t)&&(c=u),(!o||c.length<o.length)&&(o=c)}}}return o},ns=(e,n)=>{let t=e.buffer,r=new Map;for(let c=1;c<t.palette.length;c+=1)r.set(t.palette[c],c);let o=(c,u)=>{let f=c,g=_a(f,t,u,r);g.length<f.length&&(f=g);let m=Ba(f,t,u,r);return m.length<f.length&&(f=m),f},s=null,i=null,a=wa(t,n);for(let c of a){let u=Ja(t,c,r);u&&(!s||u.length<s.length)&&(s=u,i=c.allowMask);let f=qa(t,c,r,s?.length??Number.MAX_SAFE_INTEGER);f&&(!s||f.length<s.length)&&(s=f,i=c.allowMask)}s&&(s=o(s,i));let l=!1;for(let c of a){if(!c.allowMask||!Qa(t,c.allowMask))continue;let u=Ho(t,r,s?.length??Number.MAX_SAFE_INTEGER,c.allowMask);if(u&&(!s||u.length<s.length)){let f=o(u,c.allowMask);(!s||f.length<s.length)&&(s=f,i=c.allowMask,l=!0)}}if(!l){let c=Ho(t,r,s?.length??Number.MAX_SAFE_INTEGER);if(c&&(!s||c.length<s.length)){let u=o(c,null);(!s||u.length<s.length)&&(s=u,i=null)}}if(s){let c=zo(t,r,s.length);if(c&&c.length<s.length){let u=o(c,null);s=u.length<c.length?u:c,i=null}if(e.key.axis==="z"&&e.key.face==="t")for(let u of a){if(!u.allowMask||u.filledCount-t.filledCount<20)continue;let f=zo(t,r,s.length,u.allowMask);if(f&&f.length<s.length){let g=o(f,u.allowMask);s=g.length<f.length?g:f,i=u.allowMask}}}if(s)for(let c of a){let u=Wa(t,c,r,s.length);if(u&&u.length<s.length&&(s=u,i=c.allowMask),!c.allowMask){let f=jo(t,c,r,s.length);f&&f.length<s.length&&(s=f,i=c.allowMask)}if(e.key.axis==="z"){let f=Fa(t,c,r,s.length);if(f&&f.length<s.length&&(s=f,i=c.allowMask),c.allowMask){let g=jo(t,c,r,s.length);g&&g.length<s.length&&(s=g,i=c.allowMask)}}}return{key:e.key,buffer:t,brushes:s??[]}},ts=e=>{let n=Math.max(0,Math.floor(e.rows)),t=Math.max(0,Math.floor(e.cols)),r=Math.max(0,Math.floor(e.depth));if(n<=0||t<=0||r<=0||e.cells.length===0)return[];let o=n*t,s=new Int32Array(o*r),i=[],a=new Map;for(let m of e.cells){let d=Math.floor(m.x),p=Math.floor(m.y),h=Math.floor(m.z);if(d<0||d>=n||p<0||p>=t||h<0||h>=r)continue;let x=h*o+d*t+p;s[x]||(s[x]=1,i.push(x),a.set(x,{color:m.color||"#cccccc"}))}let l=new Map,c=(m,d,p,h,x,y)=>{let M=`${m}:${d}:${p}`,P=l.get(M);P||(P={key:{axis:m,plane:d,face:p},minRow:x,minCol:y,maxRow:x,maxCol:y,cells:[]},l.set(M,P)),P.cells.push({row:x,col:y,color:h}),x<P.minRow&&(P.minRow=x),y<P.minCol&&(P.minCol=y),x>P.maxRow&&(P.maxRow=x),y>P.maxCol&&(P.maxCol=y)},u=(m,d,p)=>m>=0&&m<n&&d>=0&&d<t&&p>=0&&p<r&&s[p*o+m*t+d]!==0;for(let m of i){let d=Math.floor(m/o),p=m-d*o,h=Math.floor(p/t),x=p-h*t,y=a.get(m)?.color??"#cccccc";u(h,x,d+1)||c("z",d+1,"t",y,h,x),u(h,x,d-1)||c("z",d,"b",y,h,x),u(h,x-1,d)||c("y",x,"bl",y,h,d),u(h,x+1,d)||c("y",x+1,"fr",y,h,d),u(h-1,x,d)||c("x",h,"br",y,d,x),u(h+1,x,d)||c("x",h+1,"fl",y,d,x)}let f=Array.from(l.values()).sort((m,d)=>ko[m.key.axis]-ko[d.key.axis]||m.key.plane-d.key.plane||(_o.get(m.key.face)??0)-(_o.get(d.key.face)??0)),g=[];for(let m of f){m.cells.length>1&&m.cells.sort((b,A)=>b.row!==A.row?b.row-A.row:b.col-A.col);let d=m.maxCol-m.minCol+1,p=m.maxRow-m.minRow+1;if(d<=0||p<=0)continue;let h=new Uint32Array(d*p),x=[""],y=new Map,M=0;for(let b of m.cells){let A=b.row-m.minRow,w=b.col-m.minCol;if(A<0||w<0||A>=p||w>=d)continue;let I=A*d+w,C=y.get(b.color);C===void 0&&(C=x.length,y.set(b.color,C),x.push(b.color)),h[I]||(M+=1),h[I]=C}if(M===0)continue;let P=new Uint8Array(h.length);for(let b=0;b<h.length;b+=1)h[b]&&(P[b]=1);g.push({key:m.key,buffer:{width:d,height:p,minRow:m.minRow,minCol:m.minCol,ids:h,mask:P,filledCount:M,palette:x}})}return g};var Ie="loadMesh";function Gt(e,n){if(e.voxelSource)return e;let t=Pn(e.polygons,{meshResolution:n?.meshResolution});return t.length===e.polygons.length?e:{...e,polygons:t}}async function rs(e,n){let t=n?.solidTextureSamples;return t===!1?e:_n(e,typeof t=="object"?t:void 0)}function el(e){let n=e.split("?")[0].split("#")[0],t=n.lastIndexOf(".");return t<0?"":n.slice(t+1).toLowerCase()}async function os(e,n){let t=el(e);if(t==="mtl")throw new Error(`${Ie}: .mtl is a material file, not a mesh \u2014 use parseMtl directly`);let r=globalThis.fetch;if(!r)throw new Error(`${Ie}: no fetch() in this environment`);let o=n?.baseUrl??e;if(t==="obj"){let s=await r(e);if(!s.ok)throw new Error(`${Ie}: ${e} \u2192 ${s.status}`);let i=await s.text(),a=n?.objOptions;if(n?.mtlUrl){let c=await r(n.mtlUrl);if(!c.ok)throw new Error(`${Ie}: ${n.mtlUrl} \u2192 ${c.status}`);let u=await c.text(),{colors:f,textures:g}=Rn(u),m={},d=globalThis.URL,p=globalThis.document?.baseURI,h=n.mtlUrl;if(d&&p)try{h=new d(n.mtlUrl,p).toString()}catch{}for(let[x,y]of Object.entries(g)){if(d)try{m[x]=new d(y,h).toString();continue}catch{}let M=n.mtlUrl.lastIndexOf("/"),P=M>=0?n.mtlUrl.slice(0,M+1):"";m[x]=y.startsWith("/")||/^https?:\/\//.test(y)?y:P+y}a={...a??{},materialColors:{...f,...a?.materialColors??{}},materialTextures:{...m,...a?.materialTextures??{}}}}let l=In(i,a);return Gt(await rs(l,n),n)}if(t==="glb"||t==="gltf"){let s=await r(e);if(!s.ok)throw new Error(`${Ie}: ${e} \u2192 ${s.status}`);let i=await s.arrayBuffer(),a=kn(i,{baseUrl:o,...n?.gltfOptions??{}});return Gt(await rs(a,n),n)}if(t==="vox"){let s=await r(e);if(!s.ok)throw new Error(`${Ie}: ${e} \u2192 ${s.status}`);let i=await s.arrayBuffer();return Gt(Ln(i,n?.voxOptions),n)}throw new Error(`${Ie}: unsupported extension ".${t}" (supported: obj, glb, gltf, vox)`)}0&&(module.exports={BASE_TILE,CAMERA_BACKFACE_CULL_EPS,DEFAULT_CAMERA_STATE,DEFAULT_PROJECTION,LoopOnce,LoopPingPong,LoopRepeat,POLY_VOXEL_NEXT_LAYER_STEP,QUAT_IDENTITY,VOXEL_CAMERA_CULL_AXIS_EPS,VOXEL_CAMERA_CULL_NORMAL_LIMIT,arrowPolygons,axesHelperPolygons,bakeSolidTextureSampledPolygons,bakeSolidTextureSamples,boxPolygons,buildPolyVoxelFaceData,buildPolyVoxelSlicePlan,buildSceneContext,cameraCullNormalGroups,cameraCullNormalGroupsFromPolygons,cameraCullNormalKey,cameraCullVisibleSignature,cameraFacingDepth,clampChannel,computeSceneBbox,computeShapeLighting,computeTexturePaintMetrics,coverPlanarPolygons,createIsometricCamera,createPolyAnimationMixer,cullInteriorPolygons,dedupeOverlappingPolygons,eulerXYZFromQuat,findOverlappingPolygonDuplicates,formatColor,inverseRotateVec3,isAxisAlignedSurfaceNormal,isVoxelCameraCullableNormalGroups,loadMesh,mergePolygons,normalFacesCamera,normalizeInvertMultiplier,normalizePolygons,octahedronPolygons,optimizeMeshPolygons,parseColor,parseGltf,parseHexColor,parseMtl,parseObj,parsePureColor,parseRgbColor,parseVox,planePolygons,polygonCssSurfaceNormal,polygonFaces,polygonFacesCamera,quatFromAxisAngle,quatFromEulerXYZ,quatMultiply,ringPolygons,ringQuadPolygons,rotateVec3,shadeColor});