worldorbit 2.5.17 → 2.6.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.
@@ -1,12 +1,12 @@
1
- "use strict";var WorldOrbitCore=(()=>{var Ke=Object.defineProperty;var Yn=Object.getOwnPropertyDescriptor;var qn=Object.getOwnPropertyNames;var Hn=Object.prototype.hasOwnProperty;var Gn=(e,t)=>{for(var n in t)Ke(e,n,{get:t[n],enumerable:!0})},Kn=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of qn(t))!Hn.call(e,i)&&i!==n&&Ke(e,i,{get:()=>t[i],enumerable:!(r=Yn(t,i))||r.enumerable});return e};var Zn=e=>Kn(Ke({},"__esModule",{value:!0}),e);var ka={};Gn(ka,{WORLDORBIT_FIELD_KEYS:()=>vt,WORLDORBIT_FIELD_SCHEMAS:()=>Ze,WORLDORBIT_OBJECT_TYPES:()=>fe,WorldOrbitError:()=>u,cloneAtlasDocument:()=>Ye,createDiagnostic:()=>xt,createEmptyAtlasDocument:()=>lt,detectWorldOrbitSchemaVersion:()=>ht,diagnosticFromError:()=>F,extractWorldOrbitBlocks:()=>Nn,formatAtlasDocument:()=>Ce,formatDocument:()=>Be,formatDraftDocument:()=>nt,getAtlasDocumentNode:()=>ut,getFieldSchema:()=>D,isKnownFieldKey:()=>Xe,listAtlasDocumentPaths:()=>Ln,load:()=>va,loadWorldOrbitSource:()=>He,loadWorldOrbitSourceWithDiagnostics:()=>yt,materializeAtlasDocument:()=>Ie,materializeDraftDocument:()=>Kt,normalizeDocument:()=>V,normalizeWithDiagnostics:()=>Ot,parse:()=>Cn,parseSafe:()=>Ia,parseWithDiagnostics:()=>Te,parseWorldOrbit:()=>G,parseWorldOrbitAtlas:()=>We,parseWorldOrbitDraft:()=>gn,removeAtlasDocumentNode:()=>Sn,render:()=>wa,renderDocumentToScene:()=>re,resolveAtlasDiagnosticPath:()=>pt,resolveAtlasDiagnostics:()=>ft,rotatePoint:()=>Mt,stringify:()=>$a,supportsObjectType:()=>Je,tokenizeLine:()=>It,tokenizeLineDetailed:()=>ne,unitFamilyAllowsUnit:()=>pe,updateAtlasDocumentNode:()=>An,upgradeDocumentToDraftV2:()=>Ne,upgradeDocumentToV2:()=>ve,upsertAtlasDocumentNode:()=>dt,validateAtlasDocumentWithDiagnostics:()=>Tn,validateDocument:()=>W,validateDocumentWithDiagnostics:()=>Lt});var u=class e extends Error{line;column;constructor(t,n,r){let i=n===void 0?"":` (line ${n}${r===void 0?"":`, column ${r}`})`;super(`${t}${i}`),this.name="WorldOrbitError",this.line=n,this.column=r}static fromLocation(t,n){return new e(t,n?.line,n?.column)}};var de=["system","star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],E=de.filter(e=>e!=="system"),Xn=["star","planet","moon","asteroid","comet","structure","phenomenon"],wt=["structure","phenomenon"],H=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],Jn=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"];function w(e,t){return{key:e,...t}}var fe=new Set(de),Ze=new Map([w("orbit",{kind:"string",placement:!0,arity:"single",objectTypes:H}),w("distance",{kind:"unit",placement:!0,arity:"single",objectTypes:H,unitFamily:"distance"}),w("semiMajor",{kind:"unit",placement:!0,arity:"single",objectTypes:H,unitFamily:"distance"}),w("eccentricity",{kind:"number",placement:!0,arity:"single",objectTypes:H}),w("period",{kind:"unit",placement:!0,arity:"single",objectTypes:H,unitFamily:"duration"}),w("angle",{kind:"unit",placement:!0,arity:"single",objectTypes:H,unitFamily:"angle"}),w("inclination",{kind:"unit",placement:!0,arity:"single",objectTypes:H,unitFamily:"angle"}),w("phase",{kind:"unit",placement:!0,arity:"single",objectTypes:H,unitFamily:"angle"}),w("at",{kind:"string",placement:!0,arity:"single",objectTypes:wt}),w("surface",{kind:"string",placement:!0,arity:"single",objectTypes:wt}),w("free",{kind:"string",placement:!0,arity:"single",objectTypes:Jn}),w("kind",{kind:"string",placement:!1,arity:"single",objectTypes:E}),w("class",{kind:"string",placement:!1,arity:"single",objectTypes:E}),w("culture",{kind:"string",placement:!1,arity:"single",objectTypes:E}),w("tags",{kind:"list",placement:!1,arity:"multiple",objectTypes:de}),w("color",{kind:"string",placement:!1,arity:"single",objectTypes:de}),w("image",{kind:"string",placement:!1,arity:"single",objectTypes:Xn}),w("hidden",{kind:"boolean",placement:!1,arity:"single",objectTypes:de}),w("radius",{kind:"unit",placement:!1,arity:"single",objectTypes:E,unitFamily:"radius"}),w("mass",{kind:"unit",placement:!1,arity:"single",objectTypes:E,unitFamily:"mass"}),w("density",{kind:"unit",placement:!1,arity:"single",objectTypes:E,unitFamily:"generic"}),w("gravity",{kind:"unit",placement:!1,arity:"single",objectTypes:E,unitFamily:"generic"}),w("temperature",{kind:"unit",placement:!1,arity:"single",objectTypes:E,unitFamily:"generic"}),w("albedo",{kind:"number",placement:!1,arity:"single",objectTypes:E}),w("atmosphere",{kind:"string",placement:!1,arity:"single",objectTypes:["planet","moon","asteroid","comet","phenomenon"]}),w("inner",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),w("outer",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),w("view",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),w("scale",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),w("units",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),w("title",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),w("on",{kind:"string",placement:!1,arity:"single",objectTypes:E}),w("source",{kind:"string",placement:!1,arity:"single",objectTypes:E}),w("cycle",{kind:"unit",placement:!1,arity:"single",objectTypes:E,unitFamily:"duration"})].map(e=>[e.key,e])),vt=new Set(Ze.keys());function D(e){return Ze.get(e)}function Xe(e){return vt.has(e)}function Je(e,t){return e.objectTypes.includes(t)}function pe(e,t){switch(e){case"distance":return t===null||["au","km","m","ly","pc","kpc","re","sol"].includes(t);case"radius":return t===null||["km","m","re","rj","sol"].includes(t);case"mass":return t===null||["me","mj","sol"].includes(t);case"duration":return t===null||["s","min","h","d","y","ky","my","gy"].includes(t);case"angle":return t===null||t==="deg";case"generic":return!0}}function It(e){return ne(e).map(t=>t.value)}function ne(e,t={}){let n=[],r=t.columnOffset??0,i="",a=null,o=!1,s=!1,c=null,l=()=>{a!==null&&(n.push({value:i,column:a,quoted:o}),i="",a=null,o=!1)};for(let d=0;d<e.length;d++){let f=e[d],p=r+d+1;if(s&&f==="\\"){let m=e[d+1];if(m==='"'||m==="\\"){i+=m,d++;continue}}if(f==='"'){s?s=!1:(a===null&&(a=p),o=!0,c=p,s=!0);continue}if(!s&&/\s/.test(f)){l();continue}a===null&&(a=p),i+=f}if(s)throw new u("Unclosed quote in line",t.line,c??r+e.length);return l(),n}function Le(e){return e.match(/^\s*/)?.[0].length??0}function G(e){let t=e.split(/\r?\n/),n=[],r=null,i=!1,a=null;for(let o=0;o<t.length;o++){let s=t[o],c=o+1;if(!s.trim())continue;let l=Le(s),d=ne(s.slice(l),{line:c,columnOffset:l});if(d.length!==0){if(l===0){i=!1,a=null;let f=Qn(d,c);n.push(f),r=f;continue}if(!r)throw new u("Indented line without parent object",c,l+1);if(d.length===1&&d[0].value==="info"){i=!0,a=l;continue}i&&l<=(a??0)&&(i=!1),i?r.infoEntries.push(nr(d,c)):r.blockFields.push(tr(d,c))}}return{type:"document",objects:n}}function Qn(e,t){if(e.length<2)throw new u("Invalid object declaration",t,e[0]?.column??1);let[n,r,...i]=e;if(!fe.has(n.value))throw new u(`Unknown object type "${n.value}"`,t,n.column);return{type:"object",objectType:n.value,name:r.value,inlineFields:er(i,t),blockFields:[],infoEntries:[],location:{line:t,column:n.column}}}function er(e,t){let n=[],r=0;for(;r<e.length;){let i=e[r],a=D(i.value);if(!a)throw new u(`Unknown field "${i.value}"`,t,i.column);r++;let o=[];if(a.arity==="multiple")for(;r<e.length&&!Xe(e[r].value);)o.push(e[r]),r++;else{let s=e[r];s&&(o.push(s),r++)}if(o.length===0)throw new u(`Missing value for field "${i.value}"`,t,i.column);n.push({type:"field",key:i.value,values:o.map(s=>s.value),location:{line:t,column:i.column}})}return n}function tr(e,t){if(e.length<2)throw new u("Invalid field line",t,e[0]?.column??1);if(!D(e[0].value))throw new u(`Unknown field "${e[0].value}"`,t,e[0].column);return{type:"field",key:e[0].value,values:e.slice(1).map(n=>n.value),location:{line:t,column:e[0].column}}}function nr(e,t){if(e.length<2)throw new u("Invalid info entry",t,e[0]?.column??1);return{type:"info-entry",key:e[0].value,value:e.slice(1).map(n=>n.value).join(" "),location:{line:t,column:e[0].column}}}var $t=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,rr=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),ir=/^[A-Za-z][A-Za-z0-9+.-]*:/;function V(e){let t=null,n=[];for(let r of e.objects){let i=or(r);if(r.objectType==="system"){if(t)throw u.fromLocation("Only one system object is allowed",r.location);t=i}else n.push(i)}return{format:"worldorbit",version:"1.0",schemaVersion:"1.0",system:t,groups:[],relations:[],events:[],objects:n}}function or(e){let t=[...e.inlineFields,...e.blockFields];ar(e.objectType,t);let n=sr(t),r=cr(e.objectType,n),i=lr(n),a=fr(e.infoEntries);return e.objectType==="system"?{type:"system",id:e.name,title:typeof i.title=="string"?i.title:null,description:null,epoch:null,referencePlane:null,properties:i,info:a}:{type:e.objectType,id:e.name,properties:i,placement:r,info:a}}function ar(e,t){for(let n of t){let r=D(n.key);if(!r)throw u.fromLocation(`Unknown field "${n.key}"`,n.location);if(!Je(r,e))throw u.fromLocation(`Field "${n.key}" is not valid on "${e}"`,n.location);if(r.arity==="single"&&n.values.length!==1)throw u.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function sr(e){let t=new Map;for(let n of e){if(t.has(n.key))throw u.fromLocation(`Duplicate field "${n.key}"`,n.location);t.set(n.key,n)}return t}function cr(e,t){let n=t.has("orbit"),r=t.has("at"),i=t.has("surface"),a=t.has("free"),o=[n,r,i,a].filter(Boolean).length;if(o>1){let s=t.get("orbit")??t.get("at")??t.get("surface")??t.get("free");throw u.fromLocation("Object has multiple placement modes",s?.location)}if(e==="system"&&o>0)throw u.fromLocation("System objects cannot declare placement",[...t.values()][0]?.location);if(n)return{mode:"orbit",target:Ae(t,"orbit"),distance:oe(t,"distance"),semiMajor:oe(t,"semiMajor"),eccentricity:hr(t,"eccentricity"),period:oe(t,"period"),angle:oe(t,"angle"),inclination:oe(t,"inclination"),phase:oe(t,"phase")};if(r){let s=Se(t,"at"),c=Ae(t,"at");return{mode:"at",target:c,reference:pr(c,s.location)}}if(i)return{mode:"surface",target:Ae(t,"surface")};if(a){let s=Ae(t,"free"),c=mr(s);return{mode:"free",distance:c??void 0,descriptor:c?void 0:s}}return null}function lr(e){let t={};for(let[n,r]of e.entries()){let i=D(n);if(!(!i||i.placement))switch(i.kind){case"list":t[n]=r.values;break;case"boolean":t[n]=yr(r);break;case"number":t[n]=jt(ae(r),n,r.location);break;case"unit":t[n]=kt(ae(r),r.location,n);break;case"string":t[n]=ur(n,r);break}}return t}function ur(e,t){let n=t.values.join(" ").trim();return e==="image"&&dr(n,t.location),n}function dr(e,t){if(!e)throw u.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw u.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match(ir);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw u.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function fr(e){let t={};for(let n of e){if(n.key in t)throw u.fromLocation(`Duplicate info key "${n.key}"`,n.location);t[n.key]=n.value}return t}function pr(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw u.fromLocation(`Invalid special position "${e}"`,t);let n=e.match(/^([A-Za-z0-9._-]+)-([A-Za-z0-9._-]+):(L[1-5])$/);if(n)return{kind:"lagrange",primary:n[1],secondary:n[2],point:n[3]};let r=e.match(/^([A-Za-z0-9._-]+):(L[1-5])$/);if(r)return{kind:"lagrange",primary:r[1],secondary:null,point:r[2]};if(/^[A-Za-z0-9._-]+:L\d+$/i.test(e))throw u.fromLocation(`Invalid special position "${e}"`,t);let i=e.match(/^([A-Za-z0-9._-]+):([A-Za-z0-9._-]+)$/);return i?{kind:"anchor",objectId:i[1],anchor:i[2]}:{kind:"named",name:e}}function kt(e,t,n){let r=e.match($t);if(!r)throw u.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let a=D(n);if(a?.unitFamily&&!pe(a.unitFamily,i.unit))throw u.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function mr(e){let t=e.match($t);return t?{value:Number(t[1]),unit:t[2]??null}:null}function oe(e,t){if(!e.has(t))return;let n=Se(e,t);return kt(ae(n),n.location,t)}function hr(e,t){if(!e.has(t))return;let n=Se(e,t);return jt(ae(n),t,n.location)}function jt(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw u.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function yr(e){let t=ae(e).toLowerCase(),n=rr.get(t);if(n===void 0)throw u.fromLocation(`Invalid boolean value "${t}" for "${e.key}"`,e.location);return n}function Se(e,t){let n=e.get(t);if(!n)throw new u(`Missing value for key "${t}"`);return n}function Ae(e,t){return ae(Se(e,t))}function ae(e){if(e.values.length!==1)throw u.fromLocation(`Field "${e.key}" expects exactly one value`,e.location);return e.values[0]}var gr=new Set(["star","planet","moon","asteroid","comet"]);function W(e){let t=new Set,n=new Map;for(let r of e.objects){if(t.has(r.id))throw new u(`Duplicate object id "${r.id}"`);t.add(r.id),n.set(r.id,r)}for(let r of e.objects)if(r.placement){if((r.placement.mode==="orbit"||r.placement.mode==="surface")&&!t.has(r.placement.target))throw new u(`Unknown placement target "${r.placement.target}" on "${r.id}"`);if(r.placement.mode==="surface"){let i=n.get(r.placement.target);if(!i||!gr.has(i.type))throw new u(`Surface target "${r.placement.target}" on "${r.id}" is not surface-capable`)}r.placement.mode==="at"&&(r.placement.reference.kind==="lagrange"&&br(r,r.placement.reference,t),r.placement.reference.kind==="anchor"&&wr(r,r.placement.reference,t))}}function br(e,t,n){if(!n.has(t.primary))throw new u(`Unknown Lagrange reference "${t.primary}" on "${e.id}"`);if(t.secondary&&!n.has(t.secondary))throw new u(`Unknown Lagrange reference "${t.secondary}" on "${e.id}"`)}function wr(e,t,n){if(!n.has(t.objectId))throw new u(`Unknown anchor target "${t.objectId}" on "${e.id}"`)}function xt(e){return{...e}}function F(e,t,n=`${t}.failed`){return e instanceof u?{code:n,severity:"error",source:t,message:e.message,line:e.line,column:e.column}:e instanceof Error?{code:n,severity:"error",source:t,message:e.message}:{code:n,severity:"error",source:t,message:String(e)}}function Te(e){let t;try{t=G(e)}catch(r){return{ok:!1,value:null,diagnostics:[F(r,"parse")]}}let n;try{n=V(t)}catch(r){return{ok:!1,value:null,diagnostics:[F(r,"normalize")]}}try{W(n)}catch(r){return{ok:!1,value:null,diagnostics:[F(r,"validate")]}}return{ok:!0,value:{ast:t,document:n},diagnostics:[]}}function Ot(e){try{return{ok:!0,value:V(e),diagnostics:[]}}catch(t){return{ok:!1,value:null,diagnostics:[F(t,"normalize")]}}}function Lt(e){try{return W(e),{ok:!0,value:e,diagnostics:[]}}catch(t){return{ok:!1,value:null,diagnostics:[F(t,"validate")]}}}var me=1495978707e-1,vr=6371,Ir=71492,$r=695700,kr=63241.077,jr=206264.806,xr=206264806,Pt=.68,Or=.2,Et=28;function re(e,t={}){let n=Sr(t),r=n.width,i=n.height,a=n.padding,o=Ar(e),s=Dr(e,t.projection),c=Fr(o,t.scaleModel),l=Er(o),d=e.system?.id??null,f=t.activeEventId??null,p=Lr(e.objects,e.events??[],f),m=new Map(p.map(h=>[h.id,h])),b=wi(p,m),I=new Map,j=[],L=[],g=[],k=[],R=[],Q=new Map,_=new Map;for(let h of p){let P=h.placement;if(!P){g.push(h);continue}if(P.mode==="orbit"){Tt(_,P.target,h);continue}if(P.mode==="surface"){Tt(Q,P.target,h);continue}if(P.mode==="at"){R.push(h);continue}k.push(h)}let Y=k.length>0?r*.42:r/2,q=i/2,C={orbitChildren:_,surfaceChildren:Q,objectMap:m,spacingFactor:l,projection:s,scaleModel:c},A=g.find(h=>h.type==="star")??g[0]??null;A&&Qe(A,Y,q,0,I,j,L,C);let ee=g.filter(h=>h.id!==A?.id);if(ee.length>0){let h=Math.min(r,i)*.28*l*c.orbitDistanceMultiplier;ee.forEach((P,x)=>{let Ge=be(x,ee.length,-Math.PI/2),te=we(Ge,h,s,1);Qe(P,Y+te.x,q+te.y,0,I,j,L,C)})}k.forEach((h,P)=>{let x=r-a-140-xi(h.placement?.mode==="free"?h.placement.distance:void 0,c),Ge=Math.max(76,(i-a*2-180)/Math.max(1,k.length)*l)*c.freePlacementMultiplier,te=a+92+P*Ge;I.set(h.id,{object:h,x,y:te,radius:Ee(h,0,c),sortKey:Re(x,te,0)}),L.push({object:h,groupId:b.groupIds.get(h.id)??null,x1:x-60,y1:te,x2:x-18,y2:te,mode:"free"}),Fe(h,I,j,L,C,1)}),R.forEach((h,P)=>{if(I.has(h.id)||!h.placement||h.placement.mode!=="at")return;let x=gi(h.placement.reference,I,m,P,R.length,r,i,a,C);I.set(h.id,{object:h,x:x.x,y:x.y,radius:Ee(h,2,c),sortKey:Re(x.x,x.y,2),anchorX:x.anchorX,anchorY:x.anchorY}),x.anchorX!==void 0&&x.anchorY!==void 0&&L.push({object:h,groupId:b.groupIds.get(h.id)??null,x1:x.anchorX,y1:x.anchorY,x2:x.x,y2:x.y,mode:"at"}),Fe(h,I,j,L,C,2)});let T=[...I.values()].map(h=>Mr(h,c,b)),B=j.map(h=>Rr(h,b.groupIds.get(h.object.id)??null)),U=L.map(h=>_r(h)),Oe=Nr(T,r,i,c.labelMultiplier),gt=qr(e,T),bt=Hr(e.events??[],T,f),Bn=Vr(B,gt,bt,U,T,Oe),zn=Wr(T,B,U,Oe,b,c.labelMultiplier),Un=Yr(e,T),Vn=Gr(e,s,n.preset,b,m),Wn=ci(r,i,T,B,U,Oe,c.labelMultiplier);return{width:r,height:i,padding:a,renderPreset:n.preset,projection:s,scaleModel:c,title:String(e.system?.title??e.system?.properties.title??e.system?.id??"WorldOrbit")||"WorldOrbit",subtitle:`${Dt(s)} view - ${Dt(o)} layout`,systemId:d,viewMode:s,layoutPreset:o,metadata:{format:e.format,version:e.version,view:s,scale:String(e.system?.properties.scale??o),units:String(e.system?.properties.units??"mixed"),preset:n.preset??"custom"},contentBounds:Wn,layers:Bn,groups:zn,semanticGroups:Un,viewpoints:Vn,events:bt,activeEventId:f,objects:T,orbitVisuals:B,relations:gt,leaders:U,labels:Oe}}function Mt(e,t,n){let r=_e(n),i=Math.cos(r),a=Math.sin(r),o=e.x-t.x,s=e.y-t.y;return{x:t.x+o*i-s*a,y:t.y+o*a+s*i}}function Lr(e,t,n){let r=e.map(o=>structuredClone(o));if(!n)return r;let i=t.find(o=>o.id===n);if(!i)return r;let a=new Map(r.map(o=>[o.id,o]));for(let o of i.positions){let s=a.get(o.objectId);s&&(s.placement=o.placement?structuredClone(o.placement):null,o.inner?s.properties.inner={...o.inner}:delete s.properties.inner,o.outer?s.properties.outer={...o.outer}:delete s.properties.outer)}return r}function Ar(e){switch(String(e.system?.properties.scale??"balanced").toLowerCase()){case"compressed":case"compact":return"compact";case"expanded":case"presentation":return"presentation";default:return"balanced"}}function Sr(e){let t=Tr(e.preset);return{width:e.width??t.width,height:e.height??t.height,padding:e.padding??t.padding,preset:e.preset??null}}function Tr(e){switch(e){case"presentation":return{width:1440,height:900,padding:88};case"atlas-card":return{width:960,height:560,padding:56};case"markdown":return{width:920,height:540,padding:48};default:return{width:1200,height:780,padding:72}}}function Dr(e,t){return t==="topdown"||t==="isometric"?t:String(e.system?.properties.view??"topdown").toLowerCase()==="isometric"?"isometric":"topdown"}function Fr(e,t){return{...Pr(e),...t}}function Pr(e){switch(e){case"compact":return{orbitDistanceMultiplier:.84,bodyRadiusMultiplier:.92,labelMultiplier:.9,freePlacementMultiplier:.9,ringThicknessMultiplier:.92,minBodyRadius:4,maxBodyRadius:36};case"presentation":return{orbitDistanceMultiplier:1.2,bodyRadiusMultiplier:1.18,labelMultiplier:1.08,freePlacementMultiplier:1.05,ringThicknessMultiplier:1.16,minBodyRadius:5,maxBodyRadius:48};default:return{orbitDistanceMultiplier:1,bodyRadiusMultiplier:1,labelMultiplier:1,freePlacementMultiplier:1,ringThicknessMultiplier:1,minBodyRadius:4,maxBodyRadius:40}}}function Er(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function Mr(e,t,n){let{object:r,x:i,y:a,radius:o,sortKey:s,anchorX:c,anchorY:l}=e,d=r.renderHints?.renderPriority??0;return{renderId:se(r.id),objectId:r.id,object:r,parentId:n.parentIds.get(r.id)??null,ancestorIds:n.ancestorIds.get(r.id)??[],childIds:n.childIds.get(r.id)??[],groupId:n.groupIds.get(r.id)??null,semanticGroupIds:[...r.groups??[]],x:i,y:a,radius:o,visualRadius:ji(r,o,t),sortKey:s+d*.001,anchorX:c,anchorY:l,label:r.id,secondaryLabel:r.type==="structure"?String(r.properties.kind??r.type):r.type,fillColor:Li(r.properties.color),imageHref:typeof r.properties.image=="string"&&r.properties.image.trim()?r.properties.image:void 0,hidden:r.properties.hidden===!0}}function Rr(e,t){return{renderId:`${se(e.object.id)}-orbit`,objectId:e.object.id,object:e.object,parentId:e.parentId,groupId:t,semanticGroupIds:[...e.object.groups??[]],kind:e.kind,cx:e.cx,cy:e.cy,radius:e.radius,rx:e.rx,ry:e.ry,rotationDeg:e.rotationDeg,band:e.band,bandThickness:e.bandThickness,frontArcPath:e.frontArcPath,backArcPath:e.backArcPath,hidden:e.object.properties.hidden===!0||e.object.renderHints?.renderOrbit===!1}}function _r(e){return{renderId:`${se(e.object.id)}-leader-${e.mode}`,objectId:e.object.id,object:e.object,groupId:e.groupId,semanticGroupIds:[...e.object.groups??[]],x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,mode:e.mode,hidden:e.object.properties.hidden===!0}}function Nr(e,t,n,r){let i=[],a=[],o=new Map(e.map(c=>[c.objectId,c])),s=[...e].filter(c=>!c.hidden&&c.object.renderHints?.renderLabel!==!1).sort(Cr);for(let c of s){let l=Br(c,o,a,t,n,r)??_t(c,Rt(c,o.get(c.parentId??"")??null,n),0,r);a.push(Vt(c,l,r)),i.push({renderId:`${c.renderId}-label`,objectId:c.objectId,object:c.object,groupId:c.groupId,semanticGroupIds:[...c.semanticGroupIds],label:c.label,secondaryLabel:c.secondaryLabel,x:l.x,y:l.labelY,secondaryY:l.secondaryY,textAnchor:l.textAnchor,direction:l.direction,hidden:c.hidden})}return i}function Cr(e,t){let n=At(e)-At(t);if(n!==0)return n;let r=(t.object.renderHints?.renderPriority??0)-(e.object.renderHints?.renderPriority??0);return r!==0?r:e.sortKey-t.sortKey}function At(e){switch(e.object.type){case"star":return 0;case"planet":return 1;case"moon":return 2;case"belt":case"ring":return 3;case"asteroid":case"comet":return 4;case"structure":case"phenomenon":return 5}}function Br(e,t,n,r,i,a){for(let o of zr(e,t,r,i)){let s=o==="left"||o==="right"?4:6;for(let c=0;c<=s;c+=1){let l=_t(e,o,c,a),d=Vt(e,l,a);if(!n.some(f=>$i(f,d)))return l}}return null}function zr(e,t,n,r){let i=e.parentId?t.get(e.parentId)??null:null,a=Rt(e,i,r),o=a==="below"?"above":"below",s=Ur(e,i,n),c=s==="right"?"left":"right";return e.object.type==="structure"||e.object.type==="phenomenon"||e.object.placement?.mode==="at"||e.object.placement?.mode==="surface"||e.object.placement?.mode==="free"?[s,a,c,o]:[a,s,o,c]}function Rt(e,t,n){return t&&Math.abs(e.y-t.y)>6?e.y>=t.y?"below":"above":e.y>n*.62?"above":"below"}function Ur(e,t,n){return t&&Math.abs(e.x-t.x)>6?e.x>=t.x?"right":"left":e.x>=n/2?"right":"left"}function _t(e,t,n,r){let i=14*r;switch(t){case"above":{let a=e.y-(e.radius+18*r+n*i);return{x:e.x,labelY:a,secondaryY:a-16*r,textAnchor:"middle",direction:t}}case"below":{let a=e.y+e.radius+18*r+n*i;return{x:e.x,labelY:a,secondaryY:a+16*r,textAnchor:"middle",direction:t}}case"left":{let a=e.x-(e.visualRadius+16*r+n*i),o=e.y-4*r;return{x:a,labelY:o,secondaryY:o+16*r,textAnchor:"end",direction:t}}case"right":{let a=e.x+e.visualRadius+16*r+n*i,o=e.y-4*r;return{x:a,labelY:o,secondaryY:o+16*r,textAnchor:"start",direction:t}}}}function Vr(e,t,n,r,i,a){let o=e.filter(c=>!c.hidden&&!!c.backArcPath).map(c=>c.renderId),s=e.filter(c=>!c.hidden).map(c=>c.renderId);return[{id:"background",renderIds:["wo-bg","wo-bg-glow","wo-grid"]},{id:"guides",renderIds:r.filter(c=>!c.hidden).map(c=>c.renderId)},{id:"orbits-back",renderIds:o},{id:"orbits-front",renderIds:s},{id:"relations",renderIds:t.filter(c=>!c.hidden).map(c=>c.renderId)},{id:"events",renderIds:n.filter(c=>!c.hidden).map(c=>c.renderId)},{id:"objects",renderIds:i.filter(c=>!c.hidden).map(c=>c.renderId)},{id:"labels",renderIds:a.filter(c=>!c.hidden).map(c=>c.renderId)},{id:"metadata",renderIds:["wo-title","wo-subtitle","wo-meta"]}]}function Wr(e,t,n,r,i,a){let o=new Map,s=c=>{if(!c)return null;let l=o.get(c);if(l)return l;let d=i.groupRoots.get(c)??null,f={renderId:c,rootObjectId:d,label:d??c,objectIds:[],orbitIds:[],labelIds:[],leaderIds:[],contentBounds:ge(0,0,0,0)};return o.set(c,f),f};for(let c of e){let l=s(c.groupId);l&&!c.hidden&&l.objectIds.push(c.objectId)}for(let c of t){let l=s(c.groupId);l&&!c.hidden&&l.orbitIds.push(c.objectId)}for(let c of n){let l=s(c.groupId);l&&!c.hidden&&l.leaderIds.push(c.objectId)}for(let c of r){let l=s(c.groupId);l&&!c.hidden&&l.labelIds.push(c.objectId)}for(let c of o.values())c.contentBounds=vi(c,e,t,n,r,a);return[...o.values()].sort((c,l)=>c.label.localeCompare(l.label))}function Yr(e,t){return[...e.groups].map(n=>({id:n.id,label:n.label,summary:n.summary,color:n.color,tags:[...n.tags],hidden:n.hidden,objectIds:t.filter(r=>!r.hidden&&r.semanticGroupIds.includes(n.id)).map(r=>r.objectId)})).sort((n,r)=>n.label.localeCompare(r.label))}function qr(e,t){let n=new Map(t.map(r=>[r.objectId,r]));return e.relations.map(r=>{let i=n.get(r.from),a=n.get(r.to);return{renderId:`${se(r.id)}-relation`,relationId:r.id,relation:r,fromObjectId:r.from,toObjectId:r.to,x1:i?.x??0,y1:i?.y??0,x2:a?.x??0,y2:a?.y??0,hidden:r.hidden||!i||!a||i.hidden||a.hidden}}).sort((r,i)=>r.relation.id.localeCompare(i.relation.id))}function Hr(e,t,n){let r=new Map(t.map(i=>[i.objectId,i]));return e.map(i=>{let a=[...new Set([...i.targetObjectId?[i.targetObjectId]:[],...i.participantObjectIds])],o=a.map(l=>r.get(l)).filter(Boolean),s=o.length>0?o.reduce((l,d)=>l+d.x,0)/o.length:0,c=o.length>0?o.reduce((l,d)=>l+d.y,0)/o.length:0;return{renderId:`${se(i.id)}-event`,eventId:i.id,event:i,objectIds:a,participantIds:[...i.participantObjectIds],targetObjectId:i.targetObjectId,x:s,y:c,hidden:i.hidden||o.length===0||o.every(l=>l.hidden)||n!==null&&i.id!==n}}).sort((i,a)=>i.event.id.localeCompare(a.event.id))}function Gr(e,t,n,r,i){let a=Kr(e,t,n),o=new Map;for(let[l,d]of Object.entries(e.system?.info??{})){if(!l.startsWith("viewpoint."))continue;let[f,p,...m]=l.split(".");if(f!=="viewpoint"||!p||m.length===0)continue;let b=oi(p);if(!b)continue;let I=m.join(".").toLowerCase(),j=o.get(b)??{id:b};Zr(j,I,d,e,t,n,r,i),o.set(b,j)}let s=[...o.values()].map(l=>Xr(l,t,n,i)).filter(Boolean),c=s.findIndex(l=>l.id===a.id);return c>=0?s.splice(c,1,{...a,...s[c],layers:{...a.layers,...s[c].layers},filter:s[c].filter??a.filter,generated:!1}):s.unshift(a),s.sort((l,d)=>l.id==="overview"?-1:d.id==="overview"?1:l.label.localeCompare(d.label))}function Kr(e,t,n){let r=e.system?.title??e.system?.properties.title;return{id:"overview",label:r?`${String(r)} Overview`:"Overview",summary:"Fit the whole system with the current atlas defaults.",objectId:null,selectedObjectId:null,eventIds:[],projection:t,preset:n,rotationDeg:0,scale:null,layers:{},filter:null,generated:!0}}function Zr(e,t,n,r,i,a,o,s){let c=n.trim();switch(t){case"label":case"title":c&&(e.label=c);return;case"summary":case"description":c&&(e.summary=c);return;case"focus":case"object":c&&(e.focus=c);return;case"select":case"selection":c&&(e.select=c);return;case"events":e.eventIds=ye(c);return;case"projection":case"view":e.projection=Qr(c)??i;return;case"preset":e.preset=ei(c)??a;return;case"rotation":case"angle":e.rotationDeg=Nt(c)??e.rotationDeg??0;return;case"zoom":case"scale":e.scale=ti(c);return;case"layers":e.layers=ni(c);return;case"query":e.filter={...e.filter??De(),query:c||null};return;case"types":case"objecttypes":e.filter={...e.filter??De(),objectTypes:ri(c)};return;case"tags":e.filter={...e.filter??De(),tags:ye(c)};return;case"groups":e.filter={...e.filter??De(),groupIds:ii(c,r,o,s)};return}}function Xr(e,t,n,r){let i=e.focus&&r.has(e.focus)?e.focus:null,a=e.select&&r.has(e.select)?e.select:i,o=Jr(e.filter),s=e.label?.trim()||ai(e.id);return{id:e.id,label:s,summary:e.summary?.trim()||si(s,i,o),objectId:i,selectedObjectId:a,eventIds:[...new Set(e.eventIds??[])],projection:e.projection??t,preset:e.preset??n,rotationDeg:e.rotationDeg??0,scale:e.scale??null,layers:e.layers??{},filter:o,generated:!1}}function De(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Jr(e){if(!e)return null;let t={query:e.query?.trim()||null,objectTypes:[...new Set(e.objectTypes)],tags:[...new Set(e.tags)],groupIds:[...new Set(e.groupIds)]};return t.query||t.objectTypes.length>0||t.tags.length>0||t.groupIds.length>0?t:null}function Qr(e){return e.toLowerCase()==="isometric"?"isometric":e.toLowerCase()==="topdown"?"topdown":null}function ei(e){let t=e.toLowerCase();return t==="diagram"||t==="presentation"||t==="atlas-card"||t==="markdown"?t:null}function Nt(e){let t=Number(e);return Number.isFinite(t)?t:null}function ti(e){let t=Nt(e);return t!==null&&t>0?t:null}function ni(e){let t={};for(let n of ye(e)){let r=!n.startsWith("-")&&!n.startsWith("!"),i=n.replace(/^[-!]+/,"").toLowerCase();if(i==="orbits"){t["orbits-back"]=r,t["orbits-front"]=r;continue}(i==="background"||i==="guides"||i==="orbits-back"||i==="orbits-front"||i==="relations"||i==="events"||i==="objects"||i==="labels"||i==="metadata")&&(t[i]=r)}return t}function ri(e){return ye(e).filter(t=>t==="star"||t==="planet"||t==="moon"||t==="belt"||t==="asteroid"||t==="comet"||t==="ring"||t==="structure"||t==="phenomenon")}function ii(e,t,n,r){return ye(e).map(i=>t.schemaVersion==="2.1"||t.groups.some(a=>a.id===i)||i.startsWith("wo-")&&i.endsWith("-group")?i:n.groupIds.has(i)?n.groupIds.get(i)??he(i):(r.has(i),he(i)))}function ye(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function oi(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function ai(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function si(e,t,n){let r=[e];return t&&r.push(`focus ${t}`),n?.objectTypes.length&&r.push(n.objectTypes.join("/")),n?.tags.length&&r.push(`tags ${n.tags.join(", ")}`),n?.query&&r.push(`query "${n.query}"`),r.join(" - ")}function ci(e,t,n,r,i,a,o){let s=Number.POSITIVE_INFINITY,c=Number.POSITIVE_INFINITY,l=Number.NEGATIVE_INFINITY,d=Number.NEGATIVE_INFINITY,f=(p,m)=>{s=Math.min(s,p),c=Math.min(c,m),l=Math.max(l,p),d=Math.max(d,m)};for(let p of r)p.hidden||Ct(p,f);for(let p of i)p.hidden||(f(p.x1,p.y1),f(p.x2,p.y2));for(let p of n)p.hidden||Bt(p,f);for(let p of a)p.hidden||zt(p,f,o);return!Number.isFinite(s)||!Number.isFinite(c)?ge(0,0,e,t):ge(s,c,l,d)}function Ct(e,t){let n=e.bandThickness!==void 0?e.bandThickness/2+4:e.band?10:3;if(e.kind==="circle"&&e.radius!==void 0){t(e.cx-e.radius-n,e.cy-e.radius-n),t(e.cx+e.radius+n,e.cy+e.radius+n);return}let r=e.rx??e.radius??0,i=e.ry??e.radius??0,a=Yt(e.cx,e.cy,r,i,e.rotationDeg,0,Math.PI*2,Et*2);for(let o of a)t(o.x-n,o.y-n),t(o.x+n,o.y+n)}function ge(e,t,n,r){return{minX:e,minY:t,maxX:n,maxY:r,width:n-e,height:r-t,centerX:e+(n-e)/2,centerY:t+(r-t)/2}}function Bt(e,t){t(e.x-e.visualRadius-24,e.y-e.visualRadius-16),t(e.x+e.visualRadius+24,e.y+e.visualRadius+36)}function zt(e,t,n){let r=Wt(e.x,e.y,e.secondaryY,e.textAnchor,e.direction,e.label,e.secondaryLabel,n);t(r.left,r.top),t(r.right,r.bottom)}function Qe(e,t,n,r,i,a,o,s){i.has(e.id)||(i.set(e.id,{object:e,x:t,y:n,radius:Ee(e,r,s.scaleModel),sortKey:Re(t,n,r)}),Fe(e,i,a,o,s,r+1))}function Fe(e,t,n,r,i,a){let o=t.get(e.id);if(!o)return;let s=[...i.orbitChildren.get(e.id)??[]].sort(li),c=ui(s,o.radius,i.spacingFactor,i.scaleModel),l=pi(s,c);s.forEach((f,p)=>{let m=di(f,p,s.length,o,c,l[p]??c.innerPx,i);n.push({object:f,parentId:e.id,kind:m.kind,cx:m.cx,cy:m.cy,radius:m.radius,rx:m.rx,ry:m.ry,rotationDeg:m.rotationDeg,band:m.band,bandThickness:m.bandThickness,frontArcPath:m.frontArcPath,backArcPath:m.backArcPath}),Qe(f,m.objectX,m.objectY,a,t,n,r,i)});let d=[...i.surfaceChildren.get(e.id)??[]];d.forEach((f,p)=>{let m=be(p,d.length,-Math.PI/3),b=28*i.spacingFactor,I=we(m,o.radius,i.projection,i.projection==="isometric"?.9:1),j=we(m,o.radius+b,i.projection,i.projection==="isometric"?.9:1),L=o.x+I.x,g=o.y+I.y,k=o.x+j.x,R=o.y+j.y;t.set(f.id,{object:f,x:k,y:R,radius:Ee(f,a+1,i.scaleModel),sortKey:Re(k,R,a+1),anchorX:L,anchorY:g}),r.push({object:f,groupId:i.objectMap.has(f.id)?he(Ii(f,i.objectMap)):null,x1:L,y1:g,x2:k,y2:R,mode:"surface"}),Fe(f,t,n,r,i,a+1)})}function li(e,t){let n=Pe(e),r=Pe(t);return n!==null&&r!==null&&n!==r?n-r:n!==null&&r===null?-1:n===null&&r!==null?1:e.id.localeCompare(t.id)}function ui(e,t,n,r){let i=e.map(f=>Pe(f)),a=i.filter(f=>f!==null),o=t+56*n*r.orbitDistanceMultiplier,s=(e.length>2?54:64)*n*r.orbitDistanceMultiplier;if(a.length===0)return{metrics:i,minMetric:0,maxMetric:0,metricSpread:0,innerPx:o,stepPx:s,pixelSpread:Math.max(s*Math.max(e.length-1,1),s),minimumGapPx:s*.42};let c=Math.min(...a),l=Math.max(...a),d=l-c;return{metrics:i,minMetric:c,maxMetric:l,metricSpread:d,innerPx:o,stepPx:s,pixelSpread:Math.max(s*Math.max(e.length-1,1),s),minimumGapPx:s*.42}}function di(e,t,n,r,i,a,o){let s=e.placement,c=e.type==="belt"||e.type==="ring";if(!s||s.mode!=="orbit"){let q=i.innerPx+t*i.stepPx;return{kind:"circle",cx:r.x,cy:r.y,radius:q,rotationDeg:0,band:c,bandThickness:c?12*o.scaleModel.ringThicknessMultiplier:void 0,objectX:r.x,objectY:r.y-q}}let l=O(typeof s.eccentricity=="number"?s.eccentricity:0,0,.92),d=a,f=Math.max(d*Math.sqrt(1-l*l),d*.18),p=tt(s.inclination)??0,m=o.projection==="isometric"?Math.max(Or,Math.cos(_e(p)))*Pt:1,b=Math.max(f*m,d*.14),I=tt(s.angle)??0,j=d*l,L=Ht(-j,0,I),g=r.x+L.x,k=r.y+L.y,R=hi(s.phase,t,n),Q=qt(g,k,d,b,I,R),_=o.projection==="topdown"&&l<=1e-4&&Math.abs(I)<=1e-4,Y=c?yi(e,d,i,o.scaleModel):void 0;return{kind:_?"circle":"ellipse",cx:_?r.x:g,cy:_?r.y:k,radius:_?d:void 0,rx:_?void 0:d,ry:_?void 0:b,rotationDeg:I,band:c,bandThickness:Y,frontArcPath:o.projection==="isometric"||c?St(g,k,d,b,I,0,Math.PI):void 0,backArcPath:o.projection==="isometric"||c?St(g,k,d,b,I,Math.PI,Math.PI*2):void 0,objectX:Q.x,objectY:Q.y}}function fi(e,t){return t.innerPx+t.stepPx*mi(Math.max(e,0)+1)}function pi(e,t){let n=[];return e.forEach((r,i)=>{let a=Pe(r),o=t.innerPx+i*t.stepPx,s=a===null?o:fi(a,t),c=i===0?t.innerPx:(n[i-1]??t.innerPx)+t.minimumGapPx;n.push(Math.max(s,c))}),n}function Pe(e){return!e.placement||e.placement.mode!=="orbit"?null:Me(e.placement.semiMajor??e.placement.distance??null)}function mi(e){return Math.log(e)/Math.log(2)}function hi(e,t,n){let r=e?tt(e):null;return r!==null?_e(r-90):be(t,n,-Math.PI/2)}function yi(e,t,n,r){let i=Me(et(e.properties.inner)),a=Me(et(e.properties.outer));if(i!==null&&a!==null){let s=Math.abs(a-i);if(n.metricSpread>0)return O(s/n.metricSpread*n.pixelSpread*r.ringThicknessMultiplier,8,54);let c=Math.max(Math.max(i,a),1e-4);return O(s/c*t*.75*r.ringThicknessMultiplier,8,48)}return(e.type==="belt"?18:12)*r.ringThicknessMultiplier}function gi(e,t,n,r,i,a,o,s,c){if(e.kind==="lagrange")return bi(e,t,n,a,o);if(e.kind==="anchor"){let l=t.get(e.objectId);if(l){let d=be(r,i,Math.PI/5),f=(l.radius+36)*c.scaleModel.labelMultiplier,p=we(d,f,c.projection,c.projection==="isometric"?.92:1);return{x:l.x+p.x,y:l.y+p.y,anchorX:l.x,anchorY:l.y}}}if(e.kind==="named"){let l=t.get(e.name);if(l){let d=be(r,i,Math.PI/6),f=(l.radius+36)*c.scaleModel.labelMultiplier,p=we(d,f,c.projection,c.projection==="isometric"?.92:1);return{x:l.x+p.x,y:l.y+p.y,anchorX:l.x,anchorY:l.y}}}return{x:a-s-170,y:o-s-86-r*58*c.scaleModel.freePlacementMultiplier}}function bi(e,t,n,r,i){let a=e.secondary?t.get(e.primary):ki(e.primary,t,n),o=t.get(e.secondary??e.primary);if(!a||!o)return{x:r*.7,y:i*.25};let s=o.x-a.x,c=o.y-a.y,l=Math.hypot(s,c)||1,d=s/l,f=c/l,p=-f,m=d,b=O(l*.25,24,68);switch(e.point){case"L1":return{x:o.x-d*b,y:o.y-f*b,anchorX:o.x,anchorY:o.y};case"L2":return{x:o.x+d*b,y:o.y+f*b,anchorX:o.x,anchorY:o.y};case"L3":return{x:a.x-d*b,y:a.y-f*b,anchorX:a.x,anchorY:a.y};case"L4":return{x:o.x+(d*.5-p*.8660254)*b,y:o.y+(f*.5-m*.8660254)*b,anchorX:o.x,anchorY:o.y};case"L5":return{x:o.x+(d*.5+p*.8660254)*b,y:o.y+(f*.5+m*.8660254)*b,anchorX:o.x,anchorY:o.y}}}function wi(e,t){let n=new Map,r=new Map;for(let l of e){let d=Ut(l,t);if(n.set(l.id,d),d){let f=r.get(d);f?f.push(l.id):r.set(d,[l.id])}r.has(l.id)||r.set(l.id,[])}let i=new Map,a=new Map,o=new Map,s=l=>{let d=i.get(l);if(d)return d;let f=new Set,p=[],m=n.get(l)??null;for(;m&&!f.has(m);)p.push(m),f.add(m),m=n.get(m)??null;return i.set(l,p),p},c=l=>{let d=o.get(a.get(l)??"");if(d)return d;let f=n.get(l)??null,p=t.get(l),m=l;return p?.placement&&p.placement.mode!=="free"&&f&&(m=c(f)),m};for(let l of e){s(l.id);let d=c(l.id),f=he(d);a.set(l.id,f),o.set(f,d)}return{parentIds:n,childIds:r,ancestorIds:i,groupIds:a,groupRoots:o}}function Ut(e,t){let n=e.placement;if(!n)return null;switch(n.mode){case"orbit":case"surface":return t.has(n.target)?n.target:null;case"at":switch(n.reference.kind){case"anchor":return t.has(n.reference.objectId)?n.reference.objectId:null;case"named":return t.has(n.reference.name)?n.reference.name:null;case"lagrange":return n.reference.secondary&&t.has(n.reference.secondary)?n.reference.secondary:t.has(n.reference.primary)?n.reference.primary:null}case"free":return null}}function vi(e,t,n,r,i,a){let o=Number.POSITIVE_INFINITY,s=Number.POSITIVE_INFINITY,c=Number.NEGATIVE_INFINITY,l=Number.NEGATIVE_INFINITY,d=(f,p)=>{o=Math.min(o,f),s=Math.min(s,p),c=Math.max(c,f),l=Math.max(l,p)};for(let f of t)!f.hidden&&e.objectIds.includes(f.objectId)&&Bt(f,d);for(let f of n)!f.hidden&&e.orbitIds.includes(f.objectId)&&Ct(f,d);for(let f of r)!f.hidden&&e.leaderIds.includes(f.objectId)&&(d(f.x1,f.y1),d(f.x2,f.y2));for(let f of i)!f.hidden&&e.labelIds.includes(f.objectId)&&zt(f,d,a);return!Number.isFinite(o)||!Number.isFinite(s)?ge(0,0,0,0):ge(o,s,c,l)}function Ii(e,t){let n=e,r=new Set;for(;n.placement&&n.placement.mode!=="free"&&!r.has(n.id);){r.add(n.id);let i=Ut(n,t);if(!i)break;let a=t.get(i);if(!a)break;n=a}return n.id}function Vt(e,t,n){return Wt(t.x,t.labelY,t.secondaryY,t.textAnchor,t.direction,e.label,e.secondaryLabel,n)}function Wt(e,t,n,r,i,a,o,s){let c=Ai(a,o,s),l=c*2,d=i==="above"?18:12,f=i==="above"?8:12,p=e-c,m=e+c;return r==="start"?(p=e,m=e+l):r==="end"&&(p=e-l,m=e),{left:p,right:m,top:Math.min(t,n)-d,bottom:Math.max(t,n)+f}}function $i(e,t){return!(e.right<t.left||t.right<e.left||e.bottom<t.top||t.bottom<e.top)}function ki(e,t,n){let r=n.get(e);return!r?.placement||r.placement.mode!=="orbit"?t.get(e):t.get(r.placement.target)}function Ee(e,t,n){let r=Oi(e.properties.radius,n);if(r!==null)return r;let i=n.bodyRadiusMultiplier;switch(e.type){case"star":return O((t===0?28:20)*i,n.minBodyRadius,n.maxBodyRadius);case"planet":return O(12*i,n.minBodyRadius,n.maxBodyRadius);case"moon":return O(7*i,n.minBodyRadius,n.maxBodyRadius);case"belt":return O(5*i,n.minBodyRadius,n.maxBodyRadius);case"asteroid":return O(5*i,n.minBodyRadius,n.maxBodyRadius);case"comet":return O(6*i,n.minBodyRadius,n.maxBodyRadius);case"ring":return O(5*i,n.minBodyRadius,n.maxBodyRadius);case"structure":return O(6*i,n.minBodyRadius,n.maxBodyRadius);case"phenomenon":return O(8*i,n.minBodyRadius,n.maxBodyRadius)}}function ji(e,t,n){let r=typeof e.properties.atmosphere=="string"?4:0;switch(e.type){case"star":return t*2.4;case"phenomenon":return t*1.25;case"structure":return t+2;default:return Math.min(t+r,n.maxBodyRadius+10)}}function Me(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/me;case"m":return e.value/1e3/me;case"ly":return e.value*kr;case"pc":return e.value*jr;case"kpc":return e.value*xr;case"re":return e.value*vr/me;case"rj":return e.value*Ir/me;case"sol":return e.value*$r/me;default:return e.value}}function xi(e,t){let n=Me(e??null);return n===null||n<=0?0:O(n*96*t.freePlacementMultiplier,0,420)}function Oi(e,t){let n=et(e);if(!n)return null;let r;switch(n.unit){case"sol":r=O(n.value*22,14,40);break;case"re":r=O(n.value*10,6,18);break;case"km":r=O(Math.log10(Math.max(n.value,1))*2.6,4,16);break;default:r=O(n.value*4,4,20);break}return O(r*t.bodyRadiusMultiplier,t.minBodyRadius,t.maxBodyRadius)}function et(e){return!e||typeof e!="object"||!("value"in e)?null:e}function tt(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function be(e,t,n){return t<=1?n:n+e*Math.PI*2/t}function St(e,t,n,r,i,a,o){let s=Yt(e,t,n,r,i,a,o,Et);return s.length===0?"":s.map((c,l)=>`${l===0?"M":"L"} ${Ft(c.x)} ${Ft(c.y)}`).join(" ")}function Yt(e,t,n,r,i,a,o,s){let c=[];for(let l=0;l<=s;l+=1){let d=a+(o-a)*l/s;c.push(qt(e,t,n,r,i,d))}return c}function qt(e,t,n,r,i,a){let o=n*Math.cos(a),s=r*Math.sin(a),c=Ht(o,s,i);return{x:e+c.x,y:t+c.y}}function Ht(e,t,n){let r=_e(n);return{x:e*Math.cos(r)-t*Math.sin(r),y:e*Math.sin(r)+t*Math.cos(r)}}function we(e,t,n,r){let i=n==="isometric"?Pt*r:r;return{x:Math.cos(e)*t,y:Math.sin(e)*t*i}}function Re(e,t,n){return t*1e3+e+n*.01}function O(e,t,n){return Math.min(Math.max(e,t),n)}function Tt(e,t,n){let r=e.get(t);r?r.push(n):e.set(t,[n])}function se(e){return`wo-${e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"object"}`}function he(e){return`${se(e)}-group`}function Li(e){return typeof e=="string"&&e.trim()?e:void 0}function Ai(e,t,n){let r=e.length*4.6*n+18,i=t.length*3.9*n+18;return Math.max(r,i,24)}function Dt(e){return e.length>0?e[0].toUpperCase()+e.slice(1):e}function _e(e){return e*Math.PI/180}function Ft(e){return Number.isInteger(e)?String(e):e.toFixed(2)}function ve(e,t={}){let n=re(e,t),r=[],i=Di(e,r),a=Fi(e,r),o=Ti(e,n.renderPreset??t.preset??null,n.projection),s=e.system?Si(e,o,i,a,r,n.renderPreset??t.preset??null):null;return n.viewpoints.some(c=>!c.generated)&&r.push({code:"upgrade.viewpoints.structured",severity:"info",source:"upgrade",message:`Promoted ${n.viewpoints.filter(c=>!c.generated).length} document-defined viewpoint(s) into the 2.0 atlas section.`}),{format:"worldorbit",version:"2.0",schemaVersion:"2.0",sourceVersion:e.version,system:s,groups:structuredClone(e.groups??[]),relations:structuredClone(e.relations??[]),events:structuredClone(e.events??[]),objects:e.objects.map(Zt),diagnostics:r}}function Ne(e,t={}){return Vi(ve(e,t))}function Ie(e,t={}){let n=e.system?{type:"system",id:e.system.id,title:e.system.title,description:e.system.description,epoch:e.system.epoch,referencePlane:e.system.referencePlane,properties:Bi(e.system),info:zi(e.system)}:null,r=e.objects.map(Zt);return Ri(r,e.events??[],t.activeEventId??null),{format:"worldorbit",version:"1.0",schemaVersion:e.version,system:n,groups:structuredClone(e.groups??[]),relations:structuredClone(e.relations??[]),events:e.events.map(Ei),objects:r}}function Kt(e){return Ie(e)}function Si(e,t,n,r,i,a){let o=re(e,{preset:a??void 0,projection:t.view});return{type:"system",id:e.system?.id??"WorldOrbit",title:e.system?.title??(typeof e.system?.properties.title=="string"?e.system.properties.title:null),description:e.system?.description??null,epoch:e.system?.epoch??null,referencePlane:e.system?.referencePlane??null,defaults:t,atlasMetadata:n,viewpoints:o.viewpoints.map(Pi),annotations:r}}function Ti(e,t,n){return{view:typeof e.system?.properties.view=="string"&&e.system.properties.view.toLowerCase()==="topdown"?"topdown":n,scale:typeof e.system?.properties.scale=="string"?e.system.properties.scale:null,units:typeof e.system?.properties.units=="string"?e.system.properties.units:null,preset:t,theme:typeof e.system?.info["atlas.theme"]=="string"?e.system.info["atlas.theme"]:null}}function Di(e,t){let n={};for(let[i,a]of Object.entries(e.system?.info??{}))i.startsWith("viewpoint.")||i.startsWith("annotation.")||(n[i]=a);let r=Object.keys(n);return r.length>0&&t.push({code:"upgrade.atlasMetadata.preserved",severity:"warning",source:"upgrade",message:`Preserved ${r.length} system info entr${r.length===1?"y":"ies"} as atlas metadata in the 2.0 atlas document.`}),n}function Fi(e,t){let n=new Map;for(let[r,i]of Object.entries(e.system?.info??{})){if(!r.startsWith("annotation."))continue;let[,a,...o]=r.split(".");if(!a||o.length===0)continue;let s=Gt(a);if(!s)continue;let c=n.get(s)??{id:s};switch(o.join(".").toLowerCase()){case"label":c.label=i;break;case"target":case"object":c.targetObjectId=i.trim()||null;break;case"body":case"text":case"description":c.body=i;break;case"tags":c.tags=Ni(i);break}n.set(s,c)}for(let r of e.objects){let i=r.info.description;if(!i)continue;let a=Gt(`${r.id}-notes`);n.has(a)||(n.set(a,{id:a,label:`${r.id} Notes`,targetObjectId:r.id,body:i,tags:Array.isArray(r.properties.tags)?r.properties.tags.filter(o=>typeof o=="string"):[]}),t.push({code:"upgrade.annotation.objectDescription",severity:"info",source:"upgrade",message:`Lifted ${r.id}.info.description into structured atlas annotation "${a}".`,objectId:r.id,field:"description"}))}return[...n.values()].filter(r=>r.body||r.label).map(r=>({id:r.id,label:r.label??Ci(r.id),targetObjectId:r.targetObjectId??null,body:r.body??"",tags:r.tags??[],sourceObjectId:r.targetObjectId??null})).sort((r,i)=>r.label.localeCompare(i.label))}function Pi(e){return{id:e.id,label:e.label,summary:e.summary,focusObjectId:e.objectId,selectedObjectId:e.selectedObjectId,events:[...e.eventIds],projection:e.projection,preset:e.preset,zoom:e.scale,rotationDeg:e.rotationDeg,layers:{...e.layers},filter:e.filter?{query:e.filter.query,objectTypes:[...e.filter.objectTypes],tags:[...e.filter.tags],groupIds:[...e.filter.groupIds]}:null}}function Zt(e){return{...e,groups:e.groups?[...e.groups]:void 0,resonance:e.resonance?{...e.resonance}:e.resonance,renderHints:e.renderHints?{...e.renderHints}:e.renderHints,deriveRules:e.deriveRules?e.deriveRules.map(t=>({...t})):void 0,validationRules:e.validationRules?e.validationRules.map(t=>({...t})):void 0,lockedFields:e.lockedFields?[...e.lockedFields]:void 0,tolerances:e.tolerances?e.tolerances.map(t=>({field:t.field,value:t.value&&typeof t.value=="object"&&"value"in t.value?{value:t.value.value,unit:t.value.unit}:Array.isArray(t.value)?[...t.value]:t.value})):void 0,typedBlocks:e.typedBlocks?Object.fromEntries(Object.entries(e.typedBlocks).map(([t,n])=>[t,{...n??{}}])):void 0,properties:_i(e.properties),placement:e.placement?structuredClone(e.placement):null,info:{...e.info}}}function Ei(e){return{...e,participantObjectIds:[...e.participantObjectIds],tags:[...e.tags],positions:e.positions.map(Mi)}}function Mi(e){return{objectId:e.objectId,placement:Xt(e.placement),inner:e.inner?{...e.inner}:void 0,outer:e.outer?{...e.outer}:void 0}}function Xt(e){return e?structuredClone(e):null}function Ri(e,t,n){if(!n)return;let r=t.find(a=>a.id===n);if(!r)return;let i=new Map(e.map(a=>[a.id,a]));for(let a of r.positions){let o=i.get(a.objectId);o&&(o.placement=Xt(a.placement),a.inner?o.properties.inner={...a.inner}:delete o.properties.inner,a.outer?o.properties.outer={...a.outer}:delete o.properties.outer)}}function _i(e){let t={};for(let[n,r]of Object.entries(e)){if(Array.isArray(r)){t[n]=[...r];continue}if(r&&typeof r=="object"&&"value"in r){t[n]={value:r.value,unit:r.unit};continue}t[n]=r}return t}function Ni(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function Gt(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function Ci(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Bi(e){let t={};return e.title&&(t.title=e.title),t.view=e.defaults.view,e.defaults.scale&&(t.scale=e.defaults.scale),e.defaults.units&&(t.units=e.defaults.units),e.description&&(t.description=e.description),e.epoch&&(t.epoch=e.epoch),e.referencePlane&&(t.referencePlane=e.referencePlane),t}function zi(e){let t={...e.atlasMetadata};e.defaults.theme&&(t["atlas.theme"]=e.defaults.theme);for(let n of e.viewpoints){let r=`viewpoint.${n.id}`;t[`${r}.label`]=n.label,n.summary&&(t[`${r}.summary`]=n.summary),n.focusObjectId&&(t[`${r}.focus`]=n.focusObjectId),n.selectedObjectId&&(t[`${r}.select`]=n.selectedObjectId),n.projection&&(t[`${r}.projection`]=n.projection),n.preset&&(t[`${r}.preset`]=n.preset),n.zoom!==null&&(t[`${r}.zoom`]=String(n.zoom)),n.rotationDeg!==0&&(t[`${r}.rotation`]=String(n.rotationDeg));let i=Ui(n.layers);i&&(t[`${r}.layers`]=i),n.filter?.query&&(t[`${r}.query`]=n.filter.query),(n.filter?.objectTypes.length??0)>0&&(t[`${r}.types`]=n.filter?.objectTypes.join(" ")??""),(n.filter?.tags.length??0)>0&&(t[`${r}.tags`]=n.filter?.tags.join(" ")??""),(n.filter?.groupIds.length??0)>0&&(t[`${r}.groups`]=n.filter?.groupIds.join(" ")??""),n.events.length>0&&(t[`${r}.events`]=n.events.join(" "))}for(let n of e.annotations){let r=`annotation.${n.id}`;t[`${r}.label`]=n.label,n.targetObjectId&&(t[`${r}.target`]=n.targetObjectId),t[`${r}.body`]=n.body,n.tags.length>0&&(t[`${r}.tags`]=n.tags.join(" ")),n.sourceObjectId&&(t[`${r}.source`]=n.sourceObjectId)}return t}function Ui(e){let t=[],n=e["orbits-front"],r=e["orbits-back"];(n!==void 0||r!==void 0)&&t.push(n!==!1||r!==!1?"orbits":"-orbits");for(let i of["background","guides","relations","events","objects","labels","metadata"])e[i]!==void 0&&t.push(e[i]?i:`-${i}`);return t.join(" ")}function Vi(e){return{...e,version:"2.0-draft",schemaVersion:"2.0-draft"}}var Jt=["title","view","scale","units","kind","class","tags","color","image","hidden","orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","radius","mass","density","gravity","temperature","albedo","atmosphere","inner","outer","on","source","cycle"];function Be(e,t={}){let n=t.schema??"auto";if(n==="2.0"||n==="2.1"||n==="2.0-draft"||e.version==="2.0"||e.version==="2.1"||e.version==="2.0-draft"){if(n==="2.0-draft"){let c=e.version==="2.0-draft"?e:e.version==="2.0"||e.version==="2.1"?{...e,version:"2.0-draft",schemaVersion:"2.0-draft"}:Ne(e);return nt(c)}let s=e.version==="2.0"||e.version==="2.1"?e:e.version==="2.0-draft"?{...e,version:"2.0",schemaVersion:"2.0"}:ve(e);return n==="2.1"&&s.version!=="2.1"?Ce({...s,version:"2.1",schemaVersion:"2.1"}):Ce(s)}let i=[],a=e;a.system&&i.push(...Wi(a.system));let o=[...a.objects].sort(ot);for(let s of o)i.length>0&&i.push(""),i.push(...qi(s));return i.join(`
2
- `)}function Ce(e){let t=[`schema ${e.version}`,""];e.system&&t.push(...en(e.system));for(let r of[...e.groups].sort(ce))t.push(""),t.push(...on(r));for(let r of[...e.relations].sort(ce))t.push(""),t.push(...an(r));for(let r of[...e.events].sort(ce))t.push(""),t.push(...sn(r));let n=[...e.objects].sort(ot);return n.length>0&&t.at(-1)!==""&&t.push(""),n.forEach((r,i)=>{i>0&&t.push(""),t.push(...tn(r))}),t.join(`
3
- `)}function nt(e){let t=e.version==="2.0-draft"?e:{...e,version:"2.0-draft",schemaVersion:"2.0-draft"},n=["schema 2.0-draft",""];t.system&&n.push(...en(t.system));for(let i of[...t.groups].sort(ce))n.push(""),n.push(...on(i));for(let i of[...t.relations].sort(ce))n.push(""),n.push(...an(i));for(let i of[...t.events].sort(ce))n.push(""),n.push(...sn(i));let r=[...t.objects].sort(ot);return r.length>0&&n.at(-1)!==""&&n.push(""),r.forEach((i,a)=>{a>0&&n.push(""),n.push(...tn(i))}),n.join(`
4
- `)}function Wi(e){return Yi("system",e.id,e.properties,null,e.info)}function Yi(e,t,n,r,i){let a=[`${e} ${t}`],o=[...rt(r),...rn(n)];for(let c of o)a.push(` ${c}`);let s=Object.entries(i).sort(([c],[l])=>c.localeCompare(l));if(s.length>0){o.length>0&&a.push(""),a.push(" info");for(let[c,l]of s)a.push(` ${c} ${y(l)}`)}return a}function en(e){let t=[`system ${e.id}`];if(e.title&&t.push(` title ${y(e.title)}`),e.description&&t.push(` description ${y(e.description)}`),e.epoch&&t.push(` epoch ${y(e.epoch)}`),e.referencePlane&&t.push(` referencePlane ${y(e.referencePlane)}`),t.push(""),t.push("defaults"),t.push(` view ${e.defaults.view}`),e.defaults.scale&&t.push(` scale ${y(e.defaults.scale)}`),e.defaults.units&&t.push(` units ${y(e.defaults.units)}`),e.defaults.preset&&t.push(` preset ${e.defaults.preset}`),e.defaults.theme&&t.push(` theme ${y(e.defaults.theme)}`),Object.keys(e.atlasMetadata).length>0){t.push(""),t.push("atlas"),t.push(" metadata");for(let[n,r]of Object.entries(e.atlasMetadata).sort(([i],[a])=>i.localeCompare(a)))t.push(` ${n} ${y(r)}`)}for(let n of e.viewpoints)t.push(""),t.push(...Gi(n));for(let n of e.annotations)t.push(""),t.push(...Ki(n));return t}function qi(e){return nn(e.type,e.id,e)}function tn(e){return nn(`object ${e.type}`,e.id,e)}function nn(e,t,n){let r=[`${e} ${t}`],i=[...rt(n.placement),...rn(n.properties),...Hi(n)];for(let o of i)r.push(` ${o}`);let a=Object.entries(n.info).sort(([o],[s])=>o.localeCompare(s));if(a.length>0){i.length>0&&r.push(""),r.push(" info");for(let[o,s]of a)r.push(` ${o} ${y(s)}`)}for(let o of["climate","habitability","settlement"]){let s=Object.entries(n.typedBlocks?.[o]??{}).sort(([c],[l])=>c.localeCompare(l));if(s.length>0){r.push(""),r.push(` ${o}`);for(let[c,l]of s)r.push(` ${c} ${y(l)}`)}}return r}function rt(e){if(!e)return[];switch(e.mode){case"orbit":return[`orbit ${e.target}`,...K("distance",e.distance),...K("semiMajor",e.semiMajor),...Xi("eccentricity",e.eccentricity),...K("period",e.period),...K("angle",e.angle),...K("inclination",e.inclination),...K("phase",e.phase)];case"at":return[`at ${Ji(e.reference)}`];case"surface":return[`surface ${e.target}`];case"free":return[`free ${e.distance?it(e.distance):e.descriptor??""}`.trim()]}}function rn(e){return Object.keys(e).sort(eo).map(t=>`${t} ${cn(e[t])}`)}function Hi(e){let t=[];e.groups?.length&&t.push(`groups ${e.groups.join(" ")}`),e.epoch&&t.push(`epoch ${y(e.epoch)}`),e.referencePlane&&t.push(`referencePlane ${y(e.referencePlane)}`),e.tidalLock!==void 0&&t.push(`tidalLock ${e.tidalLock?"true":"false"}`),e.renderHints?.renderLabel!==void 0&&t.push(`renderLabel ${e.renderHints.renderLabel?"true":"false"}`),e.renderHints?.renderOrbit!==void 0&&t.push(`renderOrbit ${e.renderHints.renderOrbit?"true":"false"}`),e.renderHints?.renderPriority!==void 0&&t.push(`renderPriority ${e.renderHints.renderPriority}`),e.resonance&&t.push(`resonance ${e.resonance.targetObjectId} ${e.resonance.ratio}`);for(let n of e.deriveRules??[])t.push(`derive ${n.field} ${n.strategy}`);for(let n of e.validationRules??[])t.push(`validate ${n.rule}`);e.lockedFields?.length&&t.push(`locked ${e.lockedFields.join(" ")}`);for(let n of e.tolerances??[])t.push(`tolerance ${n.field} ${cn(n.value)}`);return t}function Gi(e){let t=[`viewpoint ${e.id}`,` label ${y(e.label)}`];e.focusObjectId&&t.push(` focus ${e.focusObjectId}`),e.selectedObjectId&&e.selectedObjectId!==e.focusObjectId&&t.push(` select ${e.selectedObjectId}`),e.summary&&t.push(` summary ${y(e.summary)}`),e.projection&&t.push(` projection ${e.projection}`),e.preset&&t.push(` preset ${e.preset}`),e.zoom!==null&&t.push(` zoom ${e.zoom}`),e.rotationDeg!==0&&t.push(` rotation ${e.rotationDeg}`);let n=Qi(e.layers);return n.length>0&&t.push(` layers ${n.join(" ")}`),e.events.length>0&&t.push(` events ${e.events.join(" ")}`),e.filter&&(t.push(" filter"),e.filter.query&&t.push(` query ${y(e.filter.query)}`),e.filter.objectTypes.length>0&&t.push(` objectTypes ${e.filter.objectTypes.join(" ")}`),e.filter.tags.length>0&&t.push(` tags ${e.filter.tags.map(y).join(" ")}`),e.filter.groupIds.length>0&&t.push(` groups ${e.filter.groupIds.join(" ")}`)),t}function Ki(e){let t=[`annotation ${e.id}`,` label ${y(e.label)}`];return e.targetObjectId&&t.push(` target ${e.targetObjectId}`),t.push(` body ${y(e.body)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(y).join(" ")}`),t}function on(e){let t=[`group ${e.id}`,` label ${y(e.label)}`];return e.summary&&t.push(` summary ${y(e.summary)}`),e.color&&t.push(` color ${y(e.color)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(y).join(" ")}`),e.hidden&&t.push(" hidden true"),t}function an(e){let t=[`relation ${e.id}`];return e.from&&t.push(` from ${y(e.from)}`),e.to&&t.push(` to ${y(e.to)}`),e.kind&&t.push(` kind ${y(e.kind)}`),e.label&&t.push(` label ${y(e.label)}`),e.summary&&t.push(` summary ${y(e.summary)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(y).join(" ")}`),e.color&&t.push(` color ${y(e.color)}`),e.hidden&&t.push(" hidden true"),t}function sn(e){let t=[`event ${e.id}`,` kind ${y(e.kind)}`];if(e.label&&t.push(` label ${y(e.label)}`),e.summary&&t.push(` summary ${y(e.summary)}`),e.targetObjectId&&t.push(` target ${e.targetObjectId}`),e.participantObjectIds.length>0&&t.push(` participants ${e.participantObjectIds.join(" ")}`),e.timing&&t.push(` timing ${y(e.timing)}`),e.visibility&&t.push(` visibility ${y(e.visibility)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(y).join(" ")}`),e.color&&t.push(` color ${y(e.color)}`),e.hidden&&t.push(" hidden true"),e.positions.length>0){t.push(""),t.push(" positions");for(let n of[...e.positions].sort(to)){t.push(` pose ${n.objectId}`);for(let r of Zi(n))t.push(` ${r}`)}}return t}function Zi(e){return[...rt(e.placement),...K("inner",e.inner),...K("outer",e.outer)]}function cn(e){return Array.isArray(e)?e.map(t=>y(t)).join(" "):typeof e=="boolean"?e?"true":"false":typeof e=="number"?String(e):typeof e=="string"?y(e):it(e)}function it(e){return`${e.value}${e.unit??""}`}function K(e,t){return t?[`${e} ${it(t)}`]:[]}function Xi(e,t){return t===void 0?[]:[`${e} ${t}`]}function Ji(e){switch(e.kind){case"lagrange":return e.secondary?`${e.primary}-${e.secondary}:${e.point}`:`${e.primary}:${e.point}`;case"anchor":return`${e.objectId}:${e.anchor}`;case"named":return e.name}}function Qi(e){let t=[],n=e["orbits-front"],r=e["orbits-back"];(n!==void 0||r!==void 0)&&t.push(n!==!1||r!==!1?"orbits":"-orbits");for(let i of["background","guides","relations","events","objects","labels","metadata"])e[i]!==void 0&&t.push(e[i]?i:`-${i}`);return t}function eo(e,t){let n=Jt.indexOf(e),r=Jt.indexOf(t);return n===-1&&r===-1?e.localeCompare(t):n===-1?1:r===-1?-1:n-r}function ot(e,t){let n=Qt(e.type),r=Qt(t.type);return n!==r?n-r:e.id.localeCompare(t.id)}function ce(e,t){return e.id.localeCompare(t.id)}function to(e,t){return e.objectId.localeCompare(t.objectId)}function Qt(e){switch(e){case"star":return 0;case"planet":return 1;case"moon":return 2;case"belt":return 3;case"asteroid":return 4;case"comet":return 5;case"ring":return 6;case"structure":return 7;case"phenomenon":return 8}}function y(e){return!/\s/.test(e)&&!e.includes('"')?e:`"${e.replaceAll("\\","\\\\").replaceAll('"','\\"')}"`}var ln=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,no=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),ro=/^[A-Za-z][A-Za-z0-9+.-]*:/;function le(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function ke(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function at(e,t,n){let r=e.match(ln);if(!r)throw u.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let a=D(n);if(a?.unitFamily&&!pe(a.unitFamily,i.unit))throw u.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function st(e){let t=e.match(ln);return t?{value:Number(t[1]),unit:t[2]??null}:null}function ze(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw u.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function Z(e,t,n){let r=no.get(e.toLowerCase());if(r===void 0)throw u.fromLocation(`Invalid boolean value "${e}" for "${t}"`,n);return r}function un(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw u.fromLocation(`Invalid special position "${e}"`,t);let n=e.match(/^([A-Za-z0-9._-]+)-([A-Za-z0-9._-]+):(L[1-5])$/);if(n)return{kind:"lagrange",primary:n[1],secondary:n[2],point:n[3]};let r=e.match(/^([A-Za-z0-9._-]+):(L[1-5])$/);if(r)return{kind:"lagrange",primary:r[1],secondary:null,point:r[2]};if(/^[A-Za-z0-9._-]+:L\d+$/i.test(e))throw u.fromLocation(`Invalid special position "${e}"`,t);let i=e.match(/^([A-Za-z0-9._-]+):([A-Za-z0-9._-]+)$/);return i?{kind:"anchor",objectId:i[1],anchor:i[2]}:{kind:"named",name:e}}function io(e,t){if(!e)throw u.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw u.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match(ro);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw u.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function dn(e,t,n){let r=D(e);if(!r)throw u.fromLocation(`Unknown field "${e}"`,n);if(r.arity==="single"&&t.length!==1)throw u.fromLocation(`Field "${e}" expects exactly one value`,n);switch(r.kind){case"list":return t;case"boolean":return Z($e(t,e,n),e,n);case"number":return ze($e(t,e,n),e,n);case"unit":return at($e(t,e,n),n,e);case"string":{let i=t.join(" ").trim();return e==="image"&&io(i,n),i}}}function ct(e,t,n){let r=D(e);if(!r)throw u.fromLocation(`Unknown field "${e}"`,n);if(!r.objectTypes.includes(t))throw u.fromLocation(`Field "${e}" is not valid on "${t}"`,n)}function $e(e,t,n){if(e.length!==1)throw u.fromLocation(`Field "${t}" expects exactly one value`,n);return e[0]}var pn=new Set(["star","planet","moon","asteroid","comet"]),oo=332946.0487,ao=1047.3486,Ue=1495978707e-1,so=6371,co=695700,lo=63241.077,uo=206264.806,fo=206264806;function je(e,t){let n=[],r=new Map(e.objects.map(s=>[s.id,s])),i=new Set(e.groups.map(s=>s.id)),a=new Set(e.events.map(s=>s.id));e.system||n.push(v("validate.system.required","Atlas documents must declare exactly one system."));let o=new Map;for(let[s,c]of[["group",e.groups.map(l=>l.id)],["viewpoint",e.system?.viewpoints.map(l=>l.id)??[]],["annotation",e.system?.annotations.map(l=>l.id)??[]],["relation",e.relations.map(l=>l.id)],["event",e.events.map(l=>l.id)],["object",e.objects.map(l=>l.id)]])for(let l of c){let d=o.get(l);d?n.push(v("validate.id.duplicate",`Duplicate ${s} id "${l}" already used by ${d}.`)):o.set(l,s)}for(let s of e.relations)po(s,r,n);for(let s of e.system?.viewpoints??[])mo(s.filter,s.events??[],i,a,t,n,s.id);for(let s of e.objects)ho(s,e.system,r,i,n);for(let s of e.events)yo(s,r,n);return n}function po(e,t,n){e.from?t.has(e.from)||n.push(v("validate.relation.from.unknown",`Unknown relation source "${e.from}" on "${e.id}".`)):n.push(v("validate.relation.from.required",`Relation "${e.id}" is missing a "from" target.`)),e.to?t.has(e.to)||n.push(v("validate.relation.to.unknown",`Unknown relation target "${e.to}" on "${e.id}".`)):n.push(v("validate.relation.to.required",`Relation "${e.id}" is missing a "to" target.`)),e.kind||n.push(v("validate.relation.kind.required",`Relation "${e.id}" is missing a "kind" value.`))}function mo(e,t,n,r,i,a,o){if(i==="2.1"){if(e)for(let s of e.groupIds)n.has(s)||a.push(S("validate.viewpoint.group.unknown",`Unknown group "${s}" in viewpoint "${o}".`,void 0,`viewpoint.${o}.groups`));for(let s of t)r.has(s)||a.push(S("validate.viewpoint.event.unknown",`Unknown event "${s}" in viewpoint "${o}".`,void 0,`viewpoint.${o}.events`))}}function ho(e,t,n,r,i){let a=e.placement,o=a?.mode==="orbit"?a:null,s=a?.mode==="orbit"?n.get(a.target)??null:null;if(e.groups)for(let c of e.groups)r.has(c)||i.push(S("validate.group.unknown",`Unknown group "${c}" on "${e.id}".`,e.id,"groups"));if(o&&(n.has(o.target)||i.push(v("validate.orbit.target.unknown",`Unknown placement target "${o.target}" on "${e.id}".`,e.id,"orbit")),o.distance&&o.semiMajor&&i.push(v("validate.orbit.distanceConflict",`Object "${e.id}" cannot declare both "distance" and "semiMajor".`,e.id,"distance")),o.phase&&!e.epoch&&!t?.epoch&&i.push(S("validate.phase.epochMissing",`Object "${e.id}" sets "phase" without an object or system epoch.`,e.id,"phase")),o.inclination&&!e.referencePlane&&!t?.referencePlane&&i.push(S("validate.inclination.referencePlaneMissing",`Object "${e.id}" sets "inclination" without an object or system reference plane.`,e.id,"inclination")),o.period&&!mn(s?.properties.mass)&&i.push(S("validate.period.massMissing",`Object "${e.id}" sets "period" but its central mass cannot be derived.`,e.id,"period"))),a?.mode==="surface"){let c=n.get(a.target);c?pn.has(c.type)||i.push(v("validate.surface.target.invalid",`Surface target "${a.target}" on "${e.id}" is not surface-capable.`,e.id,"surface")):i.push(v("validate.surface.target.unknown",`Unknown placement target "${a.target}" on "${e.id}".`,e.id,"surface"))}if(a?.mode==="at"&&(e.type!=="structure"&&e.type!=="phenomenon"&&i.push(v("validate.at.objectType",`Only structures and phenomena may use "at" placement; found "${e.type}" on "${e.id}".`,e.id,"at")),bo(e,n,i)||i.push(v("validate.at.target.unknown",`Unknown at-reference target "${a.target}" on "${e.id}".`,e.id,"at"))),e.resonance){let c=n.get(e.resonance.targetObjectId);c?(e.placement?.mode!=="orbit"||c.placement?.mode!=="orbit"||e.placement.target!==c.placement.target)&&i.push(S("validate.resonance.orbitMismatch",`Resonance target "${e.resonance.targetObjectId}" on "${e.id}" does not share a compatible orbital parent.`,e.id,"resonance")):i.push(v("validate.resonance.target.unknown",`Unknown resonance target "${e.resonance.targetObjectId}" on "${e.id}".`,e.id,"resonance"))}for(let c of e.deriveRules??[]){if(c.field!=="period"||c.strategy!=="kepler"){i.push(S("validate.derive.unsupported",`Unsupported derive rule "${c.field} ${c.strategy}" on "${e.id}".`,e.id,"derive"));continue}let l=fn(e,s);if(l===null){i.push(S("validate.derive.inputsMissing",`Object "${e.id}" requests "derive period kepler" but lacks enough input data.`,e.id,"derive"));continue}o?.period||i.push($o("validate.derive.period.available",`Object "${e.id}" can derive a Kepler period of ${Io(l)}.`,e.id,"derive"))}for(let c of e.validationRules??[]){if(c.rule!=="kepler"){i.push(S("validate.rule.unsupported",`Unsupported validation rule "${c.rule}" on "${e.id}".`,e.id,"validate"));continue}let l=hn(o?.period),d=fn(e,s);if(l===null||d===null)continue;let f=vo(e,"period");Math.abs(l-d)>f&&i.push(v("validate.kepler.mismatch",`Object "${e.id}" fails Kepler validation for "period".`,e.id,"validate"))}}function yo(e,t,n){let r=`event.${e.id}`,i=new Set;e.kind.trim()||n.push(v("validate.event.kind.required",`Event "${e.id}" is missing a "kind" value.`,void 0,`${r}.kind`)),!e.targetObjectId&&e.participantObjectIds.length===0&&n.push(v("validate.event.references.required",`Event "${e.id}" must define a "target" or at least one participant.`,void 0,`${r}.participants`)),e.targetObjectId&&(i.add(e.targetObjectId),t.has(e.targetObjectId)||n.push(v("validate.event.target.unknown",`Unknown event target "${e.targetObjectId}" on "${e.id}".`,void 0,`${r}.target`)));let a=new Set;for(let s of e.participantObjectIds){if(i.add(s),a.has(s)){n.push(S("validate.event.participants.duplicate",`Event "${e.id}" repeats participant "${s}".`,void 0,`${r}.participants`));continue}a.add(s),t.has(s)||n.push(v("validate.event.participants.unknown",`Unknown event participant "${s}" on "${e.id}".`,void 0,`${r}.participants`))}e.targetObjectId&&e.participantObjectIds.length>0&&!e.participantObjectIds.includes(e.targetObjectId)&&n.push(S("validate.event.target.notParticipant",`Event "${e.id}" defines a target outside its participants list.`,void 0,`${r}.target`)),e.positions.length===0&&n.push(S("validate.event.positions.missing",`Event "${e.id}" has no positions block and cannot drive a scene snapshot.`,void 0,`${r}.positions`)),/(?:^|[-_])(solar-eclipse|lunar-eclipse|transit|occultation)(?:$|[-_])/.test(e.kind)&&i.size<3&&n.push(S("validate.event.kind.participants",`Event "${e.id}" looks like an eclipse or transit but references fewer than three bodies.`,void 0,`${r}.participants`));let o=new Set;for(let s of e.positions){let c=`${r}.pose.${s.objectId}`;if(o.has(s.objectId)){n.push(v("validate.event.pose.duplicate",`Event "${e.id}" defines "${s.objectId}" more than once in positions.`,void 0,c));continue}o.add(s.objectId);let l=t.get(s.objectId);if(!l){n.push(v("validate.event.pose.object.unknown",`Unknown event pose object "${s.objectId}" on "${e.id}".`,void 0,c));continue}i.has(s.objectId)||n.push(S("validate.event.pose.unreferenced",`Event pose "${s.objectId}" on "${e.id}" is not listed in target/participants.`,void 0,c)),go(s,l,t,n,c,e.id)}}function go(e,t,n,r,i,a){let o=e.placement;if(!o){r.push(v("validate.event.pose.placement.required",`Event "${a}" pose "${e.objectId}" is missing a placement mode.`,void 0,i));return}if(o.mode==="orbit"){n.has(o.target)||r.push(v("validate.event.pose.orbit.target.unknown",`Unknown event orbit target "${o.target}" on "${a}:${e.objectId}".`,void 0,`${i}.orbit`)),o.distance&&o.semiMajor&&r.push(v("validate.event.pose.orbit.distanceConflict",`Event "${a}" pose "${e.objectId}" cannot declare both "distance" and "semiMajor".`,void 0,`${i}.distance`));return}if(o.mode==="surface"){let s=n.get(o.target);s?pn.has(s.type)||r.push(v("validate.event.pose.surface.target.invalid",`Event surface target "${o.target}" on "${a}:${e.objectId}" is not surface-capable.`,void 0,`${i}.surface`)):r.push(v("validate.event.pose.surface.target.unknown",`Unknown event surface target "${o.target}" on "${a}:${e.objectId}".`,void 0,`${i}.surface`));return}if(o.mode==="at"){t.type!=="structure"&&t.type!=="phenomenon"&&r.push(v("validate.event.pose.at.objectType",`Only structures and phenomena may use "at" placement in events; found "${t.type}" on "${a}:${e.objectId}".`,void 0,`${i}.at`));let s=o.reference;s.kind==="named"&&!n.has(s.name)?r.push(v("validate.event.pose.at.target.unknown",`Unknown event at-reference target "${o.target}" on "${a}:${e.objectId}".`,void 0,`${i}.at`)):s.kind==="anchor"&&!n.has(s.objectId)?r.push(v("validate.event.pose.anchor.target.unknown",`Unknown event anchor target "${s.objectId}" on "${a}:${e.objectId}".`,void 0,`${i}.at`)):s.kind==="lagrange"&&(n.has(s.primary)?s.secondary&&!n.has(s.secondary)&&r.push(v("validate.event.pose.lagrange.secondary.unknown",`Unknown event Lagrange target "${s.secondary}" on "${a}:${e.objectId}".`,void 0,`${i}.at`)):r.push(v("validate.event.pose.lagrange.primary.unknown",`Unknown event Lagrange target "${s.primary}" on "${a}:${e.objectId}".`,void 0,`${i}.at`)))}}function bo(e,t,n){let r=e.placement?.mode==="at"?e.placement.reference:null;return r?r.kind==="named"?t.has(r.name):r.kind==="anchor"?t.has(r.objectId)?!0:(n.push(v("validate.anchor.target.unknown",`Unknown anchor target "${r.objectId}" on "${e.id}".`,e.id,"at")),!1):t.has(r.primary)?r.secondary&&!t.has(r.secondary)?(n.push(v("validate.lagrange.secondary.unknown",`Unknown Lagrange reference "${r.secondary}" on "${e.id}".`,e.id,"at")),!1):!0:(n.push(v("validate.lagrange.primary.unknown",`Unknown Lagrange reference "${r.primary}" on "${e.id}".`,e.id,"at")),!1):!0}function fn(e,t){let n=e.placement;if(!n||n.mode!=="orbit")return null;let r=wo(n.semiMajor??n.distance),i=mn(t?.properties.mass);return r===null||i===null||i<=0?null:Math.sqrt(r**3/i)*365.25}function wo(e){if(!e)return null;switch(e.unit){case null:case"au":return e.value;case"km":return e.value/Ue;case"m":return e.value/(Ue*1e3);case"ly":return e.value*lo;case"pc":return e.value*uo;case"kpc":return e.value*fo;case"re":return e.value*so/Ue;case"sol":return e.value*co/Ue;default:return null}}function mn(e){if(!e||typeof e!="object"||!("value"in e))return null;let t=e;switch(t.unit){case null:case"sol":return t.value;case"me":return t.value/oo;case"mj":return t.value/ao;default:return null}}function hn(e){if(!e)return null;switch(e.unit){case null:case"d":return e.value;case"s":return e.value/86400;case"min":return e.value/1440;case"h":return e.value/24;case"y":return e.value*365.25;case"ky":return e.value*365250;case"my":return e.value*36525e4;case"gy":return e.value*36525e7;default:return null}}function vo(e,t){let n=e.tolerances?.find(r=>r.field===t)?.value;return typeof n=="number"?n:n&&typeof n=="object"&&"value"in n?hn(n)??0:0}function Io(e){return`${Math.round(e*100)/100}d`}function v(e,t,n,r){return{code:e,severity:"error",source:"validate",message:t,objectId:n,field:r}}function S(e,t,n,r){return{code:e,severity:"warning",source:"validate",message:t,objectId:n,field:r}}function $o(e,t,n,r){return{code:e,severity:"info",source:"validate",message:t,objectId:n,field:r}}var ko=new Set(["climate","habitability","settlement"]),Ve=new Map;for(let e of["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","kind","class","culture","tags","color","image","hidden","radius","mass","density","gravity","temperature","albedo","atmosphere","inner","outer","on","source","cycle"]){let t=D(e);t&&Ve.set(e,{key:e,version:"2.0",inlineMode:t.arity==="multiple"?"multiple":"single",allowRepeat:!1,legacySchema:t})}for(let e of[{key:"groups",inlineMode:"multiple",allowRepeat:!1},{key:"epoch",inlineMode:"single",allowRepeat:!1},{key:"referencePlane",inlineMode:"single",allowRepeat:!1},{key:"tidalLock",inlineMode:"single",allowRepeat:!1},{key:"renderLabel",inlineMode:"single",allowRepeat:!1},{key:"renderOrbit",inlineMode:"single",allowRepeat:!1},{key:"renderPriority",inlineMode:"single",allowRepeat:!1},{key:"resonance",inlineMode:"pair",allowRepeat:!1},{key:"derive",inlineMode:"pair",allowRepeat:!0},{key:"validate",inlineMode:"single",allowRepeat:!0},{key:"locked",inlineMode:"multiple",allowRepeat:!1},{key:"tolerance",inlineMode:"pair",allowRepeat:!0}])Ve.set(e.key,{key:e.key,version:"2.1",inlineMode:e.inlineMode,allowRepeat:e.allowRepeat});var jo=new Set(Ve.keys()),xo=new Set(["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","inner","outer"]);function We(e){return bn(e)}function gn(e){return bn(e,"2.0-draft")}function bn(e,t){let n=ua(e),r=n.source.split(/\r?\n/),i=[],a=!1,o="2.0",s=null,c=null,l=[],d=[],f=[],p=[],m=new Map,b=!1,I=!1,j=new Set,L=new Set,g=new Set,k=new Set,R=new Set;for(let A=0;A<r.length;A++){let ee=r[A],T=A+1;if(!ee.trim())continue;let B=Le(ee),U=ne(ee.slice(B),{line:T,columnOffset:B});if(U.length!==0){if(!a){o=Oo(U,T),a=!0,n.comments.length>0&&o!=="2.1"&&i.push({code:"parse.schema21.commentCompatibility",severity:"warning",source:"parse",message:`Comments require schema 2.1; parsed in compatibility mode because the document header is "schema ${o}".`,line:n.comments[0].line,column:n.comments[0].column});continue}if(B===0){c=Lo(U,T,o,i,s,l,d,f,p,m,j,L,g,k,R,{sawDefaults:b,sawAtlas:I}),c.kind==="system"?s=c.system:c.kind==="defaults"?b=!0:c.kind==="atlas"&&(I=!0);continue}if(!c)throw new u("Indented line without parent atlas section",T,B+1);Mo(c,B,U,T)}}if(!a)throw new u('Missing required atlas schema header "schema 2.0"');let Q=l.map(A=>Qo(A,o,i)),_=p.map(A=>ea(A,m.get(A.id)??[])),Y=t??(o==="2.0-draft"?"2.0":o),q={format:"worldorbit",sourceVersion:"1.0",system:s,groups:d,relations:f,events:_,objects:Q,diagnostics:i};if(Y==="2.0-draft"){let A={...q,version:"2.0-draft",schemaVersion:"2.0-draft"};return A.diagnostics.push(...je(A,o)),A}let C={...q,version:Y,schemaVersion:Y};return o==="2.0-draft"&&C.diagnostics.push({code:"load.schema.deprecatedDraft",severity:"warning",source:"upgrade",message:'Source header "schema 2.0-draft" is deprecated; canonical v2 documents now use "schema 2.0".'}),C.diagnostics.push(...je(C,o)),C}function Oo(e,t){if(e.length!==2||e[0].value.toLowerCase()!=="schema"||!["2.0-draft","2.0","2.1"].includes(e[1].value.toLowerCase()))throw new u('Expected atlas header "schema 2.0", "schema 2.1", or legacy "schema 2.0-draft"',t,e[0]?.column??1);let n=e[1].value.toLowerCase();return n==="2.1"?"2.1":n==="2.0-draft"?"2.0-draft":"2.0"}function Lo(e,t,n,r,i,a,o,s,c,l,d,f,p,m,b,I){switch(e[0]?.value.toLowerCase()){case"system":if(i)throw new u('Atlas section "system" may only appear once',t,e[0].column);return Ao(e,t,n,r);case"defaults":if(!i)throw new u('Atlas section "defaults" requires a preceding system declaration',t,e[0].column);if(I.sawDefaults)throw new u('Atlas section "defaults" may only appear once',t,e[0].column);return{kind:"defaults",system:i,seenFields:new Set};case"atlas":if(!i)throw new u('Atlas section "atlas" requires a preceding system declaration',t,e[0].column);if(I.sawAtlas)throw new u('Atlas section "atlas" may only appear once',t,e[0].column);return{kind:"atlas",system:i,inMetadata:!1,metadataIndent:null};case"viewpoint":if(!i)throw new u('Atlas section "viewpoint" requires a preceding system declaration',t,e[0].column);return So(e,t,i,d,n,r);case"annotation":if(!i)throw new u('Atlas section "annotation" requires a preceding system declaration',t,e[0].column);return To(e,t,i,f);case"group":return M(n,r,"group",{line:t,column:e[0].column}),Do(e,t,o,p);case"relation":return M(n,r,"relation",{line:t,column:e[0].column}),Fo(e,t,s,m);case"event":return M(n,r,"event",{line:t,column:e[0].column}),Po(e,t,c,l,b,n,r);case"object":return Eo(e,t,n,r,a);default:throw new u(`Unknown atlas section "${e[0]?.value??""}"`,t,e[0]?.column??1)}}function Ao(e,t,n,r){if(e.length!==2)throw new u("Invalid atlas system declaration",t,e[0]?.column??1);return{kind:"system",system:{type:"system",id:e[1].value,title:null,description:null,epoch:null,referencePlane:null,defaults:{view:"topdown",scale:null,units:null,preset:null,theme:null},atlasMetadata:{},viewpoints:[],annotations:[]},sourceSchemaVersion:n,diagnostics:r,seenFields:new Set}}function So(e,t,n,r,i,a){if(e.length!==2)throw new u("Invalid viewpoint declaration",t,e[0]?.column??1);let o=le(e[1].value);if(!o)throw new u("Viewpoint id must not be empty",t,e[1].column);if(r.has(o))throw new u(`Duplicate viewpoint id "${o}"`,t,e[1].column);let s={id:o,label:ke(o),summary:"",focusObjectId:null,selectedObjectId:null,events:[],projection:n.defaults.view,preset:n.defaults.preset,zoom:null,rotationDeg:0,layers:{},filter:null};return n.viewpoints.push(s),r.add(o),{kind:"viewpoint",viewpoint:s,sourceSchemaVersion:i,diagnostics:a,seenFields:new Set,inFilter:!1,filterIndent:null,seenFilterFields:new Set}}function To(e,t,n,r){if(e.length!==2)throw new u("Invalid annotation declaration",t,e[0]?.column??1);let i=le(e[1].value);if(!i)throw new u("Annotation id must not be empty",t,e[1].column);if(r.has(i))throw new u(`Duplicate annotation id "${i}"`,t,e[1].column);let a={id:i,label:ke(i),targetObjectId:null,body:"",tags:[],sourceObjectId:null};return n.annotations.push(a),r.add(i),{kind:"annotation",annotation:a,seenFields:new Set}}function Do(e,t,n,r){if(e.length!==2)throw new u("Invalid group declaration",t,e[0]?.column??1);let i=le(e[1].value);if(!i)throw new u("Group id must not be empty",t,e[1].column);if(r.has(i))throw new u(`Duplicate group id "${i}"`,t,e[1].column);let a={id:i,label:ke(i),summary:"",color:null,tags:[],hidden:!1};return n.push(a),r.add(i),{kind:"group",group:a,seenFields:new Set}}function Fo(e,t,n,r){if(e.length!==2)throw new u("Invalid relation declaration",t,e[0]?.column??1);let i=le(e[1].value);if(!i)throw new u("Relation id must not be empty",t,e[1].column);if(r.has(i))throw new u(`Duplicate relation id "${i}"`,t,e[1].column);let a={id:i,from:"",to:"",kind:"",label:null,summary:null,tags:[],color:null,hidden:!1};return n.push(a),r.add(i),{kind:"relation",relation:a,seenFields:new Set}}function Po(e,t,n,r,i,a,o){if(e.length!==2)throw new u("Invalid event declaration",t,e[0]?.column??1);let s=le(e[1].value);if(!s)throw new u("Event id must not be empty",t,e[1].column);if(i.has(s))throw new u(`Duplicate event id "${s}"`,t,e[1].column);let c={id:s,kind:"",label:ke(s),summary:null,targetObjectId:null,participantObjectIds:[],timing:null,visibility:null,tags:[],color:null,hidden:!1,positions:[]},l=[];return n.push(c),r.set(s,l),i.add(s),{kind:"event",event:c,sourceSchemaVersion:a,diagnostics:o,seenFields:new Set,rawPoses:l,inPositions:!1,positionsIndent:null,activePose:null,poseIndent:null,activePoseSeenFields:new Set}}function Eo(e,t,n,r,i){if(e.length<3)throw new u("Invalid atlas object declaration",t,e[0]?.column??1);let a=e[1],o=e[2],s=a.value;if(!fe.has(s)||s==="system")throw new u(`Unknown object type "${a.value}"`,t,a.column);let c={objectType:s,id:o.value,fields:Xo(e.slice(3),t,s,n,r),infoEntries:[],typedBlockEntries:{},location:{line:t,column:a.column}};return i.push(c),{kind:"object",objectNode:c,sourceSchemaVersion:n,diagnostics:r,activeBlock:null,blockIndent:null,seenInfoKeys:new Set,seenTypedBlockKeys:{}}}function Mo(e,t,n,r){switch(e.kind){case"system":Ro(e,n,r);return;case"defaults":_o(e,n,r);return;case"atlas":No(e,t,n,r);return;case"viewpoint":Co(e,t,n,r);return;case"annotation":zo(e,n,r);return;case"group":Uo(e,n,r);return;case"relation":Vo(e,n,r);return;case"event":Wo(e,t,n,r);return;case"object":qo(e,t,n,r);return}}function Ro(e,t,n){let r=J(t,e.seenFields,n),i=$(t,n);switch(r){case"title":e.system.title=i;return;case"description":M(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.description=i;return;case"epoch":M(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.epoch=i;return;case"referenceplane":M(e.sourceSchemaVersion,e.diagnostics,"referencePlane",{line:n,column:t[0].column}),e.system.referencePlane=i;return;default:throw new u(`Unknown system atlas field "${t[0].value}"`,n,t[0].column)}}function _o(e,t,n){let r=J(t,e.seenFields,n),i=$(t,n);switch(r){case"view":e.system.defaults.view=wn(i,n,t[0].column);return;case"scale":e.system.defaults.scale=i;return;case"units":e.system.defaults.units=i;return;case"preset":e.system.defaults.preset=vn(i,n,t[0].column);return;case"theme":e.system.defaults.theme=i;return;default:throw new u(`Unknown defaults field "${t[0].value}"`,n,t[0].column)}}function No(e,t,n,r){if(e.inMetadata&&t<=(e.metadataIndent??0)&&(e.inMetadata=!1,e.metadataIndent=null),e.inMetadata){let i=$n(n,r,"Invalid atlas metadata entry");if(i.key in e.system.atlasMetadata)throw new u(`Duplicate atlas metadata key "${i.key}"`,r,n[0].column);e.system.atlasMetadata[i.key]=i.value;return}if(n.length===1&&n[0].value.toLowerCase()==="metadata"){e.inMetadata=!0,e.metadataIndent=t;return}throw new u(`Unknown atlas field "${n[0].value}"`,r,n[0].column)}function Co(e,t,n,r){if(e.inFilter&&t<=(e.filterIndent??0)&&(e.inFilter=!1,e.filterIndent=null),e.inFilter){Bo(e,n,r);return}if(n.length===1&&n[0].value.toLowerCase()==="filter"){if(e.seenFields.has("filter"))throw new u('Duplicate viewpoint field "filter"',r,n[0].column);e.seenFields.add("filter"),e.inFilter=!0,e.filterIndent=t;return}let i=J(n,e.seenFields,r),a=$(n,r);switch(i){case"label":e.viewpoint.label=a;return;case"summary":e.viewpoint.summary=a;return;case"focus":e.viewpoint.focusObjectId=a;return;case"select":e.viewpoint.selectedObjectId=a;return;case"projection":e.viewpoint.projection=wn(a,r,n[0].column);return;case"preset":e.viewpoint.preset=vn(a,r,n[0].column);return;case"zoom":e.viewpoint.zoom=Ko(a,r,n[0].column,"zoom");return;case"rotation":e.viewpoint.rotationDeg=In(a,r,n[0].column,"rotation");return;case"layers":e.viewpoint.layers=Go(n.slice(1),r,e.sourceSchemaVersion,e.diagnostics);return;case"events":M(e.sourceSchemaVersion,e.diagnostics,"viewpoint.events",{line:r,column:n[0].column}),e.viewpoint.events=z(n.slice(1),r,"events");return;default:throw new u(`Unknown viewpoint field "${n[0].value}"`,r,n[0].column)}}function Bo(e,t,n){let r=J(t,e.seenFilterFields,n),i=e.viewpoint.filter??Zo();switch(r){case"query":i.query=$(t,n);break;case"objecttypes":i.objectTypes=Ho(t.slice(1),n);break;case"tags":i.tags=z(t.slice(1),n,"tags");break;case"groups":i.groupIds=z(t.slice(1),n,"groups");break;default:throw new u(`Unknown viewpoint filter field "${t[0].value}"`,n,t[0].column)}e.viewpoint.filter=i}function zo(e,t,n){switch(J(t,e.seenFields,n)){case"label":e.annotation.label=$(t,n);return;case"target":e.annotation.targetObjectId=$(t,n);return;case"body":e.annotation.body=$(t,n);return;case"tags":e.annotation.tags=z(t.slice(1),n,"tags");return;default:throw new u(`Unknown annotation field "${t[0].value}"`,n,t[0].column)}}function Uo(e,t,n){switch(J(t,e.seenFields,n)){case"label":e.group.label=$(t,n);return;case"summary":e.group.summary=$(t,n);return;case"color":e.group.color=$(t,n);return;case"tags":e.group.tags=z(t.slice(1),n,"tags");return;case"hidden":e.group.hidden=Z($(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new u(`Unknown group field "${t[0].value}"`,n,t[0].column)}}function Vo(e,t,n){switch(J(t,e.seenFields,n)){case"from":e.relation.from=$(t,n);return;case"to":e.relation.to=$(t,n);return;case"kind":e.relation.kind=$(t,n);return;case"label":e.relation.label=$(t,n);return;case"summary":e.relation.summary=$(t,n);return;case"tags":e.relation.tags=z(t.slice(1),n,"tags");return;case"color":e.relation.color=$(t,n);return;case"hidden":e.relation.hidden=Z($(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new u(`Unknown relation field "${t[0].value}"`,n,t[0].column)}}function Wo(e,t,n,r){if(e.activePose&&t<=(e.poseIndent??0)&&(e.activePose=null,e.poseIndent=null,e.activePoseSeenFields.clear()),!e.activePose&&e.inPositions&&t<=(e.positionsIndent??0)&&(e.inPositions=!1,e.positionsIndent=null),e.activePose){e.activePose.fields.push(Yo(n,r,e.activePoseSeenFields));return}if(e.inPositions){if(n.length!==2||n[0].value.toLowerCase()!=="pose")throw new u(`Unknown event positions field "${n[0].value}"`,r,n[0]?.column??1);let a=n[1].value;if(!a.trim())throw new u("Event pose object id must not be empty",r,n[1].column);let o={objectId:a,fields:[],location:{line:r,column:n[0].column}};e.rawPoses.push(o),e.activePose=o,e.poseIndent=t,e.activePoseSeenFields=new Set;return}if(n.length===1&&n[0].value.toLowerCase()==="positions"){if(e.seenFields.has("positions"))throw new u('Duplicate event field "positions"',r,n[0].column);e.seenFields.add("positions"),e.inPositions=!0,e.positionsIndent=t;return}switch(J(n,e.seenFields,r)){case"kind":e.event.kind=$(n,r);return;case"label":e.event.label=$(n,r);return;case"summary":e.event.summary=$(n,r);return;case"target":e.event.targetObjectId=$(n,r);return;case"participants":e.event.participantObjectIds=z(n.slice(1),r,"participants");return;case"timing":e.event.timing=$(n,r);return;case"visibility":e.event.visibility=$(n,r);return;case"tags":e.event.tags=z(n.slice(1),r,"tags");return;case"color":e.event.color=$(n,r);return;case"hidden":e.event.hidden=Z($(n,r),"hidden",{line:r,column:n[0].column});return;default:throw new u(`Unknown event field "${n[0].value}"`,r,n[0].column)}}function Yo(e,t,n){if(e.length<2)throw new u("Invalid event pose field line",t,e[0]?.column??1);let r=e[0].value;if(!xo.has(r))throw new u(`Unknown event pose field "${r}"`,t,e[0].column);if(n.has(r))throw new u(`Duplicate event pose field "${r}"`,t,e[0].column);return n.add(r),{type:"field",key:r,values:e.slice(1).map(i=>i.value),location:{line:t,column:e[0].column}}}function qo(e,t,n,r){if(e.activeBlock&&t<=(e.blockIndent??0)&&(e.activeBlock=null,e.blockIndent=null),n.length===1){let i=n[0].value.toLowerCase();if(i==="info"||ko.has(i)){i!=="info"&&M(e.sourceSchemaVersion,e.diagnostics,i,{line:r,column:n[0].column}),e.activeBlock=i,e.blockIndent=t;return}}if(e.activeBlock){let i=$n(n,r,`Invalid ${e.activeBlock} entry`);if(e.activeBlock==="info"){if(e.seenInfoKeys.has(i.key))throw new u(`Duplicate info key "${i.key}"`,r,n[0].column);e.seenInfoKeys.add(i.key),e.objectNode.infoEntries.push(i);return}let a=e.activeBlock,o=e.seenTypedBlockKeys[a]??(e.seenTypedBlockKeys[a]=new Set);if(o.has(i.key))throw new u(`Duplicate ${a} key "${i.key}"`,r,n[0].column);o.add(i.key),(e.objectNode.typedBlockEntries[a]??(e.objectNode.typedBlockEntries[a]=[])).push(i);return}e.objectNode.fields.push(Jo(n,r,e.objectNode.objectType,e.sourceSchemaVersion,e.diagnostics))}function J(e,t,n){if(e.length<2)throw new u("Invalid atlas field line",n,e[0]?.column??1);let r=e[0].value.toLowerCase();if(t.has(r))throw new u(`Duplicate atlas field "${e[0].value}"`,n,e[0].column);return t.add(r),r}function $(e,t){if(e.length<2)throw new u("Missing value for atlas field",t,e[0]?.column??1);return e.slice(1).map(n=>n.value).join(" ").trim()}function Ho(e,t){return z(e,t,"objectTypes").filter(n=>n==="star"||n==="planet"||n==="moon"||n==="belt"||n==="asteroid"||n==="comet"||n==="ring"||n==="structure"||n==="phenomenon")}function Go(e,t,n,r){let i={};for(let a of z(e,t,"layers")){let o=!a.startsWith("-")&&!a.startsWith("!"),s=a.replace(/^[-!]+/,"").toLowerCase();if(s==="orbits"){i["orbits-back"]=o,i["orbits-front"]=o;continue}(s==="background"||s==="guides"||s==="orbits-back"||s==="orbits-front"||s==="relations"||s==="events"||s==="objects"||s==="labels"||s==="metadata")&&(s==="events"&&n&&r&&M(n,r,"layers.events",{line:t,column:e[0]?.column??1}),i[s]=o)}return i}function z(e,t,n){if(e.length===0)throw new u(`Missing value for atlas field "${n}"`,t,1);let r=e.map(i=>i.value).filter(Boolean);if(r.length===0)throw new u(`Missing value for atlas field "${n}"`,t,e[0]?.column??1);return r}function wn(e,t,n){let r=e.toLowerCase();if(r!=="topdown"&&r!=="isometric")throw new u(`Unknown projection "${e}"`,t,n);return r}function vn(e,t,n){let r=e.toLowerCase();if(r==="diagram"||r==="presentation"||r==="atlas-card"||r==="markdown")return r;throw new u(`Unknown render preset "${e}"`,t,n)}function Ko(e,t,n,r){let i=In(e,t,n,r);if(i<=0)throw new u(`Field "${r}" must be greater than zero`,t,n);return i}function In(e,t,n,r){let i=Number(e);if(!Number.isFinite(i))throw new u(`Invalid numeric value "${e}" for "${r}"`,t,n);return i}function Zo(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Xo(e,t,n,r,i){let a=[],o=0;for(;o<e.length;){let s=e[o],c=xe(s.value);if(!c)throw new u(`Unknown field "${s.value}"`,t,s.column);c.version==="2.1"&&M(r,i,s.value,{line:t,column:s.column}),o++;let l=[];if(c.inlineMode==="single"){let d=e[o];d&&(l.push(d),o++)}else if(c.inlineMode==="pair")for(let d=0;d<2;d++){let f=e[o];if(!f)break;l.push(f),o++}else for(;o<e.length&&!jo.has(e[o].value);)l.push(e[o]),o++;if(l.length===0)throw new u(`Missing value for field "${s.value}"`,t,s.column);a.push({type:"field",key:s.value,values:l.map(d=>d.value),location:{line:t,column:s.column}})}return On(a,n),a}function Jo(e,t,n,r,i){if(e.length<2)throw new u("Invalid field line",t,e[0]?.column??1);let a=xe(e[0].value);if(!a)throw new u(`Unknown field "${e[0].value}"`,t,e[0].column);a.version==="2.1"&&M(r,i,e[0].value,{line:t,column:e[0].column});let o={type:"field",key:e[0].value,values:e.slice(1).map(s=>s.value),location:{line:t,column:e[0].column}};return On([o],n),o}function $n(e,t,n){if(e.length<2)throw new u(n,t,e[0]?.column??1);return{type:"info-entry",key:e[0].value,value:e.slice(1).map(r=>r.value).join(" "),location:{line:t,column:e[0].column}}}function Qo(e,t,n){let r=kn(e.fields),i=jn(r),a=na(e.objectType,r),o=ca(r.get("groups")?.[0]),s=yn(r.get("epoch")?.[0]),c=yn(r.get("referencePlane")?.[0]),l=r.has("tidalLock")?Z(N(r.get("tidalLock")[0]),"tidalLock",r.get("tidalLock")[0].location):void 0,d=r.has("resonance")?oa(r.get("resonance")[0]):void 0,f=ia(r),p=r.get("derive")?.map(k=>aa(k)),m=r.get("validate")?.map(k=>({rule:N(k)})),b=r.has("locked")?[...new Set(r.get("locked").flatMap(k=>k.values))]:void 0,I=r.get("tolerance")?.map(k=>sa(k)),j=ra(e.typedBlockEntries),L=xn(e.infoEntries,"info"),g={type:e.objectType,id:e.id,properties:a,placement:i,info:L};return o.length>0&&(g.groups=o),s&&(g.epoch=s),c&&(g.referencePlane=c),l!==void 0&&(g.tidalLock=l),d&&(g.resonance=d),f&&(g.renderHints=f),p?.length&&(g.deriveRules=p),m?.length&&(g.validationRules=m),b?.length&&(g.lockedFields=b),I?.length&&(g.tolerances=I),j&&Object.keys(j).length>0&&(g.typedBlocks=j),t!=="2.1"&&(g.groups||g.epoch||g.referencePlane||g.tidalLock!==void 0||g.resonance||g.renderHints||g.deriveRules?.length||g.validationRules?.length||g.lockedFields?.length||g.tolerances?.length||g.typedBlocks)&&M(t,n,e.id,e.location),g}function ea(e,t){return{...e,participantObjectIds:[...new Set(e.participantObjectIds)],tags:[...new Set(e.tags)],positions:t.map(n=>ta(n))}}function ta(e){let t=kn(e.fields),n=jn(t);return{objectId:e.objectId,placement:n,inner:X(t.get("inner")?.[0],"inner"),outer:X(t.get("outer")?.[0],"outer")}}function kn(e){let t=new Map;for(let n of e){let r=xe(n.key);if(!r)throw u.fromLocation(`Unknown field "${n.key}"`,n.location);if(!r.allowRepeat&&t.has(n.key))throw u.fromLocation(`Duplicate field "${n.key}"`,n.location);let i=t.get(n.key)??[];i.push(n),t.set(n.key,i)}return t}function jn(e){let t=e.get("orbit")?.[0],n=e.get("at")?.[0],r=e.get("surface")?.[0],i=e.get("free")?.[0];if([t,n,r,i].filter(Boolean).length>1){let o=t??n??r??i;throw u.fromLocation("Object has multiple placement modes",o?.location)}if(t)return{mode:"orbit",target:N(t),distance:X(e.get("distance")?.[0],"distance"),semiMajor:X(e.get("semiMajor")?.[0],"semiMajor"),eccentricity:la(e.get("eccentricity")?.[0],"eccentricity"),period:X(e.get("period")?.[0],"period"),angle:X(e.get("angle")?.[0],"angle"),inclination:X(e.get("inclination")?.[0],"inclination"),phase:X(e.get("phase")?.[0],"phase")};if(n){let o=N(n);return{mode:"at",target:o,reference:un(o,n.location)}}if(r)return{mode:"surface",target:N(r)};if(i){let o=N(i),s=st(o);return{mode:"free",distance:s??void 0,descriptor:s?void 0:o}}return null}function na(e,t){let n={};for(let[r,i]of t.entries()){let a=i[0],o=xe(r);!a||!o?.legacySchema||o.legacySchema.placement||(ct(r,e,a.location),n[r]=dn(r,a.values,a.location))}return n}function xn(e,t){let n={};for(let r of e){if(r.key in n)throw u.fromLocation(`Duplicate ${t} key "${r.key}"`,r.location);n[r.key]=r.value}return n}function ra(e){let t={};for(let n of Object.keys(e)){let r=e[n];r?.length&&(t[n]=xn(r,n))}return t}function ia(e){let t={},n=e.get("renderLabel")?.[0],r=e.get("renderOrbit")?.[0],i=e.get("renderPriority")?.[0];return n&&(t.renderLabel=Z(N(n),"renderLabel",n.location)),r&&(t.renderOrbit=Z(N(r),"renderOrbit",r.location)),i&&(t.renderPriority=ze(N(i),"renderPriority",i.location)),Object.keys(t).length>0?t:void 0}function oa(e){if(e.values.length!==2)throw u.fromLocation('Field "resonance" expects "<targetObjectId> <ratio>"',e.location);let t=e.values[1];if(!/^\d+:\d+$/.test(t))throw u.fromLocation(`Invalid resonance ratio "${t}"`,e.location);return{targetObjectId:e.values[0],ratio:t}}function aa(e){if(e.values.length!==2)throw u.fromLocation('Field "derive" expects "<field> <strategy>"',e.location);return{field:e.values[0],strategy:e.values[1]}}function sa(e){if(e.values.length!==2)throw u.fromLocation('Field "tolerance" expects "<field> <value>"',e.location);let t=e.values[1],n=st(t),r=Number(t);return{field:e.values[0],value:n??(Number.isFinite(r)?r:t)}}function ca(e){return e?[...new Set(e.values)]:[]}function yn(e){return e&&e.values.join(" ").trim()||null}function X(e,t){return e?at(N(e),e.location,t):void 0}function la(e,t){return e?ze(N(e),t,e.location):void 0}function N(e){return $e(e.values,e.key,e.location)}function xe(e){return Ve.get(e)}function On(e,t){for(let n of e){let r=xe(n.key);if(!r)throw u.fromLocation(`Unknown field "${n.key}"`,n.location);if(r.legacySchema){ct(n.key,t,n.location);continue}if((n.key==="renderLabel"||n.key==="renderOrbit"||n.key==="tidalLock")&&n.values.length!==1)throw u.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function M(e,t,n,r){e!=="2.1"&&t.push({code:"parse.schema21.featureCompatibility",severity:"warning",source:"parse",message:`Feature "${n}" requires schema 2.1; parsed in compatibility mode because the document header is "schema ${e}".`,line:r.line,column:r.column})}function ua(e){let t=[...e],n=[],r=!1,i=!1,a=null,o=1,s=1;for(let c=0;c<t.length;c++){let l=t[c],d=t[c+1];if(i){if(l==="*"&&d==="/"){t[c]=" ",t[c+1]=" ",i=!1,a=null,c++,s+=2;continue}l!==`
5
- `&&l!=="\r"&&(t[c]=" "),l===`
6
- `?(o++,s=1):s++;continue}if(!r&&l==="/"&&d==="*"){n.push({kind:"block",line:o,column:s}),t[c]=" ",t[c+1]=" ",i=!0,a={line:o,column:s},c++,s+=2;continue}if(!r&&l==="#"&&!da(t,c)){n.push({kind:"line",line:o,column:s}),t[c]=" ";let f=c+1;for(;f<t.length&&t[f]!==`
7
- `&&t[f]!=="\r";)t[f]=" ",f++;s+=f-c,c=f-1;continue}l==='"'&&t[c-1]!=="\\"&&(r=!r),l===`
8
- `?(o++,s=1):s++}if(i)throw u.fromLocation("Unclosed block comment",a??void 0);return{source:t.join(""),comments:n}}function da(e,t){let n=t+1,r=0;for(;n<e.length&&/[0-9a-f]/i.test(e[n]??"");)n++,r++;if(![3,4,6,8].includes(r))return!1;let i=e[n];return i===void 0||i===" "||i===" "||i==="\r"||i===`
9
- `}function lt(e="WorldOrbit",t="2.0"){return{format:"worldorbit",version:t,schemaVersion:t,sourceVersion:"1.0",system:{type:"system",id:e,title:e,description:null,epoch:null,referencePlane:null,defaults:{view:"topdown",scale:null,units:null,preset:null,theme:null},atlasMetadata:{},viewpoints:[],annotations:[]},groups:[],relations:[],events:[],objects:[],diagnostics:[]}}function Ye(e){return structuredClone(e)}function Ln(e){let t=[{kind:"system"},{kind:"defaults"}];if(e.system){for(let n of Object.keys(e.system.atlasMetadata).sort())t.push({kind:"metadata",key:n});for(let n of[...e.system.viewpoints].sort(ie))t.push({kind:"viewpoint",id:n.id});for(let n of[...e.system.annotations].sort(ie))t.push({kind:"annotation",id:n.id})}for(let n of[...e.groups].sort(ie))t.push({kind:"group",id:n.id});for(let n of[...e.relations].sort(ie))t.push({kind:"relation",id:n.id});for(let n of[...e.events].sort(ie)){t.push({kind:"event",id:n.id});for(let r of[...n.positions].sort(_n))t.push({kind:"event-pose",id:n.id,key:r.objectId})}for(let n of[...e.objects].sort(ie))t.push({kind:"object",id:n.id});return t}function ut(e,t){switch(t.kind){case"system":return e.system;case"defaults":return e.system?.defaults??null;case"metadata":return t.key?e.system?.atlasMetadata[t.key]??null:null;case"group":return t.id?Fn(e,t.id):null;case"event":return t.id?qe(e,t.id):null;case"event-pose":return t.id&&t.key?En(e,t.id,t.key):null;case"object":return t.id?Dn(e,t.id):null;case"viewpoint":return t.id?Mn(e.system,t.id):null;case"annotation":return t.id?Rn(e.system,t.id):null;case"relation":return t.id?Pn(e,t.id):null}}function dt(e,t,n){let r=Ye(e),i=mt(r);switch(t.kind){case"system":return r.system=n,r;case"defaults":return i.defaults={...i.defaults,...n},r;case"metadata":if(!t.key)throw new Error('Metadata updates require a "key" value.');return n==null||n===""?delete i.atlasMetadata[t.key]:i.atlasMetadata[t.key]=String(n),r;case"group":if(!t.id)throw new Error('Group updates require an "id" value.');return ue(r.groups,n),r;case"event":if(!t.id)throw new Error('Event updates require an "id" value.');return ue(r.events,n),r;case"event-pose":if(!t.id||!t.key)throw new Error('Event pose updates require an event "id" and pose "key" value.');return fa(r.events,t.id,n),r;case"object":if(!t.id)throw new Error('Object updates require an "id" value.');return ue(r.objects,n),r;case"viewpoint":if(!t.id)throw new Error('Viewpoint updates require an "id" value.');return ue(i.viewpoints,n),r;case"annotation":if(!t.id)throw new Error('Annotation updates require an "id" value.');return ue(i.annotations,n),r;case"relation":if(!t.id)throw new Error('Relation updates require an "id" value.');return ue(r.relations,n),r}}function An(e,t,n){return dt(e,t,n(ut(e,t)))}function Sn(e,t){let n=Ye(e),r=mt(n);switch(t.kind){case"metadata":return t.key&&delete r.atlasMetadata[t.key],n;case"object":return t.id&&(n.objects=n.objects.filter(i=>i.id!==t.id)),n;case"group":return t.id&&(n.groups=n.groups.filter(i=>i.id!==t.id)),n;case"event":return t.id&&(n.events=n.events.filter(i=>i.id!==t.id)),n;case"event-pose":if(t.id&&t.key){let i=qe(n,t.id);i&&(i.positions=i.positions.filter(a=>a.objectId!==t.key))}return n;case"viewpoint":return t.id&&(r.viewpoints=r.viewpoints.filter(i=>i.id!==t.id)),n;case"annotation":return t.id&&(r.annotations=r.annotations.filter(i=>i.id!==t.id)),n;case"relation":return t.id&&(n.relations=n.relations.filter(i=>i.id!==t.id)),n;default:return n}}function ft(e,t){return t.map(n=>({diagnostic:n,path:pt(e,n)}))}function pt(e,t){if(t.objectId&&Dn(e,t.objectId))return{kind:"object",id:t.objectId};if(t.field?.startsWith("group.")){let n=t.field.split(".");if(n[1]&&Fn(e,n[1]))return{kind:"group",id:n[1]}}if(t.field?.startsWith("viewpoint.")){let n=t.field.split(".");if(n[1]&&Mn(e.system,n[1]))return{kind:"viewpoint",id:n[1]}}if(t.field?.startsWith("annotation.")){let n=t.field.split(".");if(n[1]&&Rn(e.system,n[1]))return{kind:"annotation",id:n[1]}}if(t.field?.startsWith("relation.")){let n=t.field.split(".");if(n[1]&&Pn(e,n[1]))return{kind:"relation",id:n[1]}}if(t.field?.startsWith("event.")){let n=t.field.split(".");if(n[1]&&qe(e,n[1]))return n[2]==="pose"&&n[3]&&En(e,n[1],n[3])?{kind:"event-pose",id:n[1],key:n[3]}:{kind:"event",id:n[1]}}return t.field&&t.field in mt(e).atlasMetadata?{kind:"metadata",key:t.field}:null}function Tn(e){let t=[...e.diagnostics,...je(e,e.version)];return ft(e,t)}function mt(e){return e.system||(e.system=lt().system),e.system}function Dn(e,t){return e.objects.find(n=>n.id===t)??null}function Fn(e,t){return e.groups.find(n=>n.id===t)??null}function Pn(e,t){return e.relations.find(n=>n.id===t)??null}function qe(e,t){return e.events.find(n=>n.id===t)??null}function En(e,t,n){return qe(e,t)?.positions.find(r=>r.objectId===n)??null}function Mn(e,t){return e?.viewpoints.find(n=>n.id===t)??null}function Rn(e,t){return e?.annotations.find(n=>n.id===t)??null}function ue(e,t){let n=e.findIndex(r=>r.id===t.id);if(n===-1){e.push(t),e.sort(ie);return}e[n]=t}function fa(e,t,n){let r=e.find(a=>a.id===t);if(!r)throw new Error(`Unknown event "${t}" for pose update.`);let i=r.positions.findIndex(a=>a.objectId===n.objectId);if(i===-1){r.positions.push(n),r.positions.sort(_n);return}r.positions[i]=n}function ie(e,t){return e.id.localeCompare(t.id)}function _n(e,t){return e.objectId.localeCompare(t.objectId)}var pa=/^schema\s+2(?:\.0|\.1)?$/i,ma=/^schema\s+2\.1$/i,ha=/^schema\s+2\.0-draft$/i;function ht(e){for(let t of ya(e).split(/\r?\n/)){let n=t.trim();if(n)return ha.test(n)?"2.0-draft":ma.test(n)?"2.1":pa.test(n)?"2.0":"1.0"}return"1.0"}function ya(e){let t=[...e],n=!1,r=!1;for(let i=0;i<t.length;i++){let a=t[i],o=t[i+1];if(r){if(a==="*"&&o==="/"){t[i]=" ",t[i+1]=" ",r=!1,i++;continue}a!==`
10
- `&&a!=="\r"&&(t[i]=" ");continue}if(!n&&a==="/"&&o==="*"){t[i]=" ",t[i+1]=" ",r=!0,i++;continue}if(!n&&a==="#"){t[i]=" ";let s=i+1;for(;s<t.length&&t[s]!==`
11
- `&&t[s]!=="\r";)t[s]=" ",s++;i=s-1;continue}a==='"'&&t[i-1]!=="\\"&&(n=!n)}return t.join("")}function He(e){let t=yt(e);if(!t.ok||!t.value){let n=t.diagnostics[0];throw new u(n?.message??"Failed to load WorldOrbit source",n?.line,n?.column)}return t.value}function yt(e){let t=ht(e);if(t==="2.0"||t==="2.0-draft"||t==="2.1")return ga(e,t);let n;try{n=G(e)}catch(i){return{ok:!1,value:null,diagnostics:[F(i,"parse")]}}let r;try{r=V(n)}catch(i){return{ok:!1,value:null,diagnostics:[F(i,"normalize")]}}try{W(r)}catch(i){return{ok:!1,value:null,diagnostics:[F(i,"validate")]}}return{ok:!0,value:{schemaVersion:t,ast:n,document:r,atlasDocument:null,draftDocument:null,diagnostics:[]},diagnostics:[]}}function ga(e,t){let n;try{n=We(e)}catch(o){return{ok:!1,value:null,diagnostics:[F(o,"parse","load.atlas.failed")]}}let r=[...n.diagnostics];if(r.some(o=>o.severity==="error"))return{ok:!1,value:null,diagnostics:r};let i;try{i=Ie(n)}catch(o){return{ok:!1,value:null,diagnostics:[F(o,"normalize","load.atlas.materialize.failed")]}}return{ok:!0,value:{schemaVersion:t,ast:null,document:i,atlasDocument:n,draftDocument:n,diagnostics:r},diagnostics:r}}var ba=/^```worldorbit(?:\s+(.*))?\s*$/;function Nn(e){let t=e.split(/\r?\n/),n=[],r=!1,i=null,a=0,o=[];return t.forEach((s,c)=>{let l=c+1;if(!r){let d=s.match(ba);d&&(r=!0,i=d[1]??null,a=l,o=[]);return}if(s.trim()==="```"){n.push({source:o.join(`
12
- `),info:i,startLine:a,endLine:l}),r=!1,i=null,a=0,o=[];return}o.push(s)}),n}function Cn(e){let t=G(e),n=V(t);return W(n),{ast:t,document:n}}function wa(e){let t=Cn(e);return{...t,scene:re(t.document)}}function va(e){return He(e)}function Ia(e){return Te(e)}function $a(e,t={}){return Be(e,t)}return Zn(ka);})();
1
+ "use strict";var WorldOrbitCore=(()=>{var it=Object.defineProperty;var cr=Object.getOwnPropertyDescriptor;var lr=Object.getOwnPropertyNames;var ur=Object.prototype.hasOwnProperty;var dr=(e,t)=>{for(var n in t)it(e,n,{get:t[n],enumerable:!0})},fr=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of lr(t))!ur.call(e,i)&&i!==n&&it(e,i,{get:()=>t[i],enumerable:!(r=cr(t,i))||r.enumerable});return e};var pr=e=>fr(it({},"__esModule",{value:!0}),e);var Ya={};dr(Ya,{WORLDORBIT_FIELD_KEYS:()=>Rt,WORLDORBIT_FIELD_SCHEMAS:()=>ot,WORLDORBIT_OBJECT_TYPES:()=>he,WorldOrbitError:()=>u,cloneAtlasDocument:()=>et,createDiagnostic:()=>Vt,createEmptyAtlasDocument:()=>Ot,detectWorldOrbitSchemaVersion:()=>Dt,diagnosticFromError:()=>T,extractWorldOrbitBlocks:()=>tr,formatAtlasDocument:()=>qe,formatDocument:()=>He,formatDraftDocument:()=>mt,getAtlasDocumentNode:()=>xt,getFieldSchema:()=>A,isKnownFieldKey:()=>at,listAtlasDocumentPaths:()=>Wn,load:()=>Ba,loadWorldOrbitSource:()=>nt,loadWorldOrbitSourceWithDiagnostics:()=>Tt,materializeAtlasDocument:()=>Oe,materializeDraftDocument:()=>pn,normalizeDocument:()=>W,normalizeWithDiagnostics:()=>Bt,parse:()=>nr,parseSafe:()=>Ua,parseWithDiagnostics:()=>Re,parseWorldOrbit:()=>Z,parseWorldOrbitAtlas:()=>Je,parseWorldOrbitDraft:()=>En,removeAtlasDocumentNode:()=>qn,render:()=>Va,renderDocumentToScene:()=>oe,resolveAtlasDiagnosticPath:()=>Lt,resolveAtlasDiagnostics:()=>St,rotatePoint:()=>Jt,stringify:()=>Wa,supportsObjectType:()=>st,tokenizeLine:()=>_t,tokenizeLineDetailed:()=>ie,unitFamilyAllowsUnit:()=>ye,updateAtlasDocumentNode:()=>Yn,upgradeDocumentToDraftV2:()=>Ye,upgradeDocumentToV2:()=>je,upsertAtlasDocumentNode:()=>Pt,validateAtlasDocumentWithDiagnostics:()=>Hn,validateDocument:()=>Y,validateDocumentWithDiagnostics:()=>Ut});var u=class e extends Error{line;column;constructor(t,n,r){let i=n===void 0?"":` (line ${n}${r===void 0?"":`, column ${r}`})`;super(`${t}${i}`),this.name="WorldOrbitError",this.line=n,this.column=r}static fromLocation(t,n){return new e(t,n?.line,n?.column)}};var me=["system","star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],R=me.filter(e=>e!=="system"),mr=["star","planet","moon","asteroid","comet","structure","phenomenon"],Mt=["structure","phenomenon"],K=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],hr=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"];function w(e,t){return{key:e,...t}}var he=new Set(me),ot=new Map([w("orbit",{kind:"string",placement:!0,arity:"single",objectTypes:K}),w("distance",{kind:"unit",placement:!0,arity:"single",objectTypes:K,unitFamily:"distance"}),w("semiMajor",{kind:"unit",placement:!0,arity:"single",objectTypes:K,unitFamily:"distance"}),w("eccentricity",{kind:"number",placement:!0,arity:"single",objectTypes:K}),w("period",{kind:"unit",placement:!0,arity:"single",objectTypes:K,unitFamily:"duration"}),w("angle",{kind:"unit",placement:!0,arity:"single",objectTypes:K,unitFamily:"angle"}),w("inclination",{kind:"unit",placement:!0,arity:"single",objectTypes:K,unitFamily:"angle"}),w("phase",{kind:"unit",placement:!0,arity:"single",objectTypes:K,unitFamily:"angle"}),w("at",{kind:"string",placement:!0,arity:"single",objectTypes:Mt}),w("surface",{kind:"string",placement:!0,arity:"single",objectTypes:Mt}),w("free",{kind:"string",placement:!0,arity:"single",objectTypes:hr}),w("kind",{kind:"string",placement:!1,arity:"single",objectTypes:R}),w("class",{kind:"string",placement:!1,arity:"single",objectTypes:R}),w("culture",{kind:"string",placement:!1,arity:"single",objectTypes:R}),w("tags",{kind:"list",placement:!1,arity:"multiple",objectTypes:me}),w("color",{kind:"string",placement:!1,arity:"single",objectTypes:me}),w("image",{kind:"string",placement:!1,arity:"single",objectTypes:mr}),w("hidden",{kind:"boolean",placement:!1,arity:"single",objectTypes:me}),w("radius",{kind:"unit",placement:!1,arity:"single",objectTypes:R,unitFamily:"radius"}),w("mass",{kind:"unit",placement:!1,arity:"single",objectTypes:R,unitFamily:"mass"}),w("density",{kind:"unit",placement:!1,arity:"single",objectTypes:R,unitFamily:"generic"}),w("gravity",{kind:"unit",placement:!1,arity:"single",objectTypes:R,unitFamily:"generic"}),w("temperature",{kind:"unit",placement:!1,arity:"single",objectTypes:R,unitFamily:"generic"}),w("albedo",{kind:"number",placement:!1,arity:"single",objectTypes:R}),w("atmosphere",{kind:"string",placement:!1,arity:"single",objectTypes:["planet","moon","asteroid","comet","phenomenon"]}),w("inner",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),w("outer",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),w("view",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),w("scale",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),w("units",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),w("title",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),w("on",{kind:"string",placement:!1,arity:"single",objectTypes:R}),w("source",{kind:"string",placement:!1,arity:"single",objectTypes:R}),w("cycle",{kind:"unit",placement:!1,arity:"single",objectTypes:R,unitFamily:"duration"})].map(e=>[e.key,e])),Rt=new Set(ot.keys());function A(e){return ot.get(e)}function at(e){return Rt.has(e)}function st(e,t){return e.objectTypes.includes(t)}function ye(e,t){switch(e){case"distance":return t===null||["au","km","m","ly","pc","kpc","re","sol"].includes(t);case"radius":return t===null||["km","m","re","rj","sol"].includes(t);case"mass":return t===null||["me","mj","sol"].includes(t);case"duration":return t===null||["s","min","h","d","y","ky","my","gy"].includes(t);case"angle":return t===null||t==="deg";case"generic":return!0}}function _t(e){return ie(e).map(t=>t.value)}function ie(e,t={}){let n=[],r=t.columnOffset??0,i="",s=null,a=!1,c=!1,o=null,l=()=>{s!==null&&(n.push({value:i,column:s,quoted:a}),i="",s=null,a=!1)};for(let d=0;d<e.length;d++){let f=e[d],p=r+d+1;if(c&&f==="\\"){let m=e[d+1];if(m==='"'||m==="\\"){i+=m,d++;continue}}if(f==='"'){c?c=!1:(s===null&&(s=p),a=!0,o=p,c=!0);continue}if(!c&&/\s/.test(f)){l();continue}s===null&&(s=p),i+=f}if(c)throw new u("Unclosed quote in line",t.line,o??r+e.length);return l(),n}function Fe(e){return e.match(/^\s*/)?.[0].length??0}function Z(e){let t=e.split(/\r?\n/),n=[],r=null,i=!1,s=null;for(let a=0;a<t.length;a++){let c=t[a],o=a+1;if(!c.trim())continue;let l=Fe(c),d=ie(c.slice(l),{line:o,columnOffset:l});if(d.length!==0){if(l===0){i=!1,s=null;let f=yr(d,o);n.push(f),r=f;continue}if(!r)throw new u("Indented line without parent object",o,l+1);if(d.length===1&&d[0].value==="info"){i=!0,s=l;continue}i&&l<=(s??0)&&(i=!1),i?r.infoEntries.push(vr(d,o)):r.blockFields.push(br(d,o))}}return{type:"document",objects:n}}function yr(e,t){if(e.length<2)throw new u("Invalid object declaration",t,e[0]?.column??1);let[n,r,...i]=e;if(!he.has(n.value))throw new u(`Unknown object type "${n.value}"`,t,n.column);return{type:"object",objectType:n.value,name:r.value,inlineFields:gr(i,t),blockFields:[],infoEntries:[],location:{line:t,column:n.column}}}function gr(e,t){let n=[],r=0;for(;r<e.length;){let i=e[r],s=A(i.value);if(!s)throw new u(`Unknown field "${i.value}"`,t,i.column);r++;let a=[];if(s.arity==="multiple")for(;r<e.length&&!at(e[r].value);)a.push(e[r]),r++;else{let c=e[r];c&&(a.push(c),r++)}if(a.length===0)throw new u(`Missing value for field "${i.value}"`,t,i.column);n.push({type:"field",key:i.value,values:a.map(c=>c.value),location:{line:t,column:i.column}})}return n}function br(e,t){if(e.length<2)throw new u("Invalid field line",t,e[0]?.column??1);if(!A(e[0].value))throw new u(`Unknown field "${e[0].value}"`,t,e[0].column);return{type:"field",key:e[0].value,values:e.slice(1).map(n=>n.value),location:{line:t,column:e[0].column}}}function vr(e,t){if(e.length<2)throw new u("Invalid info entry",t,e[0]?.column??1);return{type:"info-entry",key:e[0].value,value:e.slice(1).map(n=>n.value).join(" "),location:{line:t,column:e[0].column}}}var zt=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,wr=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),$r=/^[A-Za-z][A-Za-z0-9+.-]*:/;function W(e){let t=null,n=[];for(let r of e.objects){let i=Ir(r);if(r.objectType==="system"){if(t)throw u.fromLocation("Only one system object is allowed",r.location);t=i}else n.push(i)}return{format:"worldorbit",version:"1.0",schemaVersion:"1.0",system:t,groups:[],relations:[],events:[],objects:n}}function Ir(e){let t=[...e.inlineFields,...e.blockFields];kr(e.objectType,t);let n=jr(t),r=Or(e.objectType,n),i=xr(n),s=Lr(e.infoEntries);return e.objectType==="system"?{type:"system",id:e.name,title:typeof i.title=="string"?i.title:null,description:null,epoch:null,referencePlane:null,properties:i,info:s}:{type:e.objectType,id:e.name,properties:i,placement:r,info:s}}function kr(e,t){for(let n of t){let r=A(n.key);if(!r)throw u.fromLocation(`Unknown field "${n.key}"`,n.location);if(!st(r,e))throw u.fromLocation(`Field "${n.key}" is not valid on "${e}"`,n.location);if(r.arity==="single"&&n.values.length!==1)throw u.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function jr(e){let t=new Map;for(let n of e){if(t.has(n.key))throw u.fromLocation(`Duplicate field "${n.key}"`,n.location);t.set(n.key,n)}return t}function Or(e,t){let n=t.has("orbit"),r=t.has("at"),i=t.has("surface"),s=t.has("free"),a=[n,r,i,s].filter(Boolean).length;if(a>1){let c=t.get("orbit")??t.get("at")??t.get("surface")??t.get("free");throw u.fromLocation("Object has multiple placement modes",c?.location)}if(e==="system"&&a>0)throw u.fromLocation("System objects cannot declare placement",[...t.values()][0]?.location);if(n)return{mode:"orbit",target:Ee(t,"orbit"),distance:ce(t,"distance"),semiMajor:ce(t,"semiMajor"),eccentricity:Tr(t,"eccentricity"),period:ce(t,"period"),angle:ce(t,"angle"),inclination:ce(t,"inclination"),phase:ce(t,"phase")};if(r){let c=Me(t,"at"),o=Ee(t,"at");return{mode:"at",target:o,reference:Ar(o,c.location)}}if(i)return{mode:"surface",target:Ee(t,"surface")};if(s){let c=Ee(t,"free"),o=Dr(c);return{mode:"free",distance:o??void 0,descriptor:o?void 0:c}}return null}function xr(e){let t={};for(let[n,r]of e.entries()){let i=A(n);if(!(!i||i.placement))switch(i.kind){case"list":t[n]=r.values;break;case"boolean":t[n]=Fr(r);break;case"number":t[n]=Nt(le(r),n,r.location);break;case"unit":t[n]=Ct(le(r),r.location,n);break;case"string":t[n]=Pr(n,r);break}}return t}function Pr(e,t){let n=t.values.join(" ").trim();return e==="image"&&Sr(n,t.location),n}function Sr(e,t){if(!e)throw u.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw u.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match($r);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw u.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function Lr(e){let t={};for(let n of e){if(n.key in t)throw u.fromLocation(`Duplicate info key "${n.key}"`,n.location);t[n.key]=n.value}return t}function Ar(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw u.fromLocation(`Invalid special position "${e}"`,t);let n=e.match(/^([A-Za-z0-9._-]+)-([A-Za-z0-9._-]+):(L[1-5])$/);if(n)return{kind:"lagrange",primary:n[1],secondary:n[2],point:n[3]};let r=e.match(/^([A-Za-z0-9._-]+):(L[1-5])$/);if(r)return{kind:"lagrange",primary:r[1],secondary:null,point:r[2]};if(/^[A-Za-z0-9._-]+:L\d+$/i.test(e))throw u.fromLocation(`Invalid special position "${e}"`,t);let i=e.match(/^([A-Za-z0-9._-]+):([A-Za-z0-9._-]+)$/);return i?{kind:"anchor",objectId:i[1],anchor:i[2]}:{kind:"named",name:e}}function Ct(e,t,n){let r=e.match(zt);if(!r)throw u.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let s=A(n);if(s?.unitFamily&&!ye(s.unitFamily,i.unit))throw u.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function Dr(e){let t=e.match(zt);return t?{value:Number(t[1]),unit:t[2]??null}:null}function ce(e,t){if(!e.has(t))return;let n=Me(e,t);return Ct(le(n),n.location,t)}function Tr(e,t){if(!e.has(t))return;let n=Me(e,t);return Nt(le(n),t,n.location)}function Nt(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw u.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function Fr(e){let t=le(e).toLowerCase(),n=wr.get(t);if(n===void 0)throw u.fromLocation(`Invalid boolean value "${t}" for "${e.key}"`,e.location);return n}function Me(e,t){let n=e.get(t);if(!n)throw new u(`Missing value for key "${t}"`);return n}function Ee(e,t){return le(Me(e,t))}function le(e){if(e.values.length!==1)throw u.fromLocation(`Field "${e.key}" expects exactly one value`,e.location);return e.values[0]}var Er=new Set(["star","planet","moon","asteroid","comet"]);function Y(e){let t=new Set,n=new Map;for(let r of e.objects){if(t.has(r.id))throw new u(`Duplicate object id "${r.id}"`);t.add(r.id),n.set(r.id,r)}for(let r of e.objects)if(r.placement){if((r.placement.mode==="orbit"||r.placement.mode==="surface")&&!t.has(r.placement.target))throw new u(`Unknown placement target "${r.placement.target}" on "${r.id}"`);if(r.placement.mode==="surface"){let i=n.get(r.placement.target);if(!i||!Er.has(i.type))throw new u(`Surface target "${r.placement.target}" on "${r.id}" is not surface-capable`)}r.placement.mode==="at"&&(r.placement.reference.kind==="lagrange"&&Mr(r,r.placement.reference,t),r.placement.reference.kind==="anchor"&&Rr(r,r.placement.reference,t))}}function Mr(e,t,n){if(!n.has(t.primary))throw new u(`Unknown Lagrange reference "${t.primary}" on "${e.id}"`);if(t.secondary&&!n.has(t.secondary))throw new u(`Unknown Lagrange reference "${t.secondary}" on "${e.id}"`)}function Rr(e,t,n){if(!n.has(t.objectId))throw new u(`Unknown anchor target "${t.objectId}" on "${e.id}"`)}function Vt(e){return{...e}}function T(e,t,n=`${t}.failed`){return e instanceof u?{code:n,severity:"error",source:t,message:e.message,line:e.line,column:e.column}:e instanceof Error?{code:n,severity:"error",source:t,message:e.message}:{code:n,severity:"error",source:t,message:String(e)}}function Re(e){let t;try{t=Z(e)}catch(r){return{ok:!1,value:null,diagnostics:[T(r,"parse")]}}let n;try{n=W(t)}catch(r){return{ok:!1,value:null,diagnostics:[T(r,"normalize")]}}try{Y(n)}catch(r){return{ok:!1,value:null,diagnostics:[T(r,"validate")]}}return{ok:!0,value:{ast:t,document:n},diagnostics:[]}}function Bt(e){try{return{ok:!0,value:W(e),diagnostics:[]}}catch(t){return{ok:!1,value:null,diagnostics:[T(t,"normalize")]}}}function Ut(e){try{return Y(e),{ok:!0,value:e,diagnostics:[]}}catch(t){return{ok:!1,value:null,diagnostics:[T(t,"validate")]}}}var ge=1495978707e-1,_r=6371,zr=71492,Cr=695700,Nr=63241.077,Vr=206264.806,Br=206264806,Zt=.68,Ur=.2,Xt=28;function oe(e,t={}){let n=qr(t),r=n.width,i=n.height,s=n.padding,a=Yr(e),c=Gr(e,t.projection),o=pt(t.camera??null),l=ft(c,o),d=Xr(a,t.scaleModel),f=Qr(a),p=e.system?.id??null,m=t.activeEventId??null,v=Wr(e.objects,e.events??[],m),j=new Map(v.map(y=>[y.id,y])),O=Ri(v,j),x=new Map,g=[],I=[],F=[],N=[],E=[],H=new Map,G=new Map;for(let y of v){let M=y.placement;if(!M){F.push(y);continue}if(M.mode==="orbit"){Ht(G,M.target,y);continue}if(M.mode==="surface"){Ht(H,M.target,y);continue}if(M.mode==="at"){E.push(y);continue}N.push(y)}let ne=N.length>0?r*.42:r/2,L=i/2,V={orbitChildren:G,surfaceChildren:H,objectMap:j,spacingFactor:f,projection:l,scaleModel:d},B=F.find(y=>y.type==="star")??F[0]??null;B&&lt(B,ne,L,0,x,g,I,V);let U=F.filter(y=>y.id!==B?.id);if(U.length>0){let y=Math.min(r,i)*.28*f*d.orbitDistanceMultiplier;U.forEach((M,P)=>{let rt=Ie(P,U.length,-Math.PI/2),re=ke(rt,y,l,1);lt(M,ne+re.x,L+re.y,0,x,g,I,V)})}N.forEach((y,M)=>{let P=r-s-140-Bi(y.placement?.mode==="free"?y.placement.distance:void 0,d),rt=Math.max(76,(i-s*2-180)/Math.max(1,N.length)*f)*d.freePlacementMultiplier,re=s+92+M*rt;x.set(y.id,{object:y,x:P,y:re,radius:Ve(y,0,d),sortKey:Ue(P,re,0)}),I.push({object:y,groupId:O.groupIds.get(y.id)??null,x1:P-60,y1:re,x2:P-18,y2:re,mode:"free"}),Ce(y,x,g,I,V,1)}),E.forEach((y,M)=>{if(x.has(y.id)||!y.placement||y.placement.mode!=="at")return;let P=Ei(y.placement.reference,x,j,M,E.length,r,i,s,V);x.set(y.id,{object:y,x:P.x,y:P.y,radius:Ve(y,2,d),sortKey:Ue(P.x,P.y,2),anchorX:P.anchorX,anchorY:P.anchorY}),P.anchorX!==void 0&&P.anchorY!==void 0&&I.push({object:y,groupId:O.groupIds.get(y.id)??null,x1:P.anchorX,y1:P.anchorY,x2:P.x,y2:P.y,mode:"at"}),Ce(y,x,g,I,V,2)});let D=[...x.values()].map(y=>ei(y,d,O)),Ae=g.map(y=>ti(y,O.groupIds.get(y.object.id)??null)),De=I.map(y=>ni(y)),Te=ri(D,r,i,d.labelMultiplier),Ft=di(e,D),Et=fi(e.events??[],D,m),rr=ci(Ae,Ft,Et,De,D,Te),ir=li(D,Ae,De,Te,O,d.labelMultiplier),or=ui(e,D),ar=pi(e,c,n.preset,O,j),sr=Oi(r,i,D,Ae,De,Te,d.labelMultiplier);return{width:r,height:i,padding:s,renderPreset:n.preset,projection:c,renderProjection:l,camera:o,scaleModel:d,title:String(e.system?.title??e.system?.properties.title??e.system?.id??"WorldOrbit")||"WorldOrbit",subtitle:Zr(c,l,a,o),systemId:p,viewMode:c,layoutPreset:a,metadata:{format:e.format,version:e.version,view:c,renderProjection:l,scale:String(e.system?.properties.scale??a),units:String(e.system?.properties.units??"mixed"),preset:n.preset??"custom",...o?.azimuth!==null?{"camera.azimuth":String(o?.azimuth)}:{},...o?.elevation!==null?{"camera.elevation":String(o?.elevation)}:{},...o?.roll!==null?{"camera.roll":String(o?.roll)}:{},...o?.distance!==null?{"camera.distance":String(o?.distance)}:{}},contentBounds:sr,layers:rr,groups:ir,semanticGroups:or,viewpoints:ar,events:Et,activeEventId:m,objects:D,orbitVisuals:Ae,relations:Ft,leaders:De,labels:Te}}function Jt(e,t,n){let r=We(n),i=Math.cos(r),s=Math.sin(r),a=e.x-t.x,c=e.y-t.y;return{x:t.x+a*i-c*s,y:t.y+a*s+c*i}}function Wr(e,t,n){let r=e.map(c=>structuredClone(c));if(!n)return r;let i=t.find(c=>c.id===n);if(!i)return r;let s=new Map(r.map(c=>[c.id,c])),a=new Set([...i.targetObjectId?[i.targetObjectId]:[],...i.participantObjectIds,...i.positions.map(c=>c.objectId)]);for(let c of a){let o=s.get(c);o&&(i.epoch&&(o.epoch=i.epoch),i.referencePlane&&(o.referencePlane=i.referencePlane))}for(let c of i.positions){let o=s.get(c.objectId);o&&(c.placement&&(o.placement=structuredClone(c.placement)),c.inner&&(o.properties.inner={...c.inner}),c.outer&&(o.properties.outer={...c.outer}),c.epoch&&(o.epoch=c.epoch),c.referencePlane&&(o.referencePlane=c.referencePlane))}return r}function Yr(e){switch(String(e.system?.properties.scale??"balanced").toLowerCase()){case"compressed":case"compact":return"compact";case"expanded":case"presentation":return"presentation";default:return"balanced"}}function qr(e){let t=Hr(e.preset);return{width:e.width??t.width,height:e.height??t.height,padding:e.padding??t.padding,preset:e.preset??null}}function Hr(e){switch(e){case"presentation":return{width:1440,height:900,padding:88};case"atlas-card":return{width:960,height:560,padding:56};case"markdown":return{width:920,height:540,padding:48};default:return{width:1200,height:780,padding:72}}}function Gr(e,t){if(t==="topdown"||t==="isometric"||t==="orthographic"||t==="perspective")return t;let n=String(e.system?.properties.view??"topdown").toLowerCase();return tn(n)??"topdown"}function ft(e,t){switch(e){case"topdown":return"topdown";case"isometric":return"isometric";case"orthographic":return t&&(t.azimuth!==null||t.elevation!==null||t.roll!==null)?"isometric":"topdown";case"perspective":return"isometric"}}function pt(e){if(!e)return null;let t={azimuth:ct(e.azimuth),elevation:ct(e.elevation),roll:ct(e.roll),distance:Kr(e.distance)};return t.azimuth!==null||t.elevation!==null||t.roll!==null||t.distance!==null?t:null}function ct(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function Kr(e){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:null}function Zr(e,t,n,r){let i=[`${Gt(e)} view`,`${Gt(n)} layout`];if(e!==t&&i.push(`2D ${t} fallback`),r){let s=[r.azimuth!==null?`az ${r.azimuth}`:null,r.elevation!==null?`el ${r.elevation}`:null,r.roll!==null?`roll ${r.roll}`:null,r.distance!==null?`dist ${r.distance}`:null].filter(Boolean);s.length>0&&i.push(`camera ${s.join(" / ")}`)}return i.join(" - ")}function Xr(e,t){return{...Jr(e),...t}}function Jr(e){switch(e){case"compact":return{orbitDistanceMultiplier:.84,bodyRadiusMultiplier:.92,labelMultiplier:.9,freePlacementMultiplier:.9,ringThicknessMultiplier:.92,minBodyRadius:4,maxBodyRadius:36};case"presentation":return{orbitDistanceMultiplier:1.2,bodyRadiusMultiplier:1.18,labelMultiplier:1.08,freePlacementMultiplier:1.05,ringThicknessMultiplier:1.16,minBodyRadius:5,maxBodyRadius:48};default:return{orbitDistanceMultiplier:1,bodyRadiusMultiplier:1,labelMultiplier:1,freePlacementMultiplier:1,ringThicknessMultiplier:1,minBodyRadius:4,maxBodyRadius:40}}}function Qr(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function ei(e,t,n){let{object:r,x:i,y:s,radius:a,sortKey:c,anchorX:o,anchorY:l}=e,d=r.renderHints?.renderPriority??0;return{renderId:ue(r.id),objectId:r.id,object:r,parentId:n.parentIds.get(r.id)??null,ancestorIds:n.ancestorIds.get(r.id)??[],childIds:n.childIds.get(r.id)??[],groupId:n.groupIds.get(r.id)??null,semanticGroupIds:[...r.groups??[]],x:i,y:s,radius:a,visualRadius:Vi(r,a,t),sortKey:c+d*.001,anchorX:o,anchorY:l,label:r.id,secondaryLabel:r.type==="structure"?String(r.properties.kind??r.type):r.type,fillColor:Wi(r.properties.color),imageHref:typeof r.properties.image=="string"&&r.properties.image.trim()?r.properties.image:void 0,hidden:r.properties.hidden===!0}}function ti(e,t){return{renderId:`${ue(e.object.id)}-orbit`,objectId:e.object.id,object:e.object,parentId:e.parentId,groupId:t,semanticGroupIds:[...e.object.groups??[]],kind:e.kind,cx:e.cx,cy:e.cy,radius:e.radius,rx:e.rx,ry:e.ry,rotationDeg:e.rotationDeg,band:e.band,bandThickness:e.bandThickness,frontArcPath:e.frontArcPath,backArcPath:e.backArcPath,hidden:e.object.properties.hidden===!0||e.object.renderHints?.renderOrbit===!1}}function ni(e){return{renderId:`${ue(e.object.id)}-leader-${e.mode}`,objectId:e.object.id,object:e.object,groupId:e.groupId,semanticGroupIds:[...e.object.groups??[]],x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,mode:e.mode,hidden:e.object.properties.hidden===!0}}function ri(e,t,n,r){let i=[],s=[],a=new Map(e.map(o=>[o.objectId,o])),c=[...e].filter(o=>!o.hidden&&o.object.renderHints?.renderLabel!==!1).sort(ii);for(let o of c){let l=oi(o,a,s,t,n,r)??en(o,Qt(o,a.get(o.parentId??"")??null,n),0,r);s.push(sn(o,l,r)),i.push({renderId:`${o.renderId}-label`,objectId:o.objectId,object:o.object,groupId:o.groupId,semanticGroupIds:[...o.semanticGroupIds],label:o.label,secondaryLabel:o.secondaryLabel,x:l.x,y:l.labelY,secondaryY:l.secondaryY,textAnchor:l.textAnchor,direction:l.direction,hidden:o.hidden})}return i}function ii(e,t){let n=Wt(e)-Wt(t);if(n!==0)return n;let r=(t.object.renderHints?.renderPriority??0)-(e.object.renderHints?.renderPriority??0);return r!==0?r:e.sortKey-t.sortKey}function Wt(e){switch(e.object.type){case"star":return 0;case"planet":return 1;case"moon":return 2;case"belt":case"ring":return 3;case"asteroid":case"comet":return 4;case"structure":case"phenomenon":return 5}}function oi(e,t,n,r,i,s){for(let a of ai(e,t,r,i)){let c=a==="left"||a==="right"?4:6;for(let o=0;o<=c;o+=1){let l=en(e,a,o,s),d=sn(e,l,s);if(!n.some(f=>Ci(f,d)))return l}}return null}function ai(e,t,n,r){let i=e.parentId?t.get(e.parentId)??null:null,s=Qt(e,i,r),a=s==="below"?"above":"below",c=si(e,i,n),o=c==="right"?"left":"right";return e.object.type==="structure"||e.object.type==="phenomenon"||e.object.placement?.mode==="at"||e.object.placement?.mode==="surface"||e.object.placement?.mode==="free"?[c,s,o,a]:[s,c,a,o]}function Qt(e,t,n){return t&&Math.abs(e.y-t.y)>6?e.y>=t.y?"below":"above":e.y>n*.62?"above":"below"}function si(e,t,n){return t&&Math.abs(e.x-t.x)>6?e.x>=t.x?"right":"left":e.x>=n/2?"right":"left"}function en(e,t,n,r){let i=14*r;switch(t){case"above":{let s=e.y-(e.radius+18*r+n*i);return{x:e.x,labelY:s,secondaryY:s-16*r,textAnchor:"middle",direction:t}}case"below":{let s=e.y+e.radius+18*r+n*i;return{x:e.x,labelY:s,secondaryY:s+16*r,textAnchor:"middle",direction:t}}case"left":{let s=e.x-(e.visualRadius+16*r+n*i),a=e.y-4*r;return{x:s,labelY:a,secondaryY:a+16*r,textAnchor:"end",direction:t}}case"right":{let s=e.x+e.visualRadius+16*r+n*i,a=e.y-4*r;return{x:s,labelY:a,secondaryY:a+16*r,textAnchor:"start",direction:t}}}}function ci(e,t,n,r,i,s){let a=e.filter(o=>!o.hidden&&!!o.backArcPath).map(o=>o.renderId),c=e.filter(o=>!o.hidden).map(o=>o.renderId);return[{id:"background",renderIds:["wo-bg","wo-bg-glow","wo-grid"]},{id:"guides",renderIds:r.filter(o=>!o.hidden).map(o=>o.renderId)},{id:"orbits-back",renderIds:a},{id:"orbits-front",renderIds:c},{id:"relations",renderIds:t.filter(o=>!o.hidden).map(o=>o.renderId)},{id:"events",renderIds:n.filter(o=>!o.hidden).map(o=>o.renderId)},{id:"objects",renderIds:i.filter(o=>!o.hidden).map(o=>o.renderId)},{id:"labels",renderIds:s.filter(o=>!o.hidden).map(o=>o.renderId)},{id:"metadata",renderIds:["wo-title","wo-subtitle","wo-meta"]}]}function li(e,t,n,r,i,s){let a=new Map,c=o=>{if(!o)return null;let l=a.get(o);if(l)return l;let d=i.groupRoots.get(o)??null,f={renderId:o,rootObjectId:d,label:d??o,objectIds:[],orbitIds:[],labelIds:[],leaderIds:[],contentBounds:$e(0,0,0,0)};return a.set(o,f),f};for(let o of e){let l=c(o.groupId);l&&!o.hidden&&l.objectIds.push(o.objectId)}for(let o of t){let l=c(o.groupId);l&&!o.hidden&&l.orbitIds.push(o.objectId)}for(let o of n){let l=c(o.groupId);l&&!o.hidden&&l.leaderIds.push(o.objectId)}for(let o of r){let l=c(o.groupId);l&&!o.hidden&&l.labelIds.push(o.objectId)}for(let o of a.values())o.contentBounds=_i(o,e,t,n,r,s);return[...a.values()].sort((o,l)=>o.label.localeCompare(l.label))}function ui(e,t){return[...e.groups].map(n=>({id:n.id,label:n.label,summary:n.summary,color:n.color,tags:[...n.tags],hidden:n.hidden,objectIds:t.filter(r=>!r.hidden&&r.semanticGroupIds.includes(n.id)).map(r=>r.objectId)})).sort((n,r)=>n.label.localeCompare(r.label))}function di(e,t){let n=new Map(t.map(r=>[r.objectId,r]));return e.relations.map(r=>{let i=n.get(r.from),s=n.get(r.to);return{renderId:`${ue(r.id)}-relation`,relationId:r.id,relation:r,fromObjectId:r.from,toObjectId:r.to,x1:i?.x??0,y1:i?.y??0,x2:s?.x??0,y2:s?.y??0,hidden:r.hidden||!i||!s||i.hidden||s.hidden}}).sort((r,i)=>r.relation.id.localeCompare(i.relation.id))}function fi(e,t,n){let r=new Map(t.map(i=>[i.objectId,i]));return e.map(i=>{let s=[...new Set([...i.targetObjectId?[i.targetObjectId]:[],...i.participantObjectIds])],a=s.map(l=>r.get(l)).filter(Boolean),c=a.length>0?a.reduce((l,d)=>l+d.x,0)/a.length:0,o=a.length>0?a.reduce((l,d)=>l+d.y,0)/a.length:0;return{renderId:`${ue(i.id)}-event`,eventId:i.id,event:i,objectIds:s,participantIds:[...i.participantObjectIds],targetObjectId:i.targetObjectId,x:c,y:o,hidden:i.hidden||a.length===0||a.every(l=>l.hidden)||n!==null&&i.id!==n}}).sort((i,s)=>i.event.id.localeCompare(s.event.id))}function pi(e,t,n,r,i){let s=mi(e,t,n),a=new Map;for(let[l,d]of Object.entries(e.system?.info??{})){if(!l.startsWith("viewpoint."))continue;let[f,p,...m]=l.split(".");if(f!=="viewpoint"||!p||m.length===0)continue;let v=Ii(p);if(!v)continue;let j=m.join(".").toLowerCase(),O=a.get(v)??{id:v};hi(O,j,d,e,t,n,r,i),a.set(v,O)}let c=[...a.values()].map(l=>yi(l,t,n,i)).filter(Boolean),o=c.findIndex(l=>l.id===s.id);return o>=0?c.splice(o,1,{...s,...c[o],layers:{...s.layers,...c[o].layers},filter:c[o].filter??s.filter,generated:!1}):c.unshift(s),c.sort((l,d)=>l.id==="overview"?-1:d.id==="overview"?1:l.label.localeCompare(d.label))}function mi(e,t,n){let r=e.system?.title??e.system?.properties.title,i=r?`${String(r)} Overview`:"Overview",s=pt(null),a=ft(t,s);return{id:"overview",label:i,summary:"Fit the whole system with the current atlas defaults.",objectId:null,selectedObjectId:null,eventIds:[],projection:t,renderProjection:a,camera:s,preset:n,rotationDeg:0,scale:null,layers:{},filter:null,generated:!0}}function hi(e,t,n,r,i,s,a,c){let o=n.trim();switch(t){case"label":case"title":o&&(e.label=o);return;case"summary":case"description":o&&(e.summary=o);return;case"focus":case"object":o&&(e.focus=o);return;case"select":case"selection":o&&(e.select=o);return;case"events":e.eventIds=we(o);return;case"projection":case"view":e.projection=tn(o)??i;return;case"preset":e.preset=bi(o)??s;return;case"rotation":case"angle":e.rotationDeg=be(o)??e.rotationDeg??0;return;case"camera.azimuth":e.camera={...e.camera??ze(),azimuth:be(o)};return;case"camera.elevation":e.camera={...e.camera??ze(),elevation:be(o)};return;case"camera.roll":e.camera={...e.camera??ze(),roll:be(o)};return;case"camera.distance":e.camera={...e.camera??ze(),distance:Yt(o)};return;case"zoom":case"scale":e.scale=Yt(o);return;case"layers":e.layers=vi(o);return;case"query":e.filter={...e.filter??_e(),query:o||null};return;case"types":case"objecttypes":e.filter={...e.filter??_e(),objectTypes:wi(o)};return;case"tags":e.filter={...e.filter??_e(),tags:we(o)};return;case"groups":e.filter={...e.filter??_e(),groupIds:$i(o,r,a,c)};return}}function yi(e,t,n,r){let i=e.focus&&r.has(e.focus)?e.focus:null,s=e.select&&r.has(e.select)?e.select:i,a=gi(e.filter),c=e.label?.trim()||ki(e.id),o=e.projection??t,l=pt(e.camera??null),d=ft(o,l);return{id:e.id,label:c,summary:e.summary?.trim()||ji(c,i,a),objectId:i,selectedObjectId:s,eventIds:[...new Set(e.eventIds??[])],projection:o,renderProjection:d,camera:l,preset:e.preset??n,rotationDeg:e.rotationDeg??0,scale:e.scale??null,layers:e.layers??{},filter:a,generated:!1}}function _e(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function ze(){return{azimuth:null,elevation:null,roll:null,distance:null}}function gi(e){if(!e)return null;let t={query:e.query?.trim()||null,objectTypes:[...new Set(e.objectTypes)],tags:[...new Set(e.tags)],groupIds:[...new Set(e.groupIds)]};return t.query||t.objectTypes.length>0||t.tags.length>0||t.groupIds.length>0?t:null}function tn(e){switch(e.toLowerCase()){case"topdown":return"topdown";case"isometric":return"isometric";case"orthographic":return"orthographic";case"perspective":return"perspective";default:return null}}function bi(e){let t=e.toLowerCase();return t==="diagram"||t==="presentation"||t==="atlas-card"||t==="markdown"?t:null}function be(e){let t=Number(e);return Number.isFinite(t)?t:null}function Yt(e){let t=be(e);return t!==null&&t>0?t:null}function vi(e){let t={};for(let n of we(e)){let r=!n.startsWith("-")&&!n.startsWith("!"),i=n.replace(/^[-!]+/,"").toLowerCase();if(i==="orbits"){t["orbits-back"]=r,t["orbits-front"]=r;continue}(i==="background"||i==="guides"||i==="orbits-back"||i==="orbits-front"||i==="relations"||i==="events"||i==="objects"||i==="labels"||i==="metadata")&&(t[i]=r)}return t}function wi(e){return we(e).filter(t=>t==="star"||t==="planet"||t==="moon"||t==="belt"||t==="asteroid"||t==="comet"||t==="ring"||t==="structure"||t==="phenomenon")}function $i(e,t,n,r){return we(e).map(i=>t.schemaVersion==="2.1"||t.schemaVersion==="2.5"||t.groups.some(s=>s.id===i)||i.startsWith("wo-")&&i.endsWith("-group")?i:n.groupIds.has(i)?n.groupIds.get(i)??ve(i):(r.has(i),ve(i)))}function we(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function Ii(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function ki(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function ji(e,t,n){let r=[e];return t&&r.push(`focus ${t}`),n?.objectTypes.length&&r.push(n.objectTypes.join("/")),n?.tags.length&&r.push(`tags ${n.tags.join(", ")}`),n?.query&&r.push(`query "${n.query}"`),r.join(" - ")}function Oi(e,t,n,r,i,s,a){let c=Number.POSITIVE_INFINITY,o=Number.POSITIVE_INFINITY,l=Number.NEGATIVE_INFINITY,d=Number.NEGATIVE_INFINITY,f=(p,m)=>{c=Math.min(c,p),o=Math.min(o,m),l=Math.max(l,p),d=Math.max(d,m)};for(let p of r)p.hidden||nn(p,f);for(let p of i)p.hidden||(f(p.x1,p.y1),f(p.x2,p.y2));for(let p of n)p.hidden||rn(p,f);for(let p of s)p.hidden||on(p,f,a);return!Number.isFinite(c)||!Number.isFinite(o)?$e(0,0,e,t):$e(c,o,l,d)}function nn(e,t){let n=e.bandThickness!==void 0?e.bandThickness/2+4:e.band?10:3;if(e.kind==="circle"&&e.radius!==void 0){t(e.cx-e.radius-n,e.cy-e.radius-n),t(e.cx+e.radius+n,e.cy+e.radius+n);return}let r=e.rx??e.radius??0,i=e.ry??e.radius??0,s=ln(e.cx,e.cy,r,i,e.rotationDeg,0,Math.PI*2,Xt*2);for(let a of s)t(a.x-n,a.y-n),t(a.x+n,a.y+n)}function $e(e,t,n,r){return{minX:e,minY:t,maxX:n,maxY:r,width:n-e,height:r-t,centerX:e+(n-e)/2,centerY:t+(r-t)/2}}function rn(e,t){t(e.x-e.visualRadius-24,e.y-e.visualRadius-16),t(e.x+e.visualRadius+24,e.y+e.visualRadius+36)}function on(e,t,n){let r=cn(e.x,e.y,e.secondaryY,e.textAnchor,e.direction,e.label,e.secondaryLabel,n);t(r.left,r.top),t(r.right,r.bottom)}function lt(e,t,n,r,i,s,a,c){i.has(e.id)||(i.set(e.id,{object:e,x:t,y:n,radius:Ve(e,r,c.scaleModel),sortKey:Ue(t,n,r)}),Ce(e,i,s,a,c,r+1))}function Ce(e,t,n,r,i,s){let a=t.get(e.id);if(!a)return;let c=[...i.orbitChildren.get(e.id)??[]].sort(xi),o=Pi(c,a.radius,i.spacingFactor,i.scaleModel),l=Ai(c,o);c.forEach((f,p)=>{let m=Si(f,p,c.length,a,o,l[p]??o.innerPx,i);n.push({object:f,parentId:e.id,kind:m.kind,cx:m.cx,cy:m.cy,radius:m.radius,rx:m.rx,ry:m.ry,rotationDeg:m.rotationDeg,band:m.band,bandThickness:m.bandThickness,frontArcPath:m.frontArcPath,backArcPath:m.backArcPath}),lt(f,m.objectX,m.objectY,s,t,n,r,i)});let d=[...i.surfaceChildren.get(e.id)??[]];d.forEach((f,p)=>{let m=Ie(p,d.length,-Math.PI/3),v=28*i.spacingFactor,j=ke(m,a.radius,i.projection,i.projection==="isometric"?.9:1),O=ke(m,a.radius+v,i.projection,i.projection==="isometric"?.9:1),x=a.x+j.x,g=a.y+j.y,I=a.x+O.x,F=a.y+O.y;t.set(f.id,{object:f,x:I,y:F,radius:Ve(f,s+1,i.scaleModel),sortKey:Ue(I,F,s+1),anchorX:x,anchorY:g}),r.push({object:f,groupId:i.objectMap.has(f.id)?ve(zi(f,i.objectMap)):null,x1:x,y1:g,x2:I,y2:F,mode:"surface"}),Ce(f,t,n,r,i,s+1)})}function xi(e,t){let n=Ne(e),r=Ne(t);return n!==null&&r!==null&&n!==r?n-r:n!==null&&r===null?-1:n===null&&r!==null?1:e.id.localeCompare(t.id)}function Pi(e,t,n,r){let i=e.map(f=>Ne(f)),s=i.filter(f=>f!==null),a=t+56*n*r.orbitDistanceMultiplier,c=(e.length>2?54:64)*n*r.orbitDistanceMultiplier;if(s.length===0)return{metrics:i,minMetric:0,maxMetric:0,metricSpread:0,innerPx:a,stepPx:c,pixelSpread:Math.max(c*Math.max(e.length-1,1),c),minimumGapPx:c*.42};let o=Math.min(...s),l=Math.max(...s),d=l-o;return{metrics:i,minMetric:o,maxMetric:l,metricSpread:d,innerPx:a,stepPx:c,pixelSpread:Math.max(c*Math.max(e.length-1,1),c),minimumGapPx:c*.42}}function Si(e,t,n,r,i,s,a){let c=e.placement,o=e.type==="belt"||e.type==="ring";if(!c||c.mode!=="orbit"){let G=i.innerPx+t*i.stepPx;return{kind:"circle",cx:r.x,cy:r.y,radius:G,rotationDeg:0,band:o,bandThickness:o?12*a.scaleModel.ringThicknessMultiplier:void 0,objectX:r.x,objectY:r.y-G}}let l=S(typeof c.eccentricity=="number"?c.eccentricity:0,0,.92),d=s,f=Math.max(d*Math.sqrt(1-l*l),d*.18),p=dt(c.inclination)??0,m=a.projection==="isometric"?Math.max(Ur,Math.cos(We(p)))*Zt:1,v=Math.max(f*m,d*.14),j=dt(c.angle)??0,O=d*l,x=dn(-O,0,j),g=r.x+x.x,I=r.y+x.y,F=Ti(c.phase,t,n),N=un(g,I,d,v,j,F),E=a.projection==="topdown"&&l<=1e-4&&Math.abs(j)<=1e-4,H=o?Fi(e,d,i,a.scaleModel):void 0;return{kind:E?"circle":"ellipse",cx:E?r.x:g,cy:E?r.y:I,radius:E?d:void 0,rx:E?void 0:d,ry:E?void 0:v,rotationDeg:j,band:o,bandThickness:H,frontArcPath:a.projection==="isometric"||o?qt(g,I,d,v,j,0,Math.PI):void 0,backArcPath:a.projection==="isometric"||o?qt(g,I,d,v,j,Math.PI,Math.PI*2):void 0,objectX:N.x,objectY:N.y}}function Li(e,t){return t.innerPx+t.stepPx*Di(Math.max(e,0)+1)}function Ai(e,t){let n=[];return e.forEach((r,i)=>{let s=Ne(r),a=t.innerPx+i*t.stepPx,c=s===null?a:Li(s,t),o=i===0?t.innerPx:(n[i-1]??t.innerPx)+t.minimumGapPx;n.push(Math.max(c,o))}),n}function Ne(e){return!e.placement||e.placement.mode!=="orbit"?null:Be(e.placement.semiMajor??e.placement.distance??null)}function Di(e){return Math.log(e)/Math.log(2)}function Ti(e,t,n){let r=e?dt(e):null;return r!==null?We(r-90):Ie(t,n,-Math.PI/2)}function Fi(e,t,n,r){let i=Be(ut(e.properties.inner)),s=Be(ut(e.properties.outer));if(i!==null&&s!==null){let c=Math.abs(s-i);if(n.metricSpread>0)return S(c/n.metricSpread*n.pixelSpread*r.ringThicknessMultiplier,8,54);let o=Math.max(Math.max(i,s),1e-4);return S(c/o*t*.75*r.ringThicknessMultiplier,8,48)}return(e.type==="belt"?18:12)*r.ringThicknessMultiplier}function Ei(e,t,n,r,i,s,a,c,o){if(e.kind==="lagrange")return Mi(e,t,n,s,a);if(e.kind==="anchor"){let l=t.get(e.objectId);if(l){let d=Ie(r,i,Math.PI/5),f=(l.radius+36)*o.scaleModel.labelMultiplier,p=ke(d,f,o.projection,o.projection==="isometric"?.92:1);return{x:l.x+p.x,y:l.y+p.y,anchorX:l.x,anchorY:l.y}}}if(e.kind==="named"){let l=t.get(e.name);if(l){let d=Ie(r,i,Math.PI/6),f=(l.radius+36)*o.scaleModel.labelMultiplier,p=ke(d,f,o.projection,o.projection==="isometric"?.92:1);return{x:l.x+p.x,y:l.y+p.y,anchorX:l.x,anchorY:l.y}}}return{x:s-c-170,y:a-c-86-r*58*o.scaleModel.freePlacementMultiplier}}function Mi(e,t,n,r,i){let s=e.secondary?t.get(e.primary):Ni(e.primary,t,n),a=t.get(e.secondary??e.primary);if(!s||!a)return{x:r*.7,y:i*.25};let c=a.x-s.x,o=a.y-s.y,l=Math.hypot(c,o)||1,d=c/l,f=o/l,p=-f,m=d,v=S(l*.25,24,68);switch(e.point){case"L1":return{x:a.x-d*v,y:a.y-f*v,anchorX:a.x,anchorY:a.y};case"L2":return{x:a.x+d*v,y:a.y+f*v,anchorX:a.x,anchorY:a.y};case"L3":return{x:s.x-d*v,y:s.y-f*v,anchorX:s.x,anchorY:s.y};case"L4":return{x:a.x+(d*.5-p*.8660254)*v,y:a.y+(f*.5-m*.8660254)*v,anchorX:a.x,anchorY:a.y};case"L5":return{x:a.x+(d*.5+p*.8660254)*v,y:a.y+(f*.5+m*.8660254)*v,anchorX:a.x,anchorY:a.y}}}function Ri(e,t){let n=new Map,r=new Map;for(let l of e){let d=an(l,t);if(n.set(l.id,d),d){let f=r.get(d);f?f.push(l.id):r.set(d,[l.id])}r.has(l.id)||r.set(l.id,[])}let i=new Map,s=new Map,a=new Map,c=l=>{let d=i.get(l);if(d)return d;let f=new Set,p=[],m=n.get(l)??null;for(;m&&!f.has(m);)p.push(m),f.add(m),m=n.get(m)??null;return i.set(l,p),p},o=l=>{let d=a.get(s.get(l)??"");if(d)return d;let f=n.get(l)??null,p=t.get(l),m=l;return p?.placement&&p.placement.mode!=="free"&&f&&(m=o(f)),m};for(let l of e){c(l.id);let d=o(l.id),f=ve(d);s.set(l.id,f),a.set(f,d)}return{parentIds:n,childIds:r,ancestorIds:i,groupIds:s,groupRoots:a}}function an(e,t){let n=e.placement;if(!n)return null;switch(n.mode){case"orbit":case"surface":return t.has(n.target)?n.target:null;case"at":switch(n.reference.kind){case"anchor":return t.has(n.reference.objectId)?n.reference.objectId:null;case"named":return t.has(n.reference.name)?n.reference.name:null;case"lagrange":return n.reference.secondary&&t.has(n.reference.secondary)?n.reference.secondary:t.has(n.reference.primary)?n.reference.primary:null}case"free":return null}}function _i(e,t,n,r,i,s){let a=Number.POSITIVE_INFINITY,c=Number.POSITIVE_INFINITY,o=Number.NEGATIVE_INFINITY,l=Number.NEGATIVE_INFINITY,d=(f,p)=>{a=Math.min(a,f),c=Math.min(c,p),o=Math.max(o,f),l=Math.max(l,p)};for(let f of t)!f.hidden&&e.objectIds.includes(f.objectId)&&rn(f,d);for(let f of n)!f.hidden&&e.orbitIds.includes(f.objectId)&&nn(f,d);for(let f of r)!f.hidden&&e.leaderIds.includes(f.objectId)&&(d(f.x1,f.y1),d(f.x2,f.y2));for(let f of i)!f.hidden&&e.labelIds.includes(f.objectId)&&on(f,d,s);return!Number.isFinite(a)||!Number.isFinite(c)?$e(0,0,0,0):$e(a,c,o,l)}function zi(e,t){let n=e,r=new Set;for(;n.placement&&n.placement.mode!=="free"&&!r.has(n.id);){r.add(n.id);let i=an(n,t);if(!i)break;let s=t.get(i);if(!s)break;n=s}return n.id}function sn(e,t,n){return cn(t.x,t.labelY,t.secondaryY,t.textAnchor,t.direction,e.label,e.secondaryLabel,n)}function cn(e,t,n,r,i,s,a,c){let o=Yi(s,a,c),l=o*2,d=i==="above"?18:12,f=i==="above"?8:12,p=e-o,m=e+o;return r==="start"?(p=e,m=e+l):r==="end"&&(p=e-l,m=e),{left:p,right:m,top:Math.min(t,n)-d,bottom:Math.max(t,n)+f}}function Ci(e,t){return!(e.right<t.left||t.right<e.left||e.bottom<t.top||t.bottom<e.top)}function Ni(e,t,n){let r=n.get(e);return!r?.placement||r.placement.mode!=="orbit"?t.get(e):t.get(r.placement.target)}function Ve(e,t,n){let r=Ui(e.properties.radius,n);if(r!==null)return r;let i=n.bodyRadiusMultiplier;switch(e.type){case"star":return S((t===0?28:20)*i,n.minBodyRadius,n.maxBodyRadius);case"planet":return S(12*i,n.minBodyRadius,n.maxBodyRadius);case"moon":return S(7*i,n.minBodyRadius,n.maxBodyRadius);case"belt":return S(5*i,n.minBodyRadius,n.maxBodyRadius);case"asteroid":return S(5*i,n.minBodyRadius,n.maxBodyRadius);case"comet":return S(6*i,n.minBodyRadius,n.maxBodyRadius);case"ring":return S(5*i,n.minBodyRadius,n.maxBodyRadius);case"structure":return S(6*i,n.minBodyRadius,n.maxBodyRadius);case"phenomenon":return S(8*i,n.minBodyRadius,n.maxBodyRadius)}}function Vi(e,t,n){let r=typeof e.properties.atmosphere=="string"?4:0;switch(e.type){case"star":return t*2.4;case"phenomenon":return t*1.25;case"structure":return t+2;default:return Math.min(t+r,n.maxBodyRadius+10)}}function Be(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/ge;case"m":return e.value/1e3/ge;case"ly":return e.value*Nr;case"pc":return e.value*Vr;case"kpc":return e.value*Br;case"re":return e.value*_r/ge;case"rj":return e.value*zr/ge;case"sol":return e.value*Cr/ge;default:return e.value}}function Bi(e,t){let n=Be(e??null);return n===null||n<=0?0:S(n*96*t.freePlacementMultiplier,0,420)}function Ui(e,t){let n=ut(e);if(!n)return null;let r;switch(n.unit){case"sol":r=S(n.value*22,14,40);break;case"re":r=S(n.value*10,6,18);break;case"km":r=S(Math.log10(Math.max(n.value,1))*2.6,4,16);break;default:r=S(n.value*4,4,20);break}return S(r*t.bodyRadiusMultiplier,t.minBodyRadius,t.maxBodyRadius)}function ut(e){return!e||typeof e!="object"||!("value"in e)?null:e}function dt(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function Ie(e,t,n){return t<=1?n:n+e*Math.PI*2/t}function qt(e,t,n,r,i,s,a){let c=ln(e,t,n,r,i,s,a,Xt);return c.length===0?"":c.map((o,l)=>`${l===0?"M":"L"} ${Kt(o.x)} ${Kt(o.y)}`).join(" ")}function ln(e,t,n,r,i,s,a,c){let o=[];for(let l=0;l<=c;l+=1){let d=s+(a-s)*l/c;o.push(un(e,t,n,r,i,d))}return o}function un(e,t,n,r,i,s){let a=n*Math.cos(s),c=r*Math.sin(s),o=dn(a,c,i);return{x:e+o.x,y:t+o.y}}function dn(e,t,n){let r=We(n);return{x:e*Math.cos(r)-t*Math.sin(r),y:e*Math.sin(r)+t*Math.cos(r)}}function ke(e,t,n,r){let i=n==="isometric"?Zt*r:r;return{x:Math.cos(e)*t,y:Math.sin(e)*t*i}}function Ue(e,t,n){return t*1e3+e+n*.01}function S(e,t,n){return Math.min(Math.max(e,t),n)}function Ht(e,t,n){let r=e.get(t);r?r.push(n):e.set(t,[n])}function ue(e){return`wo-${e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"object"}`}function ve(e){return`${ue(e)}-group`}function Wi(e){return typeof e=="string"&&e.trim()?e:void 0}function Yi(e,t,n){let r=e.length*4.6*n+18,i=t.length*3.9*n+18;return Math.max(r,i,24)}function Gt(e){return e.length>0?e[0].toUpperCase()+e.slice(1):e}function We(e){return e*Math.PI/180}function Kt(e){return Number.isInteger(e)?String(e):e.toFixed(2)}function je(e,t={}){let n=oe(e,t),r=[],i=Gi(e,r),s=Ki(e,r),a=Hi(e,n.renderPreset??t.preset??null,n.projection),c=e.system?qi(e,a,i,s,r,n.renderPreset??t.preset??null):null;return n.viewpoints.some(o=>!o.generated)&&r.push({code:"upgrade.viewpoints.structured",severity:"info",source:"upgrade",message:`Promoted ${n.viewpoints.filter(o=>!o.generated).length} document-defined viewpoint(s) into the 2.0 atlas section.`}),{format:"worldorbit",version:"2.5",schemaVersion:"2.5",sourceVersion:e.version,system:c,groups:structuredClone(e.groups??[]),relations:structuredClone(e.relations??[]),events:structuredClone(e.events??[]),objects:e.objects.map(mn),diagnostics:r}}function Ye(e,t={}){return ao(je(e,t))}function Oe(e,t={}){let n=e.system?{type:"system",id:e.system.id,title:e.system.title,description:e.system.description,epoch:e.system.epoch,referencePlane:e.system.referencePlane,properties:ro(e.system),info:io(e.system)}:null,r=e.objects.map(mn);return Qi(r,e.events??[],t.activeEventId??null),{format:"worldorbit",version:"1.0",schemaVersion:e.version,system:n,groups:structuredClone(e.groups??[]),relations:structuredClone(e.relations??[]),events:e.events.map(Xi),objects:r}}function pn(e){return Oe(e)}function qi(e,t,n,r,i,s){let a=oe(e,{preset:s??void 0,projection:t.view});return{type:"system",id:e.system?.id??"WorldOrbit",title:e.system?.title??(typeof e.system?.properties.title=="string"?e.system.properties.title:null),description:e.system?.description??null,epoch:e.system?.epoch??null,referencePlane:e.system?.referencePlane??null,defaults:t,atlasMetadata:n,viewpoints:a.viewpoints.map(Zi),annotations:r}}function Hi(e,t,n){let r=typeof e.system?.properties.view=="string"?e.system.properties.view.toLowerCase():null;return{view:r==="topdown"||r==="isometric"||r==="orthographic"||r==="perspective"?r:n,scale:typeof e.system?.properties.scale=="string"?e.system.properties.scale:null,units:typeof e.system?.properties.units=="string"?e.system.properties.units:null,preset:t,theme:typeof e.system?.info["atlas.theme"]=="string"?e.system.info["atlas.theme"]:null}}function Gi(e,t){let n={};for(let[i,s]of Object.entries(e.system?.info??{}))i.startsWith("viewpoint.")||i.startsWith("annotation.")||(n[i]=s);let r=Object.keys(n);return r.length>0&&t.push({code:"upgrade.atlasMetadata.preserved",severity:"warning",source:"upgrade",message:`Preserved ${r.length} system info entr${r.length===1?"y":"ies"} as atlas metadata in the 2.0 atlas document.`}),n}function Ki(e,t){let n=new Map;for(let[r,i]of Object.entries(e.system?.info??{})){if(!r.startsWith("annotation."))continue;let[,s,...a]=r.split(".");if(!s||a.length===0)continue;let c=fn(s);if(!c)continue;let o=n.get(c)??{id:c};switch(a.join(".").toLowerCase()){case"label":o.label=i;break;case"target":case"object":o.targetObjectId=i.trim()||null;break;case"body":case"text":case"description":o.body=i;break;case"tags":o.tags=to(i);break}n.set(c,o)}for(let r of e.objects){let i=r.info.description;if(!i)continue;let s=fn(`${r.id}-notes`);n.has(s)||(n.set(s,{id:s,label:`${r.id} Notes`,targetObjectId:r.id,body:i,tags:Array.isArray(r.properties.tags)?r.properties.tags.filter(a=>typeof a=="string"):[]}),t.push({code:"upgrade.annotation.objectDescription",severity:"info",source:"upgrade",message:`Lifted ${r.id}.info.description into structured atlas annotation "${s}".`,objectId:r.id,field:"description"}))}return[...n.values()].filter(r=>r.body||r.label).map(r=>({id:r.id,label:r.label??no(r.id),targetObjectId:r.targetObjectId??null,body:r.body??"",tags:r.tags??[],sourceObjectId:r.targetObjectId??null})).sort((r,i)=>r.label.localeCompare(i.label))}function Zi(e){return{id:e.id,label:e.label,summary:e.summary,focusObjectId:e.objectId,selectedObjectId:e.selectedObjectId,events:[...e.eventIds],projection:e.projection,preset:e.preset,zoom:e.scale,rotationDeg:e.rotationDeg,camera:e.camera?{...e.camera}:null,layers:{...e.layers},filter:e.filter?{query:e.filter.query,objectTypes:[...e.filter.objectTypes],tags:[...e.filter.tags],groupIds:[...e.filter.groupIds]}:null}}function mn(e){return{...e,groups:e.groups?[...e.groups]:void 0,resonance:e.resonance?{...e.resonance}:e.resonance,renderHints:e.renderHints?{...e.renderHints}:e.renderHints,deriveRules:e.deriveRules?e.deriveRules.map(t=>({...t})):void 0,validationRules:e.validationRules?e.validationRules.map(t=>({...t})):void 0,lockedFields:e.lockedFields?[...e.lockedFields]:void 0,tolerances:e.tolerances?e.tolerances.map(t=>({field:t.field,value:t.value&&typeof t.value=="object"&&"value"in t.value?{value:t.value.value,unit:t.value.unit}:Array.isArray(t.value)?[...t.value]:t.value})):void 0,typedBlocks:e.typedBlocks?Object.fromEntries(Object.entries(e.typedBlocks).map(([t,n])=>[t,{...n??{}}])):void 0,properties:eo(e.properties),placement:e.placement?structuredClone(e.placement):null,info:{...e.info}}}function Xi(e){return{...e,participantObjectIds:[...e.participantObjectIds],tags:[...e.tags],positions:e.positions.map(Ji)}}function Ji(e){return{objectId:e.objectId,placement:hn(e.placement),inner:e.inner?{...e.inner}:void 0,outer:e.outer?{...e.outer}:void 0,epoch:e.epoch??null,referencePlane:e.referencePlane??null}}function hn(e){return e?structuredClone(e):null}function Qi(e,t,n){if(!n)return;let r=t.find(a=>a.id===n);if(!r)return;let i=new Map(e.map(a=>[a.id,a])),s=new Set([...r.targetObjectId?[r.targetObjectId]:[],...r.participantObjectIds,...r.positions.map(a=>a.objectId)]);for(let a of s){let c=i.get(a);c&&(r.epoch&&(c.epoch=r.epoch),r.referencePlane&&(c.referencePlane=r.referencePlane))}for(let a of r.positions){let c=i.get(a.objectId);c&&(a.placement&&(c.placement=hn(a.placement)),a.inner&&(c.properties.inner={...a.inner}),a.outer&&(c.properties.outer={...a.outer}),a.epoch&&(c.epoch=a.epoch),a.referencePlane&&(c.referencePlane=a.referencePlane))}}function eo(e){let t={};for(let[n,r]of Object.entries(e)){if(Array.isArray(r)){t[n]=[...r];continue}if(r&&typeof r=="object"&&"value"in r){t[n]={value:r.value,unit:r.unit};continue}t[n]=r}return t}function to(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function fn(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function no(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function ro(e){let t={};return e.title&&(t.title=e.title),t.view=e.defaults.view,e.defaults.scale&&(t.scale=e.defaults.scale),e.defaults.units&&(t.units=e.defaults.units),e.description&&(t.description=e.description),e.epoch&&(t.epoch=e.epoch),e.referencePlane&&(t.referencePlane=e.referencePlane),t}function io(e){let t={...e.atlasMetadata};e.defaults.theme&&(t["atlas.theme"]=e.defaults.theme);for(let n of e.viewpoints){let r=`viewpoint.${n.id}`;t[`${r}.label`]=n.label,n.summary&&(t[`${r}.summary`]=n.summary),n.focusObjectId&&(t[`${r}.focus`]=n.focusObjectId),n.selectedObjectId&&(t[`${r}.select`]=n.selectedObjectId),n.projection&&(t[`${r}.projection`]=n.projection),n.preset&&(t[`${r}.preset`]=n.preset),n.zoom!==null&&(t[`${r}.zoom`]=String(n.zoom)),n.rotationDeg!==0&&(t[`${r}.rotation`]=String(n.rotationDeg)),n.camera?.azimuth!==null&&(t[`${r}.camera.azimuth`]=String(n.camera?.azimuth)),n.camera?.elevation!==null&&(t[`${r}.camera.elevation`]=String(n.camera?.elevation)),n.camera?.roll!==null&&(t[`${r}.camera.roll`]=String(n.camera?.roll)),n.camera?.distance!==null&&(t[`${r}.camera.distance`]=String(n.camera?.distance));let i=oo(n.layers);i&&(t[`${r}.layers`]=i),n.filter?.query&&(t[`${r}.query`]=n.filter.query),(n.filter?.objectTypes.length??0)>0&&(t[`${r}.types`]=n.filter?.objectTypes.join(" ")??""),(n.filter?.tags.length??0)>0&&(t[`${r}.tags`]=n.filter?.tags.join(" ")??""),(n.filter?.groupIds.length??0)>0&&(t[`${r}.groups`]=n.filter?.groupIds.join(" ")??""),n.events.length>0&&(t[`${r}.events`]=n.events.join(" "))}for(let n of e.annotations){let r=`annotation.${n.id}`;t[`${r}.label`]=n.label,n.targetObjectId&&(t[`${r}.target`]=n.targetObjectId),t[`${r}.body`]=n.body,n.tags.length>0&&(t[`${r}.tags`]=n.tags.join(" ")),n.sourceObjectId&&(t[`${r}.source`]=n.sourceObjectId)}return t}function oo(e){let t=[],n=e["orbits-front"],r=e["orbits-back"];(n!==void 0||r!==void 0)&&t.push(n!==!1||r!==!1?"orbits":"-orbits");for(let i of["background","guides","relations","events","objects","labels","metadata"])e[i]!==void 0&&t.push(e[i]?i:`-${i}`);return t.join(" ")}function ao(e){return{...e,version:"2.0-draft",schemaVersion:"2.0-draft"}}var yn=["title","view","scale","units","kind","class","tags","color","image","hidden","orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","radius","mass","density","gravity","temperature","albedo","atmosphere","inner","outer","on","source","cycle"];function He(e,t={}){let n=t.schema??"auto";if(n==="2.0"||n==="2.1"||n==="2.5"||n==="2.0-draft"||e.version==="2.0"||e.version==="2.1"||e.version==="2.5"||e.version==="2.0-draft"){if(n==="2.0-draft"){let o=e.version==="2.0-draft"?e:e.version==="2.0"||e.version==="2.1"||e.version==="2.5"?{...e,version:"2.0-draft",schemaVersion:"2.0-draft"}:Ye(e);return mt(o)}let c=e.version==="2.0"||e.version==="2.1"||e.version==="2.5"?e:e.version==="2.0-draft"?{...e,version:"2.0",schemaVersion:"2.0"}:je(e);return(n==="2.0"||n==="2.1"||n==="2.5")&&c.version!==n?qe({...c,version:n,schemaVersion:n}):qe(c)}let i=[],s=e;s.system&&i.push(...so(s.system));let a=[...s.objects].sort(gt);for(let c of a)i.length>0&&i.push(""),i.push(...lo(c));return i.join(`
2
+ `)}function qe(e){let t=[`schema ${e.version}`,""];e.system&&t.push(...bn(e.system));for(let r of[...e.groups].sort(de))t.push(""),t.push(...In(r));for(let r of[...e.relations].sort(de))t.push(""),t.push(...kn(r));for(let r of[...e.events].sort(de))t.push(""),t.push(...jn(r));let n=[...e.objects].sort(gt);return n.length>0&&t.at(-1)!==""&&t.push(""),n.forEach((r,i)=>{i>0&&t.push(""),t.push(...vn(r))}),t.join(`
3
+ `)}function mt(e){let t=e.version==="2.0-draft"?e:{...e,version:"2.0-draft",schemaVersion:"2.0-draft"},n=["schema 2.0-draft",""];t.system&&n.push(...bn(t.system));for(let i of[...t.groups].sort(de))n.push(""),n.push(...In(i));for(let i of[...t.relations].sort(de))n.push(""),n.push(...kn(i));for(let i of[...t.events].sort(de))n.push(""),n.push(...jn(i));let r=[...t.objects].sort(gt);return r.length>0&&n.at(-1)!==""&&n.push(""),r.forEach((i,s)=>{s>0&&n.push(""),n.push(...vn(i))}),n.join(`
4
+ `)}function so(e){return co("system",e.id,e.properties,null,e.info)}function co(e,t,n,r,i){let s=[`${e} ${t}`],a=[...ht(r),...$n(n)];for(let o of a)s.push(` ${o}`);let c=Object.entries(i).sort(([o],[l])=>o.localeCompare(l));if(c.length>0){a.length>0&&s.push(""),s.push(" info");for(let[o,l]of c)s.push(` ${o} ${h(l)}`)}return s}function bn(e){let t=[`system ${e.id}`];if(e.title&&t.push(` title ${h(e.title)}`),e.description&&t.push(` description ${h(e.description)}`),e.epoch&&t.push(` epoch ${h(e.epoch)}`),e.referencePlane&&t.push(` referencePlane ${h(e.referencePlane)}`),t.push(""),t.push("defaults"),t.push(` view ${e.defaults.view}`),e.defaults.scale&&t.push(` scale ${h(e.defaults.scale)}`),e.defaults.units&&t.push(` units ${h(e.defaults.units)}`),e.defaults.preset&&t.push(` preset ${e.defaults.preset}`),e.defaults.theme&&t.push(` theme ${h(e.defaults.theme)}`),Object.keys(e.atlasMetadata).length>0){t.push(""),t.push("atlas"),t.push(" metadata");for(let[n,r]of Object.entries(e.atlasMetadata).sort(([i],[s])=>i.localeCompare(s)))t.push(` ${n} ${h(r)}`)}for(let n of e.viewpoints)t.push(""),t.push(...fo(n));for(let n of e.annotations)t.push(""),t.push(...po(n));return t}function lo(e){return wn(e.type,e.id,e)}function vn(e){return wn(`object ${e.type}`,e.id,e)}function wn(e,t,n){let r=[`${e} ${t}`],i=[...ht(n.placement),...$n(n.properties),...uo(n)];for(let a of i)r.push(` ${a}`);let s=Object.entries(n.info).sort(([a],[c])=>a.localeCompare(c));if(s.length>0){i.length>0&&r.push(""),r.push(" info");for(let[a,c]of s)r.push(` ${a} ${h(c)}`)}for(let a of["climate","habitability","settlement"]){let c=Object.entries(n.typedBlocks?.[a]??{}).sort(([o],[l])=>o.localeCompare(l));if(c.length>0){r.push(""),r.push(` ${a}`);for(let[o,l]of c)r.push(` ${o} ${h(l)}`)}}return r}function ht(e){if(!e)return[];switch(e.mode){case"orbit":return[`orbit ${e.target}`,...X("distance",e.distance),...X("semiMajor",e.semiMajor),...yo("eccentricity",e.eccentricity),...X("period",e.period),...X("angle",e.angle),...X("inclination",e.inclination),...X("phase",e.phase)];case"at":return[`at ${go(e.reference)}`];case"surface":return[`surface ${e.target}`];case"free":return[`free ${e.distance?yt(e.distance):e.descriptor??""}`.trim()]}}function $n(e){return Object.keys(e).sort(vo).map(t=>`${t} ${On(e[t])}`)}function uo(e){let t=[];e.groups?.length&&t.push(`groups ${e.groups.join(" ")}`),e.epoch&&t.push(`epoch ${h(e.epoch)}`),e.referencePlane&&t.push(`referencePlane ${h(e.referencePlane)}`),e.tidalLock!==void 0&&t.push(`tidalLock ${e.tidalLock?"true":"false"}`),e.renderHints?.renderLabel!==void 0&&t.push(`renderLabel ${e.renderHints.renderLabel?"true":"false"}`),e.renderHints?.renderOrbit!==void 0&&t.push(`renderOrbit ${e.renderHints.renderOrbit?"true":"false"}`),e.renderHints?.renderPriority!==void 0&&t.push(`renderPriority ${e.renderHints.renderPriority}`),e.resonance&&t.push(`resonance ${e.resonance.targetObjectId} ${e.resonance.ratio}`);for(let n of e.deriveRules??[])t.push(`derive ${n.field} ${n.strategy}`);for(let n of e.validationRules??[])t.push(`validate ${n.rule}`);e.lockedFields?.length&&t.push(`locked ${e.lockedFields.join(" ")}`);for(let n of e.tolerances??[])t.push(`tolerance ${n.field} ${On(n.value)}`);return t}function fo(e){let t=[`viewpoint ${e.id}`,` label ${h(e.label)}`];e.focusObjectId&&t.push(` focus ${e.focusObjectId}`),e.selectedObjectId&&e.selectedObjectId!==e.focusObjectId&&t.push(` select ${e.selectedObjectId}`),e.summary&&t.push(` summary ${h(e.summary)}`),e.projection&&t.push(` projection ${e.projection}`),e.preset&&t.push(` preset ${e.preset}`),e.zoom!==null&&t.push(` zoom ${e.zoom}`),e.rotationDeg!==0&&t.push(` rotation ${e.rotationDeg}`),e.camera&&ho(e.camera)&&(t.push(" camera"),e.camera.azimuth!==null&&t.push(` azimuth ${e.camera.azimuth}`),e.camera.elevation!==null&&t.push(` elevation ${e.camera.elevation}`),e.camera.roll!==null&&t.push(` roll ${e.camera.roll}`),e.camera.distance!==null&&t.push(` distance ${e.camera.distance}`));let n=bo(e.layers);return n.length>0&&t.push(` layers ${n.join(" ")}`),e.events.length>0&&t.push(` events ${e.events.join(" ")}`),e.filter&&(t.push(" filter"),e.filter.query&&t.push(` query ${h(e.filter.query)}`),e.filter.objectTypes.length>0&&t.push(` objectTypes ${e.filter.objectTypes.join(" ")}`),e.filter.tags.length>0&&t.push(` tags ${e.filter.tags.map(h).join(" ")}`),e.filter.groupIds.length>0&&t.push(` groups ${e.filter.groupIds.join(" ")}`)),t}function po(e){let t=[`annotation ${e.id}`,` label ${h(e.label)}`];return e.targetObjectId&&t.push(` target ${e.targetObjectId}`),t.push(` body ${h(e.body)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(h).join(" ")}`),t}function In(e){let t=[`group ${e.id}`,` label ${h(e.label)}`];return e.summary&&t.push(` summary ${h(e.summary)}`),e.color&&t.push(` color ${h(e.color)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(h).join(" ")}`),e.hidden&&t.push(" hidden true"),t}function kn(e){let t=[`relation ${e.id}`];return e.from&&t.push(` from ${h(e.from)}`),e.to&&t.push(` to ${h(e.to)}`),e.kind&&t.push(` kind ${h(e.kind)}`),e.label&&t.push(` label ${h(e.label)}`),e.summary&&t.push(` summary ${h(e.summary)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(h).join(" ")}`),e.color&&t.push(` color ${h(e.color)}`),e.hidden&&t.push(" hidden true"),t}function jn(e){let t=[`event ${e.id}`,` kind ${h(e.kind)}`];if(e.label&&t.push(` label ${h(e.label)}`),e.summary&&t.push(` summary ${h(e.summary)}`),e.targetObjectId&&t.push(` target ${e.targetObjectId}`),e.participantObjectIds.length>0&&t.push(` participants ${e.participantObjectIds.join(" ")}`),e.timing&&t.push(` timing ${h(e.timing)}`),e.visibility&&t.push(` visibility ${h(e.visibility)}`),e.epoch&&t.push(` epoch ${h(e.epoch)}`),e.referencePlane&&t.push(` referencePlane ${h(e.referencePlane)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(h).join(" ")}`),e.color&&t.push(` color ${h(e.color)}`),e.hidden&&t.push(" hidden true"),e.positions.length>0){t.push(""),t.push(" positions");for(let n of[...e.positions].sort(wo)){t.push(` pose ${n.objectId}`);for(let r of mo(n))t.push(` ${r}`)}}return t}function mo(e){return[...ht(e.placement),...e.epoch?[`epoch ${h(e.epoch)}`]:[],...e.referencePlane?[`referencePlane ${h(e.referencePlane)}`]:[],...X("inner",e.inner),...X("outer",e.outer)]}function ho(e){return e.azimuth!==null||e.elevation!==null||e.roll!==null||e.distance!==null}function On(e){return Array.isArray(e)?e.map(t=>h(t)).join(" "):typeof e=="boolean"?e?"true":"false":typeof e=="number"?String(e):typeof e=="string"?h(e):yt(e)}function yt(e){return`${e.value}${e.unit??""}`}function X(e,t){return t?[`${e} ${yt(t)}`]:[]}function yo(e,t){return t===void 0?[]:[`${e} ${t}`]}function go(e){switch(e.kind){case"lagrange":return e.secondary?`${e.primary}-${e.secondary}:${e.point}`:`${e.primary}:${e.point}`;case"anchor":return`${e.objectId}:${e.anchor}`;case"named":return e.name}}function bo(e){let t=[],n=e["orbits-front"],r=e["orbits-back"];(n!==void 0||r!==void 0)&&t.push(n!==!1||r!==!1?"orbits":"-orbits");for(let i of["background","guides","relations","events","objects","labels","metadata"])e[i]!==void 0&&t.push(e[i]?i:`-${i}`);return t}function vo(e,t){let n=yn.indexOf(e),r=yn.indexOf(t);return n===-1&&r===-1?e.localeCompare(t):n===-1?1:r===-1?-1:n-r}function gt(e,t){let n=gn(e.type),r=gn(t.type);return n!==r?n-r:e.id.localeCompare(t.id)}function de(e,t){return e.id.localeCompare(t.id)}function wo(e,t){return e.objectId.localeCompare(t.objectId)}function gn(e){switch(e){case"star":return 0;case"planet":return 1;case"moon":return 2;case"belt":return 3;case"asteroid":return 4;case"comet":return 5;case"ring":return 6;case"structure":return 7;case"phenomenon":return 8}}function h(e){return!/\s/.test(e)&&!e.includes('"')?e:`"${e.replaceAll("\\","\\\\").replaceAll('"','\\"')}"`}var xn=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,$o=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),Io=/^[A-Za-z][A-Za-z0-9+.-]*:/;function fe(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function Pe(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function bt(e,t,n){let r=e.match(xn);if(!r)throw u.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let s=A(n);if(s?.unitFamily&&!ye(s.unitFamily,i.unit))throw u.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function vt(e){let t=e.match(xn);return t?{value:Number(t[1]),unit:t[2]??null}:null}function Ge(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw u.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function J(e,t,n){let r=$o.get(e.toLowerCase());if(r===void 0)throw u.fromLocation(`Invalid boolean value "${e}" for "${t}"`,n);return r}function Pn(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw u.fromLocation(`Invalid special position "${e}"`,t);let n=e.match(/^([A-Za-z0-9._-]+)-([A-Za-z0-9._-]+):(L[1-5])$/);if(n)return{kind:"lagrange",primary:n[1],secondary:n[2],point:n[3]};let r=e.match(/^([A-Za-z0-9._-]+):(L[1-5])$/);if(r)return{kind:"lagrange",primary:r[1],secondary:null,point:r[2]};if(/^[A-Za-z0-9._-]+:L\d+$/i.test(e))throw u.fromLocation(`Invalid special position "${e}"`,t);let i=e.match(/^([A-Za-z0-9._-]+):([A-Za-z0-9._-]+)$/);return i?{kind:"anchor",objectId:i[1],anchor:i[2]}:{kind:"named",name:e}}function ko(e,t){if(!e)throw u.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw u.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match(Io);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw u.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function Sn(e,t,n){let r=A(e);if(!r)throw u.fromLocation(`Unknown field "${e}"`,n);if(r.arity==="single"&&t.length!==1)throw u.fromLocation(`Field "${e}" expects exactly one value`,n);switch(r.kind){case"list":return t;case"boolean":return J(xe(t,e,n),e,n);case"number":return Ge(xe(t,e,n),e,n);case"unit":return bt(xe(t,e,n),n,e);case"string":{let i=t.join(" ").trim();return e==="image"&&ko(i,n),i}}}function wt(e,t,n){let r=A(e);if(!r)throw u.fromLocation(`Unknown field "${e}"`,n);if(!r.objectTypes.includes(t))throw u.fromLocation(`Field "${e}" is not valid on "${t}"`,n)}function xe(e,t,n){if(e.length!==1)throw u.fromLocation(`Field "${t}" expects exactly one value`,n);return e[0]}var An=new Set(["star","planet","moon","asteroid","comet"]),jo=332946.0487,Oo=1047.3486,Ke=1495978707e-1,xo=6371,Po=695700,So=63241.077,Lo=206264.806,Ao=206264806;function Se(e,t){let n=[],r=new Map(e.objects.map(c=>[c.id,c])),i=new Set(e.groups.map(c=>c.id)),s=new Set(e.events.map(c=>c.id));e.system||n.push(b("validate.system.required","Atlas documents must declare exactly one system."));let a=new Map;for(let[c,o]of[["group",e.groups.map(l=>l.id)],["viewpoint",e.system?.viewpoints.map(l=>l.id)??[]],["annotation",e.system?.annotations.map(l=>l.id)??[]],["relation",e.relations.map(l=>l.id)],["event",e.events.map(l=>l.id)],["object",e.objects.map(l=>l.id)]])for(let l of o){let d=a.get(l);d?n.push(b("validate.id.duplicate",`Duplicate ${c} id "${l}" already used by ${d}.`)):a.set(l,c)}for(let c of e.relations)Do(c,r,n);for(let c of e.system?.viewpoints??[])To(c,i,s,t,n,r);for(let c of e.objects)Fo(c,e.system,r,i,n);for(let c of e.events)Eo(c,e.system,r,n);return n}function Do(e,t,n){e.from?t.has(e.from)||n.push(b("validate.relation.from.unknown",`Unknown relation source "${e.from}" on "${e.id}".`)):n.push(b("validate.relation.from.required",`Relation "${e.id}" is missing a "from" target.`)),e.to?t.has(e.to)||n.push(b("validate.relation.to.unknown",`Unknown relation target "${e.to}" on "${e.id}".`)):n.push(b("validate.relation.to.required",`Relation "${e.id}" is missing a "to" target.`)),e.kind||n.push(b("validate.relation.kind.required",`Relation "${e.id}" is missing a "kind" value.`))}function To(e,t,n,r,i,s){let a=e.filter;if(r==="2.1"||r==="2.5"){if(a)for(let c of a.groupIds)t.has(c)||i.push(k("validate.viewpoint.group.unknown",`Unknown group "${c}" in viewpoint "${e.id}".`,void 0,`viewpoint.${e.id}.groups`));for(let c of e.events??[])n.has(c)||i.push(k("validate.viewpoint.event.unknown",`Unknown event "${c}" in viewpoint "${e.id}".`,void 0,`viewpoint.${e.id}.events`))}zo(e.projection,i,`viewpoint.${e.id}.projection`,e.id),Co(e.camera,e.projection,e.rotationDeg,i,e.id,e.focusObjectId,e.selectedObjectId,a,s)}function Fo(e,t,n,r,i){let s=e.placement,a=s?.mode==="orbit"?s:null,c=s?.mode==="orbit"?n.get(s.target)??null:null;if(e.groups)for(let o of e.groups)r.has(o)||i.push(k("validate.group.unknown",`Unknown group "${o}" on "${e.id}".`,e.id,"groups"));if(typeof e.epoch=="string"&&!e.epoch.trim()&&i.push(k("validate.epoch.empty",`Object "${e.id}" defines an empty epoch string.`,e.id,"epoch")),typeof e.referencePlane=="string"&&!e.referencePlane.trim()&&i.push(k("validate.referencePlane.empty",`Object "${e.id}" defines an empty reference plane string.`,e.id,"referencePlane")),a&&(n.has(a.target)||i.push(b("validate.orbit.target.unknown",`Unknown placement target "${a.target}" on "${e.id}".`,e.id,"orbit")),a.distance&&a.semiMajor&&i.push(b("validate.orbit.distanceConflict",`Object "${e.id}" cannot declare both "distance" and "semiMajor".`,e.id,"distance")),a.phase&&!e.epoch&&!t?.epoch&&i.push(k("validate.phase.epochMissing",`Object "${e.id}" sets "phase" without an object or system epoch.`,e.id,"phase")),a.inclination&&!e.referencePlane&&!t?.referencePlane&&i.push(k("validate.inclination.referencePlaneMissing",`Object "${e.id}" sets "inclination" without an object or system reference plane.`,e.id,"inclination")),a.period&&!It(c?.properties.mass)&&i.push(k("validate.period.massMissing",`Object "${e.id}" sets "period" but its central mass cannot be derived.`,e.id,"period"))),s?.mode==="surface"){let o=n.get(s.target);o?An.has(o.type)||i.push(b("validate.surface.target.invalid",`Surface target "${s.target}" on "${e.id}" is not surface-capable.`,e.id,"surface")):i.push(b("validate.surface.target.unknown",`Unknown placement target "${s.target}" on "${e.id}".`,e.id,"surface"))}if(s?.mode==="at"&&(e.type!=="structure"&&e.type!=="phenomenon"&&i.push(b("validate.at.objectType",`Only structures and phenomena may use "at" placement; found "${e.type}" on "${e.id}".`,e.id,"at")),Ro(e,n,i)||i.push(b("validate.at.target.unknown",`Unknown at-reference target "${s.target}" on "${e.id}".`,e.id,"at"))),e.resonance){let o=n.get(e.resonance.targetObjectId);o?(e.placement?.mode!=="orbit"||o.placement?.mode!=="orbit"||e.placement.target!==o.placement.target)&&i.push(k("validate.resonance.orbitMismatch",`Resonance target "${e.resonance.targetObjectId}" on "${e.id}" does not share a compatible orbital parent.`,e.id,"resonance")):i.push(b("validate.resonance.target.unknown",`Unknown resonance target "${e.resonance.targetObjectId}" on "${e.id}".`,e.id,"resonance"))}for(let o of e.deriveRules??[]){if(o.field!=="period"||o.strategy!=="kepler"){i.push(k("validate.derive.unsupported",`Unsupported derive rule "${o.field} ${o.strategy}" on "${e.id}".`,e.id,"derive"));continue}let l=Ln(e,c);if(l===null){i.push(k("validate.derive.inputsMissing",`Object "${e.id}" requests "derive period kepler" but lacks enough input data.`,e.id,"derive"));continue}a?.period||i.push($t("validate.derive.period.available",`Object "${e.id}" can derive a Kepler period of ${Uo(l)}.`,e.id,"derive"))}for(let o of e.validationRules??[]){if(o.rule!=="kepler"){i.push(k("validate.rule.unsupported",`Unsupported validation rule "${o.rule}" on "${e.id}".`,e.id,"validate"));continue}let l=Dn(a?.period),d=Ln(e,c);if(l===null||d===null)continue;let f=Bo(e,"period");Math.abs(l-d)>f&&i.push(b("validate.kepler.mismatch",`Object "${e.id}" fails Kepler validation for "period".`,e.id,"validate"))}}function Eo(e,t,n,r){let i=`event.${e.id}`,s=new Set;e.kind.trim()||r.push(b("validate.event.kind.required",`Event "${e.id}" is missing a "kind" value.`,void 0,`${i}.kind`)),typeof e.epoch=="string"&&!e.epoch.trim()&&r.push(k("validate.event.epoch.empty",`Event "${e.id}" defines an empty epoch string.`,void 0,`${i}.epoch`)),typeof e.referencePlane=="string"&&!e.referencePlane.trim()&&r.push(k("validate.event.referencePlane.empty",`Event "${e.id}" defines an empty reference plane string.`,void 0,`${i}.referencePlane`)),!e.targetObjectId&&e.participantObjectIds.length===0&&r.push(b("validate.event.references.required",`Event "${e.id}" must define a "target" or at least one participant.`,void 0,`${i}.participants`)),e.targetObjectId&&(s.add(e.targetObjectId),n.has(e.targetObjectId)||r.push(b("validate.event.target.unknown",`Unknown event target "${e.targetObjectId}" on "${e.id}".`,void 0,`${i}.target`)));let a=new Set;for(let l of e.participantObjectIds){if(s.add(l),a.has(l)){r.push(k("validate.event.participants.duplicate",`Event "${e.id}" repeats participant "${l}".`,void 0,`${i}.participants`));continue}a.add(l),n.has(l)||r.push(b("validate.event.participants.unknown",`Unknown event participant "${l}" on "${e.id}".`,void 0,`${i}.participants`))}e.targetObjectId&&e.participantObjectIds.length>0&&!e.participantObjectIds.includes(e.targetObjectId)&&r.push(k("validate.event.target.notParticipant",`Event "${e.id}" defines a target outside its participants list.`,void 0,`${i}.target`)),e.positions.length===0&&r.push(k("validate.event.positions.missing",`Event "${e.id}" has no positions block and cannot drive a scene snapshot.`,void 0,`${i}.positions`)),/(?:^|[-_])(solar-eclipse|lunar-eclipse|transit|occultation)(?:$|[-_])/.test(e.kind)&&s.size<3&&r.push(k("validate.event.kind.participants",`Event "${e.id}" looks like an eclipse or transit but references fewer than three bodies.`,void 0,`${i}.participants`));let c=new Set;for(let l of e.positions){let d=`${i}.pose.${l.objectId}`;if(c.has(l.objectId)){r.push(b("validate.event.pose.duplicate",`Event "${e.id}" defines "${l.objectId}" more than once in positions.`,void 0,d));continue}c.add(l.objectId);let f=n.get(l.objectId);if(!f){r.push(b("validate.event.pose.object.unknown",`Unknown event pose object "${l.objectId}" on "${e.id}".`,void 0,d));continue}s.has(l.objectId)||r.push(k("validate.event.pose.unreferenced",`Event pose "${l.objectId}" on "${e.id}" is not listed in target/participants.`,void 0,d)),Mo(l,f,e,t,n,r,d,e.id)}let o=[...s].filter(l=>!c.has(l));e.positions.length>0&&o.length>0&&r.push(k("validate.event.positions.partial",`Event "${e.id}" leaves ${o.length} referenced object(s) on their base placement.`,void 0,`${i}.positions`))}function Mo(e,t,n,r,i,s,a,c){let o=e.placement;if(!o){s.push(b("validate.event.pose.placement.required",`Event "${c}" pose "${e.objectId}" is missing a placement mode.`,void 0,a));return}if(o.mode==="orbit"){i.has(o.target)||s.push(b("validate.event.pose.orbit.target.unknown",`Unknown event orbit target "${o.target}" on "${c}:${e.objectId}".`,void 0,`${a}.orbit`)),o.distance&&o.semiMajor&&s.push(b("validate.event.pose.orbit.distanceConflict",`Event "${c}" pose "${e.objectId}" cannot declare both "distance" and "semiMajor".`,void 0,`${a}.distance`)),o.phase&&!No(r,t,n,e)&&s.push(k("validate.event.pose.phase.epochMissing",`Event "${c}" pose "${e.objectId}" sets "phase" without an effective epoch.`,void 0,`${a}.phase`)),o.inclination&&!Vo(r,t,n,e)&&s.push(k("validate.event.pose.inclination.referencePlaneMissing",`Event "${c}" pose "${e.objectId}" sets "inclination" without an effective reference plane.`,void 0,`${a}.inclination`)),o.period&&!It(i.get(o.target)?.properties.mass)&&s.push(k("validate.event.pose.period.massMissing",`Event "${c}" pose "${e.objectId}" sets "period" but its central mass cannot be derived.`,void 0,`${a}.period`));return}if(o.mode==="surface"){let l=i.get(o.target);l?An.has(l.type)||s.push(b("validate.event.pose.surface.target.invalid",`Event surface target "${o.target}" on "${c}:${e.objectId}" is not surface-capable.`,void 0,`${a}.surface`)):s.push(b("validate.event.pose.surface.target.unknown",`Unknown event surface target "${o.target}" on "${c}:${e.objectId}".`,void 0,`${a}.surface`));return}if(o.mode==="at"){t.type!=="structure"&&t.type!=="phenomenon"&&s.push(b("validate.event.pose.at.objectType",`Only structures and phenomena may use "at" placement in events; found "${t.type}" on "${c}:${e.objectId}".`,void 0,`${a}.at`));let l=o.reference;l.kind==="named"&&!i.has(l.name)?s.push(b("validate.event.pose.at.target.unknown",`Unknown event at-reference target "${o.target}" on "${c}:${e.objectId}".`,void 0,`${a}.at`)):l.kind==="anchor"&&!i.has(l.objectId)?s.push(b("validate.event.pose.anchor.target.unknown",`Unknown event anchor target "${l.objectId}" on "${c}:${e.objectId}".`,void 0,`${a}.at`)):l.kind==="lagrange"&&(i.has(l.primary)?l.secondary&&!i.has(l.secondary)&&s.push(b("validate.event.pose.lagrange.secondary.unknown",`Unknown event Lagrange target "${l.secondary}" on "${c}:${e.objectId}".`,void 0,`${a}.at`)):s.push(b("validate.event.pose.lagrange.primary.unknown",`Unknown event Lagrange target "${l.primary}" on "${c}:${e.objectId}".`,void 0,`${a}.at`)))}}function Ro(e,t,n){let r=e.placement?.mode==="at"?e.placement.reference:null;return r?r.kind==="named"?t.has(r.name):r.kind==="anchor"?t.has(r.objectId)?!0:(n.push(b("validate.anchor.target.unknown",`Unknown anchor target "${r.objectId}" on "${e.id}".`,e.id,"at")),!1):t.has(r.primary)?r.secondary&&!t.has(r.secondary)?(n.push(b("validate.lagrange.secondary.unknown",`Unknown Lagrange reference "${r.secondary}" on "${e.id}".`,e.id,"at")),!1):!0:(n.push(b("validate.lagrange.primary.unknown",`Unknown Lagrange reference "${r.primary}" on "${e.id}".`,e.id,"at")),!1):!0}function Ln(e,t){let n=e.placement;if(!n||n.mode!=="orbit")return null;let r=_o(n.semiMajor??n.distance),i=It(t?.properties.mass);return r===null||i===null||i<=0?null:Math.sqrt(r**3/i)*365.25}function _o(e){if(!e)return null;switch(e.unit){case null:case"au":return e.value;case"km":return e.value/Ke;case"m":return e.value/(Ke*1e3);case"ly":return e.value*So;case"pc":return e.value*Lo;case"kpc":return e.value*Ao;case"re":return e.value*xo/Ke;case"sol":return e.value*Po/Ke;default:return null}}function It(e){if(!e||typeof e!="object"||!("value"in e))return null;let t=e;switch(t.unit){case null:case"sol":return t.value;case"me":return t.value/jo;case"mj":return t.value/Oo;default:return null}}function Dn(e){if(!e)return null;switch(e.unit){case null:case"d":return e.value;case"s":return e.value/86400;case"min":return e.value/1440;case"h":return e.value/24;case"y":return e.value*365.25;case"ky":return e.value*365250;case"my":return e.value*36525e4;case"gy":return e.value*36525e7;default:return null}}function zo(e,t,n,r){e!=="topdown"&&e!=="isometric"&&e!=="orthographic"&&e!=="perspective"&&t.push(b("validate.viewpoint.projection.invalid",`Unknown projection "${String(e)}" in viewpoint "${r}".`,void 0,n))}function Co(e,t,n,r,i,s,a,c,o){if(!e)return;let l=`viewpoint.${i}.camera`;for(let[f,p]of[["azimuth",e.azimuth],["elevation",e.elevation],["roll",e.roll],["distance",e.distance]])p!==null&&(!Number.isFinite(p)||f==="distance"&&p<=0)&&r.push(b("validate.viewpoint.camera.invalid",`Invalid camera ${f} "${String(p)}" in viewpoint "${i}".`,void 0,`${l}.${f}`));e.distance!==null&&t!=="perspective"&&r.push(k("validate.viewpoint.camera.distance.partialEffect",`Camera "distance" only has a semantic effect in perspective viewpoints; "${i}" uses "${t}".`,void 0,`${l}.distance`)),t==="topdown"&&(e.elevation!==null||e.roll!==null)&&r.push(k("validate.viewpoint.camera.topdownPartial",`Camera elevation/roll on topdown viewpoint "${i}" are currently stored for future 3D use and only partially affect 2D rendering.`,void 0,l)),t==="isometric"&&e.elevation!==null&&r.push($t("validate.viewpoint.camera.isometricStored",`Camera elevation on isometric viewpoint "${i}" is preserved semantically for future 3D rendering.`,void 0,`${l}.elevation`)),e.azimuth!==null&&e.azimuth!==0&&n!==0&&r.push(k("validate.viewpoint.rotation.cameraOverlap",`Viewpoint "${i}" uses camera.azimuth; keep "rotation" only for 2D screen rotation to avoid ambiguity.`,void 0,`${l}.azimuth`)),s!==null&&o.has(s)||a!==null&&o.has(a)||c||r.push($t("validate.viewpoint.camera.anchorMissing",`Viewpoint "${i}" stores camera settings without a focus object, selection, or filter anchor.`,void 0,l))}function No(e,t,n,r){return Q(r?.epoch)??Q(n?.epoch)??Q(t.epoch)??Q(e?.epoch)??null}function Vo(e,t,n,r){return Q(r?.referencePlane)??Q(n?.referencePlane)??Q(t.referencePlane)??Q(e?.referencePlane)??null}function Q(e){return typeof e=="string"&&e.trim()?e.trim():null}function Bo(e,t){let n=e.tolerances?.find(r=>r.field===t)?.value;return typeof n=="number"?n:n&&typeof n=="object"&&"value"in n?Dn(n)??0:0}function Uo(e){return`${Math.round(e*100)/100}d`}function b(e,t,n,r){return{code:e,severity:"error",source:"validate",message:t,objectId:n,field:r}}function k(e,t,n,r){return{code:e,severity:"warning",source:"validate",message:t,objectId:n,field:r}}function $t(e,t,n,r){return{code:e,severity:"info",source:"validate",message:t,objectId:n,field:r}}var Wo=new Set(["climate","habitability","settlement"]),Xe=new Map;for(let e of["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","kind","class","culture","tags","color","image","hidden","radius","mass","density","gravity","temperature","albedo","atmosphere","inner","outer","on","source","cycle"]){let t=A(e);t&&Xe.set(e,{key:e,version:"2.0",inlineMode:t.arity==="multiple"?"multiple":"single",allowRepeat:!1,legacySchema:t})}for(let e of[{key:"groups",inlineMode:"multiple",allowRepeat:!1},{key:"epoch",inlineMode:"single",allowRepeat:!1},{key:"referencePlane",inlineMode:"single",allowRepeat:!1},{key:"tidalLock",inlineMode:"single",allowRepeat:!1},{key:"renderLabel",inlineMode:"single",allowRepeat:!1},{key:"renderOrbit",inlineMode:"single",allowRepeat:!1},{key:"renderPriority",inlineMode:"single",allowRepeat:!1},{key:"resonance",inlineMode:"pair",allowRepeat:!1},{key:"derive",inlineMode:"pair",allowRepeat:!0},{key:"validate",inlineMode:"single",allowRepeat:!0},{key:"locked",inlineMode:"multiple",allowRepeat:!1},{key:"tolerance",inlineMode:"pair",allowRepeat:!0}])Xe.set(e.key,{key:e.key,version:"2.1",inlineMode:e.inlineMode,allowRepeat:e.allowRepeat});var Yo=new Set(Xe.keys()),Fn=new Set(["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","inner","outer","epoch","referencePlane"]);function Je(e){return Mn(e)}function En(e){return Mn(e,"2.0-draft")}function Mn(e,t){let n=Da(e),r=n.source.split(/\r?\n/),i=[],s=!1,a="2.0",c=null,o=null,l=[],d=[],f=[],p=[],m=new Map,v=!1,j=!1,O=new Set,x=new Set,g=new Set,I=new Set,F=new Set;for(let L=0;L<r.length;L++){let V=r[L],B=L+1;if(!V.trim())continue;let U=Fe(V),D=ie(V.slice(U),{line:B,columnOffset:U});if(D.length!==0){if(!s){a=qo(D,B),s=!0,n.comments.length>0&&Qe(a,"2.1")&&i.push({code:"parse.schema21.commentCompatibility",severity:"warning",source:"parse",message:`Comments require schema 2.1; parsed in compatibility mode because the document header is "schema ${a}".`,line:n.comments[0].line,column:n.comments[0].column});continue}if(U===0){o=Ho(D,B,a,i,c,l,d,f,p,m,O,x,g,I,F,{sawDefaults:v,sawAtlas:j}),o.kind==="system"?c=o.system:o.kind==="defaults"?v=!0:o.kind==="atlas"&&(j=!0);continue}if(!o)throw new u("Indented line without parent atlas section",B,U+1);ta(o,U,D,B)}}if(!s)throw new u('Missing required atlas schema header "schema 2.0"');let N=l.map(L=>wa(L,a,i)),E=p.map(L=>$a(L,m.get(L.id)??[])),H=t??(a==="2.0-draft"?"2.0":a),G={format:"worldorbit",sourceVersion:"1.0",system:c,groups:d,relations:f,events:E,objects:N,diagnostics:i};if(H==="2.0-draft"){let L={...G,version:"2.0-draft",schemaVersion:"2.0-draft"};return L.diagnostics.push(...Se(L,a)),L}let ne={...G,version:H,schemaVersion:H};return a==="2.0-draft"&&ne.diagnostics.push({code:"load.schema.deprecatedDraft",severity:"warning",source:"upgrade",message:'Source header "schema 2.0-draft" is deprecated; canonical v2 documents now use "schema 2.0".'}),ne.diagnostics.push(...Se(ne,a)),ne}function qo(e,t){if(e.length!==2||e[0].value.toLowerCase()!=="schema"||!["2.0-draft","2.0","2.1","2.5"].includes(e[1].value.toLowerCase()))throw new u('Expected atlas header "schema 2.0", "schema 2.1", "schema 2.5", or legacy "schema 2.0-draft"',t,e[0]?.column??1);let n=e[1].value.toLowerCase();return n==="2.5"?"2.5":n==="2.1"?"2.1":n==="2.0-draft"?"2.0-draft":"2.0"}function Ho(e,t,n,r,i,s,a,c,o,l,d,f,p,m,v,j){switch(e[0]?.value.toLowerCase()){case"system":if(i)throw new u('Atlas section "system" may only appear once',t,e[0].column);return Go(e,t,n,r);case"defaults":if(!i)throw new u('Atlas section "defaults" requires a preceding system declaration',t,e[0].column);if(j.sawDefaults)throw new u('Atlas section "defaults" may only appear once',t,e[0].column);return{kind:"defaults",system:i,sourceSchemaVersion:n,diagnostics:r,seenFields:new Set};case"atlas":if(!i)throw new u('Atlas section "atlas" requires a preceding system declaration',t,e[0].column);if(j.sawAtlas)throw new u('Atlas section "atlas" may only appear once',t,e[0].column);return{kind:"atlas",system:i,inMetadata:!1,metadataIndent:null};case"viewpoint":if(!i)throw new u('Atlas section "viewpoint" requires a preceding system declaration',t,e[0].column);return Ko(e,t,i,d,n,r);case"annotation":if(!i)throw new u('Atlas section "annotation" requires a preceding system declaration',t,e[0].column);return Zo(e,t,i,f);case"group":return _(n,r,"group",{line:t,column:e[0].column}),Xo(e,t,a,p);case"relation":return _(n,r,"relation",{line:t,column:e[0].column}),Jo(e,t,c,m);case"event":return _(n,r,"event",{line:t,column:e[0].column}),Qo(e,t,o,l,v,n,r);case"object":return ea(e,t,n,r,s);default:throw new u(`Unknown atlas section "${e[0]?.value??""}"`,t,e[0]?.column??1)}}function Go(e,t,n,r){if(e.length!==2)throw new u("Invalid atlas system declaration",t,e[0]?.column??1);return{kind:"system",system:{type:"system",id:e[1].value,title:null,description:null,epoch:null,referencePlane:null,defaults:{view:"topdown",scale:null,units:null,preset:null,theme:null},atlasMetadata:{},viewpoints:[],annotations:[]},sourceSchemaVersion:n,diagnostics:r,seenFields:new Set}}function Ko(e,t,n,r,i,s){if(e.length!==2)throw new u("Invalid viewpoint declaration",t,e[0]?.column??1);let a=fe(e[1].value);if(!a)throw new u("Viewpoint id must not be empty",t,e[1].column);if(r.has(a))throw new u(`Duplicate viewpoint id "${a}"`,t,e[1].column);let c={id:a,label:Pe(a),summary:"",focusObjectId:null,selectedObjectId:null,events:[],projection:n.defaults.view,preset:n.defaults.preset,zoom:null,rotationDeg:0,camera:null,layers:{},filter:null};return n.viewpoints.push(c),r.add(a),{kind:"viewpoint",viewpoint:c,sourceSchemaVersion:i,diagnostics:s,seenFields:new Set,inFilter:!1,filterIndent:null,seenFilterFields:new Set,inCamera:!1,cameraIndent:null,seenCameraFields:new Set}}function Zo(e,t,n,r){if(e.length!==2)throw new u("Invalid annotation declaration",t,e[0]?.column??1);let i=fe(e[1].value);if(!i)throw new u("Annotation id must not be empty",t,e[1].column);if(r.has(i))throw new u(`Duplicate annotation id "${i}"`,t,e[1].column);let s={id:i,label:Pe(i),targetObjectId:null,body:"",tags:[],sourceObjectId:null};return n.annotations.push(s),r.add(i),{kind:"annotation",annotation:s,seenFields:new Set}}function Xo(e,t,n,r){if(e.length!==2)throw new u("Invalid group declaration",t,e[0]?.column??1);let i=fe(e[1].value);if(!i)throw new u("Group id must not be empty",t,e[1].column);if(r.has(i))throw new u(`Duplicate group id "${i}"`,t,e[1].column);let s={id:i,label:Pe(i),summary:"",color:null,tags:[],hidden:!1};return n.push(s),r.add(i),{kind:"group",group:s,seenFields:new Set}}function Jo(e,t,n,r){if(e.length!==2)throw new u("Invalid relation declaration",t,e[0]?.column??1);let i=fe(e[1].value);if(!i)throw new u("Relation id must not be empty",t,e[1].column);if(r.has(i))throw new u(`Duplicate relation id "${i}"`,t,e[1].column);let s={id:i,from:"",to:"",kind:"",label:null,summary:null,tags:[],color:null,hidden:!1};return n.push(s),r.add(i),{kind:"relation",relation:s,seenFields:new Set}}function Qo(e,t,n,r,i,s,a){if(e.length!==2)throw new u("Invalid event declaration",t,e[0]?.column??1);let c=fe(e[1].value);if(!c)throw new u("Event id must not be empty",t,e[1].column);if(i.has(c))throw new u(`Duplicate event id "${c}"`,t,e[1].column);let o={id:c,kind:"",label:Pe(c),summary:null,targetObjectId:null,participantObjectIds:[],timing:null,visibility:null,epoch:null,referencePlane:null,tags:[],color:null,hidden:!1,positions:[]},l=[];return n.push(o),r.set(c,l),i.add(c),{kind:"event",event:o,sourceSchemaVersion:s,diagnostics:a,seenFields:new Set,rawPoses:l,inPositions:!1,positionsIndent:null,activePose:null,poseIndent:null,activePoseSeenFields:new Set}}function ea(e,t,n,r,i){if(e.length<3)throw new u("Invalid atlas object declaration",t,e[0]?.column??1);let s=e[1],a=e[2],c=s.value;if(!he.has(c)||c==="system")throw new u(`Unknown object type "${s.value}"`,t,s.column);let o={objectType:c,id:a.value,fields:ba(e.slice(3),t,c,n,r),infoEntries:[],typedBlockEntries:{},location:{line:t,column:s.column}};return i.push(o),{kind:"object",objectNode:o,sourceSchemaVersion:n,diagnostics:r,activeBlock:null,blockIndent:null,seenInfoKeys:new Set,seenTypedBlockKeys:{}}}function ta(e,t,n,r){switch(e.kind){case"system":na(e,n,r);return;case"defaults":ra(e,n,r);return;case"atlas":ia(e,t,n,r);return;case"viewpoint":oa(e,t,n,r);return;case"annotation":ca(e,n,r);return;case"group":la(e,n,r);return;case"relation":ua(e,n,r);return;case"event":da(e,t,n,r);return;case"object":pa(e,t,n,r);return}}function na(e,t,n){let r=q(t,e.seenFields,n),i=$(t,n);switch(r){case"title":e.system.title=i;return;case"description":_(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.description=i;return;case"epoch":_(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.epoch=i;return;case"referenceplane":_(e.sourceSchemaVersion,e.diagnostics,"referencePlane",{line:n,column:t[0].column}),e.system.referencePlane=i;return;default:throw new u(`Unknown system atlas field "${t[0].value}"`,n,t[0].column)}}function ra(e,t,n){let r=q(t,e.seenFields,n),i=$(t,n);switch(r){case"view":_n(i)&&ae(e.sourceSchemaVersion,e.diagnostics,"defaults.view",{line:n,column:t[0].column}),e.system.defaults.view=Rn(i,n,t[0].column);return;case"scale":e.system.defaults.scale=i;return;case"units":e.system.defaults.units=i;return;case"preset":e.system.defaults.preset=zn(i,n,t[0].column);return;case"theme":e.system.defaults.theme=i;return;default:throw new u(`Unknown defaults field "${t[0].value}"`,n,t[0].column)}}function ia(e,t,n,r){if(e.inMetadata&&t<=(e.metadataIndent??0)&&(e.inMetadata=!1,e.metadataIndent=null),e.inMetadata){let i=Cn(n,r,"Invalid atlas metadata entry");if(i.key in e.system.atlasMetadata)throw new u(`Duplicate atlas metadata key "${i.key}"`,r,n[0].column);e.system.atlasMetadata[i.key]=i.value;return}if(n.length===1&&n[0].value.toLowerCase()==="metadata"){e.inMetadata=!0,e.metadataIndent=t;return}throw new u(`Unknown atlas field "${n[0].value}"`,r,n[0].column)}function oa(e,t,n,r){if(e.inCamera&&t<=(e.cameraIndent??0)&&(e.inCamera=!1,e.cameraIndent=null),e.inFilter&&t<=(e.filterIndent??0)&&(e.inFilter=!1,e.filterIndent=null),e.inCamera){aa(e,n,r);return}if(e.inFilter){sa(e,n,r);return}if(n.length===1&&n[0].value.toLowerCase()==="camera"){if(ae(e.sourceSchemaVersion,e.diagnostics,"viewpoint.camera",{line:r,column:n[0].column}),e.seenFields.has("camera"))throw new u('Duplicate viewpoint field "camera"',r,n[0].column);e.seenFields.add("camera"),e.inCamera=!0,e.cameraIndent=t,e.viewpoint.camera=e.viewpoint.camera??jt();return}if(n.length===1&&n[0].value.toLowerCase()==="filter"){if(e.seenFields.has("filter"))throw new u('Duplicate viewpoint field "filter"',r,n[0].column);e.seenFields.add("filter"),e.inFilter=!0,e.filterIndent=t;return}let i=q(n,e.seenFields,r),s=$(n,r);switch(i){case"label":e.viewpoint.label=s;return;case"summary":e.viewpoint.summary=s;return;case"focus":e.viewpoint.focusObjectId=s;return;case"select":e.viewpoint.selectedObjectId=s;return;case"projection":_n(s)&&ae(e.sourceSchemaVersion,e.diagnostics,"projection",{line:r,column:n[0].column}),e.viewpoint.projection=Rn(s,r,n[0].column);return;case"preset":e.viewpoint.preset=zn(s,r,n[0].column);return;case"zoom":e.viewpoint.zoom=kt(s,r,n[0].column,"zoom");return;case"rotation":e.viewpoint.rotationDeg=te(s,r,n[0].column,"rotation");return;case"camera":ae(e.sourceSchemaVersion,e.diagnostics,"viewpoint.camera",{line:r,column:n[0].column}),e.viewpoint.camera=ga(n.slice(1),r,e.viewpoint.camera);return;case"layers":e.viewpoint.layers=ha(n.slice(1),r,e.sourceSchemaVersion,e.diagnostics);return;case"events":_(e.sourceSchemaVersion,e.diagnostics,"viewpoint.events",{line:r,column:n[0].column}),e.viewpoint.events=C(n.slice(1),r,"events");return;default:throw new u(`Unknown viewpoint field "${n[0].value}"`,r,n[0].column)}}function aa(e,t,n){let r=q(t,e.seenCameraFields,n),i=$(t,n),s=e.viewpoint.camera??jt();switch(r){case"azimuth":s.azimuth=te(i,n,t[0].column,"camera.azimuth");break;case"elevation":s.elevation=te(i,n,t[0].column,"camera.elevation");break;case"roll":s.roll=te(i,n,t[0].column,"camera.roll");break;case"distance":s.distance=kt(i,n,t[0].column,"camera.distance");break;default:throw new u(`Unknown viewpoint camera field "${t[0].value}"`,n,t[0].column)}e.viewpoint.camera=s}function sa(e,t,n){let r=q(t,e.seenFilterFields,n),i=e.viewpoint.filter??ya();switch(r){case"query":i.query=$(t,n);break;case"objecttypes":i.objectTypes=ma(t.slice(1),n);break;case"tags":i.tags=C(t.slice(1),n,"tags");break;case"groups":i.groupIds=C(t.slice(1),n,"groups");break;default:throw new u(`Unknown viewpoint filter field "${t[0].value}"`,n,t[0].column)}e.viewpoint.filter=i}function ca(e,t,n){switch(q(t,e.seenFields,n)){case"label":e.annotation.label=$(t,n);return;case"target":e.annotation.targetObjectId=$(t,n);return;case"body":e.annotation.body=$(t,n);return;case"tags":e.annotation.tags=C(t.slice(1),n,"tags");return;default:throw new u(`Unknown annotation field "${t[0].value}"`,n,t[0].column)}}function la(e,t,n){switch(q(t,e.seenFields,n)){case"label":e.group.label=$(t,n);return;case"summary":e.group.summary=$(t,n);return;case"color":e.group.color=$(t,n);return;case"tags":e.group.tags=C(t.slice(1),n,"tags");return;case"hidden":e.group.hidden=J($(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new u(`Unknown group field "${t[0].value}"`,n,t[0].column)}}function ua(e,t,n){switch(q(t,e.seenFields,n)){case"from":e.relation.from=$(t,n);return;case"to":e.relation.to=$(t,n);return;case"kind":e.relation.kind=$(t,n);return;case"label":e.relation.label=$(t,n);return;case"summary":e.relation.summary=$(t,n);return;case"tags":e.relation.tags=C(t.slice(1),n,"tags");return;case"color":e.relation.color=$(t,n);return;case"hidden":e.relation.hidden=J($(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new u(`Unknown relation field "${t[0].value}"`,n,t[0].column)}}function da(e,t,n,r){if(e.activePose&&t<=(e.poseIndent??0)&&(e.activePose=null,e.poseIndent=null,e.activePoseSeenFields.clear()),!e.activePose&&e.inPositions&&t<=(e.positionsIndent??0)&&(e.inPositions=!1,e.positionsIndent=null),e.activePose){(n[0]?.value==="epoch"||n[0]?.value==="referencePlane")&&ae(e.sourceSchemaVersion,e.diagnostics,`pose.${n[0].value}`,{line:r,column:n[0]?.column??1}),e.activePose.fields.push(fa(n,r,e.activePoseSeenFields));return}if(e.inPositions){if(n.length!==2||n[0].value.toLowerCase()!=="pose")throw new u(`Unknown event positions field "${n[0].value}"`,r,n[0]?.column??1);let s=n[1].value;if(!s.trim())throw new u("Event pose object id must not be empty",r,n[1].column);let a={objectId:s,fields:[],location:{line:r,column:n[0].column}};e.rawPoses.push(a),e.activePose=a,e.poseIndent=t,e.activePoseSeenFields=new Set;return}if(n.length===1&&n[0].value.toLowerCase()==="positions"){if(e.seenFields.has("positions"))throw new u('Duplicate event field "positions"',r,n[0].column);e.seenFields.add("positions"),e.inPositions=!0,e.positionsIndent=t;return}switch(q(n,e.seenFields,r)){case"kind":e.event.kind=$(n,r);return;case"label":e.event.label=$(n,r);return;case"summary":e.event.summary=$(n,r);return;case"target":e.event.targetObjectId=$(n,r);return;case"participants":e.event.participantObjectIds=C(n.slice(1),r,"participants");return;case"timing":e.event.timing=$(n,r);return;case"visibility":e.event.visibility=$(n,r);return;case"epoch":ae(e.sourceSchemaVersion,e.diagnostics,"event.epoch",{line:r,column:n[0].column}),e.event.epoch=$(n,r);return;case"referenceplane":ae(e.sourceSchemaVersion,e.diagnostics,"event.referencePlane",{line:r,column:n[0].column}),e.event.referencePlane=$(n,r);return;case"tags":e.event.tags=C(n.slice(1),r,"tags");return;case"color":e.event.color=$(n,r);return;case"hidden":e.event.hidden=J($(n,r),"hidden",{line:r,column:n[0].column});return;default:throw new u(`Unknown event field "${n[0].value}"`,r,n[0].column)}}function fa(e,t,n){if(e.length<2)throw new u("Invalid event pose field line",t,e[0]?.column??1);let r=e[0].value;if(!Fn.has(r))throw new u(`Unknown event pose field "${r}"`,t,e[0].column);if(n.has(r))throw new u(`Duplicate event pose field "${r}"`,t,e[0].column);return n.add(r),{type:"field",key:r,values:e.slice(1).map(i=>i.value),location:{line:t,column:e[0].column}}}function pa(e,t,n,r){if(e.activeBlock&&t<=(e.blockIndent??0)&&(e.activeBlock=null,e.blockIndent=null),n.length===1){let i=n[0].value.toLowerCase();if(i==="info"||Wo.has(i)){i!=="info"&&_(e.sourceSchemaVersion,e.diagnostics,i,{line:r,column:n[0].column}),e.activeBlock=i,e.blockIndent=t;return}}if(e.activeBlock){let i=Cn(n,r,`Invalid ${e.activeBlock} entry`);if(e.activeBlock==="info"){if(e.seenInfoKeys.has(i.key))throw new u(`Duplicate info key "${i.key}"`,r,n[0].column);e.seenInfoKeys.add(i.key),e.objectNode.infoEntries.push(i);return}let s=e.activeBlock,a=e.seenTypedBlockKeys[s]??(e.seenTypedBlockKeys[s]=new Set);if(a.has(i.key))throw new u(`Duplicate ${s} key "${i.key}"`,r,n[0].column);a.add(i.key),(e.objectNode.typedBlockEntries[s]??(e.objectNode.typedBlockEntries[s]=[])).push(i);return}e.objectNode.fields.push(va(n,r,e.objectNode.objectType,e.sourceSchemaVersion,e.diagnostics))}function q(e,t,n){if(e.length<2)throw new u("Invalid atlas field line",n,e[0]?.column??1);let r=e[0].value.toLowerCase();if(t.has(r))throw new u(`Duplicate atlas field "${e[0].value}"`,n,e[0].column);return t.add(r),r}function $(e,t){if(e.length<2)throw new u("Missing value for atlas field",t,e[0]?.column??1);return e.slice(1).map(n=>n.value).join(" ").trim()}function ma(e,t){return C(e,t,"objectTypes").filter(n=>n==="star"||n==="planet"||n==="moon"||n==="belt"||n==="asteroid"||n==="comet"||n==="ring"||n==="structure"||n==="phenomenon")}function ha(e,t,n,r){let i={};for(let s of C(e,t,"layers")){let a=!s.startsWith("-")&&!s.startsWith("!"),c=s.replace(/^[-!]+/,"").toLowerCase();if(c==="orbits"){i["orbits-back"]=a,i["orbits-front"]=a;continue}(c==="background"||c==="guides"||c==="orbits-back"||c==="orbits-front"||c==="relations"||c==="events"||c==="objects"||c==="labels"||c==="metadata")&&(c==="events"&&n&&r&&_(n,r,"layers.events",{line:t,column:e[0]?.column??1}),i[c]=a)}return i}function C(e,t,n){if(e.length===0)throw new u(`Missing value for atlas field "${n}"`,t,1);let r=e.map(i=>i.value).filter(Boolean);if(r.length===0)throw new u(`Missing value for atlas field "${n}"`,t,e[0]?.column??1);return r}function Rn(e,t,n){let r=e.toLowerCase();if(r!=="topdown"&&r!=="isometric"&&r!=="orthographic"&&r!=="perspective")throw new u(`Unknown projection "${e}"`,t,n);return r}function _n(e){let t=e.toLowerCase();return t==="orthographic"||t==="perspective"}function zn(e,t,n){let r=e.toLowerCase();if(r==="diagram"||r==="presentation"||r==="atlas-card"||r==="markdown")return r;throw new u(`Unknown render preset "${e}"`,t,n)}function kt(e,t,n,r){let i=te(e,t,n,r);if(i<=0)throw new u(`Field "${r}" must be greater than zero`,t,n);return i}function te(e,t,n,r){let i=Number(e);if(!Number.isFinite(i))throw new u(`Invalid numeric value "${e}" for "${r}"`,t,n);return i}function ya(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function jt(){return{azimuth:null,elevation:null,roll:null,distance:null}}function ga(e,t,n){if(e.length===0||e.length%2!==0)throw new u('Field "camera" expects "<field> <value>" pairs',t,e[0]?.column??1);let r=n?{...n}:jt(),i=new Set;for(let s=0;s<e.length;s+=2){let a=e[s],c=e[s+1],o=a.value.toLowerCase();if(i.has(o))throw new u(`Duplicate viewpoint camera field "${a.value}"`,t,a.column);i.add(o);let l=c.value;switch(o){case"azimuth":r.azimuth=te(l,t,a.column,"camera.azimuth");break;case"elevation":r.elevation=te(l,t,a.column,"camera.elevation");break;case"roll":r.roll=te(l,t,a.column,"camera.roll");break;case"distance":r.distance=kt(l,t,a.column,"camera.distance");break;default:throw new u(`Unknown viewpoint camera field "${a.value}"`,t,a.column)}}return r}function ba(e,t,n,r,i){let s=[],a=0;for(;a<e.length;){let c=e[a],o=Le(c.value);if(!o)throw new u(`Unknown field "${c.value}"`,t,c.column);o.version==="2.1"&&_(r,i,c.value,{line:t,column:c.column}),a++;let l=[];if(o.inlineMode==="single"){let d=e[a];d&&(l.push(d),a++)}else if(o.inlineMode==="pair")for(let d=0;d<2;d++){let f=e[a];if(!f)break;l.push(f),a++}else for(;a<e.length&&!Yo.has(e[a].value);)l.push(e[a]),a++;if(l.length===0)throw new u(`Missing value for field "${c.value}"`,t,c.column);s.push({type:"field",key:c.value,values:l.map(d=>d.value),location:{line:t,column:c.column}})}return Un(s,n),s}function va(e,t,n,r,i){if(e.length<2)throw new u("Invalid field line",t,e[0]?.column??1);let s=Le(e[0].value);if(!s)throw new u(`Unknown field "${e[0].value}"`,t,e[0].column);s.version==="2.1"&&_(r,i,e[0].value,{line:t,column:e[0].column});let a={type:"field",key:e[0].value,values:e.slice(1).map(c=>c.value),location:{line:t,column:e[0].column}};return Un([a],n),a}function Cn(e,t,n){if(e.length<2)throw new u(n,t,e[0]?.column??1);return{type:"info-entry",key:e[0].value,value:e.slice(1).map(r=>r.value).join(" "),location:{line:t,column:e[0].column}}}function wa(e,t,n){let r=Nn(e.fields),i=Vn(r),s=ka(e.objectType,r),a=La(r.get("groups")?.[0]),c=Ze(r.get("epoch")?.[0]),o=Ze(r.get("referencePlane")?.[0]),l=r.has("tidalLock")?J(z(r.get("tidalLock")[0]),"tidalLock",r.get("tidalLock")[0].location):void 0,d=r.has("resonance")?xa(r.get("resonance")[0]):void 0,f=Oa(r),p=r.get("derive")?.map(I=>Pa(I)),m=r.get("validate")?.map(I=>({rule:z(I)})),v=r.has("locked")?[...new Set(r.get("locked").flatMap(I=>I.values))]:void 0,j=r.get("tolerance")?.map(I=>Sa(I)),O=ja(e.typedBlockEntries),x=Bn(e.infoEntries,"info"),g={type:e.objectType,id:e.id,properties:s,placement:i,info:x};return a.length>0&&(g.groups=a),c&&(g.epoch=c),o&&(g.referencePlane=o),l!==void 0&&(g.tidalLock=l),d&&(g.resonance=d),f&&(g.renderHints=f),p?.length&&(g.deriveRules=p),m?.length&&(g.validationRules=m),v?.length&&(g.lockedFields=v),j?.length&&(g.tolerances=j),O&&Object.keys(O).length>0&&(g.typedBlocks=O),Qe(t,"2.1")&&(g.groups||g.epoch||g.referencePlane||g.tidalLock!==void 0||g.resonance||g.renderHints||g.deriveRules?.length||g.validationRules?.length||g.lockedFields?.length||g.tolerances?.length||g.typedBlocks)&&_(t,n,e.id,e.location),g}function $a(e,t){return{...e,participantObjectIds:[...new Set(e.participantObjectIds)],tags:[...new Set(e.tags)],positions:t.map(n=>Ia(n))}}function Ia(e){let t=Nn(e.fields,"event-pose"),n=Vn(t);return{objectId:e.objectId,placement:n,inner:ee(t.get("inner")?.[0],"inner"),outer:ee(t.get("outer")?.[0],"outer"),epoch:Ze(t.get("epoch")?.[0]),referencePlane:Ze(t.get("referencePlane")?.[0])}}function Nn(e,t="object"){let n=new Map;for(let r of e){let i=Le(r.key);if(!i&&!Fn.has(r.key))throw u.fromLocation(`Unknown field "${r.key}"`,r.location);if(!i?.allowRepeat&&n.has(r.key))throw u.fromLocation(`Duplicate field "${r.key}"`,r.location);let s=n.get(r.key)??[];s.push(r),n.set(r.key,s)}return n}function Vn(e){let t=e.get("orbit")?.[0],n=e.get("at")?.[0],r=e.get("surface")?.[0],i=e.get("free")?.[0];if([t,n,r,i].filter(Boolean).length>1){let a=t??n??r??i;throw u.fromLocation("Object has multiple placement modes",a?.location)}if(t)return{mode:"orbit",target:z(t),distance:ee(e.get("distance")?.[0],"distance"),semiMajor:ee(e.get("semiMajor")?.[0],"semiMajor"),eccentricity:Aa(e.get("eccentricity")?.[0],"eccentricity"),period:ee(e.get("period")?.[0],"period"),angle:ee(e.get("angle")?.[0],"angle"),inclination:ee(e.get("inclination")?.[0],"inclination"),phase:ee(e.get("phase")?.[0],"phase")};if(n){let a=z(n);return{mode:"at",target:a,reference:Pn(a,n.location)}}if(r)return{mode:"surface",target:z(r)};if(i){let a=z(i),c=vt(a);return{mode:"free",distance:c??void 0,descriptor:c?void 0:a}}return null}function ka(e,t){let n={};for(let[r,i]of t.entries()){let s=i[0],a=Le(r);!s||!a?.legacySchema||a.legacySchema.placement||(wt(r,e,s.location),n[r]=Sn(r,s.values,s.location))}return n}function Bn(e,t){let n={};for(let r of e){if(r.key in n)throw u.fromLocation(`Duplicate ${t} key "${r.key}"`,r.location);n[r.key]=r.value}return n}function ja(e){let t={};for(let n of Object.keys(e)){let r=e[n];r?.length&&(t[n]=Bn(r,n))}return t}function Oa(e){let t={},n=e.get("renderLabel")?.[0],r=e.get("renderOrbit")?.[0],i=e.get("renderPriority")?.[0];return n&&(t.renderLabel=J(z(n),"renderLabel",n.location)),r&&(t.renderOrbit=J(z(r),"renderOrbit",r.location)),i&&(t.renderPriority=Ge(z(i),"renderPriority",i.location)),Object.keys(t).length>0?t:void 0}function xa(e){if(e.values.length!==2)throw u.fromLocation('Field "resonance" expects "<targetObjectId> <ratio>"',e.location);let t=e.values[1];if(!/^\d+:\d+$/.test(t))throw u.fromLocation(`Invalid resonance ratio "${t}"`,e.location);return{targetObjectId:e.values[0],ratio:t}}function Pa(e){if(e.values.length!==2)throw u.fromLocation('Field "derive" expects "<field> <strategy>"',e.location);return{field:e.values[0],strategy:e.values[1]}}function Sa(e){if(e.values.length!==2)throw u.fromLocation('Field "tolerance" expects "<field> <value>"',e.location);let t=e.values[1],n=vt(t),r=Number(t);return{field:e.values[0],value:n??(Number.isFinite(r)?r:t)}}function La(e){return e?[...new Set(e.values)]:[]}function Ze(e){return e&&e.values.join(" ").trim()||null}function ee(e,t){return e?bt(z(e),e.location,t):void 0}function Aa(e,t){return e?Ge(z(e),t,e.location):void 0}function z(e){return xe(e.values,e.key,e.location)}function Le(e){return Xe.get(e)}function Un(e,t){for(let n of e){let r=Le(n.key);if(!r)throw u.fromLocation(`Unknown field "${n.key}"`,n.location);if(r.legacySchema){wt(n.key,t,n.location);continue}if((n.key==="renderLabel"||n.key==="renderOrbit"||n.key==="tidalLock")&&n.values.length!==1)throw u.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function _(e,t,n,r){Qe(e,"2.1")&&t.push({code:"parse.schema21.featureCompatibility",severity:"warning",source:"parse",message:`Feature "${n}" requires schema 2.1; parsed in compatibility mode because the document header is "schema ${e}".`,line:r.line,column:r.column})}function ae(e,t,n,r){Qe(e,"2.5")&&t.push({code:"parse.schema25.featureCompatibility",severity:"warning",source:"parse",message:`Feature "${n}" requires schema 2.5; parsed in compatibility mode because the document header is "schema ${e}".`,line:r.line,column:r.column})}function Qe(e,t){return Tn(e)<Tn(t)}function Tn(e){switch(e){case"2.0-draft":return 0;case"2.0":return 1;case"2.1":return 2;case"2.5":return 3}}function Da(e){let t=[...e],n=[],r=!1,i=!1,s=null,a=1,c=1;for(let o=0;o<t.length;o++){let l=t[o],d=t[o+1];if(i){if(l==="*"&&d==="/"){t[o]=" ",t[o+1]=" ",i=!1,s=null,o++,c+=2;continue}l!==`
5
+ `&&l!=="\r"&&(t[o]=" "),l===`
6
+ `?(a++,c=1):c++;continue}if(!r&&l==="/"&&d==="*"){n.push({kind:"block",line:a,column:c}),t[o]=" ",t[o+1]=" ",i=!0,s={line:a,column:c},o++,c+=2;continue}if(!r&&l==="#"&&!Ta(t,o)){n.push({kind:"line",line:a,column:c}),t[o]=" ";let f=o+1;for(;f<t.length&&t[f]!==`
7
+ `&&t[f]!=="\r";)t[f]=" ",f++;c+=f-o,o=f-1;continue}l==='"'&&t[o-1]!=="\\"&&(r=!r),l===`
8
+ `?(a++,c=1):c++}if(i)throw u.fromLocation("Unclosed block comment",s??void 0);return{source:t.join(""),comments:n}}function Ta(e,t){let n=t+1,r=0;for(;n<e.length&&/[0-9a-f]/i.test(e[n]??"");)n++,r++;if(![3,4,6,8].includes(r))return!1;let i=e[n];return i===void 0||i===" "||i===" "||i==="\r"||i===`
9
+ `}function Ot(e="WorldOrbit",t="2.5"){return{format:"worldorbit",version:t,schemaVersion:t,sourceVersion:"1.0",system:{type:"system",id:e,title:e,description:null,epoch:null,referencePlane:null,defaults:{view:"topdown",scale:null,units:null,preset:null,theme:null},atlasMetadata:{},viewpoints:[],annotations:[]},groups:[],relations:[],events:[],objects:[],diagnostics:[]}}function et(e){return structuredClone(e)}function Wn(e){let t=[{kind:"system"},{kind:"defaults"}];if(e.system){for(let n of Object.keys(e.system.atlasMetadata).sort())t.push({kind:"metadata",key:n});for(let n of[...e.system.viewpoints].sort(se))t.push({kind:"viewpoint",id:n.id});for(let n of[...e.system.annotations].sort(se))t.push({kind:"annotation",id:n.id})}for(let n of[...e.groups].sort(se))t.push({kind:"group",id:n.id});for(let n of[...e.relations].sort(se))t.push({kind:"relation",id:n.id});for(let n of[...e.events].sort(se)){t.push({kind:"event",id:n.id});for(let r of[...n.positions].sort(er))t.push({kind:"event-pose",id:n.id,key:r.objectId})}for(let n of[...e.objects].sort(se))t.push({kind:"object",id:n.id});return t}function xt(e,t){switch(t.kind){case"system":return e.system;case"defaults":return e.system?.defaults??null;case"metadata":return t.key?e.system?.atlasMetadata[t.key]??null:null;case"group":return t.id?Kn(e,t.id):null;case"event":return t.id?tt(e,t.id):null;case"event-pose":return t.id&&t.key?Xn(e,t.id,t.key):null;case"object":return t.id?Gn(e,t.id):null;case"viewpoint":return t.id?Jn(e.system,t.id):null;case"annotation":return t.id?Qn(e.system,t.id):null;case"relation":return t.id?Zn(e,t.id):null}}function Pt(e,t,n){let r=et(e),i=At(r);switch(t.kind){case"system":return r.system=n,r;case"defaults":return i.defaults={...i.defaults,...n},r;case"metadata":if(!t.key)throw new Error('Metadata updates require a "key" value.');return n==null||n===""?delete i.atlasMetadata[t.key]:i.atlasMetadata[t.key]=String(n),r;case"group":if(!t.id)throw new Error('Group updates require an "id" value.');return pe(r.groups,n),r;case"event":if(!t.id)throw new Error('Event updates require an "id" value.');return pe(r.events,n),r;case"event-pose":if(!t.id||!t.key)throw new Error('Event pose updates require an event "id" and pose "key" value.');return Fa(r.events,t.id,n),r;case"object":if(!t.id)throw new Error('Object updates require an "id" value.');return pe(r.objects,n),r;case"viewpoint":if(!t.id)throw new Error('Viewpoint updates require an "id" value.');return pe(i.viewpoints,n),r;case"annotation":if(!t.id)throw new Error('Annotation updates require an "id" value.');return pe(i.annotations,n),r;case"relation":if(!t.id)throw new Error('Relation updates require an "id" value.');return pe(r.relations,n),r}}function Yn(e,t,n){return Pt(e,t,n(xt(e,t)))}function qn(e,t){let n=et(e),r=At(n);switch(t.kind){case"metadata":return t.key&&delete r.atlasMetadata[t.key],n;case"object":return t.id&&(n.objects=n.objects.filter(i=>i.id!==t.id)),n;case"group":return t.id&&(n.groups=n.groups.filter(i=>i.id!==t.id)),n;case"event":return t.id&&(n.events=n.events.filter(i=>i.id!==t.id)),n;case"event-pose":if(t.id&&t.key){let i=tt(n,t.id);i&&(i.positions=i.positions.filter(s=>s.objectId!==t.key))}return n;case"viewpoint":return t.id&&(r.viewpoints=r.viewpoints.filter(i=>i.id!==t.id)),n;case"annotation":return t.id&&(r.annotations=r.annotations.filter(i=>i.id!==t.id)),n;case"relation":return t.id&&(n.relations=n.relations.filter(i=>i.id!==t.id)),n;default:return n}}function St(e,t){return t.map(n=>({diagnostic:n,path:Lt(e,n)}))}function Lt(e,t){if(t.objectId&&Gn(e,t.objectId))return{kind:"object",id:t.objectId};if(t.field?.startsWith("group.")){let n=t.field.split(".");if(n[1]&&Kn(e,n[1]))return{kind:"group",id:n[1]}}if(t.field?.startsWith("viewpoint.")){let n=t.field.split(".");if(n[1]&&Jn(e.system,n[1]))return{kind:"viewpoint",id:n[1]}}if(t.field?.startsWith("annotation.")){let n=t.field.split(".");if(n[1]&&Qn(e.system,n[1]))return{kind:"annotation",id:n[1]}}if(t.field?.startsWith("relation.")){let n=t.field.split(".");if(n[1]&&Zn(e,n[1]))return{kind:"relation",id:n[1]}}if(t.field?.startsWith("event.")){let n=t.field.split(".");if(n[1]&&tt(e,n[1]))return n[2]==="pose"&&n[3]&&Xn(e,n[1],n[3])?{kind:"event-pose",id:n[1],key:n[3]}:{kind:"event",id:n[1]}}return t.field&&t.field in At(e).atlasMetadata?{kind:"metadata",key:t.field}:null}function Hn(e){let t=[...e.diagnostics,...Se(e,e.version)];return St(e,t)}function At(e){return e.system||(e.system=Ot().system),e.system}function Gn(e,t){return e.objects.find(n=>n.id===t)??null}function Kn(e,t){return e.groups.find(n=>n.id===t)??null}function Zn(e,t){return e.relations.find(n=>n.id===t)??null}function tt(e,t){return e.events.find(n=>n.id===t)??null}function Xn(e,t,n){return tt(e,t)?.positions.find(r=>r.objectId===n)??null}function Jn(e,t){return e?.viewpoints.find(n=>n.id===t)??null}function Qn(e,t){return e?.annotations.find(n=>n.id===t)??null}function pe(e,t){let n=e.findIndex(r=>r.id===t.id);if(n===-1){e.push(t),e.sort(se);return}e[n]=t}function Fa(e,t,n){let r=e.find(s=>s.id===t);if(!r)throw new Error(`Unknown event "${t}" for pose update.`);let i=r.positions.findIndex(s=>s.objectId===n.objectId);if(i===-1){r.positions.push(n),r.positions.sort(er);return}r.positions[i]=n}function se(e,t){return e.id.localeCompare(t.id)}function er(e,t){return e.objectId.localeCompare(t.objectId)}var Ea=/^schema\s+2(?:\.0|\.1|\.5)?$/i,Ma=/^schema\s+2\.1$/i,Ra=/^schema\s+2\.5$/i,_a=/^schema\s+2\.0-draft$/i;function Dt(e){for(let t of za(e).split(/\r?\n/)){let n=t.trim();if(n)return _a.test(n)?"2.0-draft":Ma.test(n)?"2.1":Ra.test(n)?"2.5":Ea.test(n)?"2.0":"1.0"}return"1.0"}function za(e){let t=[...e],n=!1,r=!1;for(let i=0;i<t.length;i++){let s=t[i],a=t[i+1];if(r){if(s==="*"&&a==="/"){t[i]=" ",t[i+1]=" ",r=!1,i++;continue}s!==`
10
+ `&&s!=="\r"&&(t[i]=" ");continue}if(!n&&s==="/"&&a==="*"){t[i]=" ",t[i+1]=" ",r=!0,i++;continue}if(!n&&s==="#"){t[i]=" ";let c=i+1;for(;c<t.length&&t[c]!==`
11
+ `&&t[c]!=="\r";)t[c]=" ",c++;i=c-1;continue}s==='"'&&t[i-1]!=="\\"&&(n=!n)}return t.join("")}function nt(e){let t=Tt(e);if(!t.ok||!t.value){let n=t.diagnostics[0];throw new u(n?.message??"Failed to load WorldOrbit source",n?.line,n?.column)}return t.value}function Tt(e){let t=Dt(e);if(t==="2.0"||t==="2.0-draft"||t==="2.1"||t==="2.5")return Ca(e,t);let n;try{n=Z(e)}catch(i){return{ok:!1,value:null,diagnostics:[T(i,"parse")]}}let r;try{r=W(n)}catch(i){return{ok:!1,value:null,diagnostics:[T(i,"normalize")]}}try{Y(r)}catch(i){return{ok:!1,value:null,diagnostics:[T(i,"validate")]}}return{ok:!0,value:{schemaVersion:t,ast:n,document:r,atlasDocument:null,draftDocument:null,diagnostics:[]},diagnostics:[]}}function Ca(e,t){let n;try{n=Je(e)}catch(a){return{ok:!1,value:null,diagnostics:[T(a,"parse","load.atlas.failed")]}}let r=[...n.diagnostics];if(r.some(a=>a.severity==="error"))return{ok:!1,value:null,diagnostics:r};let i;try{i=Oe(n)}catch(a){return{ok:!1,value:null,diagnostics:[T(a,"normalize","load.atlas.materialize.failed")]}}return{ok:!0,value:{schemaVersion:t,ast:null,document:i,atlasDocument:n,draftDocument:n,diagnostics:r},diagnostics:r}}var Na=/^```worldorbit(?:\s+(.*))?\s*$/;function tr(e){let t=e.split(/\r?\n/),n=[],r=!1,i=null,s=0,a=[];return t.forEach((c,o)=>{let l=o+1;if(!r){let d=c.match(Na);d&&(r=!0,i=d[1]??null,s=l,a=[]);return}if(c.trim()==="```"){n.push({source:a.join(`
12
+ `),info:i,startLine:s,endLine:l}),r=!1,i=null,s=0,a=[];return}a.push(c)}),n}function nr(e){let t=Z(e),n=W(t);return Y(n),{ast:t,document:n}}function Va(e){let t=nr(e);return{...t,scene:oe(t.document)}}function Ba(e){return nt(e)}function Ua(e){return Re(e)}function Wa(e,t={}){return He(e,t)}return pr(Ya);})();