ldr 0.29.1 → 0.31.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 +18 -16
- package/dist/cli.js +107 -16
- package/dist/cull.d.ts +2 -1
- package/dist/index.js +71 -25
- package/dist/load-worker.gen.d.ts +1 -1
- package/dist/model.d.ts +17 -0
- package/dist/node/index.js +142 -33
- package/dist/node/library.d.ts +2 -1
- package/dist/node/resolver.d.ts +12 -1
- package/dist/parts-cdn.d.ts +2 -0
- package/dist/spec.d.ts +2 -0
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/spec.ts
|
|
2
2
|
var norm = (s) => s.trim().toLowerCase().replace(/\\/g, "/").replace(/\/+/g, "/");
|
|
3
3
|
var COLOUR_ID_RE = /^[A-Za-z][A-Za-z0-9_]*$/;
|
|
4
4
|
var namedCodes = new Map;
|
|
@@ -707,9 +707,35 @@ function fileStepViews(f) {
|
|
|
707
707
|
viewMemo.set(f, out);
|
|
708
708
|
return out;
|
|
709
709
|
}
|
|
710
|
-
// ../../../../../../../tmp/ldr-build-
|
|
710
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/model.ts
|
|
711
711
|
var CALLOUT_END = 999999;
|
|
712
712
|
var stepKey = (steps) => steps.map((x) => String(x).padStart(6, "0")).join(".") + "~";
|
|
713
|
+
var defLine = new WeakMap;
|
|
714
|
+
var wrapMemo = new WeakMap;
|
|
715
|
+
function scopeWrapper(part, scope) {
|
|
716
|
+
let w = wrapMemo.get(scope);
|
|
717
|
+
if (!w) {
|
|
718
|
+
const lines = [...scope.values()].map((d) => {
|
|
719
|
+
const t = defLine.get(d) ?? "";
|
|
720
|
+
const k = t.indexOf("!COLOUR");
|
|
721
|
+
return k < 0 ? "" : "0 " + t.slice(k).trim().replace(/\s+/g, " ");
|
|
722
|
+
}).filter(Boolean);
|
|
723
|
+
w = { head: lines.join(`
|
|
724
|
+
`), parts: new Map };
|
|
725
|
+
wrapMemo.set(scope, w);
|
|
726
|
+
}
|
|
727
|
+
let r = w.parts.get(part);
|
|
728
|
+
if (!r) {
|
|
729
|
+
const n = norm(part), source = `0 ldr: ${n} placed in a model's !COLOUR scope
|
|
730
|
+
0 BFC CERTIFY CCW
|
|
731
|
+
${w.head}
|
|
732
|
+
1 16 0 0 0 1 0 0 0 1 0 0 0 1 ${n}
|
|
733
|
+
`;
|
|
734
|
+
r = { name: `${n}#col-${hash32(source)}`, source };
|
|
735
|
+
w.parts.set(part, r);
|
|
736
|
+
}
|
|
737
|
+
return r;
|
|
738
|
+
}
|
|
713
739
|
function flatten(doc, opts = {}) {
|
|
714
740
|
const out = [];
|
|
715
741
|
const maxDepth = opts.maxDepth ?? 64;
|
|
@@ -754,7 +780,7 @@ function flatten(doc, opts = {}) {
|
|
|
754
780
|
const views = fileStepViews(f);
|
|
755
781
|
const ls = loose ? looseSteps(f) : [];
|
|
756
782
|
let li = 0;
|
|
757
|
-
const emit = (part, col, mm, sp, k, embedded, tex, cd) => {
|
|
783
|
+
const emit = (part, col, mm, sp, k, embedded, tex, cd, sc) => {
|
|
758
784
|
if (fixed)
|
|
759
785
|
sp = fixed;
|
|
760
786
|
const i = { part, color: col, m: mm, step: sp[0], steps: sp, localStep: k, path };
|
|
@@ -773,6 +799,10 @@ function flatten(doc, opts = {}) {
|
|
|
773
799
|
const w = texWrapper(part, tex);
|
|
774
800
|
i.texPart = w.name;
|
|
775
801
|
i.texSource = w.source;
|
|
802
|
+
} else if (sc) {
|
|
803
|
+
const w = scopeWrapper(part, sc);
|
|
804
|
+
i.colPart = w.name;
|
|
805
|
+
i.colSource = w.source;
|
|
776
806
|
}
|
|
777
807
|
const v = views[k];
|
|
778
808
|
if (v)
|
|
@@ -783,7 +813,7 @@ function flatten(doc, opts = {}) {
|
|
|
783
813
|
const flushLoose = (upTo) => {
|
|
784
814
|
while (li < ls.length && ls[li] <= upTo) {
|
|
785
815
|
const k = ls[li++];
|
|
786
|
-
emit(loosePartName(f.name, k), color, m, [...stepPath, k], k, false, null, colour).source = lazy(f, k);
|
|
816
|
+
emit(loosePartName(f.name, k), color, m, [...stepPath, k], k, false, null, colour, scope0).source = lazy(f, k);
|
|
787
817
|
}
|
|
788
818
|
};
|
|
789
819
|
for (const c0 of f.cmds) {
|
|
@@ -799,8 +829,10 @@ function flatten(doc, opts = {}) {
|
|
|
799
829
|
if (c.t === 0) {
|
|
800
830
|
if (c.meta === "!COLOUR") {
|
|
801
831
|
const def = parseColourLine(c.text);
|
|
802
|
-
if (def && def.code !== 16 && def.code !== 24)
|
|
832
|
+
if (def && def.code !== 16 && def.code !== 24) {
|
|
833
|
+
defLine.set(def, c.text);
|
|
803
834
|
(scope = new Map(scope ?? [])).set(def.code, def);
|
|
835
|
+
}
|
|
804
836
|
continue;
|
|
805
837
|
}
|
|
806
838
|
if (tx && c.geom?.t === 1)
|
|
@@ -821,7 +853,7 @@ function flatten(doc, opts = {}) {
|
|
|
821
853
|
sub(d, c.file, mm, col, sp, lt, cd);
|
|
822
854
|
continue;
|
|
823
855
|
}
|
|
824
|
-
emit(c.file, col, mm, sp, s, true, lt, cd);
|
|
856
|
+
emit(c.file, col, mm, sp, s, true, lt, cd, scope);
|
|
825
857
|
continue;
|
|
826
858
|
}
|
|
827
859
|
const ext = opts.resolveModel?.(c.file);
|
|
@@ -829,7 +861,7 @@ function flatten(doc, opts = {}) {
|
|
|
829
861
|
sub(ext, c.file, mm, col, sp, lt, cd);
|
|
830
862
|
continue;
|
|
831
863
|
}
|
|
832
|
-
emit(c.file, col, mm, sp, s, false, lt, cd);
|
|
864
|
+
emit(c.file, col, mm, sp, s, false, lt, cd, scope);
|
|
833
865
|
}
|
|
834
866
|
flushLoose(Infinity);
|
|
835
867
|
if (groups) {
|
|
@@ -1089,7 +1121,7 @@ function blendedColourHex(code) {
|
|
|
1089
1121
|
const a = LDRAW_EXE_16[code - 256 >> 4], b = LDRAW_EXE_16[code - 256 & 15];
|
|
1090
1122
|
return "#" + [0, 1, 2].map((k) => (a[k] + b[k] >> 1).toString(16).padStart(2, "0")).join("").toUpperCase();
|
|
1091
1123
|
}
|
|
1092
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1124
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/instructions.ts
|
|
1093
1125
|
var MIN_VIS = 0.5;
|
|
1094
1126
|
var REORIENT = 0.35;
|
|
1095
1127
|
var deg = Math.PI / 180;
|
|
@@ -1457,10 +1489,10 @@ function planStepViews(insts, parts, stepOf, nSteps, o = {}) {
|
|
|
1457
1489
|
}
|
|
1458
1490
|
};
|
|
1459
1491
|
}
|
|
1460
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1492
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/render.ts
|
|
1461
1493
|
import * as THREE from "three";
|
|
1462
1494
|
|
|
1463
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1495
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/pack-io.ts
|
|
1464
1496
|
import { decompress } from "fzstd";
|
|
1465
1497
|
async function decompressPack(data) {
|
|
1466
1498
|
const u = data instanceof Uint8Array ? data : new Uint8Array(data);
|
|
@@ -1483,7 +1515,7 @@ function decodePack(buf) {
|
|
|
1483
1515
|
return { header, arr, bytes: buf.byteLength, buffer: buf };
|
|
1484
1516
|
}
|
|
1485
1517
|
|
|
1486
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1518
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/cull.ts
|
|
1487
1519
|
var upright = (m, o = 0) => Math.abs(m[o + 7] - 1) < 0.001 && Math.abs(m[o + 4]) < 0.001 && Math.abs(m[o + 10]) < 0.001;
|
|
1488
1520
|
var prepCache = new WeakMap;
|
|
1489
1521
|
function prepPart(H, part) {
|
|
@@ -1623,8 +1655,21 @@ function forEachStud(insts, H, fn) {
|
|
|
1623
1655
|
}
|
|
1624
1656
|
}
|
|
1625
1657
|
}
|
|
1658
|
+
function seeThrough(H, c) {
|
|
1659
|
+
const g = H.colorTable?.[c];
|
|
1660
|
+
if (g)
|
|
1661
|
+
return (g.alpha ?? 255) < 255;
|
|
1662
|
+
return c.charCodeAt(0) === 35 && /\/[^:/]*:a\d/.test(c);
|
|
1663
|
+
}
|
|
1626
1664
|
function cullCore(insts, H, steps) {
|
|
1627
1665
|
const CELL = 40;
|
|
1666
|
+
const clear = new Map;
|
|
1667
|
+
const isClear = (c) => {
|
|
1668
|
+
let v = clear.get(c);
|
|
1669
|
+
if (v === undefined)
|
|
1670
|
+
clear.set(c, v = seeThrough(H, c));
|
|
1671
|
+
return v;
|
|
1672
|
+
};
|
|
1628
1673
|
const rx0 = [], rx1 = [], rz0 = [], rz1 = [], rInst = [], rPrep = [], rBx = [], rBz = [];
|
|
1629
1674
|
const cells = new Int3Table(insts.length * 2);
|
|
1630
1675
|
const nextE = [], rectE = [];
|
|
@@ -1632,7 +1677,7 @@ function cullCore(insts, H, steps) {
|
|
|
1632
1677
|
const it = insts[idx];
|
|
1633
1678
|
const m = it.m;
|
|
1634
1679
|
const p = H.parts[it.part];
|
|
1635
|
-
if (!p || !p.mask || !upright(m))
|
|
1680
|
+
if (!p || !p.mask || !upright(m) || isClear(it.color))
|
|
1636
1681
|
continue;
|
|
1637
1682
|
const b = p.bbox;
|
|
1638
1683
|
let x0 = Infinity, x1 = -Infinity, z0 = Infinity, z1 = -Infinity;
|
|
@@ -1758,7 +1803,7 @@ function cullCore(insts, H, steps) {
|
|
|
1758
1803
|
for (let idx = 0;idx < insts.length; idx++) {
|
|
1759
1804
|
const it = insts[idx];
|
|
1760
1805
|
const p = H.parts[it.part];
|
|
1761
|
-
if (!p || !p.under || !upright(it.m))
|
|
1806
|
+
if (!p || !p.under || !upright(it.m) || isClear(it.color))
|
|
1762
1807
|
continue;
|
|
1763
1808
|
const b = p.bbox;
|
|
1764
1809
|
const nx = Math.round((b[3] - b[0]) / 20), nz = Math.round((b[5] - b[2]) / 20);
|
|
@@ -1788,7 +1833,7 @@ function cullCore(insts, H, steps) {
|
|
|
1788
1833
|
return { nStuds, studHidden, studUp, underHidden, studsHidden, studHideStep, underHideStep };
|
|
1789
1834
|
}
|
|
1790
1835
|
function sceneInstances(instances, H, useTex) {
|
|
1791
|
-
const pick = (i) => useTex && i.texPart && H.parts[i.texPart] ? i.texPart : i.part;
|
|
1836
|
+
const pick = (i) => i.colPart && H.parts[i.colPart] ? i.colPart : useTex && i.texPart && H.parts[i.texPart] ? i.texPart : i.part;
|
|
1792
1837
|
const localColours = new Map;
|
|
1793
1838
|
const same = new Map;
|
|
1794
1839
|
const keyOf = (i) => {
|
|
@@ -1818,7 +1863,7 @@ function precomputeCull(instances, H, useTex = true) {
|
|
|
1818
1863
|
return cullCore(s.all, H, s.nSteps > 1 ? s.stepOf : undefined);
|
|
1819
1864
|
}
|
|
1820
1865
|
|
|
1821
|
-
// ../../../../../../../tmp/ldr-build-
|
|
1866
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/render.ts
|
|
1822
1867
|
async function loadPack(url) {
|
|
1823
1868
|
const res = await fetch(url);
|
|
1824
1869
|
if (!res.ok)
|
|
@@ -3672,7 +3717,7 @@ async function warmPackGeometry(pack, stop = () => false, sliceMs = 8) {
|
|
|
3672
3717
|
await new Promise((r) => setTimeout(r, 0));
|
|
3673
3718
|
}
|
|
3674
3719
|
}
|
|
3675
|
-
// ../../../../../../../tmp/ldr-build-
|
|
3720
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/scene.ts
|
|
3676
3721
|
import * as THREE2 from "three";
|
|
3677
3722
|
function ghostMaterial(side, g) {
|
|
3678
3723
|
const m = new THREE2.MeshStandardMaterial({ color: 16777215, roughness: 0.85, metalness: 0, side, transparent: false, depthWrite: true, opacity: g.opacity });
|
|
@@ -4016,10 +4061,10 @@ function createLdrObjectInner(instances, pack, options, progressive) {
|
|
|
4016
4061
|
return finish();
|
|
4017
4062
|
})();
|
|
4018
4063
|
}
|
|
4019
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4064
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/parts-cdn.ts
|
|
4020
4065
|
import { decompress as decompress2 } from "fzstd";
|
|
4021
4066
|
|
|
4022
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4067
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/embedded.ts
|
|
4023
4068
|
function splitFiles(text, fallback) {
|
|
4024
4069
|
const files = new Map;
|
|
4025
4070
|
let cur = null, saw = false;
|
|
@@ -4091,7 +4136,7 @@ function embeddedKeys(text, names, fallback = "main.ldr") {
|
|
|
4091
4136
|
return out;
|
|
4092
4137
|
}
|
|
4093
4138
|
|
|
4094
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4139
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/parts-cdn.ts
|
|
4095
4140
|
var DEFAULT_PARTS_CDN = "https://ldr-demo.vercel.app/cdn/v1/";
|
|
4096
4141
|
var indexCache = new Map;
|
|
4097
4142
|
var shardCache = new Map;
|
|
@@ -4220,11 +4265,12 @@ async function loadPartsOnce(names, o) {
|
|
|
4220
4265
|
};
|
|
4221
4266
|
await Promise.all(Array.from({ length: Math.min(o.concurrency ?? 24, groups.length) }, worker));
|
|
4222
4267
|
const shards = want.filter((n) => shardCache.has(cdn + n)).map((n) => shardCache.get(cdn + n));
|
|
4223
|
-
const
|
|
4268
|
+
const extra = { colors: idx.colors, ...idx.colorTable ? { colorTable: idx.colorTable } : {} };
|
|
4269
|
+
const pack = shards.length ? mergePacks(shards, extra) : decodePack(emptyPack(extra));
|
|
4224
4270
|
return { pack, missing, requests, bytes };
|
|
4225
4271
|
}
|
|
4226
|
-
function emptyPack(
|
|
4227
|
-
const h = new TextEncoder().encode(JSON.stringify({ version: 1, weld: true, parts: {}, studKinds: {},
|
|
4272
|
+
function emptyPack(extra) {
|
|
4273
|
+
const h = new TextEncoder().encode(JSON.stringify({ version: 1, weld: true, parts: {}, studKinds: {}, ...extra }));
|
|
4228
4274
|
const pad = (4 - (4 + h.length) % 4) % 4;
|
|
4229
4275
|
const b = new Uint8Array(4 + h.length + pad).fill(32);
|
|
4230
4276
|
new DataView(b.buffer).setUint32(0, h.length + pad, true);
|
|
@@ -4344,10 +4390,10 @@ async function prepareModel(source, o = {}) {
|
|
|
4344
4390
|
return { insts, pack, tier, missing, requests, bytes, cull, timings: { fetchModel: t1 - t0, parse: t2 - t1, parts: t3 - t2, ...cull ? { cull: performance.now() - t3 } : {} } };
|
|
4345
4391
|
}
|
|
4346
4392
|
|
|
4347
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4348
|
-
var load_worker_gen_default = 'var Ct=ArrayBuffer,q=Uint8Array,ge=Uint16Array,Tt=Int16Array;var de=Int32Array,Ee=function(e,t,n){if(q.prototype.slice)return q.prototype.slice.call(e,t,n);if(t==null||t<0)t=0;if(n==null||n>e.length)n=e.length;var r=new q(n-t);return r.set(e.subarray(t,n)),r},ce=function(e,t,n,r){if(q.prototype.fill)return q.prototype.fill.call(e,t,n,r);if(n==null||n<0)n=0;if(r==null||r>e.length)r=e.length;for(;n<r;++n)e[n]=t;return e},Lt=function(e,t,n,r){if(q.prototype.copyWithin)return q.prototype.copyWithin.call(e,t,n,r);if(n==null||n<0)n=0;if(r==null||r>e.length)r=e.length;while(n<r)e[t++]=e[n++]};var Et=["invalid zstd data","window size too large (>2046MB)","invalid block type","FSE accuracy too high","match distance too far back","unexpected EOF"],Y=function(e,t,n){var r=Error(t||Et[e]);if(r.code=e,Error.captureStackTrace)Error.captureStackTrace(r,Y);if(!n)throw r;return r},We=function(e,t,n){var r=0,s=0;for(;r<n;++r)s|=e[t++]<<(r<<3);return s},St=function(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0},Pt=function(e,t){var n=e[0]|e[1]<<8|e[2]<<16;if(n==3126568&&e[3]==253){var r=e[4],s=r>>5&1,o=r>>2&1,i=r&3,l=r>>6;if(r&8)Y(0);var u=6-s,c=i==3?4:i,f=We(e,u,c);u+=c;var a=l?1<<l:s,p=We(e,u,a)+(l==1&&256),d=p;if(!s){var x=1<<10+(e[5]>>3);d=x+(x>>3)*(e[5]&7)}if(d>2145386496)Y(1);var y=new q((t==1?p||d:t?0:d)+12);return y[0]=1,y[4]=4,y[8]=8,{b:u+a,y:0,l:0,d:f,w:t&&t!=1?t:y.subarray(12),e:d,o:new de(y.buffer,0,3),u:p,c:o,m:Math.min(131072,d)}}else if((n>>4|e[3]<<20)==25481893)return St(e,4)+8;Y(0)},re=function(e){var t=0;for(;1<<t<=e;++t);return t-1},ue=function(e,t,n){var r=(t<<3)+4,s=(e[t]&15)+5;if(s>n)Y(3);var o=1<<s,i=o,l=-1,u=-1,c=-1,f=o,a=new Ct(512+(o<<2)),p=new Tt(a,0,256),d=new ge(a,0,256),x=new ge(a,512,o),y=512+(o<<1),L=new q(a,y,o),h=new q(a,y+o);while(l<255&&i>0){var g=re(i+1),b=r>>3,C=(1<<g+1)-1,F=(e[b]|e[b+1]<<8|e[b+2]<<16)>>(r&7)&C,A=(1<<g)-1,E=C-i-1,T=F&A;if(T<E)r+=g,F=T;else if(r+=g+1,F>A)F-=E;if(p[++l]=--F,F==-1)i+=F,L[--f]=l;else i-=F;if(!F)do{var k=r>>3;u=(e[k]|e[k+1]<<8)>>(r&7)&3,r+=2,l+=u}while(u==3)}if(l>255||i)Y(0);var m=0,P=(o>>1)+(o>>3)+3,V=o-1;for(var N=0;N<=l;++N){var v=p[N];if(v<1){d[N]=-v;continue}for(c=0;c<v;++c){L[m]=N;do m=m+P&V;while(m>=f)}}if(m)Y(0);for(c=0;c<o;++c){var M=d[L[c]]++,I=h[c]=s-re(M);x[c]=(M<<I)-o}return[r+7>>3,{b:s,s:L,n:h,t:x}]},kt=function(e,t){var n=0,r=-1,s=new q(292),o=e[t],i=s.subarray(0,256),l=s.subarray(256,268),u=new ge(s.buffer,268);if(o<128){var c=ue(e,t+1,6),f=c[0],a=c[1];t+=o;var p=f<<3,d=e[t];if(!d)Y(0);var x=0,y=0,L=a.b,h=L,g=(++t<<3)-8+re(d);for(;;){if(g-=L,g<p)break;var b=g>>3;if(x+=(e[b]|e[b+1]<<8)>>(g&7)&(1<<L)-1,i[++r]=a.s[x],g-=h,g<p)break;b=g>>3,y+=(e[b]|e[b+1]<<8)>>(g&7)&(1<<h)-1,i[++r]=a.s[y],L=a.n[x],x=a.t[x],h=a.n[y],y=a.t[y]}if(++r>255)Y(0)}else{r=o-127;for(;n<r;n+=2){var C=e[++t];i[n]=C>>4,i[n+1]=C&15}++t}var F=0;for(n=0;n<r;++n){var A=i[n];if(A>11)Y(0);F+=A&&1<<A-1}var E=re(F)+1,T=1<<E,k=T-F;if(k&k-1)Y(0);i[r++]=re(k)+1;for(n=0;n<r;++n){var A=i[n];++l[i[n]=A&&E+1-A]}var m=new q(T<<1),P=m.subarray(0,T),V=m.subarray(T);u[E]=0;for(n=E;n>0;--n){var N=u[n];ce(V,n,N,u[n-1]=N+l[n]*(1<<E-n))}if(u[0]!=T)Y(0);for(n=0;n<r;++n){var v=i[n];if(v){var M=u[v];ce(P,n,M,u[v]=M+(1<<E-v))}}return[t,{n:V,b:E,s:P}]},It=ue(new q([81,16,99,140,49,198,24,99,12,33,196,24,99,102,102,134,70,146,4]),0,6)[1],Bt=ue(new q([33,20,196,24,99,140,33,132,16,66,8,33,132,16,66,8,33,68,68,68,68,68,68,68,68,36,9]),0,6)[1],Ft=ue(new q([32,132,16,66,102,70,68,68,68,68,36,73,2]),0,5)[1],Xe=function(e,t){var n=e.length,r=new de(n);for(var s=0;s<n;++s)r[s]=t,t+=1<<e[s];return r},Se=new q(new de([0,0,0,0,16843009,50528770,134678020,202050057,269422093]).buffer,0,36),Rt=Xe(Se,0),Pe=new q(new de([0,0,0,0,0,0,0,0,16843009,50528770,117769220,185207048,252579084,16]).buffer,0,53),Dt=Xe(Pe,3),le=function(e,t,n){var r=e.length,s=t.length,o=e[r-1],i=(1<<n.b)-1,l=-n.b;if(!o)Y(0);var u=0,c=n.b,f=(r<<3)-8+re(o)-c,a=-1;for(;f>l&&a<s;){var p=f>>3,d=(e[p]|e[p+1]<<8|e[p+2]<<16)>>(f&7);u=(u<<c|d)&i,t[++a]=n.s[u],f-=c=n.n[u]}if(f!=l||a+1!=s)Y(0)},Ut=function(e,t,n){var r=6,s=t.length,o=s+3>>2,i=o<<1,l=o+i;le(e.subarray(r,r+=e[0]|e[1]<<8),t.subarray(0,o),n),le(e.subarray(r,r+=e[2]|e[3]<<8),t.subarray(o,i),n),le(e.subarray(r,r+=e[4]|e[5]<<8),t.subarray(i,l),n),le(e.subarray(r),t.subarray(l),n)},Ot=function(e,t,n){var r,s=t.b,o=e[s],i=o>>1&3;t.l=o&1;var l=o>>3|e[s+1]<<5|e[s+2]<<13,u=(s+=3)+l;if(i==1){if(s>=e.length)return;if(t.b=s+1,n)return ce(n,e[s],t.y,t.y+=l),n;return ce(new q(l),e[s])}if(u>e.length)return;if(i==0){if(t.b=u,n)return n.set(e.subarray(s,u),t.y),t.y+=l,n;return Ee(e,s,u)}if(i==2){var c=e[s],f=c&3,a=c>>2&3,p=c>>4,d=0,x=0;if(f<2)if(a&1)p|=e[++s]<<4|(a&2&&e[++s]<<12);else p=c>>3;else if(x=a,a<2)p|=(e[++s]&63)<<4,d=e[s]>>6|e[++s]<<2;else if(a==2)p|=e[++s]<<4|(e[++s]&3)<<12,d=e[s]>>2|e[++s]<<6;else p|=e[++s]<<4|(e[++s]&63)<<12,d=e[s]>>6|e[++s]<<2|e[++s]<<10;++s;var y=n?n.subarray(t.y,t.y+t.m):new q(t.m),L=y.length-p;if(f==0)y.set(e.subarray(s,s+=p),L);else if(f==1)ce(y,e[s++],L);else{var h=t.h;if(f==2){var g=kt(e,s);d+=s-(s=g[0]),t.h=h=g[1]}else if(!h)Y(0);(x?Ut:le)(e.subarray(s,s+=d),y.subarray(L),h)}var b=e[s++];if(b){if(b==255)b=(e[s++]|e[s++]<<8)+32512;else if(b>127)b=b-128<<8|e[s++];var C=e[s++];if(C&3)Y(0);var F=[Bt,Ft,It];for(var A=2;A>-1;--A){var E=C>>(A<<1)+2&3;if(E==1){var T=new q([0,0,e[s++]]);F[A]={s:T.subarray(2,3),n:T.subarray(0,1),t:new ge(T.buffer,0,1),b:0}}else if(E==2)r=ue(e,s,9-(A&1)),s=r[0],F[A]=r[1];else if(E==3){if(!t.t)Y(0);F[A]=t.t[A]}}var k=t.t=F,m=k[0],P=k[1],V=k[2],N=e[u-1];if(!N)Y(0);var v=(u<<3)-8+re(N)-V.b,M=v>>3,I=0,K=(e[M]|e[M+1]<<8)>>(v&7)&(1<<V.b)-1;M=(v-=P.b)>>3;var B=(e[M]|e[M+1]<<8)>>(v&7)&(1<<P.b)-1;M=(v-=m.b)>>3;var z=(e[M]|e[M+1]<<8)>>(v&7)&(1<<m.b)-1;for(++b;--b;){var _=V.s[K],Z=V.n[K],X=m.s[z],S=m.n[z],w=P.s[B],R=P.n[B];M=(v-=w)>>3;var D=1<<w,U=D+((e[M]|e[M+1]<<8|e[M+2]<<16|e[M+3]<<24)>>>(v&7)&D-1);M=(v-=Pe[X])>>3;var G=Dt[X]+((e[M]|e[M+1]<<8|e[M+2]<<16)>>(v&7)&(1<<Pe[X])-1);M=(v-=Se[_])>>3;var j=Rt[_]+((e[M]|e[M+1]<<8|e[M+2]<<16)>>(v&7)&(1<<Se[_])-1);if(M=(v-=Z)>>3,K=V.t[K]+((e[M]|e[M+1]<<8)>>(v&7)&(1<<Z)-1),M=(v-=S)>>3,z=m.t[z]+((e[M]|e[M+1]<<8)>>(v&7)&(1<<S)-1),M=(v-=R)>>3,B=P.t[B]+((e[M]|e[M+1]<<8)>>(v&7)&(1<<R)-1),U>3)t.o[2]=t.o[1],t.o[1]=t.o[0],t.o[0]=U-=3;else{var H=U-(j!=0);if(H){if(U=H==3?t.o[0]-1:t.o[H],H>1)t.o[2]=t.o[1];t.o[1]=t.o[0],t.o[0]=U}else U=t.o[0]}for(var A=0;A<j;++A)y[I+A]=y[L+A];I+=j,L+=j;var O=I-U;if(O<0){var W=-O,J=t.e+O;if(W>G)W=G;for(var A=0;A<W;++A)y[I+A]=t.w[J+A];I+=W,G-=W,O=0}for(var A=0;A<G;++A)y[I+A]=y[O+A];I+=G}if(I!=L)while(L<y.length)y[I++]=y[L++];else I=y.length;if(n)t.y+=I;else y=Ee(y,0,I)}else if(n){if(t.y+=p,L)for(var A=0;A<p;++A)y[A]=y[L+A]}else if(L)y=Ee(y,L);return t.b=u,y}Y(2)},Nt=function(e,t){if(e.length==1)return e[0];var n=new q(t);for(var r=0,s=0;r<e.length;++r){var o=e[r];n.set(o,s),s+=o.length}return n};function be(e,t){var n=[],r=+!t,s=0,o=0;for(;e.length;){var i=Pt(e,r||t);if(typeof i=="object"){if(r){if(t=null,i.w.length==i.u)n.push(t=i.w),o+=i.u}else n.push(t),i.e=0;for(;!i.l;){var l=Ot(e,i,t);if(!l)Y(5);if(t)i.e=i.y;else n.push(l),o+=l.length,Lt(i.w,0,l.length),i.w.set(l,i.w.length-l.length)}s=i.b+i.c*4}else s=i;e=e.subarray(s)}return Nt(n,o)}async function zt(e){let t=e instanceof Uint8Array?e:new Uint8Array(e),n=(r)=>r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength);if(t[0]===40&&t[1]===181&&t[2]===47&&t[3]===253)return n(be(t));if(t[0]===31&&t[1]===139)return new Response(new Blob([t]).stream().pipeThrough(new DecompressionStream("gzip"))).arrayBuffer();return n(t)}async function Ze(e){return new TextDecoder().decode(await zt(e))}var qe=(e)=>decodeURIComponent(e.split(/[?#]/)[0].split("/").pop()||"main.ldr").replace(/\\.(zst|gz)$/i,"")||"main.ldr";function ye(e){let t=new DataView(e).getUint32(0,!0),n=JSON.parse(new TextDecoder().decode(new Uint8Array(e,4,t))),r=4+t;return{header:n,arr:(o)=>o&&(o[2]==="f32"?new Float32Array(e,r+o[0],o[1]):o[2]==="u16"?new Uint16Array(e,r+o[0],o[1]):o[2]==="u8"?new Uint8Array(e,r+o[0],o[1]):new Uint32Array(e,r+o[0],o[1])),bytes:e.byteLength,buffer:e}}var Q=(e)=>e.trim().toLowerCase().replace(/\\\\/g,"/").replace(/\\/+/g,"/"),Ie=/^[A-Za-z][A-Za-z0-9_]*$/,ke=new Map;function Be(e){let t=e.toLowerCase(),n=2166136261;for(let s=0;s<t.length;s++)n^=t.charCodeAt(s),n=Math.imul(n,16777619);let r=-1-(n>>>0&1073741823);if(!ke.has(r))ke.set(r,t);return r}function Fe(e){let t=e.charCodeAt(0)|32;if(t>=97&&t<=122&&Ie.test(e))return Be(e);if(/^0x/i.test(e))return parseInt(e,16);return+e}var Ye=/^~?\\s*moved\\s+to\\s+(.+)$/i,$t=new Set(["FILE","NOFILE","!DATA","!:","STEP","BFC","ROTSTEP","BUFEXCHG","!TEXMAP"]),ot=new Set(["part","subpart","primitive","8_primitive","48_primitive","shortcut","helper"]),jt=new Set(["model","submodel","configuration"]),Vt=/^(?:!?LDRAW_ORG|Unofficial|Official\\s+LCAD)\\s+(\\S+)/i;function Je(e){let t=Vt.exec(e);if(!t)return;let n=t[1].toLowerCase().replace(/^unofficial_/,"");return ot.has(n)||jt.has(n)?n:void 0}function _t(e){let t=[],n=0;while(n<e.length){while(e[n]===" "||e[n]==="\\t")n++;if(n>=e.length)break;if(e[n]===\'"\'){let r="";n++;while(n<e.length&&e[n]!==\'"\'){if(e[n]==="\\\\"&&n+1<e.length)n++;r+=e[n++]}n++,t.push(r)}else{let r=n;while(r<e.length&&e[r]!==" "&&e[r]!=="\\t")r++;t.push(e.slice(n,r)),n=r}}return t}function Ht(e,t=!1){let n=/^\\s*(\\S+)\\s+(.*)$/.exec(e);if(!n)return null;let r=n[1].toUpperCase(),s=r==="PLANAR"?9:r==="CYLINDRICAL"?10:r==="SPHERICAL"?11:0;if(!s)return null;let o=n[2].trim().split(/\\s+/);if(o.length<s+1)return null;let i=o.slice(0,s).map(Number);if(!i.every(Number.isFinite))return null;let l=n[2].trim();for(let a=0;a<s;a++)l=l.replace(/^\\S+\\s*/,"");let u=_t(l);if(!u.length)return null;let c={method:r,p1:i.slice(0,3),p2:i.slice(3,6),p3:i.slice(6,9),texture:u[0]};if(s>=10)c.a=i[9];if(s===11)c.b=i[10];let f=u.findIndex((a,p)=>p>0&&a.toUpperCase()==="GLOSSMAP");if(f>0&&u[f+1])c.glossmap=u[f+1];if(t)c.next=!0;return c}var Gt=(e)=>{let t=e.replace(/[^A-Za-z0-9+/]/g,""),n=t+"=".repeat((4-t.length%4)%4),r=atob(n),s=new Uint8Array(r.length);for(let o=0;o<r.length;o++)s[o]=r.charCodeAt(o);return s};function Kt(e){let t=e.length,n=1,r=(c)=>c===32||c===9,s=()=>{while(n<t&&r(e.charCodeAt(n)))n++;let c=n;while(n<t&&!r(e.charCodeAt(n)))n++;return c<n?e.slice(c,n):null},o=s();if(o===null)return null;let i=Array(12);for(let c=0;c<12;c++){let f=s();if(f===null)return null;i[c]=+f}while(n<t&&r(e.charCodeAt(n)))n++;if(n>=t)return null;let l=e.slice(n),u=/[ \\t]{2,}|\\t/.test(l)?l.split(/\\s+/).join(" "):l;return{t:1,color:Fe(o),m:i,file:Q(u)}}function Qe(e){let t=+e[0];if(!(t>=1&&t<=5)||e.length<2)return null;let n=Fe(e[1]),r=e.slice(2).map(Number);if(t===1)return{t:1,color:n,m:r.slice(0,12),file:Q(e.slice(14).join(" "))};if(t===2)return{t:2,color:n,p:r.slice(0,6)};if(t===3)return{t:3,color:n,p:r.slice(0,9)};if(t===4)return{t:4,color:n,p:r.slice(0,12)};return{t:5,color:n,p:r.slice(0,12)}}function it(e,t="main.ldr",n={}){let r=!!n.geometryText,s=new Map,o=null,i="",l,u=null,c=[],f=null,a=()=>{if(!u)return;let g=Gt(u.chunks.join("")),b=g[0]===137&&g[1]===80&&g[2]===78&&g[3]===71;(l??=new Map).set(Q(u.name),{name:u.name,bytes:g,...b?{mime:"image/png"}:{}}),u=null},p=!0,d=(g)=>{if(a(),o={name:Q(g),cmds:[]},s.set(o.name,o),!i)i=o.name;c=[],f=null,p=!0},x=!1,y=!1,L=()=>{if(y)return;y=!0,s.clear(),o=null,i=""},h=(g,b)=>{if(f){g.tex=f,f=null;return}let C=c[c.length-1];if(!C)return;if(C.fallback){if(!b)g.fallback=!0}else g.tex=C.map};for(let g of e.split(`\n`)){let b=g.trim();if(!b)continue;if(r&&b.charCodeAt(0)>=50&&b.charCodeAt(0)<=53&&(b.charCodeAt(1)===32||b.charCodeAt(1)===9)){if(u||x)continue;if(!o)d(t);let E=b.slice(2).trimStart(),T=E.search(/\\s/),k={t:b.charCodeAt(0)-48,color:Fe(T<0?E:E.slice(0,T)),p:[],src:b};h(k,!1),o.cmds.push(k),p=!1;continue}if(b.charCodeAt(0)===48&&(b.charCodeAt(1)===32||b.charCodeAt(1)===9)){let E=2;while(b.charCodeAt(E)===32||b.charCodeAt(E)===9)E++;let T=E;while(T<b.length&&b.charCodeAt(T)!==32&&b.charCodeAt(T)!==9)T++;let k=b.slice(E,T);if(!$t.has(k)){if(x||u)continue;if(!o)d(t);let m=b.slice(E),P={t:0,text:m};if(k.charCodeAt(0)===33)P.meta=k;if(f=null,p&&!o.org){let N=Je(m);if(N)o.org=N}let V=m.match(Ye);if(V&&!o.movedTo){let N=V[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(N))N+=".dat";o.movedTo=Q(N)}o.cmds.push(P);continue}}if(b.charCodeAt(0)===49&&(b.charCodeAt(1)===32||b.charCodeAt(1)===9)&&!u&&!x){let E=Kt(b);if(E){if(!o)d(t);h(E,!1),o.cmds.push(E),p=!1;continue}}let C=b.split(/\\s+/);if(+C[0]===0){let E=b.slice(1).trim();if(C[1]==="FILE"){L(),x=!1,d(E.slice(5));continue}if(C[1]==="NOFILE"){a(),o=null,x=!0;continue}if(C[1]==="!DATA"){L(),a(),o=null,x=!1,u={name:E.slice(5).trim(),chunks:[]};continue}if(x)continue;if(u){if(C[1]==="!:")u.chunks.push(C.slice(2).join(""));continue}if(!o)d(t);let T={t:0,text:E};if(C[1]==="STEP")T.step=!0,c=[],f=null;else if(C[1]==="BFC")T.bfc=C.slice(2).join(" ");else if(C[1]==="ROTSTEP")if(T.meta="ROTSTEP",T.step=!0,c=[],f=null,(C[2]??"").toUpperCase()==="END")T.rotstep={x:0,y:0,z:0,mode:"END"};else{let m=(C[5]??"REL").toUpperCase();T.rotstep={x:+C[2]||0,y:+C[3]||0,z:+C[4]||0,mode:["REL","ABS","ADD"].includes(m)?m:"REL"}}else if(C[1]==="BUFEXCHG"){T.meta="BUFEXCHG";let m=(C[2]??"").toUpperCase();T.bufexchg={op:m==="RETRIEVE"?"RETRIEVE":"STORE",buf:C[3]??"A"}}else if(C[1]?.startsWith("!"))T.meta=C[1];if(p&&!o.org){let m=Je(E);if(m)o.org=m}if(C[1]==="!TEXMAP"){let m=(C[2]??"").toUpperCase();if(f=null,m==="START"||m==="NEXT"){let P=Ht(E.replace(/^!TEXMAP\\s+\\S+/i,""),m==="NEXT");if(T.texmap={op:m,...P?{map:P}:{}},P)if((o.texmaps??=[]).push(P),m==="START")c.push({map:P,fallback:!1});else f=P}else if(m==="FALLBACK"){T.texmap={op:m};let P=c[c.length-1];if(P)P.fallback=!0}else if(m==="END")T.texmap={op:m},c.pop()}else if(C[1]==="!:"){f=null;let m=Qe(C.slice(2));if(m)h(m,!0),T.geom=m}else f=null;let k=E.match(Ye);if(k&&!o.movedTo){let m=k[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(m))m+=".dat";o.movedTo=Q(m)}o.cmds.push(T);continue}if(u||x)continue;if(!o)d(t);let A=Qe(C);if(!A)continue;h(A,!1),o.cmds.push(A),p=!1}return a(),l?{main:i,files:s,data:l}:{main:i,files:s}}var yn=Math.PI/180;function at(e,t){let n=(r)=>[t[3]*r[0]+t[4]*r[1]+t[5]*r[2]+t[0],t[6]*r[0]+t[7]*r[1]+t[8]*r[2]+t[1],t[9]*r[0]+t[10]*r[1]+t[11]*r[2]+t[2]];return{...e,p1:n(e.p1),p2:n(e.p2),p3:n(e.p3)}}function lt(e,t){let[n,r,s,o,i,l,u,c,f,a,p,d]=e,[x,y,L,h,g,b,C,F,A,E,T,k]=t;return[o*x+i*y+l*L+n,u*x+c*y+f*L+r,a*x+p*y+d*L+s,o*h+i*C+l*E,o*g+i*F+l*T,o*b+i*A+l*k,u*h+c*C+f*E,u*g+c*F+f*T,u*b+c*A+f*k,a*h+p*C+d*E,a*g+p*F+d*T,a*b+p*A+d*k]}var Re=[0,0,0,1,0,0,0,1,0,0,0,1];var et=new WeakMap,Wt=/^(s|8|48)\\//;function De(e,t){let n=e.files.get(Q(t));if(!n)return"part";let r=et.get(n);if(r)return r;if(n.org)r=ot.has(n.org)?"part":"model";else if(n.name===e.main)r="model";else r=n.cmds.some((s)=>s.t>=2||s.t===0&&!!s.geom||s.t===1&&Wt.test(s.file))?"part":"model";return et.set(n,r),r}var tt=new WeakMap;function ct(e){let t=tt.get(e);if(t)return t;t=[];let n=0;for(let r of e.cmds){if(r.t===0&&r.step){n++;continue}if((r.t>=2||r.t===0&&r.geom&&r.geom.t>=2)&&t[t.length-1]!==n)t.push(n)}return tt.set(e,t),t}var nt=(e)=>e>16777215?"0x"+e.toString(16).toUpperCase():e<0?ke.get(e)??String(e):String(e),Xt=(e)=>e.t===0?"0 "+e.text:e.t===1?`1 ${nt(e.color)} ${e.m.join(" ")} ${e.file}`:e.src?e.src:`${e.t} ${nt(e.color)} ${e.p.join(" ")}`,Ue=(e,t)=>`${Q(e)}#${t}`;function Zt(e,t){let n=[],r=0,s=(o)=>!!o&&o.t===0&&o.texmap?.op==="NEXT";for(let o of e.cmds){if(o.t===0){if(o.step){r++;continue}if(o.bfc!==void 0||o.meta==="!COLOUR"){n.push(o);continue}if(r!==t)continue;if(o.texmap)n.push(o);else if(o.geom){if(o.geom.t>=2)n.push(o);else if(s(n[n.length-1]))n.pop()}continue}if(r!==t)continue;if(o.t===1){if(s(n[n.length-1]))n.pop();continue}n.push(o)}return{name:Ue(e.name,t),cmds:n}}function ut(e,t){return[`0 ldr: own geometry of ${e.name}, step ${t}`,...Zt(e,t).cmds.map(Xt)].join(`\n`)+`\n`}function qt(e){let t=2166136261;for(let n=0;n<e.length;n++)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return(t>>>0).toString(16).padStart(8,"0")}function ft(e){let[t,n,r,s,o,i,l,u,c,f,a,p]=e,d=u*p-c*a,x=-(l*p-c*f),y=l*a-u*f,L=s*d+o*x+i*y;if(!Number.isFinite(L)||Math.abs(L)<0.000000000001)return null;let h=1/L,g=[d*h,-(o*p-i*a)*h,(o*c-i*u)*h,x*h,(s*p-i*f)*h,-(s*c-i*l)*h,y*h,-(s*a-o*f)*h,(s*u-o*l)*h];return[-(g[0]*t+g[1]*n+g[2]*r),-(g[3]*t+g[4]*n+g[5]*r),-(g[6]*t+g[7]*n+g[8]*r),...g]}var Yt=(e)=>String(+e.toFixed(6)||0),rt=(e)=>\'"\'+e.replace(/\\\\/g,"\\\\\\\\").replace(/"/g,"\\\\\\"")+\'"\';function pt(e,t){let n=[...t.p1,...t.p2,...t.p3,...t.method!=="PLANAR"?[t.a??360]:[],...t.method==="SPHERICAL"?[t.b??180]:[]].map(Yt).join(" "),r=`0 ldr: ${e} with a model-level !TEXMAP\n0 BFC CERTIFY CCW\n0 !TEXMAP START ${t.method} ${n} ${rt(t.texture)}${t.glossmap?" GLOSSMAP "+rt(t.glossmap):""}\n1 16 0 0 0 1 0 0 0 1 0 0 0 1 ${Q(e)}\n0 !TEXMAP END\n`;return{name:`${Q(e)}#tex-${qt(r)}`,source:r}}var Jt=(e,t)=>{let n=[,,,,,,,,,];for(let r=0;r<3;r++)for(let s=0;s<3;s++)n[r*3+s]=e[r*3]*t[s]+e[r*3+1]*t[3+s]+e[r*3+2]*t[6+s];return n};function Qt(e,t,n){let r=Math.PI/180,s=Math.sin(e*r),o=Math.cos(e*r),i=Math.sin(t*r),l=Math.cos(t*r),u=Math.sin(n*r),c=Math.cos(n*r);return[l*c,-l*u,i,o*u+s*i*c,o*c-s*i*u,-s*l,s*u-o*i*c,s*c+o*i*u,o*l]}var st=new WeakMap;function mt(e){let t=st.get(e);if(t)return t;let n=[],r=null;for(let s of e.cmds){if(s.t!==0||!s.step)continue;let o=s.rotstep;if(o)if(o.mode==="END")r=null;else{let i=Qt(o.x,o.y,o.z);r=o.mode==="ABS"?{abs:!0,m:i,rotstep:o}:o.mode==="ADD"&&r?{abs:r.abs,m:Jt(r.m,i),rotstep:o}:{abs:!1,m:i,rotstep:o}}n.push(r)}return n.push(r),st.set(e,n),n}var ht=999999,dt=(e)=>e.map((t)=>String(t).padStart(6,"0")).join(".")+"~";function en(e,t={}){let n=[],r=t.maxDepth??64,s=t.looseGeometry!==!1,o=!!t.textures,i=!!t.callouts,l=new Map,u=0,c=(a,p)=>{let d=a.name+"#"+p,x=l.get(d);if(!x){let y;x=Object.assign(()=>y??=ut(a,p),{file:a,step:p}),l.set(d,x)}return x},f=(a,p,d,x,y,L,h,g,b=null,C=[],F=[],A=void 0,E=null)=>{let T=a.files.get(p);if(!T||h>r)return;let k=E,m=0,P=h>0?++u:0,V=i&&P?[...C,P]:C,N=i&&P?[...F,d]:F,v=i&&!b?new Map:null,M=-1,I=0,K=(S,w,R,D,U,G,j)=>{if(M!==m)M=m,I=0;let H=v?.get(m+"|"+w);if(H)return H.n++,f(S,S===a?w:S.main,R,D,y+"/"+w,[...U,ht],h+1,G,[...U,ht],V,N,j,k);let O=[...U,I++],W=n.length;f(S,S===a?w:S.main,R,D,y+"/"+w,O,h+1,G,b,V,N,j,k),v?.set(m+"|"+w,{n:1,from:W,to:n.length})},B=mt(T),z=s?ct(T):[],_=0,Z=(S,w,R,D,U,G,j,H)=>{if(b)D=b;let O={part:S,color:w,m:R,step:D[0],steps:D,localStep:U,path:y};if(H)O.colour=H;if(P){if(O.sub=P,i)O.subPath=V,O.subMats=N}if(G)O.embedded=!0;if(j){let J=pt(S,j);O.texPart=J.name,O.texSource=J.source}let W=B[U];if(W)O.view=W;return n.push(O),O},X=(S)=>{while(_<z.length&&z[_]<=S){let w=z[_++];Z(Ue(T.name,w),x,d,[...L,w],w,!1,null,A).source=c(T,w)}};for(let S of T.cmds){if(S.t===0&&S.step){m++;continue}let w=S;if(w.t>=2||w.t===0&&w.geom&&w.geom.t>=2){X(m);continue}if(w.t===0){if(w.meta==="!COLOUR"){let J=nn(w.text);if(J&&J.code!==16&&J.code!==24)(k=new Map(k??[])).set(J.code,J);continue}if(o&&w.geom?.t===1)w=w.geom;else continue}if(w.t!==1)continue;if(o&&w.fallback)continue;let R=w.color===16?x:w.color,D=w.color===16?A:k?.get(w.color),U=lt(d,w.m),G=[...L,m],j=o?w.tex??g:null,H=j?ft(w.m):null,O=j&&H?at(j,H):null;if(a.files.has(w.file)){if(De(a,w.file)==="model"){K(a,w.file,U,R,G,O,D);continue}Z(w.file,R,U,G,m,!0,O,D);continue}let W=t.resolveModel?.(w.file);if(W){K(W,w.file,U,R,G,O,D);continue}Z(w.file,R,U,G,m,!1,O,D)}if(X(1/0),v){for(let S of v.values())if(S.n>1)for(let w=S.from;w<S.to;w++)n[w].mult??=S.n}};if(De(e,e.main)==="part"){if(e.files.get(e.main))n.push({part:e.main,color:16,m:[...Re],step:0,steps:[0],localStep:0,path:e.main,embedded:!0});return n}return f(e,e.main,Re,16,e.main,[],0,null),n}function bt(e,t="main.ldr",n){return en(it(e,t,{geometryText:!0}),n)}var tn=new Set(["CHROME","PEARLESCENT","RUBBER","MATTE_METALLIC","METAL","MATERIAL"]);function Oe(e){if(!e)return null;if(e.startsWith("#")&&/^#[0-9A-Fa-f]{6}$/.test(e))return e.toUpperCase();if(/^0x[0-9A-Fa-f]{6}$/i.test(e))return("#"+e.slice(2)).toUpperCase();return null}function gt(e,t){let n={value:"#FFFFFF",fraction:0.5};while(t<e.length){let r=e[t].toUpperCase(),s=e[t+1];if(r==="VALUE"){let o=Oe(s);if(o)n.value=o;t+=2}else if(r==="ALPHA")n.alpha=+s,t+=2;else if(r==="LUMINANCE")n.luminance=+s,t+=2;else if(r==="FRACTION")n.fraction=+s,t+=2;else if(r==="VFRACTION")n.vfraction=+s,t+=2;else if(r==="SIZE")n.size=+s,t+=2;else if(r==="MINSIZE")n.minsize=+s,t+=2;else if(r==="MAXSIZE")n.maxsize=+s,t+=2;else break}return{grain:n,next:t}}function nn(e){let t=e.indexOf("!COLOUR");if(t<0)return null;let n=e.slice(t+7).trim().split(/\\s+/).filter(Boolean);if(n.length<2)return null;let r=n[0],s=NaN,o="#FF00FF",i="#333333",l=255,u=0,c={type:"default"},f=1;while(f<n.length){let a=n[f].toUpperCase(),p=n[f+1];if(a==="CODE")s=p!==void 0&&Ie.test(p)?Be(p):p!==void 0&&/^\\d+$/.test(p)?+p:NaN,f+=2;else if(a==="VALUE"){let d=Oe(p);if(d)o=d;f+=2}else if(a==="EDGE")i=Oe(p)??p,f+=2;else if(a==="ALPHA")l=+p,f+=2;else if(a==="LUMINANCE")u=+p,f+=2;else if(a==="CHROME")c={type:"chrome"},f+=1;else if(a==="PEARLESCENT")c={type:"pearlescent"},f+=1;else if(a==="RUBBER")c={type:"rubber"},f+=1;else if(a==="MATTE_METALLIC")c={type:"matte_metallic"},f+=1;else if(a==="METAL")c={type:"metal"},f+=1;else if(a==="MATERIAL"){let d=(n[f+1]||"").toUpperCase();if(d==="GLITTER"){let{grain:x,next:y}=gt(n,f+2);c={type:"glitter",material:x},f=y}else if(d==="SPECKLE"){let{grain:x,next:y}=gt(n,f+2);c={type:"speckle",material:x},f=y}else if(d==="FABRIC"){let x=(n[f+2]||"").toUpperCase(),y=["VELVET","CANVAS","STRING","FUR"].includes(x)?x.toLowerCase():void 0;c={type:"fabric",kind:y},f+=y?3:2}else f=n.length}else if(tn.has(a))f+=1;else f+=1}if(Number.isNaN(s)||!o)return null;return{code:s,name:r,hex:o,edge:i,alpha:Number.isFinite(l)?l:255,luminance:Number.isFinite(u)?u:0,finish:c}}function rn(e){let t=Math.max(0,Math.min(1,(e.alpha??255)/255)),n=t<1,r=Math.max(0,Math.min(1,(e.luminance??0)/255)),s={opacity:t,transparent:n,depthWrite:!n,emissive:r,clearcoat:0,clearcoatRoughness:0,sheen:0,sheenRoughness:0};switch(e.finish?.type??"default"){case"chrome":return{...s,metalness:1,roughness:0,finish:"chrome"};case"pearlescent":return{...s,metalness:0.25,roughness:0.3,clearcoat:0.5,clearcoatRoughness:0.25,sheen:0.4,sheenRoughness:0.35,finish:"pearlescent"};case"rubber":return{...s,metalness:0,roughness:0.9,finish:"rubber"};case"matte_metallic":return{...s,metalness:0.4,roughness:0.8,finish:"matte_metallic"};case"metal":return{...s,metalness:0.85,roughness:0.2,finish:"metal"};case"glitter":{let i=e.finish.material,l=i.size??(i.minsize!=null&&i.maxsize!=null?(i.minsize+i.maxsize)/2:1);return{...s,metalness:0.35,roughness:0.25,clearcoat:1,clearcoatRoughness:0.08,particleHex:i.value,particleFraction:i.fraction,particleSize:l,finish:"glitter"}}case"speckle":{let i=e.finish.material,l=i.size??(i.minsize!=null&&i.maxsize!=null?(i.minsize+i.maxsize)/2:1);return{...s,metalness:0.2,roughness:0.55,particleHex:i.value,particleFraction:i.fraction,particleSize:l,finish:"speckle"}}case"fabric":return{...s,metalness:0,roughness:0.85,sheen:0.65,sheenRoughness:0.75,finish:"fabric"};default:return{...s,metalness:0,roughness:0.45,finish:"default"}}}function Ne(e){let t=rn(e),n=!t.transparent?"op":t.opacity>=0.75?"a200":t.opacity>=0.4?"a128":`a${Math.round(t.opacity*255)}`,r=t.emissive>0?`L${Math.round(t.emissive*16)}`:"",s=`${t.finish}:${n}${r}`;if(t.particleHex)s+=`:${t.particleHex}:${(t.particleFraction??0).toFixed(2)}`;return s}function sn(e,t){let n=new Map,r=null,s=!1;for(let o of e.split(/\\r?\\n/)){let i=/^\\s*0\\s+FILE\\s+(.+)$/i.exec(o);if(i){if(!s)n.clear();s=!0,r=[],n.set(Q(i[1]),r);continue}if(/^\\s*0\\s+(NOFILE|!DATA)(\\s|$)/i.test(o)){if(!s)n.clear();s=!0,r=null;continue}if(!r){if(s)continue;r=[],n.set(Q(t),r)}let l=o.trim().replace(/\\s+/g," ");if(l)r.push(l)}return n}var on=(e)=>{if(!e.startsWith("1 "))return null;let t=e.split(" ");return t.length>=15?Q(t.slice(14).join(" ")):null};function an(e){let t=2166136261,n=1523705862;for(let r=0;r<e.length;r++){let s=e.charCodeAt(r);t=Math.imul(t^s,16777619),n=Math.imul(n^s,16777629)^n>>>15}return(t>>>0).toString(16).padStart(8,"0")+(n>>>0).toString(16).padStart(8,"0")}function yt(e,t,n="main.ldr"){let r=sn(e,n),s=new Map;for(let o of t){let i=Q(o);if(!r.has(i)||s.has(i))continue;let l=new Set([i]),u=[i];while(u.length)for(let f of r.get(u.pop())){let a=on(f);if(a&&r.has(a)&&!l.has(a))l.add(a),u.push(a)}let c=[i,...[...l].filter((f)=>f!==i).sort()].map((f)=>"0 FILE "+(f===i?"":f)+`\n`+r.get(f).join(`\n`)).join(`\n`);s.set(i,`emb/${an(c)}.dat`)}return s}var xt=(e,t=0)=>Math.abs(e[t+7]-1)<0.001&&Math.abs(e[t+4])<0.001&&Math.abs(e[t+10])<0.001,wt=new WeakMap;function ze(e,t){let n=wt.get(e);if(!n)wt.set(e,n=new Map);let r=n.get(t);if(r!==void 0)return r;let s=e.parts[t];if(!s)return n.set(t,null),null;let o=s.studs.length,i=new Float64Array(o*12),l=[],u=[];s.studs.forEach((p,d)=>{l.push(p[0]),u.push(p[1]);for(let x=0;x<12;x++)i[d*12+x]=p[2+x]});let c=null,f=0,a=0;if(s.mask){f=s.mask[0],a=s.mask[1];let p=s.mask[2];c=new Uint8Array(p.length);for(let d=0;d<p.length;d++)c[d]=p.charCodeAt(d)===49?1:0}return n.set(t,r={nStuds:o,studM:i,kind:l,color:u,mask:c,nx:f,nz:a}),r}var ie=1073741824;class $e{a;b;c;vals;used;mask;size=0;constructor(e=1024){let t=1024;while(t<e*2)t*=2;this.a=new Int32Array(t),this.b=new Int32Array(t),this.c=new Int32Array(t),this.vals=new Int32Array(t),this.used=new Uint8Array(t),this.mask=t-1}slot(e,t,n){let r=Math.imul(e,2654435761)^Math.imul(t,2246822507)^Math.imul(n,3266489909);return r^=r>>>15,r=Math.imul(r,739982445),r^=r>>>12,r&this.mask}get(e,t,n){let r=this.slot(e,t,n),s=this.used,o=this.a,i=this.b,l=this.c;for(;;){if(!s[r])return-1;if(o[r]===e&&i[r]===t&&l[r]===n)return this.vals[r];r=r+1&this.mask}}put(e,t,n,r){if((this.size+1)*2>this.used.length)this.grow();let s=this.slot(e,t,n),o=this.used,i=this.a,l=this.b,u=this.c;for(;;){if(!o[s])return o[s]=1,i[s]=e,l[s]=t,u[s]=n,this.vals[s]=r,this.size++,-1;if(i[s]===e&&l[s]===t&&u[s]===n){let c=this.vals[s];return this.vals[s]=r,c}s=s+1&this.mask}}grow(){let{a:e,b:t,c:n,vals:r,used:s}=this,o=s.length*2;this.a=new Int32Array(o),this.b=new Int32Array(o),this.c=new Int32Array(o),this.vals=new Int32Array(o),this.used=new Uint8Array(o),this.mask=o-1,this.size=0;for(let i=0;i<s.length;i++)if(s[i])this.put(e[i],t[i],n[i],r[i])}}var xe=(e,t,n)=>e>-ie&&e<ie&&t>-ie&&t<ie&&n>-ie&&n<ie,fe=2147483647;function ln(e,t,n){let s=[],o=[],i=[],l=[],u=[],c=[],f=[],a=[],p=new $e(e.length*2),d=[],x=[];for(let v=0;v<e.length;v++){let M=e[v],I=M.m,K=t.parts[M.part];if(!K||!K.mask||!xt(I))continue;let B=K.bbox,z=1/0,_=-1/0,Z=1/0,X=-1/0;for(let R=0;R<2;R++)for(let D=0;D<2;D++){let U=R?B[3]:B[0],G=D?B[5]:B[2],j=I[0]+I[3]*U+I[5]*G,H=I[2]+I[9]*U+I[11]*G;if(j<z)z=j;if(j>_)_=j;if(H<Z)Z=H;if(H>X)X=H}let S=u.length;s.push(z),o.push(_),i.push(Z),l.push(X),u.push(v),c.push(ze(t,M.part)),f.push(B[0]),a.push(B[2]);let w=Math.round((I[1]+B[4])*2);for(let R=Math.floor(z/40);R<=Math.floor(_/40);R++)for(let D=Math.floor(Z/40);D<=Math.floor(X/40);D++){if(!xe(w,R,D))continue;let U=x.length;x.push(S),d.push(p.put(w,R,D,U))}}let y=[0,5,-5,5,-5],L=[0,5,5,-5,-5],h=NaN,g=NaN,b=NaN,C=-1,F=(v,M,I,K)=>{let B=Math.round(M*2),z=Math.floor(v/40),_=Math.floor(I/40);if(!xe(B,z,_))return fe;let Z=fe;if(B!==h||z!==g||_!==b)h=B,g=z,b=_,C=p.get(B,z,_);for(let X=C;X>=0;X=d[X]){let S=x[X];if(u[S]===K||!(v-6>=s[S]-0.5&&v+6<=o[S]+0.5&&I-6>=i[S]-0.5&&I+6<=l[S]+0.5))continue;let w=e[u[S]].m,R=c[S],D=f[S],U=a[S],G=v-w[0],j=M-w[1],H=I-w[2],O=w[3]*G+w[6]*j+w[9]*H,W=w[5]*G+w[8]*j+w[11]*H,{nx:J,nz:se,mask:ae}=R,oe=!0;for(let ee=0;ee<5;ee++){let te=Math.floor((O+y[ee]-D)/20),ne=Math.floor((W+L[ee]-U)/20);if(te<0||ne<0||te>=J||ne>=se||ae[te*se+ne]!==1){oe=!1;break}}if(oe){if(!n)return 0;let ee=n[u[S]];if(ee<Z)Z=ee}}return Z},A=0;for(let v of e){let M=ze(t,v.part);if(M)A+=M.nStuds}let E=new Uint8Array(A),T=new Uint8Array(A),k=new $e(A),m=0,P=n?new Int32Array(A).fill(fe):void 0;for(let v=0,M=0;v<e.length;v++){let I=e[v],K=ze(t,I.part);if(!K)continue;let B=I.m,z=K.studM,_=B[0],Z=B[1],X=B[2],S=B[3],w=B[4],R=B[5],D=B[6],U=B[7],G=B[8],j=B[9],H=B[10],O=B[11];for(let W=0;W<K.nStuds;W++,M++){let J=W*12,se=z[J+4],ae=z[J+7],oe=z[J+10];if(!(Math.abs(D*se+U*ae+G*oe-1)<0.001&&Math.abs(S*se+w*ae+R*oe)<0.001&&Math.abs(j*se+H*ae+O*oe)<0.001))continue;T[M]=1;let ee=z[J],te=z[J+1],ne=z[J+2],je=_+S*ee+w*te+R*ne,Ve=Z+D*ee+U*te+G*ne,_e=X+j*ee+H*te+O*ne,He=F(je,Ve,_e,v);if(He!==fe){if(E[M]=1,m++,P)P[M]=He}let pe=Math.round(je),me=Math.round(Ve),he=Math.round(_e);if(!xe(pe,me,he))continue;if(!n){k.put(pe,me,he,1);continue}let Ge=n[v],Ke=k.get(pe,me,he);if(Ke<0||Ge<Ke)k.put(pe,me,he,Ge)}}let V=new Uint8Array(e.length),N=n?new Int32Array(e.length).fill(fe):void 0;for(let v=0;v<e.length;v++){let M=e[v],I=t.parts[M.part];if(!I||!I.under||!xt(M.m))continue;let K=I.bbox,B=Math.round((K[3]-K[0])/20),z=Math.round((K[5]-K[2])/20);if(!B||!z||B*z>4096)continue;let _=M.m,Z=!0,X=0;for(let S=0;S<B&&Z;S++)for(let w=0;w<z;w++){let R=K[0]+10+20*S,D=K[2]+10+20*w,U=_[0]+_[3]*R+_[5]*D,G=_[2]+_[9]*R+_[11]*D,j=Math.round(U),H=Math.round(_[1]+K[4]),O=Math.round(G),W=xe(j,H,O)?k.get(j,H,O):-1;if(W<0){Z=!1;break}if(W>X)X=W}if(Z){if(V[v]=1,N)N[v]=X}}return{nStuds:A,studHidden:E,studUp:T,underHidden:V,studsHidden:m,studHideStep:P,underHideStep:N}}function cn(e,t,n){let r=(a)=>n&&a.texPart&&t.parts[a.texPart]?a.texPart:a.part,s=new Map,o=new Map,i=(a)=>{let p=a.colour;if(!p)return String(a.color);let d=o.get(p);if(d!==void 0)return d;let x=t.colorTable?.[a.color],y=x?.hex??t.colors?.[a.color],L=x?Ne({alpha:x.alpha??255,luminance:x.luminance??0,finish:x.finish??{type:"default"}}):"default:op",h=Ne(p);if(d=y&&y.toUpperCase()===p.hex.toUpperCase()&&L===h?String(a.color):p.hex.toUpperCase()+"/"+h,d!==String(a.color))s.set(d,p);return o.set(p,d),d},l=e.map((a)=>({part:r(a),color:i(a),m:a.m,steps:a.steps})),u=l.map((a)=>dt(a.steps)),c=[...new Set(u)].sort(),f=new Map(c.map((a,p)=>[a,p]));return{all:l,stepOf:u.map((a)=>f.get(a)),nSteps:c.length,localColours:s}}function we(e,t,n=!0){let r=cn(e,t,n);return ln(r.all,t,r.nSteps>1?r.stepOf:void 0)}var Te="https://ldr-demo.vercel.app/cdn/v1/",Me=new Map,Ae=new Map;function ve(e=Te,t=fetch){let n=Me.get(e);if(!n)n=t(e+"parts.json").then((r)=>{if(!r.ok)throw Error(`ldr: parts CDN index ${r.status} (${e}parts.json)`);return r.json()}),n.catch(()=>Me.delete(e)),Me.set(e,n);return n}var un=(e)=>Array.isArray(e)&&e.length===3&&typeof e[0]==="number"&&typeof e[1]==="number"&&(e[2]==="f32"||e[2]==="u16"||e[2]==="u8"||e[2]==="u32"),Ce=(e,t)=>un(e)?[e[0]+t,e[1],e[2]]:Array.isArray(e)?e.map((n)=>Ce(n,t)):e&&typeof e==="object"?Object.fromEntries(Object.entries(e).map(([n,r])=>[n,Ce(r,t)])):e;function fn(e,t={}){let n=[],r=0,s={},o={};for(let p of e){let d=p.buffer;if(!d)throw Error("ldr: mergePacks needs packs from decodePack/loadPack");let x=new DataView(d).getUint32(0,!0),y=new Uint8Array(d,4+x),L=r;n.push(y),r+=y.byteLength;let h=(4-r%4)%4;if(h)n.push(new Uint8Array(h)),r+=h;for(let[g,b]of Object.entries(p.header.parts??{}))if(!(g in s))s[g]=Ce(b,L);for(let[g,b]of Object.entries(p.header.studKinds??{}))if(!(g in o))o[g]=Ce(b,L)}let i=e[0]?.header??{version:1,weld:!0},l=new TextEncoder().encode(JSON.stringify({...i,parts:s,studKinds:o,...t})),u=(4-(4+l.length)%4)%4,c=4+l.length+u,f=new Uint8Array(c+r);new DataView(f.buffer).setUint32(0,l.length+u,!0),f.set(l,4),f.fill(32,4+l.length,c);let a=c;for(let p of n)f.set(p,a),a+=p.byteLength;return ye(f.buffer)}async function pn(e,t={}){e=[...e];try{return await At(e,t)}catch(n){let r=t.cdn??Te,s=t.fetch??fetch;Me.delete(r);let o=(i,l)=>s(i,{...l,cache:"reload"});try{return await At(e,{...t,fetch:o})}catch{throw n}}}async function At(e,t){let n=t.cdn??Te,r=t.fetch??fetch,s=t.gap??16384,o=await ve(n,r),i=[...new Set([...e].map(Q))],l=[],u=[];for(let h of i){if(Ae.has(n+h))continue;let g=o.parts[h];if(g)u.push({name:h,off:g[0],len:g[1],file:g[2]??0});else l.push(h)}u.sort((h,g)=>h.file-g.file||h.off-g.off);let c=[];for(let h of u){let g=c[c.length-1];if(g&&g.file===h.file&&h.off-g.end<=s)g.end=Math.max(g.end,h.off+h.len),g.items.push(h);else c.push({file:h.file,start:h.off,end:h.off+h.len,items:[h]})}let f=0,a=0,p=0,d=new Map,x=async()=>{while(p<c.length){let h=c[p++],g=d.get(h.file);if(g)g=g.subarray(h.start,h.end);else{let b=await r(new URL(o.archives[h.file],n).href,{headers:{Range:`bytes=${h.start}-${h.end-1}`,"Accept-Encoding":"identity"}});if(!b.ok)throw Error(`ldr: parts CDN ${b.status}`);if(a++,g=new Uint8Array(await b.arrayBuffer()),f+=g.byteLength,b.status===200)d.set(h.file,g),g=g.subarray(h.start,h.end)}for(let b of h.items){let C=be(g.subarray(b.off-h.start,b.off-h.start+b.len)),F=C.buffer.slice(C.byteOffset,C.byteOffset+C.byteLength);Ae.set(n+b.name,ye(F))}}};await Promise.all(Array.from({length:Math.min(t.concurrency??24,c.length)},x));let y=i.filter((h)=>Ae.has(n+h)).map((h)=>Ae.get(n+h));return{pack:y.length?fn(y,{colors:o.colors}):ye(mn(o.colors)),missing:l,requests:a,bytes:f}}function mn(e){let t=new TextEncoder().encode(JSON.stringify({version:1,weld:!0,parts:{},studKinds:{},colors:e})),n=(4-(4+t.length)%4)%4,r=new Uint8Array(4+t.length+n).fill(32);return new DataView(r.buffer).setUint32(0,t.length+n,!0),r.set(t,4),r.buffer}function hn(e,t){let n=t.header.parts;if(!n)return 0;let r=0;for(let s of e){let o=n[s.part]?.body?.tris;if(o)r+=o}return r}function Mt(e,t,n){let r=0,s=0,o=!1,i=new Set;for(let l of e){let u=l.embedded?t.get(l.part):Q(l.part),c=u?n.parts[u]:void 0;if(!c)continue;if(c[3]!=null)o=!0,r+=c[3];if(!i.has(u))i.add(u),s+=c[1]}return{bodyTris:r,packBytes:s,known:o}}class Le extends Error{code="ldr-budget";bodyTris;packBytes;maxBodyTris;maxPackBytes;constructor(e){let t=[e.maxBodyTris!=null&&e.bodyTris>e.maxBodyTris?`${e.bodyTris} triangles (limit ${e.maxBodyTris})`:"",e.maxPackBytes!=null&&e.packBytes>e.maxPackBytes?`${(e.packBytes/1e6).toFixed(1)} MB parts pack (limit ${(e.maxPackBytes/1e6).toFixed(0)} MB)`:""].filter(Boolean).join(", ");super(`ldr: model exceeds device budget: ${t}`);this.name="BudgetError",this.bodyTris=e.bodyTris,this.packBytes=e.packBytes,this.maxBodyTris=e.maxBodyTris,this.maxPackBytes=e.maxPackBytes}}async function vt(e,t={}){let n=performance.now(),r=t.fetch??fetch,s=ve(t.cdn??Te,r);s.catch(()=>{});let o=t.text?e:await r(e).then(async(m)=>{if(!m.ok)throw Error(`ldr: ${m.status} fetching ${e}`);return Ze(await m.arrayBuffer())}),i=performance.now(),l=t.name??(t.text?"main.ldr":qe(e)),u=bt(o,l,{looseGeometry:!1,callouts:t.callouts}),c=performance.now();t.onParsed?.(u),await s;let f=yt(o,new Set(u.filter((m)=>m.embedded).map((m)=>m.part)),l),a=(m,P)=>t.maxBodyTris!=null&&m>t.maxBodyTris||t.maxPackBytes!=null&&P>t.maxPackBytes,p=t.maxBodyTris!=null||t.maxPackBytes!=null,d=(m)=>new Le({...m,maxBodyTris:t.maxBodyTris,maxPackBytes:t.maxPackBytes}),x="full";if(p){let m=Mt(u,f,await s);if(a(m.known?m.bodyTris:0,m.packBytes)){if(!t.lowCdn)throw d(m);let P=await ve(t.lowCdn,r).catch(()=>null);if(!P)throw d(m);let V=Mt(u,f,P);if(a(V.known?V.bodyTris:0,V.packBytes))throw d(V);x="low"}}let y=[...u.filter((m)=>!m.embedded).map((m)=>m.part),...f.values()],L=async()=>{let m=await pn(y,x==="low"?{...t,cdn:t.lowCdn}:t);for(let[P,V]of f){let N=m.pack.header.parts[V];if(N)m.pack.header.parts[P]=N}return{...m,packBytes:m.pack.buffer?.byteLength??m.pack.bytes??0,bodyTris:hn(u,m.pack)}},h=await L();if(p&&a(h.bodyTris,h.packBytes)&&x==="full"&&t.lowCdn&&await ve(t.lowCdn,r).then(()=>!0,()=>!1)){x="low";let m=h;h=await L(),h.requests+=m.requests,h.bytes+=m.bytes}if(p&&a(h.bodyTris,h.packBytes))throw d(h);let{pack:g,missing:b,requests:C,bytes:F}=h,A=new Map([...f].map(([m,P])=>[P,m])),E=b.map((m)=>A.get(m)??m),T=performance.now(),k=t.cull?we(u,g.header,t.textures!==!1):void 0;return{insts:u,pack:g,tier:x,missing:E,requests:C,bytes:F,cull:k,timings:{fetchModel:i-n,parse:c-i,parts:T-c,...k?{cull:performance.now()-T}:{}}}}self.onmessage=async(e)=>{let{id:t,source:n,opts:r}=e.data;try{let s=await vt(n,{...r,cull:!1,onParsed:(f)=>self.postMessage({id:t,insts:f})}),o=s.pack.buffer;if(self.postMessage({id:t,buffer:o,tier:s.tier,missing:s.missing,requests:s.requests,bytes:s.bytes,timings:s.timings},[o]),!r.cull)return;let i=performance.now(),l=we(s.insts,s.pack.header,r.textures!==!1),u=performance.now()-i,c=[];for(let f of[l.studHidden,l.studUp,l.underHidden,l.studHideStep,l.underHideStep])if(f)c.push(f.buffer);self.postMessage({id:t,cull:l,ms:u},c)}catch(s){if(s instanceof Le||s?.code==="ldr-budget")self.postMessage({id:t,phase:"error",error:String(s?.message??s),budget:{bodyTris:s.bodyTris,packBytes:s.packBytes,maxBodyTris:s.maxBodyTris,maxPackBytes:s.maxPackBytes}});else self.postMessage({id:t,phase:"error",error:String(s?.message??s)})}};\n';
|
|
4393
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/load-worker.gen.ts
|
|
4394
|
+
var load_worker_gen_default = 'var Pt=ArrayBuffer,Y=Uint8Array,be=Uint16Array,kt=Int16Array;var ye=Int32Array,Pe=function(e,t,n){if(Y.prototype.slice)return Y.prototype.slice.call(e,t,n);if(t==null||t<0)t=0;if(n==null||n>e.length)n=e.length;var r=new Y(n-t);return r.set(e.subarray(t,n)),r},fe=function(e,t,n,r){if(Y.prototype.fill)return Y.prototype.fill.call(e,t,n,r);if(n==null||n<0)n=0;if(r==null||r>e.length)r=e.length;for(;n<r;++n)e[n]=t;return e},It=function(e,t,n,r){if(Y.prototype.copyWithin)return Y.prototype.copyWithin.call(e,t,n,r);if(n==null||n<0)n=0;if(r==null||r>e.length)r=e.length;while(n<r)e[t++]=e[n++]};var Rt=["invalid zstd data","window size too large (>2046MB)","invalid block type","FSE accuracy too high","match distance too far back","unexpected EOF"],q=function(e,t,n){var r=Error(t||Rt[e]);if(r.code=e,Error.captureStackTrace)Error.captureStackTrace(r,q);if(!n)throw r;return r},Ye=function(e,t,n){var r=0,s=0;for(;r<n;++r)s|=e[t++]<<(r<<3);return s},Bt=function(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0},Ft=function(e,t){var n=e[0]|e[1]<<8|e[2]<<16;if(n==3126568&&e[3]==253){var r=e[4],s=r>>5&1,o=r>>2&1,i=r&3,l=r>>6;if(r&8)q(0);var f=6-s,c=i==3?4:i,u=Ye(e,f,c);f+=c;var a=l?1<<l:s,p=Ye(e,f,a)+(l==1&&256),d=p;if(!s){var y=1<<10+(e[5]>>3);d=y+(y>>3)*(e[5]&7)}if(d>2145386496)q(1);var b=new Y((t==1?p||d:t?0:d)+12);return b[0]=1,b[4]=4,b[8]=8,{b:f+a,y:0,l:0,d:u,w:t&&t!=1?t:b.subarray(12),e:d,o:new ye(b.buffer,0,3),u:p,c:o,m:Math.min(131072,d)}}else if((n>>4|e[3]<<20)==25481893)return Bt(e,4)+8;q(0)},oe=function(e){var t=0;for(;1<<t<=e;++t);return t-1},pe=function(e,t,n){var r=(t<<3)+4,s=(e[t]&15)+5;if(s>n)q(3);var o=1<<s,i=o,l=-1,f=-1,c=-1,u=o,a=new Pt(512+(o<<2)),p=new kt(a,0,256),d=new be(a,0,256),y=new be(a,512,o),b=512+(o<<1),C=new Y(a,b,o),v=new Y(a,b+o);while(l<255&&i>0){var m=oe(i+1),g=r>>3,w=(1<<m+1)-1,F=(e[g]|e[g+1]<<8|e[g+2]<<16)>>(r&7)&w,A=(1<<m)-1,T=w-i-1,M=F&A;if(M<T)r+=m,F=M;else if(r+=m+1,F>A)F-=T;if(p[++l]=--F,F==-1)i+=F,C[--u]=l;else i-=F;if(!F)do{var k=r>>3;f=(e[k]|e[k+1]<<8)>>(r&7)&3,r+=2,l+=f}while(f==3)}if(l>255||i)q(0);var h=0,S=(o>>1)+(o>>3)+3,_=o-1;for(var j=0;j<=l;++j){var D=p[j];if(D<1){d[j]=-D;continue}for(c=0;c<D;++c){C[h]=j;do h=h+S&_;while(h>=u)}}if(h)q(0);for(c=0;c<o;++c){var E=d[C[c]]++,L=v[c]=s-oe(E);y[c]=(E<<L)-o}return[r+7>>3,{b:s,s:C,n:v,t:y}]},Dt=function(e,t){var n=0,r=-1,s=new Y(292),o=e[t],i=s.subarray(0,256),l=s.subarray(256,268),f=new be(s.buffer,268);if(o<128){var c=pe(e,t+1,6),u=c[0],a=c[1];t+=o;var p=u<<3,d=e[t];if(!d)q(0);var y=0,b=0,C=a.b,v=C,m=(++t<<3)-8+oe(d);for(;;){if(m-=C,m<p)break;var g=m>>3;if(y+=(e[g]|e[g+1]<<8)>>(m&7)&(1<<C)-1,i[++r]=a.s[y],m-=v,m<p)break;g=m>>3,b+=(e[g]|e[g+1]<<8)>>(m&7)&(1<<v)-1,i[++r]=a.s[b],C=a.n[y],y=a.t[y],v=a.n[b],b=a.t[b]}if(++r>255)q(0)}else{r=o-127;for(;n<r;n+=2){var w=e[++t];i[n]=w>>4,i[n+1]=w&15}++t}var F=0;for(n=0;n<r;++n){var A=i[n];if(A>11)q(0);F+=A&&1<<A-1}var T=oe(F)+1,M=1<<T,k=M-F;if(k&k-1)q(0);i[r++]=oe(k)+1;for(n=0;n<r;++n){var A=i[n];++l[i[n]=A&&T+1-A]}var h=new Y(M<<1),S=h.subarray(0,M),_=h.subarray(M);f[T]=0;for(n=T;n>0;--n){var j=f[n];fe(_,n,j,f[n-1]=j+l[n]*(1<<T-n))}if(f[0]!=M)q(0);for(n=0;n<r;++n){var D=i[n];if(D){var E=f[D];fe(S,n,E,f[D]=E+(1<<T-D))}}return[t,{n:_,b:T,s:S}]},Ut=pe(new Y([81,16,99,140,49,198,24,99,12,33,196,24,99,102,102,134,70,146,4]),0,6)[1],Ot=pe(new Y([33,20,196,24,99,140,33,132,16,66,8,33,132,16,66,8,33,68,68,68,68,68,68,68,68,36,9]),0,6)[1],Nt=pe(new Y([32,132,16,66,102,70,68,68,68,68,36,73,2]),0,5)[1],qe=function(e,t){var n=e.length,r=new ye(n);for(var s=0;s<n;++s)r[s]=t,t+=1<<e[s];return r},ke=new Y(new ye([0,0,0,0,16843009,50528770,134678020,202050057,269422093]).buffer,0,36),zt=qe(ke,0),Ie=new Y(new ye([0,0,0,0,0,0,0,0,16843009,50528770,117769220,185207048,252579084,16]).buffer,0,53),$t=qe(Ie,3),ue=function(e,t,n){var r=e.length,s=t.length,o=e[r-1],i=(1<<n.b)-1,l=-n.b;if(!o)q(0);var f=0,c=n.b,u=(r<<3)-8+oe(o)-c,a=-1;for(;u>l&&a<s;){var p=u>>3,d=(e[p]|e[p+1]<<8|e[p+2]<<16)>>(u&7);f=(f<<c|d)&i,t[++a]=n.s[f],u-=c=n.n[f]}if(u!=l||a+1!=s)q(0)},jt=function(e,t,n){var r=6,s=t.length,o=s+3>>2,i=o<<1,l=o+i;ue(e.subarray(r,r+=e[0]|e[1]<<8),t.subarray(0,o),n),ue(e.subarray(r,r+=e[2]|e[3]<<8),t.subarray(o,i),n),ue(e.subarray(r,r+=e[4]|e[5]<<8),t.subarray(i,l),n),ue(e.subarray(r),t.subarray(l),n)},Vt=function(e,t,n){var r,s=t.b,o=e[s],i=o>>1&3;t.l=o&1;var l=o>>3|e[s+1]<<5|e[s+2]<<13,f=(s+=3)+l;if(i==1){if(s>=e.length)return;if(t.b=s+1,n)return fe(n,e[s],t.y,t.y+=l),n;return fe(new Y(l),e[s])}if(f>e.length)return;if(i==0){if(t.b=f,n)return n.set(e.subarray(s,f),t.y),t.y+=l,n;return Pe(e,s,f)}if(i==2){var c=e[s],u=c&3,a=c>>2&3,p=c>>4,d=0,y=0;if(u<2)if(a&1)p|=e[++s]<<4|(a&2&&e[++s]<<12);else p=c>>3;else if(y=a,a<2)p|=(e[++s]&63)<<4,d=e[s]>>6|e[++s]<<2;else if(a==2)p|=e[++s]<<4|(e[++s]&3)<<12,d=e[s]>>2|e[++s]<<6;else p|=e[++s]<<4|(e[++s]&63)<<12,d=e[s]>>6|e[++s]<<2|e[++s]<<10;++s;var b=n?n.subarray(t.y,t.y+t.m):new Y(t.m),C=b.length-p;if(u==0)b.set(e.subarray(s,s+=p),C);else if(u==1)fe(b,e[s++],C);else{var v=t.h;if(u==2){var m=Dt(e,s);d+=s-(s=m[0]),t.h=v=m[1]}else if(!v)q(0);(y?jt:ue)(e.subarray(s,s+=d),b.subarray(C),v)}var g=e[s++];if(g){if(g==255)g=(e[s++]|e[s++]<<8)+32512;else if(g>127)g=g-128<<8|e[s++];var w=e[s++];if(w&3)q(0);var F=[Ot,Nt,Ut];for(var A=2;A>-1;--A){var T=w>>(A<<1)+2&3;if(T==1){var M=new Y([0,0,e[s++]]);F[A]={s:M.subarray(2,3),n:M.subarray(0,1),t:new be(M.buffer,0,1),b:0}}else if(T==2)r=pe(e,s,9-(A&1)),s=r[0],F[A]=r[1];else if(T==3){if(!t.t)q(0);F[A]=t.t[A]}}var k=t.t=F,h=k[0],S=k[1],_=k[2],j=e[f-1];if(!j)q(0);var D=(f<<3)-8+oe(j)-_.b,E=D>>3,L=0,O=(e[E]|e[E+1]<<8)>>(D&7)&(1<<_.b)-1;E=(D-=S.b)>>3;var H=(e[E]|e[E+1]<<8)>>(D&7)&(1<<S.b)-1;E=(D-=h.b)>>3;var W=(e[E]|e[E+1]<<8)>>(D&7)&(1<<h.b)-1;for(++g;--g;){var R=_.s[O],G=_.n[O],K=h.s[W],P=h.n[W],x=S.s[H],N=S.n[H];E=(D-=x)>>3;var U=1<<x,I=U+((e[E]|e[E+1]<<8|e[E+2]<<16|e[E+3]<<24)>>>(D&7)&U-1);E=(D-=Ie[K])>>3;var z=$t[K]+((e[E]|e[E+1]<<8|e[E+2]<<16)>>(D&7)&(1<<Ie[K])-1);E=(D-=ke[R])>>3;var X=zt[R]+((e[E]|e[E+1]<<8|e[E+2]<<16)>>(D&7)&(1<<ke[R])-1);if(E=(D-=G)>>3,O=_.t[O]+((e[E]|e[E+1]<<8)>>(D&7)&(1<<G)-1),E=(D-=P)>>3,W=h.t[W]+((e[E]|e[E+1]<<8)>>(D&7)&(1<<P)-1),E=(D-=N)>>3,H=S.t[H]+((e[E]|e[E+1]<<8)>>(D&7)&(1<<N)-1),I>3)t.o[2]=t.o[1],t.o[1]=t.o[0],t.o[0]=I-=3;else{var Z=I-(X!=0);if(Z){if(I=Z==3?t.o[0]-1:t.o[Z],Z>1)t.o[2]=t.o[1];t.o[1]=t.o[0],t.o[0]=I}else I=t.o[0]}for(var A=0;A<X;++A)b[L+A]=b[C+A];L+=X,C+=X;var V=L-I;if(V<0){var B=-V,Q=t.e+V;if(B>z)B=z;for(var A=0;A<B;++A)b[L+A]=t.w[Q+A];L+=B,z-=B,V=0}for(var A=0;A<z;++A)b[L+A]=b[V+A];L+=z}if(L!=C)while(C<b.length)b[L++]=b[C++];else L=b.length;if(n)t.y+=L;else b=Pe(b,0,L)}else if(n){if(t.y+=p,C)for(var A=0;A<p;++A)b[A]=b[C+A]}else if(C)b=Pe(b,C);return t.b=f,b}q(2)},_t=function(e,t){if(e.length==1)return e[0];var n=new Y(t);for(var r=0,s=0;r<e.length;++r){var o=e[r];n.set(o,s),s+=o.length}return n};function xe(e,t){var n=[],r=+!t,s=0,o=0;for(;e.length;){var i=Ft(e,r||t);if(typeof i=="object"){if(r){if(t=null,i.w.length==i.u)n.push(t=i.w),o+=i.u}else n.push(t),i.e=0;for(;!i.l;){var l=Vt(e,i,t);if(!l)q(5);if(t)i.e=i.y;else n.push(l),o+=l.length,It(i.w,0,l.length),i.w.set(l,i.w.length-l.length)}s=i.b+i.c*4}else s=i;e=e.subarray(s)}return _t(n,o)}async function Ht(e){let t=e instanceof Uint8Array?e:new Uint8Array(e),n=(r)=>r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength);if(t[0]===40&&t[1]===181&&t[2]===47&&t[3]===253)return n(xe(t));if(t[0]===31&&t[1]===139)return new Response(new Blob([t]).stream().pipeThrough(new DecompressionStream("gzip"))).arrayBuffer();return n(t)}async function Je(e){return new TextDecoder().decode(await Ht(e))}var Qe=(e)=>decodeURIComponent(e.split(/[?#]/)[0].split("/").pop()||"main.ldr").replace(/\\.(zst|gz)$/i,"")||"main.ldr";function we(e){let t=new DataView(e).getUint32(0,!0),n=JSON.parse(new TextDecoder().decode(new Uint8Array(e,4,t))),r=4+t;return{header:n,arr:(o)=>o&&(o[2]==="f32"?new Float32Array(e,r+o[0],o[1]):o[2]==="u16"?new Uint16Array(e,r+o[0],o[1]):o[2]==="u8"?new Uint8Array(e,r+o[0],o[1]):new Uint32Array(e,r+o[0],o[1])),bytes:e.byteLength,buffer:e}}var J=(e)=>e.trim().toLowerCase().replace(/\\\\/g,"/").replace(/\\/+/g,"/"),Be=/^[A-Za-z][A-Za-z0-9_]*$/,Re=new Map;function Fe(e){let t=e.toLowerCase(),n=2166136261;for(let s=0;s<t.length;s++)n^=t.charCodeAt(s),n=Math.imul(n,16777619);let r=-1-(n>>>0&1073741823);if(!Re.has(r))Re.set(r,t);return r}function De(e){let t=e.charCodeAt(0)|32;if(t>=97&&t<=122&&Be.test(e))return Fe(e);if(/^0x/i.test(e))return parseInt(e,16);return+e}var et=/^~?\\s*moved\\s+to\\s+(.+)$/i,Gt=new Set(["FILE","NOFILE","!DATA","!:","STEP","BFC","ROTSTEP","BUFEXCHG","!TEXMAP"]),lt=new Set(["part","subpart","primitive","8_primitive","48_primitive","shortcut","helper"]),Wt=new Set(["model","submodel","configuration"]),Kt=/^(?:!?LDRAW_ORG|Unofficial|Official\\s+LCAD)\\s+(\\S+)/i;function tt(e){let t=Kt.exec(e);if(!t)return;let n=t[1].toLowerCase().replace(/^unofficial_/,"");return lt.has(n)||Wt.has(n)?n:void 0}function Xt(e){let t=[],n=0;while(n<e.length){while(e[n]===" "||e[n]==="\\t")n++;if(n>=e.length)break;if(e[n]===\'"\'){let r="";n++;while(n<e.length&&e[n]!==\'"\'){if(e[n]==="\\\\"&&n+1<e.length)n++;r+=e[n++]}n++,t.push(r)}else{let r=n;while(r<e.length&&e[r]!==" "&&e[r]!=="\\t")r++;t.push(e.slice(n,r)),n=r}}return t}function Zt(e,t=!1){let n=/^\\s*(\\S+)\\s+(.*)$/.exec(e);if(!n)return null;let r=n[1].toUpperCase(),s=r==="PLANAR"?9:r==="CYLINDRICAL"?10:r==="SPHERICAL"?11:0;if(!s)return null;let o=n[2].trim().split(/\\s+/);if(o.length<s+1)return null;let i=o.slice(0,s).map(Number);if(!i.every(Number.isFinite))return null;let l=n[2].trim();for(let a=0;a<s;a++)l=l.replace(/^\\S+\\s*/,"");let f=Xt(l);if(!f.length)return null;let c={method:r,p1:i.slice(0,3),p2:i.slice(3,6),p3:i.slice(6,9),texture:f[0]};if(s>=10)c.a=i[9];if(s===11)c.b=i[10];let u=f.findIndex((a,p)=>p>0&&a.toUpperCase()==="GLOSSMAP");if(u>0&&f[u+1])c.glossmap=f[u+1];if(t)c.next=!0;return c}var Yt=(e)=>{let t=e.replace(/[^A-Za-z0-9+/]/g,""),n=t+"=".repeat((4-t.length%4)%4),r=atob(n),s=new Uint8Array(r.length);for(let o=0;o<r.length;o++)s[o]=r.charCodeAt(o);return s};function qt(e){let t=e.length,n=1,r=(c)=>c===32||c===9,s=()=>{while(n<t&&r(e.charCodeAt(n)))n++;let c=n;while(n<t&&!r(e.charCodeAt(n)))n++;return c<n?e.slice(c,n):null},o=s();if(o===null)return null;let i=Array(12);for(let c=0;c<12;c++){let u=s();if(u===null)return null;i[c]=+u}while(n<t&&r(e.charCodeAt(n)))n++;if(n>=t)return null;let l=e.slice(n),f=/[ \\t]{2,}|\\t/.test(l)?l.split(/\\s+/).join(" "):l;return{t:1,color:De(o),m:i,file:J(f)}}function nt(e){let t=+e[0];if(!(t>=1&&t<=5)||e.length<2)return null;let n=De(e[1]),r=e.slice(2).map(Number);if(t===1)return{t:1,color:n,m:r.slice(0,12),file:J(e.slice(14).join(" "))};if(t===2)return{t:2,color:n,p:r.slice(0,6)};if(t===3)return{t:3,color:n,p:r.slice(0,9)};if(t===4)return{t:4,color:n,p:r.slice(0,12)};return{t:5,color:n,p:r.slice(0,12)}}function ct(e,t="main.ldr",n={}){let r=!!n.geometryText,s=new Map,o=null,i="",l,f=null,c=[],u=null,a=()=>{if(!f)return;let m=Yt(f.chunks.join("")),g=m[0]===137&&m[1]===80&&m[2]===78&&m[3]===71;(l??=new Map).set(J(f.name),{name:f.name,bytes:m,...g?{mime:"image/png"}:{}}),f=null},p=!0,d=(m)=>{if(a(),o={name:J(m),cmds:[]},s.set(o.name,o),!i)i=o.name;c=[],u=null,p=!0},y=!1,b=!1,C=()=>{if(b)return;b=!0,s.clear(),o=null,i=""},v=(m,g)=>{if(u){m.tex=u,u=null;return}let w=c[c.length-1];if(!w)return;if(w.fallback){if(!g)m.fallback=!0}else m.tex=w.map};for(let m of e.split(`\n`)){let g=m.trim();if(!g)continue;if(r&&g.charCodeAt(0)>=50&&g.charCodeAt(0)<=53&&(g.charCodeAt(1)===32||g.charCodeAt(1)===9)){if(f||y)continue;if(!o)d(t);let T=g.slice(2).trimStart(),M=T.search(/\\s/),k={t:g.charCodeAt(0)-48,color:De(M<0?T:T.slice(0,M)),p:[],src:g};v(k,!1),o.cmds.push(k),p=!1;continue}if(g.charCodeAt(0)===48&&(g.charCodeAt(1)===32||g.charCodeAt(1)===9)){let T=2;while(g.charCodeAt(T)===32||g.charCodeAt(T)===9)T++;let M=T;while(M<g.length&&g.charCodeAt(M)!==32&&g.charCodeAt(M)!==9)M++;let k=g.slice(T,M);if(!Gt.has(k)){if(y||f)continue;if(!o)d(t);let h=g.slice(T),S={t:0,text:h};if(k.charCodeAt(0)===33)S.meta=k;if(u=null,p&&!o.org){let j=tt(h);if(j)o.org=j}let _=h.match(et);if(_&&!o.movedTo){let j=_[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(j))j+=".dat";o.movedTo=J(j)}o.cmds.push(S);continue}}if(g.charCodeAt(0)===49&&(g.charCodeAt(1)===32||g.charCodeAt(1)===9)&&!f&&!y){let T=qt(g);if(T){if(!o)d(t);v(T,!1),o.cmds.push(T),p=!1;continue}}let w=g.split(/\\s+/);if(+w[0]===0){let T=g.slice(1).trim();if(w[1]==="FILE"){C(),y=!1,d(T.slice(5));continue}if(w[1]==="NOFILE"){a(),o=null,y=!0;continue}if(w[1]==="!DATA"){C(),a(),o=null,y=!1,f={name:T.slice(5).trim(),chunks:[]};continue}if(y)continue;if(f){if(w[1]==="!:")f.chunks.push(w.slice(2).join(""));continue}if(!o)d(t);let M={t:0,text:T};if(w[1]==="STEP")M.step=!0,c=[],u=null;else if(w[1]==="BFC")M.bfc=w.slice(2).join(" ");else if(w[1]==="ROTSTEP")if(M.meta="ROTSTEP",M.step=!0,c=[],u=null,(w[2]??"").toUpperCase()==="END")M.rotstep={x:0,y:0,z:0,mode:"END"};else{let h=(w[5]??"REL").toUpperCase();M.rotstep={x:+w[2]||0,y:+w[3]||0,z:+w[4]||0,mode:["REL","ABS","ADD"].includes(h)?h:"REL"}}else if(w[1]==="BUFEXCHG"){M.meta="BUFEXCHG";let h=(w[2]??"").toUpperCase();M.bufexchg={op:h==="RETRIEVE"?"RETRIEVE":"STORE",buf:w[3]??"A"}}else if(w[1]?.startsWith("!"))M.meta=w[1];if(p&&!o.org){let h=tt(T);if(h)o.org=h}if(w[1]==="!TEXMAP"){let h=(w[2]??"").toUpperCase();if(u=null,h==="START"||h==="NEXT"){let S=Zt(T.replace(/^!TEXMAP\\s+\\S+/i,""),h==="NEXT");if(M.texmap={op:h,...S?{map:S}:{}},S)if((o.texmaps??=[]).push(S),h==="START")c.push({map:S,fallback:!1});else u=S}else if(h==="FALLBACK"){M.texmap={op:h};let S=c[c.length-1];if(S)S.fallback=!0}else if(h==="END")M.texmap={op:h},c.pop()}else if(w[1]==="!:"){u=null;let h=nt(w.slice(2));if(h)v(h,!0),M.geom=h}else u=null;let k=T.match(et);if(k&&!o.movedTo){let h=k[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(h))h+=".dat";o.movedTo=J(h)}o.cmds.push(M);continue}if(f||y)continue;if(!o)d(t);let A=nt(w);if(!A)continue;v(A,!1),o.cmds.push(A),p=!1}return a(),l?{main:i,files:s,data:l}:{main:i,files:s}}var Cn=Math.PI/180;function ut(e,t){let n=(r)=>[t[3]*r[0]+t[4]*r[1]+t[5]*r[2]+t[0],t[6]*r[0]+t[7]*r[1]+t[8]*r[2]+t[1],t[9]*r[0]+t[10]*r[1]+t[11]*r[2]+t[2]];return{...e,p1:n(e.p1),p2:n(e.p2),p3:n(e.p3)}}function ft(e,t){let[n,r,s,o,i,l,f,c,u,a,p,d]=e,[y,b,C,v,m,g,w,F,A,T,M,k]=t;return[o*y+i*b+l*C+n,f*y+c*b+u*C+r,a*y+p*b+d*C+s,o*v+i*w+l*T,o*m+i*F+l*M,o*g+i*A+l*k,f*v+c*w+u*T,f*m+c*F+u*M,f*g+c*A+u*k,a*v+p*w+d*T,a*m+p*F+d*M,a*g+p*A+d*k]}var Ue=[0,0,0,1,0,0,0,1,0,0,0,1];var rt=new WeakMap,Jt=/^(s|8|48)\\//;function Oe(e,t){let n=e.files.get(J(t));if(!n)return"part";let r=rt.get(n);if(r)return r;if(n.org)r=lt.has(n.org)?"part":"model";else if(n.name===e.main)r="model";else r=n.cmds.some((s)=>s.t>=2||s.t===0&&!!s.geom||s.t===1&&Jt.test(s.file))?"part":"model";return rt.set(n,r),r}var st=new WeakMap;function pt(e){let t=st.get(e);if(t)return t;t=[];let n=0;for(let r of e.cmds){if(r.t===0&&r.step){n++;continue}if((r.t>=2||r.t===0&&r.geom&&r.geom.t>=2)&&t[t.length-1]!==n)t.push(n)}return st.set(e,t),t}var ot=(e)=>e>16777215?"0x"+e.toString(16).toUpperCase():e<0?Re.get(e)??String(e):String(e),Qt=(e)=>e.t===0?"0 "+e.text:e.t===1?`1 ${ot(e.color)} ${e.m.join(" ")} ${e.file}`:e.src?e.src:`${e.t} ${ot(e.color)} ${e.p.join(" ")}`,Ne=(e,t)=>`${J(e)}#${t}`;function en(e,t){let n=[],r=0,s=(o)=>!!o&&o.t===0&&o.texmap?.op==="NEXT";for(let o of e.cmds){if(o.t===0){if(o.step){r++;continue}if(o.bfc!==void 0||o.meta==="!COLOUR"){n.push(o);continue}if(r!==t)continue;if(o.texmap)n.push(o);else if(o.geom){if(o.geom.t>=2)n.push(o);else if(s(n[n.length-1]))n.pop()}continue}if(r!==t)continue;if(o.t===1){if(s(n[n.length-1]))n.pop();continue}n.push(o)}return{name:Ne(e.name,t),cmds:n}}function mt(e,t){return[`0 ldr: own geometry of ${e.name}, step ${t}`,...en(e,t).cmds.map(Qt)].join(`\n`)+`\n`}function ze(e){let t=2166136261;for(let n=0;n<e.length;n++)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return(t>>>0).toString(16).padStart(8,"0")}function ht(e){let[t,n,r,s,o,i,l,f,c,u,a,p]=e,d=f*p-c*a,y=-(l*p-c*u),b=l*a-f*u,C=s*d+o*y+i*b;if(!Number.isFinite(C)||Math.abs(C)<0.000000000001)return null;let v=1/C,m=[d*v,-(o*p-i*a)*v,(o*c-i*f)*v,y*v,(s*p-i*u)*v,-(s*c-i*l)*v,b*v,-(s*a-o*u)*v,(s*f-o*l)*v];return[-(m[0]*t+m[1]*n+m[2]*r),-(m[3]*t+m[4]*n+m[5]*r),-(m[6]*t+m[7]*n+m[8]*r),...m]}var tn=(e)=>String(+e.toFixed(6)||0),it=(e)=>\'"\'+e.replace(/\\\\/g,"\\\\\\\\").replace(/"/g,"\\\\\\"")+\'"\';function gt(e,t){let n=[...t.p1,...t.p2,...t.p3,...t.method!=="PLANAR"?[t.a??360]:[],...t.method==="SPHERICAL"?[t.b??180]:[]].map(tn).join(" "),r=`0 ldr: ${e} with a model-level !TEXMAP\n0 BFC CERTIFY CCW\n0 !TEXMAP START ${t.method} ${n} ${it(t.texture)}${t.glossmap?" GLOSSMAP "+it(t.glossmap):""}\n1 16 0 0 0 1 0 0 0 1 0 0 0 1 ${J(e)}\n0 !TEXMAP END\n`;return{name:`${J(e)}#tex-${ze(r)}`,source:r}}var nn=(e,t)=>{let n=[,,,,,,,,,];for(let r=0;r<3;r++)for(let s=0;s<3;s++)n[r*3+s]=e[r*3]*t[s]+e[r*3+1]*t[3+s]+e[r*3+2]*t[6+s];return n};function rn(e,t,n){let r=Math.PI/180,s=Math.sin(e*r),o=Math.cos(e*r),i=Math.sin(t*r),l=Math.cos(t*r),f=Math.sin(n*r),c=Math.cos(n*r);return[l*c,-l*f,i,o*f+s*i*c,o*c-s*i*f,-s*l,s*f-o*i*c,s*c+o*i*f,o*l]}var at=new WeakMap;function dt(e){let t=at.get(e);if(t)return t;let n=[],r=null;for(let s of e.cmds){if(s.t!==0||!s.step)continue;let o=s.rotstep;if(o)if(o.mode==="END")r=null;else{let i=rn(o.x,o.y,o.z);r=o.mode==="ABS"?{abs:!0,m:i,rotstep:o}:o.mode==="ADD"&&r?{abs:r.abs,m:nn(r.m,i),rotstep:o}:{abs:!1,m:i,rotstep:o}}n.push(r)}return n.push(r),at.set(e,n),n}var bt=999999,wt=(e)=>e.map((t)=>String(t).padStart(6,"0")).join(".")+"~",Mt=new WeakMap,yt=new WeakMap;function sn(e,t){let n=yt.get(t);if(!n)n={head:[...t.values()].map((o)=>{let i=Mt.get(o)??"",l=i.indexOf("!COLOUR");return l<0?"":"0 "+i.slice(l).trim().replace(/\\s+/g," ")}).filter(Boolean).join(`\n`),parts:new Map},yt.set(t,n);let r=n.parts.get(e);if(!r){let s=J(e),o=`0 ldr: ${s} placed in a model\'s !COLOUR scope\n0 BFC CERTIFY CCW\n${n.head}\n1 16 0 0 0 1 0 0 0 1 0 0 0 1 ${s}\n`;r={name:`${s}#col-${ze(o)}`,source:o},n.parts.set(e,r)}return r}function on(e,t={}){let n=[],r=t.maxDepth??64,s=t.looseGeometry!==!1,o=!!t.textures,i=!!t.callouts,l=new Map,f=0,c=(a,p)=>{let d=a.name+"#"+p,y=l.get(d);if(!y){let b;y=Object.assign(()=>b??=mt(a,p),{file:a,step:p}),l.set(d,y)}return y},u=(a,p,d,y,b,C,v,m,g=null,w=[],F=[],A=void 0,T=null)=>{let M=a.files.get(p);if(!M||v>r)return;let k=T,h=0,S=v>0?++f:0,_=i&&S?[...w,S]:w,j=i&&S?[...F,d]:F,D=i&&!g?new Map:null,E=-1,L=0,O=(P,x,N,U,I,z,X)=>{if(E!==h)E=h,L=0;let Z=D?.get(h+"|"+x);if(Z)return Z.n++,u(P,P===a?x:P.main,N,U,b+"/"+x,[...I,bt],v+1,z,[...I,bt],_,j,X,k);let V=[...I,L++],B=n.length;u(P,P===a?x:P.main,N,U,b+"/"+x,V,v+1,z,g,_,j,X,k),D?.set(h+"|"+x,{n:1,from:B,to:n.length})},H=dt(M),W=s?pt(M):[],R=0,G=(P,x,N,U,I,z,X,Z,V)=>{if(g)U=g;let B={part:P,color:x,m:N,step:U[0],steps:U,localStep:I,path:b};if(Z)B.colour=Z;if(S){if(B.sub=S,i)B.subPath=_,B.subMats=j}if(z)B.embedded=!0;if(X){let ee=gt(P,X);B.texPart=ee.name,B.texSource=ee.source}else if(V){let ee=sn(P,V);B.colPart=ee.name,B.colSource=ee.source}let Q=H[I];if(Q)B.view=Q;return n.push(B),B},K=(P)=>{while(R<W.length&&W[R]<=P){let x=W[R++];G(Ne(M.name,x),y,d,[...C,x],x,!1,null,A,T).source=c(M,x)}};for(let P of M.cmds){if(P.t===0&&P.step){h++;continue}let x=P;if(x.t>=2||x.t===0&&x.geom&&x.geom.t>=2){K(h);continue}if(x.t===0){if(x.meta==="!COLOUR"){let Q=ln(x.text);if(Q&&Q.code!==16&&Q.code!==24)Mt.set(Q,x.text),(k=new Map(k??[])).set(Q.code,Q);continue}if(o&&x.geom?.t===1)x=x.geom;else continue}if(x.t!==1)continue;if(o&&x.fallback)continue;let N=x.color===16?y:x.color,U=x.color===16?A:k?.get(x.color),I=ft(d,x.m),z=[...C,h],X=o?x.tex??m:null,Z=X?ht(x.m):null,V=X&&Z?ut(X,Z):null;if(a.files.has(x.file)){if(Oe(a,x.file)==="model"){O(a,x.file,I,N,z,V,U);continue}G(x.file,N,I,z,h,!0,V,U,k);continue}let B=t.resolveModel?.(x.file);if(B){O(B,x.file,I,N,z,V,U);continue}G(x.file,N,I,z,h,!1,V,U,k)}if(K(1/0),D){for(let P of D.values())if(P.n>1)for(let x=P.from;x<P.to;x++)n[x].mult??=P.n}};if(Oe(e,e.main)==="part"){if(e.files.get(e.main))n.push({part:e.main,color:16,m:[...Ue],step:0,steps:[0],localStep:0,path:e.main,embedded:!0});return n}return u(e,e.main,Ue,16,e.main,[],0,null),n}function At(e,t="main.ldr",n){return on(ct(e,t,{geometryText:!0}),n)}var an=new Set(["CHROME","PEARLESCENT","RUBBER","MATTE_METALLIC","METAL","MATERIAL"]);function $e(e){if(!e)return null;if(e.startsWith("#")&&/^#[0-9A-Fa-f]{6}$/.test(e))return e.toUpperCase();if(/^0x[0-9A-Fa-f]{6}$/i.test(e))return("#"+e.slice(2)).toUpperCase();return null}function xt(e,t){let n={value:"#FFFFFF",fraction:0.5};while(t<e.length){let r=e[t].toUpperCase(),s=e[t+1];if(r==="VALUE"){let o=$e(s);if(o)n.value=o;t+=2}else if(r==="ALPHA")n.alpha=+s,t+=2;else if(r==="LUMINANCE")n.luminance=+s,t+=2;else if(r==="FRACTION")n.fraction=+s,t+=2;else if(r==="VFRACTION")n.vfraction=+s,t+=2;else if(r==="SIZE")n.size=+s,t+=2;else if(r==="MINSIZE")n.minsize=+s,t+=2;else if(r==="MAXSIZE")n.maxsize=+s,t+=2;else break}return{grain:n,next:t}}function ln(e){let t=e.indexOf("!COLOUR");if(t<0)return null;let n=e.slice(t+7).trim().split(/\\s+/).filter(Boolean);if(n.length<2)return null;let r=n[0],s=NaN,o="#FF00FF",i="#333333",l=255,f=0,c={type:"default"},u=1;while(u<n.length){let a=n[u].toUpperCase(),p=n[u+1];if(a==="CODE")s=p!==void 0&&Be.test(p)?Fe(p):p!==void 0&&/^\\d+$/.test(p)?+p:NaN,u+=2;else if(a==="VALUE"){let d=$e(p);if(d)o=d;u+=2}else if(a==="EDGE")i=$e(p)??p,u+=2;else if(a==="ALPHA")l=+p,u+=2;else if(a==="LUMINANCE")f=+p,u+=2;else if(a==="CHROME")c={type:"chrome"},u+=1;else if(a==="PEARLESCENT")c={type:"pearlescent"},u+=1;else if(a==="RUBBER")c={type:"rubber"},u+=1;else if(a==="MATTE_METALLIC")c={type:"matte_metallic"},u+=1;else if(a==="METAL")c={type:"metal"},u+=1;else if(a==="MATERIAL"){let d=(n[u+1]||"").toUpperCase();if(d==="GLITTER"){let{grain:y,next:b}=xt(n,u+2);c={type:"glitter",material:y},u=b}else if(d==="SPECKLE"){let{grain:y,next:b}=xt(n,u+2);c={type:"speckle",material:y},u=b}else if(d==="FABRIC"){let y=(n[u+2]||"").toUpperCase(),b=["VELVET","CANVAS","STRING","FUR"].includes(y)?y.toLowerCase():void 0;c={type:"fabric",kind:b},u+=b?3:2}else u=n.length}else if(an.has(a))u+=1;else u+=1}if(Number.isNaN(s)||!o)return null;return{code:s,name:r,hex:o,edge:i,alpha:Number.isFinite(l)?l:255,luminance:Number.isFinite(f)?f:0,finish:c}}function cn(e){let t=Math.max(0,Math.min(1,(e.alpha??255)/255)),n=t<1,r=Math.max(0,Math.min(1,(e.luminance??0)/255)),s={opacity:t,transparent:n,depthWrite:!n,emissive:r,clearcoat:0,clearcoatRoughness:0,sheen:0,sheenRoughness:0};switch(e.finish?.type??"default"){case"chrome":return{...s,metalness:1,roughness:0,finish:"chrome"};case"pearlescent":return{...s,metalness:0.25,roughness:0.3,clearcoat:0.5,clearcoatRoughness:0.25,sheen:0.4,sheenRoughness:0.35,finish:"pearlescent"};case"rubber":return{...s,metalness:0,roughness:0.9,finish:"rubber"};case"matte_metallic":return{...s,metalness:0.4,roughness:0.8,finish:"matte_metallic"};case"metal":return{...s,metalness:0.85,roughness:0.2,finish:"metal"};case"glitter":{let i=e.finish.material,l=i.size??(i.minsize!=null&&i.maxsize!=null?(i.minsize+i.maxsize)/2:1);return{...s,metalness:0.35,roughness:0.25,clearcoat:1,clearcoatRoughness:0.08,particleHex:i.value,particleFraction:i.fraction,particleSize:l,finish:"glitter"}}case"speckle":{let i=e.finish.material,l=i.size??(i.minsize!=null&&i.maxsize!=null?(i.minsize+i.maxsize)/2:1);return{...s,metalness:0.2,roughness:0.55,particleHex:i.value,particleFraction:i.fraction,particleSize:l,finish:"speckle"}}case"fabric":return{...s,metalness:0,roughness:0.85,sheen:0.65,sheenRoughness:0.75,finish:"fabric"};default:return{...s,metalness:0,roughness:0.45,finish:"default"}}}function je(e){let t=cn(e),n=!t.transparent?"op":t.opacity>=0.75?"a200":t.opacity>=0.4?"a128":`a${Math.round(t.opacity*255)}`,r=t.emissive>0?`L${Math.round(t.emissive*16)}`:"",s=`${t.finish}:${n}${r}`;if(t.particleHex)s+=`:${t.particleHex}:${(t.particleFraction??0).toFixed(2)}`;return s}function un(e,t){let n=new Map,r=null,s=!1;for(let o of e.split(/\\r?\\n/)){let i=/^\\s*0\\s+FILE\\s+(.+)$/i.exec(o);if(i){if(!s)n.clear();s=!0,r=[],n.set(J(i[1]),r);continue}if(/^\\s*0\\s+(NOFILE|!DATA)(\\s|$)/i.test(o)){if(!s)n.clear();s=!0,r=null;continue}if(!r){if(s)continue;r=[],n.set(J(t),r)}let l=o.trim().replace(/\\s+/g," ");if(l)r.push(l)}return n}var fn=(e)=>{if(!e.startsWith("1 "))return null;let t=e.split(" ");return t.length>=15?J(t.slice(14).join(" ")):null};function pn(e){let t=2166136261,n=1523705862;for(let r=0;r<e.length;r++){let s=e.charCodeAt(r);t=Math.imul(t^s,16777619),n=Math.imul(n^s,16777629)^n>>>15}return(t>>>0).toString(16).padStart(8,"0")+(n>>>0).toString(16).padStart(8,"0")}function vt(e,t,n="main.ldr"){let r=un(e,n),s=new Map;for(let o of t){let i=J(o);if(!r.has(i)||s.has(i))continue;let l=new Set([i]),f=[i];while(f.length)for(let u of r.get(f.pop())){let a=fn(u);if(a&&r.has(a)&&!l.has(a))l.add(a),f.push(a)}let c=[i,...[...l].filter((u)=>u!==i).sort()].map((u)=>"0 FILE "+(u===i?"":u)+`\n`+r.get(u).join(`\n`)).join(`\n`);s.set(i,`emb/${pn(c)}.dat`)}return s}var Ct=(e,t=0)=>Math.abs(e[t+7]-1)<0.001&&Math.abs(e[t+4])<0.001&&Math.abs(e[t+10])<0.001,Tt=new WeakMap;function Ve(e,t){let n=Tt.get(e);if(!n)Tt.set(e,n=new Map);let r=n.get(t);if(r!==void 0)return r;let s=e.parts[t];if(!s)return n.set(t,null),null;let o=s.studs.length,i=new Float64Array(o*12),l=[],f=[];s.studs.forEach((p,d)=>{l.push(p[0]),f.push(p[1]);for(let y=0;y<12;y++)i[d*12+y]=p[2+y]});let c=null,u=0,a=0;if(s.mask){u=s.mask[0],a=s.mask[1];let p=s.mask[2];c=new Uint8Array(p.length);for(let d=0;d<p.length;d++)c[d]=p.charCodeAt(d)===49?1:0}return n.set(t,r={nStuds:o,studM:i,kind:l,color:f,mask:c,nx:u,nz:a}),r}var le=1073741824;class _e{a;b;c;vals;used;mask;size=0;constructor(e=1024){let t=1024;while(t<e*2)t*=2;this.a=new Int32Array(t),this.b=new Int32Array(t),this.c=new Int32Array(t),this.vals=new Int32Array(t),this.used=new Uint8Array(t),this.mask=t-1}slot(e,t,n){let r=Math.imul(e,2654435761)^Math.imul(t,2246822507)^Math.imul(n,3266489909);return r^=r>>>15,r=Math.imul(r,739982445),r^=r>>>12,r&this.mask}get(e,t,n){let r=this.slot(e,t,n),s=this.used,o=this.a,i=this.b,l=this.c;for(;;){if(!s[r])return-1;if(o[r]===e&&i[r]===t&&l[r]===n)return this.vals[r];r=r+1&this.mask}}put(e,t,n,r){if((this.size+1)*2>this.used.length)this.grow();let s=this.slot(e,t,n),o=this.used,i=this.a,l=this.b,f=this.c;for(;;){if(!o[s])return o[s]=1,i[s]=e,l[s]=t,f[s]=n,this.vals[s]=r,this.size++,-1;if(i[s]===e&&l[s]===t&&f[s]===n){let c=this.vals[s];return this.vals[s]=r,c}s=s+1&this.mask}}grow(){let{a:e,b:t,c:n,vals:r,used:s}=this,o=s.length*2;this.a=new Int32Array(o),this.b=new Int32Array(o),this.c=new Int32Array(o),this.vals=new Int32Array(o),this.used=new Uint8Array(o),this.mask=o-1,this.size=0;for(let i=0;i<s.length;i++)if(s[i])this.put(e[i],t[i],n[i],r[i])}}var Me=(e,t,n)=>e>-le&&e<le&&t>-le&&t<le&&n>-le&&n<le,me=2147483647;function mn(e,t){let n=e.colorTable?.[t];if(n)return(n.alpha??255)<255;return t.charCodeAt(0)===35&&/\\/[^:/]*:a\\d/.test(t)}function hn(e,t,n){let s=new Map,o=(L)=>{let O=s.get(L);if(O===void 0)s.set(L,O=mn(t,L));return O},i=[],l=[],f=[],c=[],u=[],a=[],p=[],d=[],y=new _e(e.length*2),b=[],C=[];for(let L=0;L<e.length;L++){let O=e[L],H=O.m,W=t.parts[O.part];if(!W||!W.mask||!Ct(H)||o(O.color))continue;let R=W.bbox,G=1/0,K=-1/0,P=1/0,x=-1/0;for(let I=0;I<2;I++)for(let z=0;z<2;z++){let X=I?R[3]:R[0],Z=z?R[5]:R[2],V=H[0]+H[3]*X+H[5]*Z,B=H[2]+H[9]*X+H[11]*Z;if(V<G)G=V;if(V>K)K=V;if(B<P)P=B;if(B>x)x=B}let N=u.length;i.push(G),l.push(K),f.push(P),c.push(x),u.push(L),a.push(Ve(t,O.part)),p.push(R[0]),d.push(R[2]);let U=Math.round((H[1]+R[4])*2);for(let I=Math.floor(G/40);I<=Math.floor(K/40);I++)for(let z=Math.floor(P/40);z<=Math.floor(x/40);z++){if(!Me(U,I,z))continue;let X=C.length;C.push(N),b.push(y.put(U,I,z,X))}}let v=[0,5,-5,5,-5],m=[0,5,5,-5,-5],g=NaN,w=NaN,F=NaN,A=-1,T=(L,O,H,W)=>{let R=Math.round(O*2),G=Math.floor(L/40),K=Math.floor(H/40);if(!Me(R,G,K))return me;let P=me;if(R!==g||G!==w||K!==F)g=R,w=G,F=K,A=y.get(R,G,K);for(let x=A;x>=0;x=b[x]){let N=C[x];if(u[N]===W||!(L-6>=i[N]-0.5&&L+6<=l[N]+0.5&&H-6>=f[N]-0.5&&H+6<=c[N]+0.5))continue;let U=e[u[N]].m,I=a[N],z=p[N],X=d[N],Z=L-U[0],V=O-U[1],B=H-U[2],Q=U[3]*Z+U[6]*V+U[9]*B,ee=U[5]*Z+U[8]*V+U[11]*B,{nx:ne,nz:ie,mask:ce}=I,ae=!0;for(let te=0;te<5;te++){let re=Math.floor((Q+v[te]-z)/20),se=Math.floor((ee+m[te]-X)/20);if(re<0||se<0||re>=ne||se>=ie||ce[re*ie+se]!==1){ae=!1;break}}if(ae){if(!n)return 0;let te=n[u[N]];if(te<P)P=te}}return P},M=0;for(let L of e){let O=Ve(t,L.part);if(O)M+=O.nStuds}let k=new Uint8Array(M),h=new Uint8Array(M),S=new _e(M),_=0,j=n?new Int32Array(M).fill(me):void 0;for(let L=0,O=0;L<e.length;L++){let H=e[L],W=Ve(t,H.part);if(!W)continue;let R=H.m,G=W.studM,K=R[0],P=R[1],x=R[2],N=R[3],U=R[4],I=R[5],z=R[6],X=R[7],Z=R[8],V=R[9],B=R[10],Q=R[11];for(let ee=0;ee<W.nStuds;ee++,O++){let ne=ee*12,ie=G[ne+4],ce=G[ne+7],ae=G[ne+10];if(!(Math.abs(z*ie+X*ce+Z*ae-1)<0.001&&Math.abs(N*ie+U*ce+I*ae)<0.001&&Math.abs(V*ie+B*ce+Q*ae)<0.001))continue;h[O]=1;let te=G[ne],re=G[ne+1],se=G[ne+2],He=K+N*te+U*re+I*se,Ge=P+z*te+X*re+Z*se,We=x+V*te+B*re+Q*se,Ke=T(He,Ge,We,L);if(Ke!==me){if(k[O]=1,_++,j)j[O]=Ke}let he=Math.round(He),ge=Math.round(Ge),de=Math.round(We);if(!Me(he,ge,de))continue;if(!n){S.put(he,ge,de,1);continue}let Xe=n[L],Ze=S.get(he,ge,de);if(Ze<0||Xe<Ze)S.put(he,ge,de,Xe)}}let D=new Uint8Array(e.length),E=n?new Int32Array(e.length).fill(me):void 0;for(let L=0;L<e.length;L++){let O=e[L],H=t.parts[O.part];if(!H||!H.under||!Ct(O.m)||o(O.color))continue;let W=H.bbox,R=Math.round((W[3]-W[0])/20),G=Math.round((W[5]-W[2])/20);if(!R||!G||R*G>4096)continue;let K=O.m,P=!0,x=0;for(let N=0;N<R&&P;N++)for(let U=0;U<G;U++){let I=W[0]+10+20*N,z=W[2]+10+20*U,X=K[0]+K[3]*I+K[5]*z,Z=K[2]+K[9]*I+K[11]*z,V=Math.round(X),B=Math.round(K[1]+W[4]),Q=Math.round(Z),ee=Me(V,B,Q)?S.get(V,B,Q):-1;if(ee<0){P=!1;break}if(ee>x)x=ee}if(P){if(D[L]=1,E)E[L]=x}}return{nStuds:M,studHidden:k,studUp:h,underHidden:D,studsHidden:_,studHideStep:j,underHideStep:E}}function gn(e,t,n){let r=(a)=>a.colPart&&t.parts[a.colPart]?a.colPart:n&&a.texPart&&t.parts[a.texPart]?a.texPart:a.part,s=new Map,o=new Map,i=(a)=>{let p=a.colour;if(!p)return String(a.color);let d=o.get(p);if(d!==void 0)return d;let y=t.colorTable?.[a.color],b=y?.hex??t.colors?.[a.color],C=y?je({alpha:y.alpha??255,luminance:y.luminance??0,finish:y.finish??{type:"default"}}):"default:op",v=je(p);if(d=b&&b.toUpperCase()===p.hex.toUpperCase()&&C===v?String(a.color):p.hex.toUpperCase()+"/"+v,d!==String(a.color))s.set(d,p);return o.set(p,d),d},l=e.map((a)=>({part:r(a),color:i(a),m:a.m,steps:a.steps})),f=l.map((a)=>wt(a.steps)),c=[...new Set(f)].sort(),u=new Map(c.map((a,p)=>[a,p]));return{all:l,stepOf:f.map((a)=>u.get(a)),nSteps:c.length,localColours:s}}function Ae(e,t,n=!0){let r=gn(e,t,n);return hn(r.all,t,r.nSteps>1?r.stepOf:void 0)}var Se="https://ldr-demo.vercel.app/cdn/v1/",Ce=new Map,ve=new Map;function Te(e=Se,t=fetch){let n=Ce.get(e);if(!n)n=t(e+"parts.json").then((r)=>{if(!r.ok)throw Error(`ldr: parts CDN index ${r.status} (${e}parts.json)`);return r.json()}),n.catch(()=>Ce.delete(e)),Ce.set(e,n);return n}var dn=(e)=>Array.isArray(e)&&e.length===3&&typeof e[0]==="number"&&typeof e[1]==="number"&&(e[2]==="f32"||e[2]==="u16"||e[2]==="u8"||e[2]==="u32"),Le=(e,t)=>dn(e)?[e[0]+t,e[1],e[2]]:Array.isArray(e)?e.map((n)=>Le(n,t)):e&&typeof e==="object"?Object.fromEntries(Object.entries(e).map(([n,r])=>[n,Le(r,t)])):e;function bn(e,t={}){let n=[],r=0,s={},o={};for(let p of e){let d=p.buffer;if(!d)throw Error("ldr: mergePacks needs packs from decodePack/loadPack");let y=new DataView(d).getUint32(0,!0),b=new Uint8Array(d,4+y),C=r;n.push(b),r+=b.byteLength;let v=(4-r%4)%4;if(v)n.push(new Uint8Array(v)),r+=v;for(let[m,g]of Object.entries(p.header.parts??{}))if(!(m in s))s[m]=Le(g,C);for(let[m,g]of Object.entries(p.header.studKinds??{}))if(!(m in o))o[m]=Le(g,C)}let i=e[0]?.header??{version:1,weld:!0},l=new TextEncoder().encode(JSON.stringify({...i,parts:s,studKinds:o,...t})),f=(4-(4+l.length)%4)%4,c=4+l.length+f,u=new Uint8Array(c+r);new DataView(u.buffer).setUint32(0,l.length+f,!0),u.set(l,4),u.fill(32,4+l.length,c);let a=c;for(let p of n)u.set(p,a),a+=p.byteLength;return we(u.buffer)}async function yn(e,t={}){e=[...e];try{return await Lt(e,t)}catch(n){let r=t.cdn??Se,s=t.fetch??fetch;Ce.delete(r);let o=(i,l)=>s(i,{...l,cache:"reload"});try{return await Lt(e,{...t,fetch:o})}catch{throw n}}}async function Lt(e,t){let n=t.cdn??Se,r=t.fetch??fetch,s=t.gap??16384,o=await Te(n,r),i=[...new Set([...e].map(J))],l=[],f=[];for(let m of i){if(ve.has(n+m))continue;let g=o.parts[m];if(g)f.push({name:m,off:g[0],len:g[1],file:g[2]??0});else l.push(m)}f.sort((m,g)=>m.file-g.file||m.off-g.off);let c=[];for(let m of f){let g=c[c.length-1];if(g&&g.file===m.file&&m.off-g.end<=s)g.end=Math.max(g.end,m.off+m.len),g.items.push(m);else c.push({file:m.file,start:m.off,end:m.off+m.len,items:[m]})}let u=0,a=0,p=0,d=new Map,y=async()=>{while(p<c.length){let m=c[p++],g=d.get(m.file);if(g)g=g.subarray(m.start,m.end);else{let w=await r(new URL(o.archives[m.file],n).href,{headers:{Range:`bytes=${m.start}-${m.end-1}`,"Accept-Encoding":"identity"}});if(!w.ok)throw Error(`ldr: parts CDN ${w.status}`);if(a++,g=new Uint8Array(await w.arrayBuffer()),u+=g.byteLength,w.status===200)d.set(m.file,g),g=g.subarray(m.start,m.end)}for(let w of m.items){let F=xe(g.subarray(w.off-m.start,w.off-m.start+w.len)),A=F.buffer.slice(F.byteOffset,F.byteOffset+F.byteLength);ve.set(n+w.name,we(A))}}};await Promise.all(Array.from({length:Math.min(t.concurrency??24,c.length)},y));let b=i.filter((m)=>ve.has(n+m)).map((m)=>ve.get(n+m)),C={colors:o.colors,...o.colorTable?{colorTable:o.colorTable}:{}};return{pack:b.length?bn(b,C):we(xn(C)),missing:l,requests:a,bytes:u}}function xn(e){let t=new TextEncoder().encode(JSON.stringify({version:1,weld:!0,parts:{},studKinds:{},...e})),n=(4-(4+t.length)%4)%4,r=new Uint8Array(4+t.length+n).fill(32);return new DataView(r.buffer).setUint32(0,t.length+n,!0),r.set(t,4),r.buffer}function wn(e,t){let n=t.header.parts;if(!n)return 0;let r=0;for(let s of e){let o=n[s.part]?.body?.tris;if(o)r+=o}return r}function St(e,t,n){let r=0,s=0,o=!1,i=new Set;for(let l of e){let f=l.embedded?t.get(l.part):J(l.part),c=f?n.parts[f]:void 0;if(!c)continue;if(c[3]!=null)o=!0,r+=c[3];if(!i.has(f))i.add(f),s+=c[1]}return{bodyTris:r,packBytes:s,known:o}}class Ee extends Error{code="ldr-budget";bodyTris;packBytes;maxBodyTris;maxPackBytes;constructor(e){let t=[e.maxBodyTris!=null&&e.bodyTris>e.maxBodyTris?`${e.bodyTris} triangles (limit ${e.maxBodyTris})`:"",e.maxPackBytes!=null&&e.packBytes>e.maxPackBytes?`${(e.packBytes/1e6).toFixed(1)} MB parts pack (limit ${(e.maxPackBytes/1e6).toFixed(0)} MB)`:""].filter(Boolean).join(", ");super(`ldr: model exceeds device budget: ${t}`);this.name="BudgetError",this.bodyTris=e.bodyTris,this.packBytes=e.packBytes,this.maxBodyTris=e.maxBodyTris,this.maxPackBytes=e.maxPackBytes}}async function Et(e,t={}){let n=performance.now(),r=t.fetch??fetch,s=Te(t.cdn??Se,r);s.catch(()=>{});let o=t.text?e:await r(e).then(async(h)=>{if(!h.ok)throw Error(`ldr: ${h.status} fetching ${e}`);return Je(await h.arrayBuffer())}),i=performance.now(),l=t.name??(t.text?"main.ldr":Qe(e)),f=At(o,l,{looseGeometry:!1,callouts:t.callouts}),c=performance.now();t.onParsed?.(f),await s;let u=vt(o,new Set(f.filter((h)=>h.embedded).map((h)=>h.part)),l),a=(h,S)=>t.maxBodyTris!=null&&h>t.maxBodyTris||t.maxPackBytes!=null&&S>t.maxPackBytes,p=t.maxBodyTris!=null||t.maxPackBytes!=null,d=(h)=>new Ee({...h,maxBodyTris:t.maxBodyTris,maxPackBytes:t.maxPackBytes}),y="full";if(p){let h=St(f,u,await s);if(a(h.known?h.bodyTris:0,h.packBytes)){if(!t.lowCdn)throw d(h);let S=await Te(t.lowCdn,r).catch(()=>null);if(!S)throw d(h);let _=St(f,u,S);if(a(_.known?_.bodyTris:0,_.packBytes))throw d(_);y="low"}}let b=[...f.filter((h)=>!h.embedded).map((h)=>h.part),...u.values()],C=async()=>{let h=await yn(b,y==="low"?{...t,cdn:t.lowCdn}:t);for(let[S,_]of u){let j=h.pack.header.parts[_];if(j)h.pack.header.parts[S]=j}return{...h,packBytes:h.pack.buffer?.byteLength??h.pack.bytes??0,bodyTris:wn(f,h.pack)}},v=await C();if(p&&a(v.bodyTris,v.packBytes)&&y==="full"&&t.lowCdn&&await Te(t.lowCdn,r).then(()=>!0,()=>!1)){y="low";let h=v;v=await C(),v.requests+=h.requests,v.bytes+=h.bytes}if(p&&a(v.bodyTris,v.packBytes))throw d(v);let{pack:m,missing:g,requests:w,bytes:F}=v,A=new Map([...u].map(([h,S])=>[S,h])),T=g.map((h)=>A.get(h)??h),M=performance.now(),k=t.cull?Ae(f,m.header,t.textures!==!1):void 0;return{insts:f,pack:m,tier:y,missing:T,requests:w,bytes:F,cull:k,timings:{fetchModel:i-n,parse:c-i,parts:M-c,...k?{cull:performance.now()-M}:{}}}}self.onmessage=async(e)=>{let{id:t,source:n,opts:r}=e.data;try{let s=await Et(n,{...r,cull:!1,onParsed:(u)=>self.postMessage({id:t,insts:u})}),o=s.pack.buffer;if(self.postMessage({id:t,buffer:o,tier:s.tier,missing:s.missing,requests:s.requests,bytes:s.bytes,timings:s.timings},[o]),!r.cull)return;let i=performance.now(),l=Ae(s.insts,s.pack.header,r.textures!==!1),f=performance.now()-i,c=[];for(let u of[l.studHidden,l.studUp,l.underHidden,l.studHideStep,l.underHideStep])if(u)c.push(u.buffer);self.postMessage({id:t,cull:l,ms:f},c)}catch(s){if(s instanceof Ee||s?.code==="ldr-budget")self.postMessage({id:t,phase:"error",error:String(s?.message??s),budget:{bodyTris:s.bodyTris,packBytes:s.packBytes,maxBodyTris:s.maxBodyTris,maxPackBytes:s.maxPackBytes}});else self.postMessage({id:t,phase:"error",error:String(s?.message??s)})}};\n';
|
|
4349
4395
|
|
|
4350
|
-
// ../../../../../../../tmp/ldr-build-
|
|
4396
|
+
// ../../../../../../../tmp/ldr-build-dLNbNv/src/cdn.ts
|
|
4351
4397
|
var worker;
|
|
4352
4398
|
var seq = 0;
|
|
4353
4399
|
var pending = new Map;
|