worldorbit 4.0.0 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -18
- package/dist/browser/core/dist/draft-parse.js +131 -12
- package/dist/browser/core/dist/draft.js +4 -4
- package/dist/browser/core/dist/format.js +42 -3
- package/dist/browser/core/dist/load.js +7 -2
- package/dist/browser/core/dist/scene.js +215 -3
- package/dist/browser/core/dist/solver.d.ts +8 -1
- package/dist/browser/core/dist/solver.js +72 -0
- package/dist/browser/core/dist/spatial-scene.js +56 -0
- package/dist/browser/core/dist/types.d.ts +74 -2
- package/dist/browser/viewer/dist/render.js +71 -15
- package/dist/browser/viewer/dist/theme.js +1 -0
- package/dist/browser/viewer/dist/types.d.ts +7 -0
- package/dist/browser/viewer/dist/viewer.js +27 -0
- package/dist/obsidian-plugin/main.js +81 -67
- package/dist/unpkg/core/dist/draft-parse.js +131 -12
- package/dist/unpkg/core/dist/draft.js +4 -4
- package/dist/unpkg/core/dist/format.js +42 -3
- package/dist/unpkg/core/dist/load.js +7 -2
- package/dist/unpkg/core/dist/scene.js +215 -3
- package/dist/unpkg/core/dist/solver.d.ts +8 -1
- package/dist/unpkg/core/dist/solver.js +72 -0
- package/dist/unpkg/core/dist/spatial-scene.js +56 -0
- package/dist/unpkg/core/dist/types.d.ts +74 -2
- package/dist/unpkg/viewer/dist/render.js +71 -15
- package/dist/unpkg/viewer/dist/theme.js +1 -0
- package/dist/unpkg/viewer/dist/types.d.ts +7 -0
- package/dist/unpkg/viewer/dist/viewer.js +27 -0
- package/dist/unpkg/worldorbit-core.min.js +12 -12
- package/dist/unpkg/worldorbit-editor.min.js +336 -322
- package/dist/unpkg/worldorbit-markdown.min.js +50 -36
- package/dist/unpkg/worldorbit-viewer.min.js +225 -211
- package/dist/unpkg/worldorbit.js +473 -19
- package/dist/unpkg/worldorbit.min.js +229 -215
- package/package.json +1 -1
- package/packages/core/dist/draft-parse.js +131 -12
- package/packages/core/dist/draft.js +4 -4
- package/packages/core/dist/format.js +42 -3
- package/packages/core/dist/load.js +7 -2
- package/packages/core/dist/scene.js +215 -3
- package/packages/core/dist/solver.d.ts +8 -1
- package/packages/core/dist/solver.js +72 -0
- package/packages/core/dist/spatial-scene.js +56 -0
- package/packages/core/dist/types.d.ts +74 -2
- package/packages/viewer/dist/render.js +71 -15
- package/packages/viewer/dist/theme.js +1 -0
- package/packages/viewer/dist/types.d.ts +7 -0
- package/packages/viewer/dist/viewer.js +27 -0
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
"use strict";var WorldOrbitMarkdown=(()=>{var ut=Object.defineProperty;var ur=Object.getOwnPropertyDescriptor;var dr=Object.getOwnPropertyNames;var fr=Object.prototype.hasOwnProperty;var pr=(e,t)=>{for(var n in t)ut(e,n,{get:t[n],enumerable:!0})},mr=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of dr(t))!fr.call(e,i)&&i!==n&&ut(e,i,{get:()=>t[i],enumerable:!(r=ur(t,i))||r.enumerable});return e};var hr=e=>mr(ut({},"__esModule",{value:!0}),e);var Vs={};pr(Vs,{rehypeWorldOrbit:()=>nr,remarkWorldOrbit:()=>er,renderWorldOrbitBlock:()=>ge,renderWorldOrbitError:()=>zt});var f=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 be=["system","star","planet","moon","belt","asteroid","comet","ring","craft","structure","phenomenon"],R=be.filter(e=>e!=="system"),gr=["star","planet","moon","asteroid","comet","craft","structure","phenomenon"],Nt=["craft","structure","phenomenon"],H=["star","planet","moon","belt","asteroid","comet","ring","craft","structure","phenomenon"],yr=["star","planet","moon","belt","asteroid","comet","ring","craft","structure","phenomenon"];function $(e,t){return{key:e,...t}}var Ve=new Set(be),Ut=new Map([$("orbit",{kind:"string",placement:!0,arity:"single",objectTypes:H}),$("distance",{kind:"unit",placement:!0,arity:"single",objectTypes:H,unitFamily:"distance"}),$("semiMajor",{kind:"unit",placement:!0,arity:"single",objectTypes:H,unitFamily:"distance"}),$("eccentricity",{kind:"number",placement:!0,arity:"single",objectTypes:H}),$("period",{kind:"unit",placement:!0,arity:"single",objectTypes:H,unitFamily:"duration"}),$("angle",{kind:"unit",placement:!0,arity:"single",objectTypes:H,unitFamily:"angle"}),$("inclination",{kind:"unit",placement:!0,arity:"single",objectTypes:H,unitFamily:"angle"}),$("phase",{kind:"unit",placement:!0,arity:"single",objectTypes:H,unitFamily:"angle"}),$("at",{kind:"string",placement:!0,arity:"single",objectTypes:Nt}),$("surface",{kind:"string",placement:!0,arity:"single",objectTypes:Nt}),$("free",{kind:"string",placement:!0,arity:"single",objectTypes:yr}),$("kind",{kind:"string",placement:!1,arity:"single",objectTypes:R}),$("class",{kind:"string",placement:!1,arity:"single",objectTypes:R}),$("culture",{kind:"string",placement:!1,arity:"single",objectTypes:R}),$("tags",{kind:"list",placement:!1,arity:"multiple",objectTypes:be}),$("color",{kind:"string",placement:!1,arity:"single",objectTypes:be}),$("image",{kind:"string",placement:!1,arity:"single",objectTypes:gr}),$("hidden",{kind:"boolean",placement:!1,arity:"single",objectTypes:be}),$("radius",{kind:"unit",placement:!1,arity:"single",objectTypes:R,unitFamily:"radius"}),$("mass",{kind:"unit",placement:!1,arity:"single",objectTypes:R,unitFamily:"mass"}),$("density",{kind:"unit",placement:!1,arity:"single",objectTypes:R,unitFamily:"generic"}),$("gravity",{kind:"unit",placement:!1,arity:"single",objectTypes:R,unitFamily:"generic"}),$("temperature",{kind:"unit",placement:!1,arity:"single",objectTypes:R,unitFamily:"generic"}),$("albedo",{kind:"number",placement:!1,arity:"single",objectTypes:R}),$("atmosphere",{kind:"string",placement:!1,arity:"single",objectTypes:["planet","moon","asteroid","comet","phenomenon"]}),$("inner",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),$("outer",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),$("view",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),$("scale",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),$("units",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),$("title",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),$("on",{kind:"string",placement:!1,arity:"single",objectTypes:R}),$("source",{kind:"string",placement:!1,arity:"single",objectTypes:R}),$("cycle",{kind:"unit",placement:!1,arity:"single",objectTypes:R,unitFamily:"duration"}),$("trajectory",{kind:"string",placement:!1,arity:"single",objectTypes:["craft","structure"]})].map(e=>[e.key,e])),br=new Set(Ut.keys());function E(e){return Ut.get(e)}function Wt(e){return br.has(e)}function Yt(e,t){return e.objectTypes.includes(t)}function Re(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 we(e,t={}){let n=[],r=t.columnOffset??0,i="",o=null,a=!1,l=!1,s=null,c=()=>{o!==null&&(n.push({value:i,column:o,quoted:a}),i="",o=null,a=!1)};for(let u=0;u<e.length;u++){let d=e[u],p=r+u+1;if(l&&d==="\\"){let m=e[u+1];if(m==='"'||m==="\\"){i+=m,u++;continue}}if(d==='"'){l?l=!1:(o===null&&(o=p),a=!0,s=p,l=!0);continue}if(!l&&/\s/.test(d)){c();continue}o===null&&(o=p),i+=d}if(l)throw new f("Unclosed quote in line",t.line,s??r+e.length);return c(),n}function ze(e){return e.match(/^\s*/)?.[0].length??0}function ve(e){let t=e.split(/\r?\n/),n=[],r=null,i=null,o=!1,a=!1,l=null,s=null,c=null,u=null;for(let d=0;d<t.length;d++){let p=t[d],m=d+1;if(!p.trim())continue;let y=ze(p),h=we(p.slice(y),{line:m,columnOffset:y});if(h.length!==0){if(y===0){if(o=!1,a=!1,l=null,s=null,c=null,u=null,h.length>=1&&h[0].value==="theme"){a=!0,s=0,r={type:"theme",preset:h.length>=2?h[1].value:null,blocks:[],location:{line:m,column:h[0].column}};continue}let I=wr(h,m);n.push(I),i=I;continue}if(a){if(h.length>=2&&h[0].value==="preset"&&(!c||y<=c)){r&&(r.preset=h[1].value);continue}u&&c!==null&&y>c?u.fields.push($r(h,m)):(c=y,u={type:"theme-block",target:h[0].value,fields:[],location:{line:m,column:h[0].column}},r?.blocks.push(u));continue}if(!i)throw new f("Indented line without parent object",m,y+1);if(h.length===1&&h[0].value==="info"){o=!0,l=y;continue}o&&y<=(l??0)&&(o=!1),o?i.infoEntries.push(jr(h,m)):i.blockFields.push(Ir(h,m))}}return{type:"document",theme:r,objects:n}}function wr(e,t){if(e.length<2)throw new f("Invalid object declaration",t,e[0]?.column??1);let[n,r,...i]=e;if(!Ve.has(n.value))throw new f(`Unknown object type "${n.value}"`,t,n.column);return{type:"object",objectType:n.value,name:r.value,inlineFields:vr(i,t),blockFields:[],infoEntries:[],location:{line:t,column:n.column}}}function vr(e,t){let n=[],r=0;for(;r<e.length;){let i=e[r],o=E(i.value);if(!o)throw new f(`Unknown field "${i.value}"`,t,i.column);r++;let a=[];if(o.arity==="multiple")for(;r<e.length&&!Wt(e[r].value);)a.push(e[r]),r++;else{let l=e[r];l&&(a.push(l),r++)}if(a.length===0)throw new f(`Missing value for field "${i.value}"`,t,i.column);n.push({type:"field",key:i.value,values:a.map(l=>l.value),location:{line:t,column:i.column}})}return n}function Ir(e,t){if(e.length<2)throw new f("Invalid field line",t,e[0]?.column??1);if(!E(e[0].value))throw new f(`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 $r(e,t){if(e.length<2)throw new f("Invalid theme field line",t,e[0]?.column??1);return{type:"field",key:e[0].value,values:e.slice(1).map(n=>n.value),location:{line:t,column:e[0].column}}}function jr(e,t){if(e.length<2)throw new f("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 Gt=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,xr=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),Sr=/^[A-Za-z][A-Za-z0-9+.-]*:/;function Ie(e){let t=null,n=[],r=e.theme?kr(e.theme):null;for(let i of e.objects){let o=Or(i);if(i.objectType==="system"){if(t)throw f.fromLocation("Only one system object is allowed",i.location);t=o}else n.push(o)}return{format:"worldorbit",version:"1.0",schemaVersion:"1.0",theme:r,system:t,groups:[],relations:[],events:[],trajectories:[],objects:n}}function kr(e){let t={};for(let n of e.blocks){let r=qt(n.fields);t[n.target]=Mr(r)}return{preset:e.preset,styles:t}}function Mr(e){let t={};for(let[n,r]of e.entries()){if(r.values.length===1){let i=r.values[0];if(i==="true"){t[n]=!0;continue}if(i==="false"){t[n]=!1;continue}let o=Number(i);if(!Number.isNaN(o)&&i.trim()!==""){t[n]=o;continue}}t[n]=r.values.join(" ")}return t}function Or(e){let t=[...e.inlineFields,...e.blockFields];Ar(e.objectType,t);let n=qt(t),r=Tr(e.objectType,n),i=Lr(n),o=Er(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:o}:{type:e.objectType,id:e.name,properties:i,placement:r,info:o}}function Ar(e,t){for(let n of t){let r=E(n.key);if(!r)throw f.fromLocation(`Unknown field "${n.key}"`,n.location);if(!Yt(r,e))throw f.fromLocation(`Field "${n.key}" is not valid on "${e}"`,n.location);if(r.arity==="single"&&n.values.length!==1)throw f.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function qt(e){let t=new Map;for(let n of e){if(t.has(n.key))throw f.fromLocation(`Duplicate field "${n.key}"`,n.location);t.set(n.key,n)}return t}function Tr(e,t){let n=t.has("orbit"),r=t.has("at"),i=t.has("surface"),o=t.has("free"),a=[n,r,i,o].filter(Boolean).length;if(a>1){let l=t.get("orbit")??t.get("at")??t.get("surface")??t.get("free");throw f.fromLocation("Object has multiple placement modes",l?.location)}if(e==="system"&&a>0)throw f.fromLocation("System objects cannot declare placement",[...t.values()][0]?.location);if(n)return{mode:"orbit",target:Be(t,"orbit"),distance:ue(t,"distance"),semiMajor:ue(t,"semiMajor"),eccentricity:Vr(t,"eccentricity"),period:ue(t,"period"),angle:ue(t,"angle"),inclination:ue(t,"inclination"),phase:ue(t,"phase")};if(r){let l=_e(t,"at"),s=Be(t,"at");return{mode:"at",target:s,reference:Fr(s,l.location)}}if(i)return{mode:"surface",target:Be(t,"surface")};if(o){let l=Be(t,"free"),s=Cr(l);return{mode:"free",distance:s??void 0,descriptor:s?void 0:l}}return null}function Lr(e){let t={};for(let[n,r]of e.entries()){let i=E(n);if(!(!i||i.placement))switch(i.kind){case"list":t[n]=r.values;break;case"boolean":t[n]=Rr(r);break;case"number":t[n]=Ht(de(r),n,r.location);break;case"unit":t[n]=Xt(de(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"&&Dr(n,t.location),n}function Dr(e,t){if(!e)throw f.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw f.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match(Sr);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw f.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function Er(e){let t={};for(let n of e){if(n.key in t)throw f.fromLocation(`Duplicate info key "${n.key}"`,n.location);t[n.key]=n.value}return t}function Fr(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw f.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 f.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 Xt(e,t,n){let r=e.match(Gt);if(!r)throw f.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let o=E(n);if(o?.unitFamily&&!Re(o.unitFamily,i.unit))throw f.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function Cr(e){let t=e.match(Gt);return t?{value:Number(t[1]),unit:t[2]??null}:null}function ue(e,t){if(!e.has(t))return;let n=_e(e,t);return Xt(de(n),n.location,t)}function Vr(e,t){if(!e.has(t))return;let n=_e(e,t);return Ht(de(n),t,n.location)}function Ht(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw f.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function Rr(e){let t=de(e).toLowerCase(),n=xr.get(t);if(n===void 0)throw f.fromLocation(`Invalid boolean value "${t}" for "${e.key}"`,e.location);return n}function _e(e,t){let n=e.get(t);if(!n)throw new f(`Missing value for key "${t}"`);return n}function Be(e,t){return de(_e(e,t))}function de(e){if(e.values.length!==1)throw f.fromLocation(`Field "${e.key}" expects exactly one value`,e.location);return e.values[0]}var zr=new Set(["star","planet","moon","asteroid","comet"]);function $e(e){let t=new Set,n=new Map;for(let r of e.objects){if(t.has(r.id))throw new f(`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 f(`Unknown placement target "${r.placement.target}" on "${r.id}"`);if(r.placement.mode==="surface"){let i=n.get(r.placement.target);if(!i||!zr.has(i.type))throw new f(`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"&&_r(r,r.placement.reference,t))}}function Br(e,t,n){if(!n.has(t.primary))throw new f(`Unknown Lagrange reference "${t.primary}" on "${e.id}"`);if(t.secondary&&!n.has(t.secondary))throw new f(`Unknown Lagrange reference "${t.secondary}" on "${e.id}"`)}function _r(e,t,n){if(!n.has(t.objectId))throw new f(`Unknown anchor target "${t.objectId}" on "${e.id}"`)}function oe(e,t,n=`${t}.failed`){return e instanceof f?{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)}}var je=1495978707e-1,Nr=6371,Ur=71492,Wr=695700,Yr=63241.077,Gr=206264.806,qr=206264806,nn=.68,Xr=.2,rn=28;function N(e,t={}){let n=Zr(t),r=n.width,i=n.height,o=n.padding,a=Kr(e),l=Qr(e,t.projection),s=ht(t.camera??null),c=mt(l,s),u=ii(a),d=ni(a,t.scaleModel,t.bodyScaleMode),p=e.system?.id??null,m=t.activeEventId??null,y=Hr(e.objects,e.events??[],m),h=oi(y,r,i,o,u,d),I=new Map(y.map(v=>[v.id,v])),M=Ni(y,I),g=new Map,w=[],S=[],U=[],D=[],ee=[],te=new Map,ce=new Map;for(let v of y){let V=v.placement;if(!V){U.push(v);continue}if(V.mode==="orbit"){Qt(ce,V.target,v);continue}if(V.mode==="surface"){Qt(te,V.target,v);continue}if(V.mode==="at"){ee.push(v);continue}D.push(v)}let ye=D.length>0?r*.42:r/2,ne=i/2,O={orbitChildren:ce,surfaceChildren:te,objectMap:I,spacingFactor:u,projection:c,scaleModel:d,sceneMetricScale:h},re=U.find(v=>v.type==="star")??U[0]??null;re&&ft(re,ye,ne,0,g,w,S,O);let W=U.filter(v=>v.id!==re?.id);if(W.length>0){let v=Math.min(r,i)*.28*u*d.orbitDistanceMultiplier;W.forEach((V,A)=>{let ct=Oe(A,W.length,-Math.PI/2),ie=Ae(ct,v,c,1);ft(V,ye+ie.x,ne+ie.y,0,g,w,S,O)})}D.forEach((v,V)=>{let A=r-o-140-Xi(v.placement?.mode==="free"?v.placement.distance:void 0,d,h),ct=Math.max(76,(i-o*2-180)/Math.max(1,D.length)*u)*d.freePlacementMultiplier,ie=o+92+V*ct;g.set(v.id,{object:v,x:A,y:ie,radius:Ge(v,0,d,h),sortKey:Xe(A,ie,0)}),S.push({object:v,groupId:M.groupIds.get(v.id)??null,x1:A-60,y1:ie,x2:A-18,y2:ie,mode:"free"}),We(v,g,w,S,O,1)}),ee.forEach((v,V)=>{if(g.has(v.id)||!v.placement||v.placement.mode!=="at")return;let A=Bi(v.placement.reference,g,I,V,ee.length,r,i,o,O);g.set(v.id,{object:v,x:A.x,y:A.y,radius:Ge(v,2,d,h),sortKey:Xe(A.x,A.y,2),anchorX:A.anchorX,anchorY:A.anchorY}),A.anchorX!==void 0&&A.anchorY!==void 0&&S.push({object:v,groupId:M.groupIds.get(v.id)??null,x1:A.anchorX,y1:A.anchorY,x2:A.x,y2:A.y,mode:"at"}),We(v,g,w,S,O,2)});let P=[...g.values()].map(v=>ai(v,d,M)),Y=w.map(v=>si(v,M.groupIds.get(v.object.id)??null)),Fe=S.map(v=>li(v)),Ce=ci(P,r,i,d.labelMultiplier),Bt=yi(e,P),_t=bi(e.events??[],P,m),or=mi(Y,Bt,_t,Fe,P,Ce),ar=hi(P,Y,Fe,Ce,M,d.labelMultiplier),sr=gi(e,P),lr=wi(e,l,n.preset,M,I),cr=Li(r,i,P,Y,Fe,Ce,d.labelMultiplier);return{width:r,height:i,padding:o,renderPreset:n.preset,projection:l,renderProjection:c,camera:s,scaleModel:d,title:String(e.system?.title??e.system?.properties.title??e.system?.id??"WorldOrbit")||"WorldOrbit",subtitle:ti(l,c,a,s),systemId:p,viewMode:l,layoutPreset:a,metadata:{format:e.format,version:e.version,view:l,renderProjection:c,scale:String(e.system?.properties.scale??a),units:String(e.system?.properties.units??"mixed"),preset:n.preset??"custom","body.scaleMode":d.bodyScaleMode,...s?.azimuth!==null?{"camera.azimuth":String(s?.azimuth)}:{},...s?.elevation!==null?{"camera.elevation":String(s?.elevation)}:{},...s?.roll!==null?{"camera.roll":String(s?.roll)}:{},...s?.distance!==null?{"camera.distance":String(s?.distance)}:{}},contentBounds:cr,layers:or,groups:ar,semanticGroups:sr,viewpoints:lr,events:_t,activeEventId:m,objects:P,orbitVisuals:Y,relations:Bt,leaders:Fe,labels:Ce}}function Hr(e,t,n){let r=e.map(l=>structuredClone(l));if(!n)return r;let i=t.find(l=>l.id===n);if(!i)return r;let o=new Map(r.map(l=>[l.id,l])),a=new Set([...i.targetObjectId?[i.targetObjectId]:[],...i.participantObjectIds,...i.positions.map(l=>l.objectId)]);for(let l of a){let s=o.get(l);s&&(i.epoch&&(s.epoch=i.epoch),i.referencePlane&&(s.referencePlane=i.referencePlane))}for(let l of i.positions){let s=o.get(l.objectId);s&&(l.placement&&(s.placement=structuredClone(l.placement)),l.inner&&(s.properties.inner={...l.inner}),l.outer&&(s.properties.outer={...l.outer}),l.epoch&&(s.epoch=l.epoch),l.referencePlane&&(s.referencePlane=l.referencePlane))}return r}function Kr(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 Zr(e){let t=Jr(e.preset);return{width:e.width??t.width,height:e.height??t.height,padding:e.padding??t.padding,preset:e.preset??null}}function Jr(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 Qr(e,t){if(t==="topdown"||t==="isometric"||t==="orthographic"||t==="perspective")return t;let n=String(e.system?.properties.view??"topdown").toLowerCase();return sn(n)??"topdown"}function mt(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 ht(e){if(!e)return null;let t={azimuth:dt(e.azimuth),elevation:dt(e.elevation),roll:dt(e.roll),distance:ei(e.distance)};return t.azimuth!==null||t.elevation!==null||t.roll!==null||t.distance!==null?t:null}function dt(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function ei(e){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:null}function ti(e,t,n,r){let i=[`${en(e)} view`,`${en(n)} layout`];if(e!==t&&i.push(`2D ${t} fallback`),r){let o=[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);o.length>0&&i.push(`camera ${o.join(" / ")}`)}return i.join(" - ")}function ni(e,t,n){return{...ri(e),...n?{bodyScaleMode:n}:{},...t}}function ri(e){switch(e){case"compact":return{orbitDistanceMultiplier:.84,bodyRadiusMultiplier:.92,labelMultiplier:.9,freePlacementMultiplier:.9,ringThicknessMultiplier:.92,minBodyRadius:4,maxBodyRadius:36,bodyScaleMode:"readable"};case"presentation":return{orbitDistanceMultiplier:1.2,bodyRadiusMultiplier:1.18,labelMultiplier:1.08,freePlacementMultiplier:1.05,ringThicknessMultiplier:1.16,minBodyRadius:5,maxBodyRadius:48,bodyScaleMode:"readable"};default:return{orbitDistanceMultiplier:1,bodyRadiusMultiplier:1,labelMultiplier:1,freePlacementMultiplier:1,ringThicknessMultiplier:1,minBodyRadius:4,maxBodyRadius:40,bodyScaleMode:"readable"}}}function ii(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function oi(e,t,n,r,i,o){let a=[],l=[];for(let m of e){let y=Ki(m);y!==null&&y>0&&l.push(y);let h=m.placement;if(h){if(h.mode==="orbit"){let I=K(h.semiMajor??h.distance??null);I!==null&&I>0&&a.push(I);continue}if(h.mode==="free"){let I=K(h.distance??null);I!==null&&I>0&&a.push(I)}}}let s=Math.max(...a,0),c=Math.max(...l,0),u=Math.max(s,c*6,0),d=u+Math.max(Math.sqrt(u),c*2,s>0?.25:0);return d<=0?{pixelsPerMetric:null,hasExplicitScale:!1}:{pixelsPerMetric:Math.max(Math.min(t,n)/2-r-24,120)*i*o.orbitDistanceMultiplier/d,hasExplicitScale:!0}}function ai(e,t,n){let{object:r,x:i,y:o,radius:a,sortKey:l,anchorX:s,anchorY:c}=e,u=r.renderHints?.renderPriority??0;return{renderId:fe(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:o,radius:a,visualRadius:qi(r,a,t),sortKey:l+u*.001,anchorX:s,anchorY:c,label:r.id,secondaryLabel:r.type==="structure"||r.type==="craft"?String(r.properties.kind??r.type):r.type,fillColor:Zi(r.properties.color),imageHref:typeof r.properties.image=="string"&&r.properties.image.trim()?r.properties.image:void 0,hidden:r.properties.hidden===!0}}function si(e,t){return{renderId:`${fe(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 li(e){return{renderId:`${fe(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 ci(e,t,n,r){let i=[],o=[],a=new Map(e.map(s=>[s.objectId,s])),l=[...e].filter(s=>!s.hidden&&s.object.renderHints?.renderLabel!==!1).sort(ui);for(let s of l){let c=di(s,a,o,t,n,r)??an(s,on(s,a.get(s.parentId??"")??null,n),0,r);o.push(fn(s,c,r)),i.push({renderId:`${s.renderId}-label`,objectId:s.objectId,object:s.object,groupId:s.groupId,semanticGroupIds:[...s.semanticGroupIds],label:s.label,secondaryLabel:s.secondaryLabel,x:c.x,y:c.labelY,secondaryY:c.secondaryY,textAnchor:c.textAnchor,direction:c.direction,hidden:s.hidden})}return i}function ui(e,t){let n=Kt(e)-Kt(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 Kt(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"craft":case"structure":case"phenomenon":return 5}}function di(e,t,n,r,i,o){for(let a of fi(e,t,r,i)){let l=a==="left"||a==="right"?4:6;for(let s=0;s<=l;s+=1){let c=an(e,a,s,o),u=fn(e,c,o);if(!n.some(d=>Yi(d,u)))return c}}return null}function fi(e,t,n,r){let i=e.parentId?t.get(e.parentId)??null:null,o=on(e,i,r),a=o==="below"?"above":"below",l=pi(e,i,n),s=l==="right"?"left":"right";return e.object.type==="craft"||e.object.type==="structure"||e.object.type==="phenomenon"||e.object.placement?.mode==="at"||e.object.placement?.mode==="surface"||e.object.placement?.mode==="free"?[l,o,s,a]:[o,l,a,s]}function on(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 pi(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 an(e,t,n,r){let i=14*r;switch(t){case"above":{let o=e.y-(e.radius+18*r+n*i);return{x:e.x,labelY:o,secondaryY:o-16*r,textAnchor:"middle",direction:t}}case"below":{let o=e.y+e.radius+18*r+n*i;return{x:e.x,labelY:o,secondaryY:o+16*r,textAnchor:"middle",direction:t}}case"left":{let o=e.x-(e.visualRadius+16*r+n*i),a=e.y-4*r;return{x:o,labelY:a,secondaryY:a+16*r,textAnchor:"end",direction:t}}case"right":{let o=e.x+e.visualRadius+16*r+n*i,a=e.y-4*r;return{x:o,labelY:a,secondaryY:a+16*r,textAnchor:"start",direction:t}}}}function mi(e,t,n,r,i,o){let a=e.filter(s=>!s.hidden&&!!s.backArcPath).map(s=>s.renderId),l=e.filter(s=>!s.hidden).map(s=>s.renderId);return[{id:"background",renderIds:["wo-bg","wo-bg-glow","wo-grid"]},{id:"guides",renderIds:r.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"orbits-back",renderIds:a},{id:"orbits-front",renderIds:l},{id:"relations",renderIds:t.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"events",renderIds:n.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"objects",renderIds:i.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"labels",renderIds:o.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"metadata",renderIds:["wo-title","wo-subtitle","wo-meta"]}]}function hi(e,t,n,r,i,o){let a=new Map,l=s=>{if(!s)return null;let c=a.get(s);if(c)return c;let u=i.groupRoots.get(s)??null,d={renderId:s,rootObjectId:u,label:u??s,objectIds:[],orbitIds:[],labelIds:[],leaderIds:[],contentBounds:Me(0,0,0,0)};return a.set(s,d),d};for(let s of e){let c=l(s.groupId);c&&!s.hidden&&c.objectIds.push(s.objectId)}for(let s of t){let c=l(s.groupId);c&&!s.hidden&&c.orbitIds.push(s.objectId)}for(let s of n){let c=l(s.groupId);c&&!s.hidden&&c.leaderIds.push(s.objectId)}for(let s of r){let c=l(s.groupId);c&&!s.hidden&&c.labelIds.push(s.objectId)}for(let s of a.values())s.contentBounds=Ui(s,e,t,n,r,o);return[...a.values()].sort((s,c)=>s.label.localeCompare(c.label))}function gi(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 yi(e,t){let n=new Map(t.map(r=>[r.objectId,r]));return e.relations.map(r=>{let i=n.get(r.from),o=n.get(r.to);return{renderId:`${fe(r.id)}-relation`,relationId:r.id,relation:r,fromObjectId:r.from,toObjectId:r.to,x1:i?.x??0,y1:i?.y??0,x2:o?.x??0,y2:o?.y??0,hidden:r.hidden||!i||!o||i.hidden||o.hidden}}).sort((r,i)=>r.relation.id.localeCompare(i.relation.id))}function bi(e,t,n){let r=new Map(t.map(i=>[i.objectId,i]));return e.map(i=>{let o=[...new Set([...i.targetObjectId?[i.targetObjectId]:[],...i.participantObjectIds])],a=o.map(c=>r.get(c)).filter(Boolean),l=a.length>0?a.reduce((c,u)=>c+u.x,0)/a.length:0,s=a.length>0?a.reduce((c,u)=>c+u.y,0)/a.length:0;return{renderId:`${fe(i.id)}-event`,eventId:i.id,event:i,objectIds:o,participantIds:[...i.participantObjectIds],targetObjectId:i.targetObjectId,x:l,y:s,hidden:i.hidden||a.length===0||a.every(c=>c.hidden)||n!==null&&i.id!==n}}).sort((i,o)=>i.event.id.localeCompare(o.event.id))}function wi(e,t,n,r,i){let o=vi(e,t,n),a=new Map;for(let[c,u]of Object.entries(e.system?.info??{})){if(!c.startsWith("viewpoint."))continue;let[d,p,...m]=c.split(".");if(d!=="viewpoint"||!p||m.length===0)continue;let y=Oi(p);if(!y)continue;let h=m.join(".").toLowerCase(),I=a.get(y)??{id:y};Ii(I,h,u,e,t,n,r,i),a.set(y,I)}let l=[...a.values()].map(c=>$i(c,t,n,i)).filter(Boolean),s=l.findIndex(c=>c.id===o.id);return s>=0?l.splice(s,1,{...o,...l[s],layers:{...o.layers,...l[s].layers},filter:l[s].filter??o.filter,generated:!1}):l.unshift(o),l.sort((c,u)=>c.id==="overview"?-1:u.id==="overview"?1:c.label.localeCompare(u.label))}function vi(e,t,n){let r=e.system?.title??e.system?.properties.title,i=r?`${String(r)} Overview`:"Overview",o=ht(null),a=mt(t,o);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:o,preset:n,rotationDeg:0,scale:null,layers:{},filter:null,generated:!0}}function Ii(e,t,n,r,i,o,a,l){let s=n.trim();switch(t){case"label":case"title":s&&(e.label=s);return;case"summary":case"description":s&&(e.summary=s);return;case"focus":case"object":s&&(e.focus=s);return;case"select":case"selection":s&&(e.select=s);return;case"events":e.eventIds=ke(s);return;case"projection":case"view":e.projection=sn(s)??i;return;case"preset":e.preset=xi(s)??o;return;case"rotation":case"angle":e.rotationDeg=xe(s)??e.rotationDeg??0;return;case"camera.azimuth":e.camera={...e.camera??Ue(),azimuth:xe(s)};return;case"camera.elevation":e.camera={...e.camera??Ue(),elevation:xe(s)};return;case"camera.roll":e.camera={...e.camera??Ue(),roll:xe(s)};return;case"camera.distance":e.camera={...e.camera??Ue(),distance:Zt(s)};return;case"zoom":case"scale":e.scale=Zt(s);return;case"layers":e.layers=Si(s);return;case"query":e.filter={...e.filter??Ne(),query:s||null};return;case"types":case"objecttypes":e.filter={...e.filter??Ne(),objectTypes:ki(s)};return;case"tags":e.filter={...e.filter??Ne(),tags:ke(s)};return;case"groups":e.filter={...e.filter??Ne(),groupIds:Mi(s,r,a,l)};return}}function $i(e,t,n,r){let i=e.focus&&r.has(e.focus)?e.focus:null,o=e.select&&r.has(e.select)?e.select:i,a=ji(e.filter),l=e.label?.trim()||Ai(e.id),s=e.projection??t,c=ht(e.camera??null),u=mt(s,c);return{id:e.id,label:l,summary:e.summary?.trim()||Ti(l,i,a),objectId:i,selectedObjectId:o,eventIds:[...new Set(e.eventIds??[])],projection:s,renderProjection:u,camera:c,preset:e.preset??n,rotationDeg:e.rotationDeg??0,scale:e.scale??null,layers:e.layers??{},filter:a,generated:!1}}function Ne(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Ue(){return{azimuth:null,elevation:null,roll:null,distance:null}}function ji(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 sn(e){switch(e.toLowerCase()){case"topdown":return"topdown";case"isometric":return"isometric";case"orthographic":return"orthographic";case"perspective":return"perspective";default:return null}}function xi(e){let t=e.toLowerCase();return t==="diagram"||t==="presentation"||t==="atlas-card"||t==="markdown"?t:null}function xe(e){let t=Number(e);return Number.isFinite(t)?t:null}function Zt(e){let t=xe(e);return t!==null&&t>0?t:null}function Si(e){let t={};for(let n of ke(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 ki(e){return ke(e).filter(t=>t==="star"||t==="planet"||t==="moon"||t==="belt"||t==="asteroid"||t==="comet"||t==="ring"||t==="craft"||t==="structure"||t==="phenomenon")}function Mi(e,t,n,r){return ke(e).map(i=>t.schemaVersion==="2.1"||t.schemaVersion==="2.5"||t.schemaVersion==="2.6"||t.groups.some(o=>o.id===i)||i.startsWith("wo-")&&i.endsWith("-group")?i:n.groupIds.has(i)?n.groupIds.get(i)??Se(i):(r.has(i),Se(i)))}function ke(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 Ti(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 Li(e,t,n,r,i,o,a){let l=Number.POSITIVE_INFINITY,s=Number.POSITIVE_INFINITY,c=Number.NEGATIVE_INFINITY,u=Number.NEGATIVE_INFINITY,d=(p,m)=>{l=Math.min(l,p),s=Math.min(s,m),c=Math.max(c,p),u=Math.max(u,m)};for(let p of r)p.hidden||ln(p,d);for(let p of i)p.hidden||(d(p.x1,p.y1),d(p.x2,p.y2));for(let p of n)p.hidden||cn(p,d);for(let p of o)p.hidden||un(p,d,a);return!Number.isFinite(l)||!Number.isFinite(s)?Me(0,0,e,t):Me(l,s,c,u)}function ln(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,o=mn(e.cx,e.cy,r,i,e.rotationDeg,0,Math.PI*2,rn*2);for(let a of o)t(a.x-n,a.y-n),t(a.x+n,a.y+n)}function Me(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 cn(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 un(e,t,n){let r=pn(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 ft(e,t,n,r,i,o,a,l){i.has(e.id)||(i.set(e.id,{object:e,x:t,y:n,radius:Ge(e,r,l.scaleModel,l.sceneMetricScale),sortKey:Xe(t,n,r)}),We(e,i,o,a,l,r+1))}function We(e,t,n,r,i,o){let a=t.get(e.id);if(!a)return;let l=[...i.orbitChildren.get(e.id)??[]].sort(Pi),s=Di(l,a.radius,i.spacingFactor,i.scaleModel,i.sceneMetricScale),c=Ci(l,s);l.forEach((d,p)=>{let m=Ei(d,p,l.length,a,s,c[p]??s.innerPx,i);n.push({object:d,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}),ft(d,m.objectX,m.objectY,o,t,n,r,i)});let u=[...i.surfaceChildren.get(e.id)??[]];u.forEach((d,p)=>{let m=Oe(p,u.length,-Math.PI/3),y=28*i.spacingFactor,h=Ae(m,a.radius,i.projection,i.projection==="isometric"?.9:1),I=Ae(m,a.radius+y,i.projection,i.projection==="isometric"?.9:1),M=a.x+h.x,g=a.y+h.y,w=a.x+I.x,S=a.y+I.y;t.set(d.id,{object:d,x:w,y:S,radius:Ge(d,o+1,i.scaleModel,i.sceneMetricScale),sortKey:Xe(w,S,o+1),anchorX:M,anchorY:g}),r.push({object:d,groupId:i.objectMap.has(d.id)?Se(Wi(d,i.objectMap)):null,x1:M,y1:g,x2:w,y2:S,mode:"surface"}),We(d,t,n,r,i,o+1)})}function Pi(e,t){let n=Ye(e),r=Ye(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 Di(e,t,n,r,i){let o=e.map(m=>Ye(m)),a=o.filter(m=>m!==null),l=r.bodyScaleMode==="strict"?Math.max(2,8*n*r.orbitDistanceMultiplier):(e.length>2?54:64)*n*r.orbitDistanceMultiplier*.42,s=t+Math.max(l*1.2,24*n),c=(e.length>2?54:64)*n*r.orbitDistanceMultiplier;if(a.length===0)return{metrics:o,minMetric:0,maxMetric:0,metricSpread:0,innerPx:s,stepPx:c,pixelSpread:Math.max(c*Math.max(e.length-1,1),c),minimumGapPx:l,pixelsPerMetric:i.pixelsPerMetric};let u=Math.min(...a),d=Math.max(...a),p=d-u;return{metrics:o,minMetric:u,maxMetric:d,metricSpread:p,innerPx:s,stepPx:c,pixelSpread:Math.max(c*Math.max(e.length-1,1),c),minimumGapPx:l,pixelsPerMetric:i.pixelsPerMetric}}function Ei(e,t,n,r,i,o,a){let l=e.placement,s=e.type==="belt"||e.type==="ring";if(!l||l.mode!=="orbit"){let te=i.innerPx+t*i.stepPx;return{kind:"circle",cx:r.x,cy:r.y,radius:te,rotationDeg:0,band:s,bandThickness:s?12*a.scaleModel.ringThicknessMultiplier:void 0,objectX:r.x,objectY:r.y-te}}let c=k(typeof l.eccentricity=="number"?l.eccentricity:0,0,.92),u=o,d=Math.max(u*Math.sqrt(1-c*c),u*.18),p=pt(l.inclination)??0,m=a.projection==="isometric"?Math.max(Xr,Math.cos(gt(p)))*nn:1,y=Math.max(d*m,u*.14),h=pt(l.angle)??0,I=u*c,M=gn(-I,0,h),g=r.x+M.x,w=r.y+M.y,S=Ri(l.phase,t,n),U=hn(g,w,u,y,h,S),D=a.projection==="topdown"&&c<=1e-4&&Math.abs(h)<=1e-4,ee=s?zi(e,u,i,a.scaleModel):void 0;return{kind:D?"circle":"ellipse",cx:D?r.x:g,cy:D?r.y:w,radius:D?u:void 0,rx:D?void 0:u,ry:D?void 0:y,rotationDeg:h,band:s,bandThickness:ee,frontArcPath:a.projection==="isometric"||s?Jt(g,w,u,y,h,0,Math.PI):void 0,backArcPath:a.projection==="isometric"||s?Jt(g,w,u,y,h,Math.PI,Math.PI*2):void 0,objectX:U.x,objectY:U.y}}function Fi(e,t){return t.pixelsPerMetric!==null?e*t.pixelsPerMetric:t.innerPx+t.stepPx*Vi(Math.max(e,0)+1)}function Ci(e,t){let n=[];return e.forEach((r,i)=>{let o=Ye(r),a=t.innerPx+i*t.stepPx,l=o===null?a:Fi(o,t),s=i===0?t.innerPx:(n[i-1]??t.innerPx)+t.minimumGapPx;n.push(Math.max(l,s))}),n}function Ye(e){return!e.placement||e.placement.mode!=="orbit"?null:K(e.placement.semiMajor??e.placement.distance??null)}function Vi(e){return Math.log(e)/Math.log(2)}function Ri(e,t,n){let r=e?pt(e):null;return r!==null?gt(r-90):Oe(t,n,-Math.PI/2)}function zi(e,t,n,r){let i=K(qe(e.properties.inner)),o=K(qe(e.properties.outer));if(i!==null&&o!==null){let l=Math.abs(o-i);if(n.pixelsPerMetric!==null){let c=l*n.pixelsPerMetric;return r.bodyScaleMode==="strict"?Math.max(c*r.ringThicknessMultiplier,1):k(Math.max(c*r.ringThicknessMultiplier,8),8,54)}if(n.metricSpread>0)return k(l/n.metricSpread*n.pixelSpread*r.ringThicknessMultiplier,8,54);let s=Math.max(Math.max(i,o),1e-4);return k(l/s*t*.75*r.ringThicknessMultiplier,8,48)}return(e.type==="belt"?18:12)*r.ringThicknessMultiplier}function Bi(e,t,n,r,i,o,a,l,s){if(e.kind==="lagrange")return _i(e,t,n,o,a);if(e.kind==="anchor"){let c=t.get(e.objectId);if(c){let u=Oe(r,i,Math.PI/5),d=(c.radius+36)*s.scaleModel.labelMultiplier,p=Ae(u,d,s.projection,s.projection==="isometric"?.92:1);return{x:c.x+p.x,y:c.y+p.y,anchorX:c.x,anchorY:c.y}}}if(e.kind==="named"){let c=t.get(e.name);if(c){let u=Oe(r,i,Math.PI/6),d=(c.radius+36)*s.scaleModel.labelMultiplier,p=Ae(u,d,s.projection,s.projection==="isometric"?.92:1);return{x:c.x+p.x,y:c.y+p.y,anchorX:c.x,anchorY:c.y}}}return{x:o-l-170,y:a-l-86-r*58*s.scaleModel.freePlacementMultiplier}}function _i(e,t,n,r,i){let o=e.secondary?t.get(e.primary):Gi(e.primary,t,n),a=t.get(e.secondary??e.primary);if(!o||!a)return{x:r*.7,y:i*.25};let l=a.x-o.x,s=a.y-o.y,c=Math.hypot(l,s)||1,u=l/c,d=s/c,p=-d,m=u,y=k(c*.25,24,68);switch(e.point){case"L1":return{x:a.x-u*y,y:a.y-d*y,anchorX:a.x,anchorY:a.y};case"L2":return{x:a.x+u*y,y:a.y+d*y,anchorX:a.x,anchorY:a.y};case"L3":return{x:o.x-u*y,y:o.y-d*y,anchorX:o.x,anchorY:o.y};case"L4":return{x:a.x+(u*.5-p*.8660254)*y,y:a.y+(d*.5-m*.8660254)*y,anchorX:a.x,anchorY:a.y};case"L5":return{x:a.x+(u*.5+p*.8660254)*y,y:a.y+(d*.5+m*.8660254)*y,anchorX:a.x,anchorY:a.y}}}function Ni(e,t){let n=new Map,r=new Map;for(let c of e){let u=dn(c,t);if(n.set(c.id,u),u){let d=r.get(u);d?d.push(c.id):r.set(u,[c.id])}r.has(c.id)||r.set(c.id,[])}let i=new Map,o=new Map,a=new Map,l=c=>{let u=i.get(c);if(u)return u;let d=new Set,p=[],m=n.get(c)??null;for(;m&&!d.has(m);)p.push(m),d.add(m),m=n.get(m)??null;return i.set(c,p),p},s=c=>{let u=a.get(o.get(c)??"");if(u)return u;let d=n.get(c)??null,p=t.get(c),m=c;return p?.placement&&p.placement.mode!=="free"&&d&&(m=s(d)),m};for(let c of e){l(c.id);let u=s(c.id),d=Se(u);o.set(c.id,d),a.set(d,u)}return{parentIds:n,childIds:r,ancestorIds:i,groupIds:o,groupRoots:a}}function dn(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 Ui(e,t,n,r,i,o){let a=Number.POSITIVE_INFINITY,l=Number.POSITIVE_INFINITY,s=Number.NEGATIVE_INFINITY,c=Number.NEGATIVE_INFINITY,u=(d,p)=>{a=Math.min(a,d),l=Math.min(l,p),s=Math.max(s,d),c=Math.max(c,p)};for(let d of t)!d.hidden&&e.objectIds.includes(d.objectId)&&cn(d,u);for(let d of n)!d.hidden&&e.orbitIds.includes(d.objectId)&&ln(d,u);for(let d of r)!d.hidden&&e.leaderIds.includes(d.objectId)&&(u(d.x1,d.y1),u(d.x2,d.y2));for(let d of i)!d.hidden&&e.labelIds.includes(d.objectId)&&un(d,u,o);return!Number.isFinite(a)||!Number.isFinite(l)?Me(0,0,0,0):Me(a,l,s,c)}function Wi(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=dn(n,t);if(!i)break;let o=t.get(i);if(!o)break;n=o}return n.id}function fn(e,t,n){return pn(t.x,t.labelY,t.secondaryY,t.textAnchor,t.direction,e.label,e.secondaryLabel,n)}function pn(e,t,n,r,i,o,a,l){let s=Ji(o,a,l),c=s*2,u=i==="above"?18:12,d=i==="above"?8:12,p=e-s,m=e+s;return r==="start"?(p=e,m=e+c):r==="end"&&(p=e-c,m=e),{left:p,right:m,top:Math.min(t,n)-u,bottom:Math.max(t,n)+d}}function Yi(e,t){return!(e.right<t.left||t.right<e.left||e.bottom<t.top||t.bottom<e.top)}function Gi(e,t,n){let r=n.get(e);return!r?.placement||r.placement.mode!=="orbit"?t.get(e):t.get(r.placement.target)}function Ge(e,t,n,r){let i=Hi(e.properties.radius,n,r);if(i!==null)return i;let o=n.bodyRadiusMultiplier;switch(e.type){case"star":return k((t===0?28:20)*o,n.minBodyRadius,n.maxBodyRadius);case"planet":return k(12*o,n.minBodyRadius,n.maxBodyRadius);case"moon":return k(7*o,n.minBodyRadius,n.maxBodyRadius);case"belt":return k(5*o,n.minBodyRadius,n.maxBodyRadius);case"asteroid":return k(5*o,n.minBodyRadius,n.maxBodyRadius);case"comet":return k(6*o,n.minBodyRadius,n.maxBodyRadius);case"ring":return k(5*o,n.minBodyRadius,n.maxBodyRadius);case"craft":return k(5*o,n.minBodyRadius,n.maxBodyRadius);case"structure":return k(6*o,n.minBodyRadius,n.maxBodyRadius);case"phenomenon":return k(8*o,n.minBodyRadius,n.maxBodyRadius)}}function qi(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"craft":return t+1.5;case"structure":return t+2;default:return Math.min(t+r,n.maxBodyRadius+10)}}function K(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/je;case"m":return e.value/1e3/je;case"ly":return e.value*Yr;case"pc":return e.value*Gr;case"kpc":return e.value*qr;case"re":return e.value*Nr/je;case"rj":return e.value*Ur/je;case"sol":return e.value*Wr/je;default:return e.value}}function Xi(e,t,n){let r=K(e??null);if(r===null||r<=0)return 0;if(n.pixelsPerMetric!==null){let i=r*n.pixelsPerMetric*t.freePlacementMultiplier;return t.bodyScaleMode==="strict"?Math.max(i,0):k(i,0,420)}return k(r*96*t.freePlacementMultiplier,0,420)}function Hi(e,t,n){let r=qe(e);if(!r)return null;let i=K(r);if(n.pixelsPerMetric!==null&&i!==null&&i>0){let a=i*n.pixelsPerMetric*t.bodyRadiusMultiplier;return t.bodyScaleMode==="strict"?Math.max(a,.1):k(Math.max(a,t.minBodyRadius),t.minBodyRadius,t.maxBodyRadius)}let o;switch(r.unit){case"sol":o=k(r.value*22,14,40);break;case"re":o=k(r.value*10,6,18);break;case"km":o=k(Math.log10(Math.max(r.value,1))*2.6,4,16);break;default:o=k(r.value*4,4,20);break}return k(o*t.bodyRadiusMultiplier,t.minBodyRadius,t.maxBodyRadius)}function Ki(e){return K(qe(e.properties.radius))}function qe(e){return!e||typeof e!="object"||!("value"in e)?null:e}function pt(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function Oe(e,t,n){return t<=1?n:n+e*Math.PI*2/t}function Jt(e,t,n,r,i,o,a){let l=mn(e,t,n,r,i,o,a,rn);return l.length===0?"":l.map((s,c)=>`${c===0?"M":"L"} ${tn(s.x)} ${tn(s.y)}`).join(" ")}function mn(e,t,n,r,i,o,a,l){let s=[];for(let c=0;c<=l;c+=1){let u=o+(a-o)*c/l;s.push(hn(e,t,n,r,i,u))}return s}function hn(e,t,n,r,i,o){let a=n*Math.cos(o),l=r*Math.sin(o),s=gn(a,l,i);return{x:e+s.x,y:t+s.y}}function gn(e,t,n){let r=gt(n);return{x:e*Math.cos(r)-t*Math.sin(r),y:e*Math.sin(r)+t*Math.cos(r)}}function Ae(e,t,n,r){let i=n==="isometric"?nn*r:r;return{x:Math.cos(e)*t,y:Math.sin(e)*t*i}}function Xe(e,t,n){return t*1e3+e+n*.01}function k(e,t,n){return Math.min(Math.max(e,t),n)}function Qt(e,t,n){let r=e.get(t);r?r.push(n):e.set(t,[n])}function fe(e){return`wo-${e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"object"}`}function Se(e){return`${fe(e)}-group`}function Zi(e){return typeof e=="string"&&e.trim()?e:void 0}function Ji(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 en(e){return e.length>0?e[0].toUpperCase()+e.slice(1):e}function gt(e){return e*Math.PI/180}function tn(e){return Number.isInteger(e)?String(e):e.toFixed(2)}var wn=86400,He=wn*365.25,Ke=18,yn=180;function Qe(e,t={}){let n={width:t.width,height:t.height,padding:t.padding,preset:t.preset,projection:t.projection,camera:t.camera,scaleModel:t.scaleModel,bodyScaleMode:t.bodyScaleMode,activeEventId:t.activeEventId},r=N(e,n),i=ro(r.layoutPreset,t.spatialScaleModel),o={x:r.contentBounds.centerX,y:r.contentBounds.centerY},a=new Map(r.objects.map(h=>[h.objectId,h])),l=new Map(r.orbitVisuals.map(h=>[h.objectId,h])),s=new Map;for(let h of r.objects){let I=h.object.placement;!I||I.mode!=="orbit"||s.set(h.objectId,bt(I))}let c=Math.min(...[...s.values()].filter(h=>Number.isFinite(h)&&h>0))||1,u=new Map,d=r.objects.map(h=>Qi(h,r,o,a,l,i,u,c)),p=new Map(d.map(h=>[h.objectId,h])),m=r.orbitVisuals.map(h=>eo(h,p,c,r.activeEventId!==null)),y=d.map(h=>({objectId:h.objectId,center:{...h.position},radius:h.visualRadius+i.focusPadding}));return{width:r.width,height:r.height,padding:r.padding,renderPreset:r.renderPreset,projection:r.projection,camera:r.camera,scaleModel:i,title:r.title,subtitle:r.subtitle,systemId:r.systemId,viewMode:"3d",layoutPreset:r.layoutPreset,metadata:{...r.metadata,"viewer.mode":"3d"},contentBounds:oo(d),semanticGroups:r.semanticGroups,viewpoints:r.viewpoints,activeEventId:r.activeEventId,timeFrozen:r.activeEventId!==null,objects:d,orbits:m,focusTargets:y}}function Qi(e,t,n,r,i,o,a,l){let s=Ze(e,t,n,r,i,a),c=wt(e.object,i.get(e.objectId),l,t.activeEventId!==null);return{objectId:e.objectId,object:e.object,parentId:e.parentId,ancestorIds:e.ancestorIds.slice(),childIds:e.childIds.slice(),groupId:e.groupId,semanticGroupIds:e.semanticGroupIds.slice(),position:s,radius:pe(e.radius*o.bodyRadiusMultiplier,o.minBodyRadius,o.maxBodyRadius),visualRadius:pe(e.visualRadius*o.bodyRadiusMultiplier,o.minBodyRadius,o.maxBodyRadius+24),label:e.label,secondaryLabel:e.secondaryLabel,fillColor:e.fillColor,imageHref:e.imageHref,hidden:e.hidden,motion:c}}function eo(e,t,n,r){let i=t.get(e.objectId),o=t.get(e.parentId);return{objectId:e.objectId,object:e.object,parentId:e.parentId,groupId:e.groupId,semanticGroupIds:e.semanticGroupIds.slice(),center:o?.position??{x:0,y:0,z:0},kind:e.kind,radius:e.radius,semiMajor:e.radius??e.rx??0,semiMinor:e.radius??e.ry??0,rotationDeg:e.rotationDeg,inclinationDeg:i?.motion?.inclinationDeg??Je(e.object.placement?.mode==="orbit"?e.object.placement.inclination:void 0)??0,band:e.band,bandThickness:e.bandThickness,hidden:e.hidden,motion:i?.motion??wt(e.object,e,n,r)}}function Ze(e,t,n,r,i,o){let a=o.get(e.objectId);if(a)return a;let l=e.object.placement,s;if(l?.mode==="orbit"&&e.parentId){let c=r.get(e.parentId),u=c?Ze(c,t,n,r,i,o):{x:0,y:0,z:0},d=i.get(e.objectId),p=wt(e.object,d,1,t.activeEventId!==null),m=p?to(p,0):{x:(e.x-n.x)*.8,y:0,z:(e.y-n.y)*.8};s=ao(u,m)}else if(l?.mode==="surface"&&e.parentId){let c=r.get(e.parentId),u=c?Ze(c,t,n,r,i,o):{x:0,y:0,z:0},d=c?.visualRadius??16,p=so(e.objectId),m=p*Math.PI*2;s={x:u.x+Math.cos(m)*(d+e.visualRadius*.9),y:u.y+Math.sin(p*Math.PI)*Math.max(e.visualRadius*.2,2),z:u.z+Math.sin(m)*(d+e.visualRadius*.9)}}else if(l?.mode==="at"&&e.parentId){let c=r.get(e.parentId),u=c?Ze(c,t,n,r,i,o):{x:0,y:0,z:0},d=e.anchorX??c?.x??n.x,p=e.anchorY??c?.y??n.y;s={x:u.x+(e.x-d),y:u.y,z:u.z+(e.y-p)}}else s={x:(e.x-n.x)*.8,y:0,z:(e.y-n.y)*.8};return o.set(e.objectId,s),s}function to(e,t){let n=e.phase0Deg+e.angularVelocityDegPerSecond*t,r=yt(n),i=yt(e.rotationDeg),o=yt(e.inclinationDeg),a=Math.cos(r)*e.semiMajor,l=Math.sin(r)*e.semiMinor,s=a*Math.cos(i)-l*Math.sin(i),c=a*Math.sin(i)+l*Math.cos(i);return{x:s,y:c*Math.sin(o),z:c*Math.cos(o)}}function wt(e,t,n,r){let i=e.placement;if(!i||i.mode!=="orbit")return null;let o=t?.radius??t?.rx??pe(bt(i)*48,24,1200),a=t?.radius??t?.ry??o,l=no(i.period),s=bt(i),c=pe(s/Math.max(n,1e-4),1,20),u=pe(l?Ke*c:Ke*Math.pow(c,.75),Ke,yn);return{phase0Deg:Je(i.phase)??0,rotationDeg:Je(i.angle)??t?.rotationDeg??0,inclinationDeg:Je(i.inclination)??0,semiMajor:o,semiMinor:a,eccentricity:i.eccentricity??0,periodSeconds:l,angularVelocityDegPerSecond:360/Math.max(u,.001),heuristic:l===null,frozen:r}}function bt(e){let t=bn(e.semiMajor)??bn(e.distance)??1;return Math.max(t,.01)}function bn(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/1495978707e-1;case"m":return e.value/149597870700;case"re":return e.value*6371/1495978707e-1;case"rj":return e.value*71492/1495978707e-1;case"sol":return e.value*695700/1495978707e-1;case"ly":return e.value*63241.077;case"pc":return e.value*206264.806;case"kpc":return e.value*206264806;default:return e.value}}function no(e){if(!e)return null;switch(e.unit){case"s":return e.value;case"min":return e.value*60;case"h":return e.value*3600;case"d":return e.value*wn;case"y":return e.value*He;case"ky":return e.value*He*1e3;case"my":return e.value*He*1e6;case"gy":return e.value*He*1e9;default:return null}}function Je(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function ro(e,t){return{...io(e),...t}}function io(e){switch(e){case"compact":return{orbitDistanceMultiplier:.92,bodyRadiusMultiplier:.92,markerSizeMultiplier:.92,ringThicknessMultiplier:.9,focusPadding:10,minBodyRadius:4,maxBodyRadius:34};case"presentation":return{orbitDistanceMultiplier:1.15,bodyRadiusMultiplier:1.12,markerSizeMultiplier:1.08,ringThicknessMultiplier:1.14,focusPadding:16,minBodyRadius:5,maxBodyRadius:44};default:return{orbitDistanceMultiplier:1,bodyRadiusMultiplier:1,markerSizeMultiplier:1,ringThicknessMultiplier:1,focusPadding:12,minBodyRadius:4,maxBodyRadius:40}}}function oo(e){if(e.length===0)return{minX:0,minY:0,minZ:0,maxX:0,maxY:0,maxZ:0,width:0,height:0,depth:0,center:{x:0,y:0,z:0}};let t=Number.POSITIVE_INFINITY,n=Number.POSITIVE_INFINITY,r=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY,o=Number.NEGATIVE_INFINITY,a=Number.NEGATIVE_INFINITY;for(let l of e)t=Math.min(t,l.position.x-l.visualRadius),n=Math.min(n,l.position.y-l.visualRadius),r=Math.min(r,l.position.z-l.visualRadius),i=Math.max(i,l.position.x+l.visualRadius),o=Math.max(o,l.position.y+l.visualRadius),a=Math.max(a,l.position.z+l.visualRadius);return{minX:t,minY:n,minZ:r,maxX:i,maxY:o,maxZ:a,width:i-t,height:o-n,depth:a-r,center:{x:(t+i)/2,y:(n+o)/2,z:(r+a)/2}}}function ao(e,t){return{x:e.x+t.x,y:e.y+t.y,z:e.z+t.z}}function so(e){let t=0;for(let n=0;n<e.length;n+=1)t=t*31+e.charCodeAt(n)>>>0;return t%1e4/1e4}function pe(e,t,n){return Math.min(Math.max(e,t),n)}function yt(e){return e*Math.PI/180}function vt(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:ho(e.system),info:go(e.system)}:null,r=e.objects.map(lo);return po(r,e.events??[],t.activeEventId??null),{format:"worldorbit",version:"1.0",schemaVersion:e.version,theme:e.theme??null,system:n,groups:structuredClone(e.groups??[]),relations:structuredClone(e.relations??[]),events:e.events.map(co),trajectories:e.trajectories.map(fo),objects:r}}function lo(e){return{...e,trajectoryId:e.trajectoryId??null,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:mo(e.properties),placement:e.placement?structuredClone(e.placement):null,info:{...e.info}}}function co(e){return{...e,trajectoryId:e.trajectoryId??null,participantObjectIds:[...e.participantObjectIds],tags:[...e.tags],positions:e.positions.map(uo)}}function uo(e){return{objectId:e.objectId,placement:vn(e.placement),trajectorySegmentId:e.trajectorySegmentId??null,trajectoryManeuverId:e.trajectoryManeuverId??null,inner:e.inner?{...e.inner}:void 0,outer:e.outer?{...e.outer}:void 0,epoch:e.epoch??null,referencePlane:e.referencePlane??null}}function fo(e){return structuredClone(e)}function vn(e){return e?structuredClone(e):null}function po(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])),o=new Set([...r.targetObjectId?[r.targetObjectId]:[],...r.participantObjectIds,...r.positions.map(a=>a.objectId)]);for(let a of o){let l=i.get(a);l&&(r.epoch&&(l.epoch=r.epoch),r.referencePlane&&(l.referencePlane=r.referencePlane))}for(let a of r.positions){let l=i.get(a.objectId);l&&(a.placement&&(l.placement=vn(a.placement)),a.inner&&(l.properties.inner={...a.inner}),a.outer&&(l.properties.outer={...a.outer}),a.epoch&&(l.epoch=a.epoch),a.referencePlane&&(l.referencePlane=a.referencePlane))}}function mo(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 ho(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 go(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=yo(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 yo(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(" ")}var In=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,vo=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),Io=/^[A-Za-z][A-Za-z0-9+.-]*:/;function G(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function me(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function F(e,t,n){let r=e.match(In);if(!r)throw f.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let o=E(n);if(o?.unitFamily&&!Re(o.unitFamily,i.unit))throw f.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function It(e){let t=e.match(In);return t?{value:Number(t[1]),unit:t[2]??null}:null}function et(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw f.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function q(e,t,n){let r=vo.get(e.toLowerCase());if(r===void 0)throw f.fromLocation(`Invalid boolean value "${e}" for "${t}"`,n);return r}function $n(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw f.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 f.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 $o(e,t){if(!e)throw f.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw f.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 f.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function jn(e,t,n){let r=E(e);if(!r)throw f.fromLocation(`Unknown field "${e}"`,n);if(r.arity==="single"&&t.length!==1)throw f.fromLocation(`Field "${e}" expects exactly one value`,n);switch(r.kind){case"list":return t;case"boolean":return q(Te(t,e,n),e,n);case"number":return et(Te(t,e,n),e,n);case"unit":return F(Te(t,e,n),n,e);case"string":{let i=t.join(" ").trim();return e==="image"&&$o(i,n),i}}}function $t(e,t,n){let r=E(e);if(!r)throw f.fromLocation(`Unknown field "${e}"`,n);if(!r.objectTypes.includes(t))throw f.fromLocation(`Field "${e}" is not valid on "${t}"`,n)}function Te(e,t,n){if(e.length!==1)throw f.fromLocation(`Field "${t}" expects exactly one value`,n);return e[0]}var Sn=new Set(["star","planet","moon","asteroid","comet"]),jo=332946.0487,xo=1047.3486,tt=1495978707e-1,So=6371,ko=695700,Mo=63241.077,Oo=206264.806,Ao=206264806;function nt(e,t){let n=[],r=new Map(e.objects.map(s=>[s.id,s])),i=new Set(e.groups.map(s=>s.id)),o=new Set(e.events.map(s=>s.id)),a=new Map(e.trajectories.map(s=>[s.id,s]));e.system||n.push(b("validate.system.required","Atlas documents must declare exactly one system."));let l=new Map;for(let[s,c]of[["group",e.groups.map(u=>u.id)],["viewpoint",e.system?.viewpoints.map(u=>u.id)??[]],["annotation",e.system?.annotations.map(u=>u.id)??[]],["relation",e.relations.map(u=>u.id)],["event",e.events.map(u=>u.id)],["trajectory",e.trajectories.map(u=>u.id)],["object",e.objects.map(u=>u.id)]])for(let u of c){let d=l.get(u);d?n.push(b("validate.id.duplicate",`Duplicate ${s} id "${u}" already used by ${d}.`)):l.set(u,s)}for(let s of e.relations)To(s,r,n);for(let s of e.system?.viewpoints??[])Lo(s,i,o,t,n,r);for(let s of e.objects)Po(s,e.system,r,i,a,n);for(let s of e.events)Do(s,e.system,r,a,n);for(let s of e.trajectories)Fo(s,r,n);return n}function To(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 Lo(e,t,n,r,i,o){let a=e.filter;if(r==="2.1"||r==="2.5"||r==="2.6"){if(a)for(let l of a.groupIds)t.has(l)||i.push(x("validate.viewpoint.group.unknown",`Unknown group "${l}" in viewpoint "${e.id}".`,void 0,`viewpoint.${e.id}.groups`));for(let l of e.events??[])n.has(l)||i.push(x("validate.viewpoint.event.unknown",`Unknown event "${l}" in viewpoint "${e.id}".`,void 0,`viewpoint.${e.id}.events`))}No(e.projection,i,`viewpoint.${e.id}.projection`,e.id),Uo(e.camera,e.projection,e.rotationDeg,i,e.id,e.focusObjectId,e.selectedObjectId,a,o)}function Po(e,t,n,r,i,o){let a=e.placement,l=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)||o.push(x("validate.group.unknown",`Unknown group "${c}" on "${e.id}".`,e.id,"groups"));if(typeof e.epoch=="string"&&!e.epoch.trim()&&o.push(x("validate.epoch.empty",`Object "${e.id}" defines an empty epoch string.`,e.id,"epoch")),typeof e.referencePlane=="string"&&!e.referencePlane.trim()&&o.push(x("validate.referencePlane.empty",`Object "${e.id}" defines an empty reference plane string.`,e.id,"referencePlane")),e.trajectoryId&&(i.has(e.trajectoryId)?kn(e)||o.push(b("validate.trajectory.object.invalidType",`Only craft or legacy ship-like structures may reference trajectories; found "${e.type}" on "${e.id}".`,e.id,"trajectory")):o.push(b("validate.trajectory.object.unknown",`Unknown trajectory "${e.trajectoryId}" on "${e.id}".`,e.id,"trajectory"))),l&&(n.has(l.target)||o.push(b("validate.orbit.target.unknown",`Unknown placement target "${l.target}" on "${e.id}".`,e.id,"orbit")),l.distance&&l.semiMajor&&o.push(b("validate.orbit.distanceConflict",`Object "${e.id}" cannot declare both "distance" and "semiMajor".`,e.id,"distance")),l.phase&&!e.epoch&&!t?.epoch&&o.push(x("validate.phase.epochMissing",`Object "${e.id}" sets "phase" without an object or system epoch.`,e.id,"phase")),l.inclination&&!e.referencePlane&&!t?.referencePlane&&o.push(x("validate.inclination.referencePlaneMissing",`Object "${e.id}" sets "inclination" without an object or system reference plane.`,e.id,"inclination")),l.period&&!xt(s?.properties.mass)&&o.push(x("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?Sn.has(c.type)||o.push(b("validate.surface.target.invalid",`Surface target "${a.target}" on "${e.id}" is not surface-capable.`,e.id,"surface")):o.push(b("validate.surface.target.unknown",`Unknown placement target "${a.target}" on "${e.id}".`,e.id,"surface"))}if(a?.mode==="at"&&(e.type!=="craft"&&e.type!=="structure"&&e.type!=="phenomenon"&&o.push(b("validate.at.objectType",`Only craft, structures, and phenomena may use "at" placement; found "${e.type}" on "${e.id}".`,e.id,"at")),Bo(e,n,o)||o.push(b("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)&&o.push(x("validate.resonance.orbitMismatch",`Resonance target "${e.resonance.targetObjectId}" on "${e.id}" does not share a compatible orbital parent.`,e.id,"resonance")):o.push(b("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"){o.push(x("validate.derive.unsupported",`Unsupported derive rule "${c.field} ${c.strategy}" on "${e.id}".`,e.id,"derive"));continue}let u=xn(e,s);if(u===null){o.push(x("validate.derive.inputsMissing",`Object "${e.id}" requests "derive period kepler" but lacks enough input data.`,e.id,"derive"));continue}l?.period||o.push(jt("validate.derive.period.available",`Object "${e.id}" can derive a Kepler period of ${qo(u)}.`,e.id,"derive"))}for(let c of e.validationRules??[]){if(c.rule!=="kepler"){o.push(x("validate.rule.unsupported",`Unsupported validation rule "${c.rule}" on "${e.id}".`,e.id,"validate"));continue}let u=Mn(l?.period),d=xn(e,s);if(u===null||d===null)continue;let p=Go(e,"period");Math.abs(u-d)>p&&o.push(b("validate.kepler.mismatch",`Object "${e.id}" fails Kepler validation for "period".`,e.id,"validate"))}}function Do(e,t,n,r,i){let o=`event.${e.id}`,a=new Set;e.kind.trim()||i.push(b("validate.event.kind.required",`Event "${e.id}" is missing a "kind" value.`,void 0,`${o}.kind`)),typeof e.epoch=="string"&&!e.epoch.trim()&&i.push(x("validate.event.epoch.empty",`Event "${e.id}" defines an empty epoch string.`,void 0,`${o}.epoch`)),typeof e.referencePlane=="string"&&!e.referencePlane.trim()&&i.push(x("validate.event.referencePlane.empty",`Event "${e.id}" defines an empty reference plane string.`,void 0,`${o}.referencePlane`)),e.trajectoryId&&!r.has(e.trajectoryId)&&i.push(b("validate.event.trajectory.unknown",`Unknown trajectory "${e.trajectoryId}" on event "${e.id}".`,void 0,`${o}.trajectory`)),!e.targetObjectId&&e.participantObjectIds.length===0&&i.push(b("validate.event.references.required",`Event "${e.id}" must define a "target" or at least one participant.`,void 0,`${o}.participants`)),e.targetObjectId&&(a.add(e.targetObjectId),n.has(e.targetObjectId)||i.push(b("validate.event.target.unknown",`Unknown event target "${e.targetObjectId}" on "${e.id}".`,void 0,`${o}.target`)));let l=new Set;for(let u of e.participantObjectIds){if(a.add(u),l.has(u)){i.push(x("validate.event.participants.duplicate",`Event "${e.id}" repeats participant "${u}".`,void 0,`${o}.participants`));continue}l.add(u),n.has(u)||i.push(b("validate.event.participants.unknown",`Unknown event participant "${u}" on "${e.id}".`,void 0,`${o}.participants`))}e.targetObjectId&&e.participantObjectIds.length>0&&!e.participantObjectIds.includes(e.targetObjectId)&&i.push(x("validate.event.target.notParticipant",`Event "${e.id}" defines a target outside its participants list.`,void 0,`${o}.target`)),e.positions.length===0&&i.push(x("validate.event.positions.missing",`Event "${e.id}" has no positions block and cannot drive a scene snapshot.`,void 0,`${o}.positions`)),/(?:^|[-_])(solar-eclipse|lunar-eclipse|transit|occultation)(?:$|[-_])/.test(e.kind)&&a.size<3&&i.push(x("validate.event.kind.participants",`Event "${e.id}" looks like an eclipse or transit but references fewer than three bodies.`,void 0,`${o}.participants`));let s=new Set;for(let u of e.positions){let d=`${o}.pose.${u.objectId}`;if(s.has(u.objectId)){i.push(b("validate.event.pose.duplicate",`Event "${e.id}" defines "${u.objectId}" more than once in positions.`,void 0,d));continue}s.add(u.objectId);let p=n.get(u.objectId);if(!p){i.push(b("validate.event.pose.object.unknown",`Unknown event pose object "${u.objectId}" on "${e.id}".`,void 0,d));continue}a.has(u.objectId)||i.push(x("validate.event.pose.unreferenced",`Event pose "${u.objectId}" on "${e.id}" is not listed in target/participants.`,void 0,d)),Eo(u,p,e,t,n,r,i,d,e.id)}let c=[...a].filter(u=>!s.has(u));e.positions.length>0&&c.length>0&&i.push(x("validate.event.positions.partial",`Event "${e.id}" leaves ${c.length} referenced object(s) on their base placement.`,void 0,`${o}.positions`))}function Eo(e,t,n,r,i,o,a,l,s){let c=e.placement;if(!c){a.push(b("validate.event.pose.placement.required",`Event "${s}" pose "${e.objectId}" is missing a placement mode.`,void 0,l));return}if(e.trajectorySegmentId&&!Ro(o,e.trajectorySegmentId)&&a.push(b("validate.event.pose.segment.unknown",`Unknown trajectory segment "${e.trajectorySegmentId}" on "${s}:${e.objectId}".`,void 0,`${l}.segment`)),e.trajectoryManeuverId&&!zo(o,e.trajectoryManeuverId)&&a.push(b("validate.event.pose.maneuver.unknown",`Unknown trajectory maneuver "${e.trajectoryManeuverId}" on "${s}:${e.objectId}".`,void 0,`${l}.maneuver`)),c.mode==="orbit"){i.has(c.target)||a.push(b("validate.event.pose.orbit.target.unknown",`Unknown event orbit target "${c.target}" on "${s}:${e.objectId}".`,void 0,`${l}.orbit`)),c.distance&&c.semiMajor&&a.push(b("validate.event.pose.orbit.distanceConflict",`Event "${s}" pose "${e.objectId}" cannot declare both "distance" and "semiMajor".`,void 0,`${l}.distance`)),c.phase&&!Wo(r,t,n,e)&&a.push(x("validate.event.pose.phase.epochMissing",`Event "${s}" pose "${e.objectId}" sets "phase" without an effective epoch.`,void 0,`${l}.phase`)),c.inclination&&!Yo(r,t,n,e)&&a.push(x("validate.event.pose.inclination.referencePlaneMissing",`Event "${s}" pose "${e.objectId}" sets "inclination" without an effective reference plane.`,void 0,`${l}.inclination`)),c.period&&!xt(i.get(c.target)?.properties.mass)&&a.push(x("validate.event.pose.period.massMissing",`Event "${s}" pose "${e.objectId}" sets "period" but its central mass cannot be derived.`,void 0,`${l}.period`));return}if(c.mode==="surface"){let u=i.get(c.target);u?Sn.has(u.type)||a.push(b("validate.event.pose.surface.target.invalid",`Event surface target "${c.target}" on "${s}:${e.objectId}" is not surface-capable.`,void 0,`${l}.surface`)):a.push(b("validate.event.pose.surface.target.unknown",`Unknown event surface target "${c.target}" on "${s}:${e.objectId}".`,void 0,`${l}.surface`));return}if(c.mode==="at"){t.type!=="craft"&&t.type!=="structure"&&t.type!=="phenomenon"&&a.push(b("validate.event.pose.at.objectType",`Only craft, structures, and phenomena may use "at" placement in events; found "${t.type}" on "${s}:${e.objectId}".`,void 0,`${l}.at`));let u=c.reference;u.kind==="named"&&!i.has(u.name)?a.push(b("validate.event.pose.at.target.unknown",`Unknown event at-reference target "${c.target}" on "${s}:${e.objectId}".`,void 0,`${l}.at`)):u.kind==="anchor"&&!i.has(u.objectId)?a.push(b("validate.event.pose.anchor.target.unknown",`Unknown event anchor target "${u.objectId}" on "${s}:${e.objectId}".`,void 0,`${l}.at`)):u.kind==="lagrange"&&(i.has(u.primary)?u.secondary&&!i.has(u.secondary)&&a.push(b("validate.event.pose.lagrange.secondary.unknown",`Unknown event Lagrange target "${u.secondary}" on "${s}:${e.objectId}".`,void 0,`${l}.at`)):a.push(b("validate.event.pose.lagrange.primary.unknown",`Unknown event Lagrange target "${u.primary}" on "${s}:${e.objectId}".`,void 0,`${l}.at`)))}}function Fo(e,t,n){if(e.craftObjectId){let r=t.get(e.craftObjectId);r?kn(r)||n.push(b("validate.trajectory.craft.invalidType",`Trajectory "${e.id}" targets "${e.craftObjectId}", which is not craft-like.`,void 0,`trajectory.${e.id}.craft`)):n.push(b("validate.trajectory.craft.unknown",`Unknown craft "${e.craftObjectId}" on trajectory "${e.id}".`,void 0,`trajectory.${e.id}.craft`))}for(let r of e.segments)Co(e.id,r,t,n)}function Co(e,t,n,r){let i=`trajectory.${e}.segment.${t.id}`;for(let[o,a]of[["from",t.fromObjectId],["to",t.toObjectId],["around",t.aroundObjectId]])a&&!n.has(a)&&r.push(b(`validate.trajectory.segment.${o}.unknown`,`Unknown ${o} object "${a}" on trajectory "${e}" segment "${t.id}".`,void 0,`${i}.${o}`));t.assist?.objectId&&!n.has(t.assist.objectId)&&r.push(b("validate.trajectory.segment.assist.unknown",`Unknown assist object "${t.assist.objectId}" on trajectory "${e}" segment "${t.id}".`,void 0,`${i}.assist`)),t.kind==="flyby"&&!t.assist?.objectId&&r.push(b("validate.trajectory.segment.assist.required",`Trajectory "${e}" segment "${t.id}" is a flyby and requires an "assist" object.`,void 0,`${i}.assist`)),(t.kind==="capture"||t.kind==="departure")&&!t.toObjectId&&!t.aroundObjectId&&r.push(b("validate.trajectory.segment.target.required",`Trajectory "${e}" segment "${t.id}" requires a target reference.`,void 0,`${i}.to`));for(let o of t.maneuvers)Vo(e,t.id,o,r)}function Vo(e,t,n,r){n.kind.trim()||r.push(b("validate.trajectory.maneuver.kind.required",`Trajectory "${e}" segment "${t}" maneuver "${n.id}" is missing a kind.`,void 0,`trajectory.${e}.segment.${t}.maneuver.${n.id}.kind`))}function kn(e){if(e.type==="craft")return!0;if(e.type!=="structure")return!1;let t=typeof e.properties.kind=="string"?e.properties.kind.toLowerCase():"";return t==="ship"||t==="probe"||t==="station"}function Ro(e,t){for(let n of e.values()){let r=n.segments.find(i=>i.id===t);if(r)return r}return null}function zo(e,t){for(let n of e.values())for(let r of n.segments){let i=r.maneuvers.find(o=>o.id===t);if(i)return i}return null}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(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 xn(e,t){let n=e.placement;if(!n||n.mode!=="orbit")return null;let r=_o(n.semiMajor??n.distance),i=xt(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/tt;case"m":return e.value/(tt*1e3);case"ly":return e.value*Mo;case"pc":return e.value*Oo;case"kpc":return e.value*Ao;case"re":return e.value*So/tt;case"sol":return e.value*ko/tt;default:return null}}function xt(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/xo;default:return null}}function Mn(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 No(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 Uo(e,t,n,r,i,o,a,l,s){if(!e)return;let c=`viewpoint.${i}.camera`;for(let[d,p]of[["azimuth",e.azimuth],["elevation",e.elevation],["roll",e.roll],["distance",e.distance]])p!==null&&(!Number.isFinite(p)||d==="distance"&&p<=0)&&r.push(b("validate.viewpoint.camera.invalid",`Invalid camera ${d} "${String(p)}" in viewpoint "${i}".`,void 0,`${c}.${d}`));e.distance!==null&&t!=="perspective"&&r.push(x("validate.viewpoint.camera.distance.partialEffect",`Camera "distance" only has a semantic effect in perspective viewpoints; "${i}" uses "${t}".`,void 0,`${c}.distance`)),t==="topdown"&&(e.elevation!==null||e.roll!==null)&&r.push(x("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,c)),t==="isometric"&&e.elevation!==null&&r.push(jt("validate.viewpoint.camera.isometricStored",`Camera elevation on isometric viewpoint "${i}" is preserved semantically for future 3D rendering.`,void 0,`${c}.elevation`)),e.azimuth!==null&&e.azimuth!==0&&n!==0&&r.push(x("validate.viewpoint.rotation.cameraOverlap",`Viewpoint "${i}" uses camera.azimuth; keep "rotation" only for 2D screen rotation to avoid ambiguity.`,void 0,`${c}.azimuth`)),o!==null&&s.has(o)||a!==null&&s.has(a)||l||r.push(jt("validate.viewpoint.camera.anchorMissing",`Viewpoint "${i}" stores camera settings without a focus object, selection, or filter anchor.`,void 0,c))}function Wo(e,t,n,r){return Z(r?.epoch)??Z(n?.epoch)??Z(t.epoch)??Z(e?.epoch)??null}function Yo(e,t,n,r){return Z(r?.referencePlane)??Z(n?.referencePlane)??Z(t.referencePlane)??Z(e?.referencePlane)??null}function Z(e){return typeof e=="string"&&e.trim()?e.trim():null}function Go(e,t){let n=e.tolerances?.find(r=>r.field===t)?.value;return typeof n=="number"?n:n&&typeof n=="object"&&"value"in n?Mn(n)??0:0}function qo(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 x(e,t,n,r){return{code:e,severity:"warning",source:"validate",message:t,objectId:n,field:r}}function jt(e,t,n,r){return{code:e,severity:"info",source:"validate",message:t,objectId:n,field:r}}var Xo=new Set(["climate","habitability","settlement"]),Ho=new Set(["departure","transfer","flyby","capture","stationkeeping","escape"]),rt=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","trajectory"]){let t=E(e);t&&rt.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},{key:"trajectory",inlineMode:"single",allowRepeat:!1}])rt.set(e.key,{key:e.key,version:e.key==="trajectory"?"3.0":"2.1",inlineMode:e.inlineMode,allowRepeat:e.allowRepeat});var Ko=new Set(rt.keys()),An=new Set(["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","inner","outer","epoch","referencePlane","segment","maneuver"]);function St(e){return Zo(e)}function Zo(e,t){let n=_a(e),r=n.source.split(/\r?\n/),i=[],o=!1,a="2.0",l=null,s=null,c=[],u=[],d=[],p=[],m=[],y=new Map,h=!1,I=!1,M=new Set,g=new Set,w=new Set,S=new Set,U=new Set,D=new Set;for(let O=0;O<r.length;O++){let re=r[O],W=O+1;if(!re.trim())continue;let P=ze(re),Y=we(re.slice(P),{line:W,columnOffset:P});if(Y.length!==0){if(!o){a=Jo(Y,W),o=!0,n.comments.length>0&&Pe(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(P===0){s=Qo(Y,W,a,i,l,c,u,d,p,m,y,M,g,w,S,U,D,{sawDefaults:h,sawAtlas:I}),s.kind==="system"?l=s.system:s.kind==="defaults"?h=!0:s.kind==="atlas"&&(I=!0);continue}if(!s)throw new f("Indented line without parent atlas section",W,P+1);la(s,P,Y,W)}}if(!o)throw new f('Missing required atlas schema header "schema 2.0" or "schema 3.0"');let ee=c.map(O=>Ta(O,a,i)),te=p.map(O=>La(O,y.get(O.id)??[])),ce=t??(a==="2.0-draft"?"2.0":a),ye={format:"worldorbit",sourceVersion:"1.0",theme:null,system:l,groups:u,relations:d,events:te,trajectories:m,objects:ee,diagnostics:i};if(ce==="2.0-draft"){let O={...ye,version:"2.0-draft",schemaVersion:"2.0-draft"};return O.diagnostics.push(...nt(O,a)),O}let ne={...ye,version:ce,schemaVersion:ce};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(...nt(ne,a)),ne}function Jo(e,t){if(e.length!==2||e[0].value.toLowerCase()!=="schema"||!["2.0-draft","2.0","2.1","2.5","2.6","3.0"].includes(e[1].value.toLowerCase()))throw new f('Expected atlas header "schema 2.0", "schema 2.1", "schema 2.5", "schema 2.6", "schema 3.0", or legacy "schema 2.0-draft"',t,e[0]?.column??1);let n=e[1].value.toLowerCase();return n==="2.6"?"2.6":n==="3.0"?"3.0":n==="2.5"?"2.5":n==="2.1"?"2.1":n==="2.0-draft"?"2.0-draft":"2.0"}function Qo(e,t,n,r,i,o,a,l,s,c,u,d,p,m,y,h,I,M){switch(e[0]?.value.toLowerCase()){case"system":if(i)throw new f('Atlas section "system" may only appear once',t,e[0].column);return ea(e,t,n,r);case"defaults":if(!i)throw new f('Atlas section "defaults" requires a preceding system declaration',t,e[0].column);if(M.sawDefaults)throw new f('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 f('Atlas section "atlas" requires a preceding system declaration',t,e[0].column);if(M.sawAtlas)throw new f('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 f('Atlas section "viewpoint" requires a preceding system declaration',t,e[0].column);return ta(e,t,i,d,n,r);case"annotation":if(!i)throw new f('Atlas section "annotation" requires a preceding system declaration',t,e[0].column);return na(e,t,i,p);case"group":return z(n,r,"group",{line:t,column:e[0].column}),ra(e,t,a,m);case"relation":return z(n,r,"relation",{line:t,column:e[0].column}),ia(e,t,l,y);case"event":return z(n,r,"event",{line:t,column:e[0].column}),oa(e,t,s,u,h,n,r);case"trajectory":return he(n,r,"trajectory",{line:t,column:e[0].column}),aa(e,t,c,I,n,r);case"object":return sa(e,t,n,r,o);default:throw new f(`Unknown atlas section "${e[0]?.value??""}"`,t,e[0]?.column??1)}}function ea(e,t,n,r){if(e.length!==2)throw new f("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 ta(e,t,n,r,i,o){if(e.length!==2)throw new f("Invalid viewpoint declaration",t,e[0]?.column??1);let a=G(e[1].value);if(!a)throw new f("Viewpoint id must not be empty",t,e[1].column);if(r.has(a))throw new f(`Duplicate viewpoint id "${a}"`,t,e[1].column);let l={id:a,label:me(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(l),r.add(a),{kind:"viewpoint",viewpoint:l,sourceSchemaVersion:i,diagnostics:o,seenFields:new Set,inFilter:!1,filterIndent:null,seenFilterFields:new Set,inCamera:!1,cameraIndent:null,seenCameraFields:new Set}}function na(e,t,n,r){if(e.length!==2)throw new f("Invalid annotation declaration",t,e[0]?.column??1);let i=G(e[1].value);if(!i)throw new f("Annotation id must not be empty",t,e[1].column);if(r.has(i))throw new f(`Duplicate annotation id "${i}"`,t,e[1].column);let o={id:i,label:me(i),targetObjectId:null,body:"",tags:[],sourceObjectId:null};return n.annotations.push(o),r.add(i),{kind:"annotation",annotation:o,seenFields:new Set}}function ra(e,t,n,r){if(e.length!==2)throw new f("Invalid group declaration",t,e[0]?.column??1);let i=G(e[1].value);if(!i)throw new f("Group id must not be empty",t,e[1].column);if(r.has(i))throw new f(`Duplicate group id "${i}"`,t,e[1].column);let o={id:i,label:me(i),summary:"",color:null,tags:[],hidden:!1};return n.push(o),r.add(i),{kind:"group",group:o,seenFields:new Set}}function ia(e,t,n,r){if(e.length!==2)throw new f("Invalid relation declaration",t,e[0]?.column??1);let i=G(e[1].value);if(!i)throw new f("Relation id must not be empty",t,e[1].column);if(r.has(i))throw new f(`Duplicate relation id "${i}"`,t,e[1].column);let o={id:i,from:"",to:"",kind:"",label:null,summary:null,tags:[],color:null,hidden:!1};return n.push(o),r.add(i),{kind:"relation",relation:o,seenFields:new Set}}function oa(e,t,n,r,i,o,a){if(e.length!==2)throw new f("Invalid event declaration",t,e[0]?.column??1);let l=G(e[1].value);if(!l)throw new f("Event id must not be empty",t,e[1].column);if(i.has(l))throw new f(`Duplicate event id "${l}"`,t,e[1].column);let s={id:l,kind:"",label:me(l),summary:null,targetObjectId:null,participantObjectIds:[],timing:null,visibility:null,epoch:null,referencePlane:null,tags:[],color:null,hidden:!1,positions:[]},c=[];return n.push(s),r.set(l,c),i.add(l),{kind:"event",event:s,sourceSchemaVersion:o,diagnostics:a,seenFields:new Set,rawPoses:c,inPositions:!1,positionsIndent:null,activePose:null,poseIndent:null,activePoseSeenFields:new Set}}function aa(e,t,n,r,i,o){if(e.length!==2)throw new f("Invalid trajectory declaration",t,e[0]?.column??1);let a=G(e[1].value);if(!a)throw new f("Trajectory id must not be empty",t,e[1].column);if(r.has(a))throw new f(`Duplicate trajectory id "${a}"`,t,e[1].column);let l={id:a,label:me(a),summary:null,craftObjectId:null,tags:[],color:null,hidden:!1,segments:[]};return n.push(l),r.add(a),{kind:"trajectory",trajectory:l,sourceSchemaVersion:i,diagnostics:o,seenFields:new Set,inSegment:!1,segmentIndent:null,activeSegment:null,activeSegmentSeenFields:new Set,inManeuver:!1,maneuverIndent:null,activeManeuver:null,activeManeuverSeenFields:new Set}}function sa(e,t,n,r,i){if(e.length<3)throw new f("Invalid atlas object declaration",t,e[0]?.column??1);let o=e[1],a=e[2],l=o.value;if(!Ve.has(l)||l==="system")throw new f(`Unknown object type "${o.value}"`,t,o.column);let s={objectType:l,id:a.value,fields:Oa(e.slice(3),t,l,n,r),infoEntries:[],typedBlockEntries:{},location:{line:t,column:o.column}};return i.push(s),{kind:"object",objectNode:s,sourceSchemaVersion:n,diagnostics:r,activeBlock:null,blockIndent:null,seenInfoKeys:new Set,seenTypedBlockKeys:{}}}function la(e,t,n,r){switch(e.kind){case"system":ca(e,n,r);return;case"defaults":ua(e,n,r);return;case"atlas":da(e,t,n,r);return;case"viewpoint":fa(e,t,n,r);return;case"annotation":ha(e,n,r);return;case"group":ga(e,n,r);return;case"relation":ya(e,n,r);return;case"event":ba(e,t,n,r);return;case"trajectory":wa(e,t,n,r);return;case"object":ja(e,t,n,r);return}}function ca(e,t,n){let r=B(t,e.seenFields,n),i=j(t,n);switch(r){case"title":e.system.title=i;return;case"description":z(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.description=i;return;case"epoch":z(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.epoch=i;return;case"referenceplane":z(e.sourceSchemaVersion,e.diagnostics,"referencePlane",{line:n,column:t[0].column}),e.system.referencePlane=i;return;default:throw new f(`Unknown system atlas field "${t[0].value}"`,n,t[0].column)}}function ua(e,t,n){let r=B(t,e.seenFields,n),i=j(t,n);switch(r){case"view":Ln(i)&&se(e.sourceSchemaVersion,e.diagnostics,"defaults.view",{line:n,column:t[0].column}),e.system.defaults.view=Tn(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=Pn(i,n,t[0].column);return;case"theme":e.system.defaults.theme=i;return;default:throw new f(`Unknown defaults field "${t[0].value}"`,n,t[0].column)}}function da(e,t,n,r){if(e.inMetadata&&t<=(e.metadataIndent??0)&&(e.inMetadata=!1,e.metadataIndent=null),e.inMetadata){let i=Dn(n,r,"Invalid atlas metadata entry");if(i.key in e.system.atlasMetadata)throw new f(`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 f(`Unknown atlas field "${n[0].value}"`,r,n[0].column)}function fa(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){pa(e,n,r);return}if(e.inFilter){ma(e,n,r);return}if(n.length===1&&n[0].value.toLowerCase()==="camera"){if(se(e.sourceSchemaVersion,e.diagnostics,"viewpoint.camera",{line:r,column:n[0].column}),e.seenFields.has("camera"))throw new f('Duplicate viewpoint field "camera"',r,n[0].column);e.seenFields.add("camera"),e.inCamera=!0,e.cameraIndent=t,e.viewpoint.camera=e.viewpoint.camera??Mt();return}if(n.length===1&&n[0].value.toLowerCase()==="filter"){if(e.seenFields.has("filter"))throw new f('Duplicate viewpoint field "filter"',r,n[0].column);e.seenFields.add("filter"),e.inFilter=!0,e.filterIndent=t;return}let i=B(n,e.seenFields,r),o=j(n,r);switch(i){case"label":e.viewpoint.label=o;return;case"summary":e.viewpoint.summary=o;return;case"focus":e.viewpoint.focusObjectId=o;return;case"select":e.viewpoint.selectedObjectId=o;return;case"projection":Ln(o)&&se(e.sourceSchemaVersion,e.diagnostics,"projection",{line:r,column:n[0].column}),e.viewpoint.projection=Tn(o,r,n[0].column);return;case"preset":e.viewpoint.preset=Pn(o,r,n[0].column);return;case"zoom":e.viewpoint.zoom=kt(o,r,n[0].column,"zoom");return;case"rotation":e.viewpoint.rotationDeg=Q(o,r,n[0].column,"rotation");return;case"camera":se(e.sourceSchemaVersion,e.diagnostics,"viewpoint.camera",{line:r,column:n[0].column}),e.viewpoint.camera=Ma(n.slice(1),r,e.viewpoint.camera);return;case"layers":e.viewpoint.layers=Sa(n.slice(1),r,e.sourceSchemaVersion,e.diagnostics);return;case"events":z(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 f(`Unknown viewpoint field "${n[0].value}"`,r,n[0].column)}}function pa(e,t,n){let r=B(t,e.seenCameraFields,n),i=j(t,n),o=e.viewpoint.camera??Mt();switch(r){case"azimuth":o.azimuth=Q(i,n,t[0].column,"camera.azimuth");break;case"elevation":o.elevation=Q(i,n,t[0].column,"camera.elevation");break;case"roll":o.roll=Q(i,n,t[0].column,"camera.roll");break;case"distance":o.distance=kt(i,n,t[0].column,"camera.distance");break;default:throw new f(`Unknown viewpoint camera field "${t[0].value}"`,n,t[0].column)}e.viewpoint.camera=o}function ma(e,t,n){let r=B(t,e.seenFilterFields,n),i=e.viewpoint.filter??ka();switch(r){case"query":i.query=j(t,n);break;case"objecttypes":i.objectTypes=xa(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 f(`Unknown viewpoint filter field "${t[0].value}"`,n,t[0].column)}e.viewpoint.filter=i}function ha(e,t,n){switch(B(t,e.seenFields,n)){case"label":e.annotation.label=j(t,n);return;case"target":e.annotation.targetObjectId=j(t,n);return;case"body":e.annotation.body=j(t,n);return;case"tags":e.annotation.tags=C(t.slice(1),n,"tags");return;default:throw new f(`Unknown annotation field "${t[0].value}"`,n,t[0].column)}}function ga(e,t,n){switch(B(t,e.seenFields,n)){case"label":e.group.label=j(t,n);return;case"summary":e.group.summary=j(t,n);return;case"color":e.group.color=j(t,n);return;case"tags":e.group.tags=C(t.slice(1),n,"tags");return;case"hidden":e.group.hidden=q(j(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new f(`Unknown group field "${t[0].value}"`,n,t[0].column)}}function ya(e,t,n){switch(B(t,e.seenFields,n)){case"from":e.relation.from=j(t,n);return;case"to":e.relation.to=j(t,n);return;case"kind":e.relation.kind=j(t,n);return;case"label":e.relation.label=j(t,n);return;case"summary":e.relation.summary=j(t,n);return;case"tags":e.relation.tags=C(t.slice(1),n,"tags");return;case"color":e.relation.color=j(t,n);return;case"hidden":e.relation.hidden=q(j(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new f(`Unknown relation field "${t[0].value}"`,n,t[0].column)}}function ba(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")&&se(e.sourceSchemaVersion,e.diagnostics,`pose.${n[0].value}`,{line:r,column:n[0]?.column??1}),(n[0]?.value==="segment"||n[0]?.value==="maneuver")&&he(e.sourceSchemaVersion,e.diagnostics,`pose.${n[0].value}`,{line:r,column:n[0]?.column??1}),e.activePose.fields.push($a(n,r,e.activePoseSeenFields));return}if(e.inPositions){if(n.length!==2||n[0].value.toLowerCase()!=="pose")throw new f(`Unknown event positions field "${n[0].value}"`,r,n[0]?.column??1);let o=n[1].value;if(!o.trim())throw new f("Event pose object id must not be empty",r,n[1].column);let a={objectId:o,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 f('Duplicate event field "positions"',r,n[0].column);e.seenFields.add("positions"),e.inPositions=!0,e.positionsIndent=t;return}switch(B(n,e.seenFields,r)){case"kind":e.event.kind=j(n,r);return;case"label":e.event.label=j(n,r);return;case"summary":e.event.summary=j(n,r);return;case"trajectory":he(e.sourceSchemaVersion,e.diagnostics,"event.trajectory",{line:r,column:n[0].column}),e.event.trajectoryId=j(n,r);return;case"target":e.event.targetObjectId=j(n,r);return;case"participants":e.event.participantObjectIds=C(n.slice(1),r,"participants");return;case"timing":e.event.timing=j(n,r);return;case"visibility":e.event.visibility=j(n,r);return;case"epoch":se(e.sourceSchemaVersion,e.diagnostics,"event.epoch",{line:r,column:n[0].column}),e.event.epoch=j(n,r);return;case"referenceplane":se(e.sourceSchemaVersion,e.diagnostics,"event.referencePlane",{line:r,column:n[0].column}),e.event.referencePlane=j(n,r);return;case"tags":e.event.tags=C(n.slice(1),r,"tags");return;case"color":e.event.color=j(n,r);return;case"hidden":e.event.hidden=q(j(n,r),"hidden",{line:r,column:n[0].column});return;default:throw new f(`Unknown event field "${n[0].value}"`,r,n[0].column)}}function wa(e,t,n,r){if(e.activeManeuver&&t<=(e.maneuverIndent??0)&&(e.activeManeuver=null,e.maneuverIndent=null,e.activeManeuverSeenFields.clear(),e.inManeuver=!1),e.activeSegment&&t<=(e.segmentIndent??0)&&(e.activeSegment=null,e.segmentIndent=null,e.activeSegmentSeenFields.clear(),e.inSegment=!1),e.activeManeuver){Ia(e,n,r);return}if(e.activeSegment){if(n[0]?.value.toLowerCase()==="maneuver"){if(n.length!==2)throw new f("Invalid trajectory maneuver declaration",r,n[0]?.column??1);let a=G(n[1].value);if(!a)throw new f("Trajectory maneuver id must not be empty",r,n[1].column);if(e.activeSegment.maneuvers.some(s=>s.id===a))throw new f(`Duplicate trajectory maneuver id "${a}"`,r,n[1].column);let l={id:a,kind:"burn",label:null,epoch:null,notes:[]};e.activeSegment.maneuvers.push(l),e.activeManeuver=l,e.inManeuver=!0,e.maneuverIndent=t,e.activeManeuverSeenFields=new Set;return}va(e,n,r);return}if(n[0]?.value.toLowerCase()==="segment"){if(n.length!==2)throw new f("Invalid trajectory segment declaration",r,n[0]?.column??1);let a=G(n[1].value);if(!a)throw new f("Trajectory segment id must not be empty",r,n[1].column);if(e.trajectory.segments.some(s=>s.id===a))throw new f(`Duplicate trajectory segment id "${a}"`,r,n[1].column);let l={id:a,kind:"transfer",label:null,summary:null,fromObjectId:null,toObjectId:null,aroundObjectId:null,assist:null,epoch:null,notes:[],maneuvers:[]};e.trajectory.segments.push(l),e.activeSegment={id:a,fields:[],maneuvers:l.maneuvers,assist:null,location:{line:r,column:n[0].column}},e.inSegment=!0,e.segmentIndent=t,e.activeSegmentSeenFields=new Set;return}let i=B(n,e.seenFields,r),o=j(n,r);switch(i){case"label":e.trajectory.label=o;return;case"summary":e.trajectory.summary=o;return;case"craft":e.trajectory.craftObjectId=o;return;case"tags":e.trajectory.tags=C(n.slice(1),r,"tags");return;case"color":e.trajectory.color=o;return;case"hidden":e.trajectory.hidden=q(o,"hidden",{line:r,column:n[0].column});return;default:throw new f(`Unknown trajectory field "${n[0].value}"`,r,n[0].column)}}function va(e,t,n){let r=e.activeSegment;if(!r)return;let i=B(t,e.activeSegmentSeenFields,n),o=j(t,n),a=e.trajectory.segments.find(l=>l.id===r.id);switch(i){case"kind":{let l=o.toLowerCase();if(!Ho.has(l))throw new f(`Unknown trajectory segment kind "${o}"`,n,t[0].column);a.kind=l;return}case"label":a.label=o;return;case"summary":a.summary=o;return;case"from":a.fromObjectId=o;return;case"to":a.toObjectId=o;return;case"around":a.aroundObjectId=o;return;case"assist":a.assist={objectId:o,notes:[]};return;case"epoch":a.epoch=o;return;case"periapsis":a.periapsis=F(o,{line:n,column:t[0].column},"periapsis");return;case"apoapsis":a.apoapsis=F(o,{line:n,column:t[0].column},"apoapsis");return;case"inclination":a.inclination=F(o,{line:n,column:t[0].column},"inclination");return;case"duration":a.duration=F(o,{line:n,column:t[0].column},"duration");return;case"deltav":a.deltaV=F(o,{line:n,column:t[0].column});return;case"phaseangle":a.phaseAngle=F(o,{line:n,column:t[0].column},"phaseAngle");return;case"turnangle":a.turnAngle=F(o,{line:n,column:t[0].column},"turnAngle");return;case"energy":a.energy=F(o,{line:n,column:t[0].column});return;case"notes":a.notes=C(t.slice(1),n,"notes");return;default:throw new f(`Unknown trajectory segment field "${t[0].value}"`,n,t[0].column)}}function Ia(e,t,n){let r=e.activeManeuver;if(!r)return;let i=B(t,e.activeManeuverSeenFields,n),o=j(t,n);switch(i){case"kind":r.kind=o;return;case"label":r.label=o;return;case"epoch":r.epoch=o;return;case"deltav":r.deltaV=F(o,{line:n,column:t[0].column});return;case"duration":r.duration=F(o,{line:n,column:t[0].column},"duration");return;case"notes":r.notes=C(t.slice(1),n,"notes");return;default:throw new f(`Unknown trajectory maneuver field "${t[0].value}"`,n,t[0].column)}}function $a(e,t,n){if(e.length<2)throw new f("Invalid event pose field line",t,e[0]?.column??1);let r=e[0].value;if(!An.has(r))throw new f(`Unknown event pose field "${r}"`,t,e[0].column);if(n.has(r))throw new f(`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 ja(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"||Xo.has(i)){i!=="info"&&z(e.sourceSchemaVersion,e.diagnostics,i,{line:r,column:n[0].column}),e.activeBlock=i,e.blockIndent=t;return}}if(e.activeBlock){let i=Dn(n,r,`Invalid ${e.activeBlock} entry`);if(e.activeBlock==="info"){if(e.seenInfoKeys.has(i.key))throw new f(`Duplicate info key "${i.key}"`,r,n[0].column);e.seenInfoKeys.add(i.key),e.objectNode.infoEntries.push(i);return}let o=e.activeBlock,a=e.seenTypedBlockKeys[o]??(e.seenTypedBlockKeys[o]=new Set);if(a.has(i.key))throw new f(`Duplicate ${o} key "${i.key}"`,r,n[0].column);a.add(i.key),(e.objectNode.typedBlockEntries[o]??(e.objectNode.typedBlockEntries[o]=[])).push(i);return}e.objectNode.fields.push(Aa(n,r,e.objectNode.objectType,e.sourceSchemaVersion,e.diagnostics))}function B(e,t,n){if(e.length<2)throw new f("Invalid atlas field line",n,e[0]?.column??1);let r=e[0].value.toLowerCase();if(t.has(r))throw new f(`Duplicate atlas field "${e[0].value}"`,n,e[0].column);return t.add(r),r}function j(e,t){if(e.length<2)throw new f("Missing value for atlas field",t,e[0]?.column??1);return e.slice(1).map(n=>n.value).join(" ").trim()}function xa(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 Sa(e,t,n,r){let i={};for(let o of C(e,t,"layers")){let a=!o.startsWith("-")&&!o.startsWith("!"),l=o.replace(/^[-!]+/,"").toLowerCase();if(l==="orbits"){i["orbits-back"]=a,i["orbits-front"]=a;continue}(l==="background"||l==="guides"||l==="orbits-back"||l==="orbits-front"||l==="relations"||l==="events"||l==="objects"||l==="labels"||l==="metadata")&&(l==="events"&&n&&r&&z(n,r,"layers.events",{line:t,column:e[0]?.column??1}),i[l]=a)}return i}function C(e,t,n){if(e.length===0)throw new f(`Missing value for atlas field "${n}"`,t,1);let r=e.map(i=>i.value).filter(Boolean);if(r.length===0)throw new f(`Missing value for atlas field "${n}"`,t,e[0]?.column??1);return r}function Tn(e,t,n){let r=e.toLowerCase();if(r!=="topdown"&&r!=="isometric"&&r!=="orthographic"&&r!=="perspective")throw new f(`Unknown projection "${e}"`,t,n);return r}function Ln(e){let t=e.toLowerCase();return t==="orthographic"||t==="perspective"}function Pn(e,t,n){let r=e.toLowerCase();if(r==="diagram"||r==="presentation"||r==="atlas-card"||r==="markdown")return r;throw new f(`Unknown render preset "${e}"`,t,n)}function kt(e,t,n,r){let i=Q(e,t,n,r);if(i<=0)throw new f(`Field "${r}" must be greater than zero`,t,n);return i}function Q(e,t,n,r){let i=Number(e);if(!Number.isFinite(i))throw new f(`Invalid numeric value "${e}" for "${r}"`,t,n);return i}function ka(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Mt(){return{azimuth:null,elevation:null,roll:null,distance:null}}function Ma(e,t,n){if(e.length===0||e.length%2!==0)throw new f('Field "camera" expects "<field> <value>" pairs',t,e[0]?.column??1);let r=n?{...n}:Mt(),i=new Set;for(let o=0;o<e.length;o+=2){let a=e[o],l=e[o+1],s=a.value.toLowerCase();if(i.has(s))throw new f(`Duplicate viewpoint camera field "${a.value}"`,t,a.column);i.add(s);let c=l.value;switch(s){case"azimuth":r.azimuth=Q(c,t,a.column,"camera.azimuth");break;case"elevation":r.elevation=Q(c,t,a.column,"camera.elevation");break;case"roll":r.roll=Q(c,t,a.column,"camera.roll");break;case"distance":r.distance=kt(c,t,a.column,"camera.distance");break;default:throw new f(`Unknown viewpoint camera field "${a.value}"`,t,a.column)}}return r}function Oa(e,t,n,r,i){let o=[],a=0;for(;a<e.length;){let l=e[a],s=Le(l.value);if(!s)throw new f(`Unknown field "${l.value}"`,t,l.column);s.version==="2.1"?z(r,i,l.value,{line:t,column:l.column}):s.version==="3.0"&&he(r,i,l.value,{line:t,column:l.column}),a++;let c=[];if(s.inlineMode==="single"){let u=e[a];u&&(c.push(u),a++)}else if(s.inlineMode==="pair")for(let u=0;u<2;u++){let d=e[a];if(!d)break;c.push(d),a++}else for(;a<e.length&&!Ko.has(e[a].value);)c.push(e[a]),a++;if(c.length===0)throw new f(`Missing value for field "${l.value}"`,t,l.column);o.push({type:"field",key:l.value,values:c.map(u=>u.value),location:{line:t,column:l.column}})}return Vn(o,n),o}function Aa(e,t,n,r,i){if(e.length<2)throw new f("Invalid field line",t,e[0]?.column??1);let o=Le(e[0].value);if(!o)throw new f(`Unknown field "${e[0].value}"`,t,e[0].column);o.version==="2.1"?z(r,i,e[0].value,{line:t,column:e[0].column}):o.version==="3.0"&&he(r,i,e[0].value,{line:t,column:e[0].column});let a={type:"field",key:e[0].value,values:e.slice(1).map(l=>l.value),location:{line:t,column:e[0].column}};return Vn([a],n),a}function Dn(e,t,n){if(e.length<2)throw new f(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 Ta(e,t,n){let r=En(e.fields),i=Fn(r),o=Da(e.objectType,r),a=za(r.get("groups")?.[0]),l=ae(r.get("epoch")?.[0]),s=ae(r.get("referencePlane")?.[0]),c=r.has("tidalLock")?q(_(r.get("tidalLock")[0]),"tidalLock",r.get("tidalLock")[0].location):void 0,u=r.has("resonance")?Ca(r.get("resonance")[0]):void 0,d=Fa(r),p=r.get("derive")?.map(S=>Va(S)),m=r.get("validate")?.map(S=>({rule:_(S)})),y=r.has("locked")?[...new Set(r.get("locked").flatMap(S=>S.values))]:void 0,h=r.get("tolerance")?.map(S=>Ra(S)),I=Ea(e.typedBlockEntries),M=Cn(e.infoEntries,"info"),g=ae(r.get("trajectory")?.[0]),w={type:e.objectType,id:e.id,properties:o,placement:i,info:M};return a.length>0&&(w.groups=a),l&&(w.epoch=l),s&&(w.referencePlane=s),c!==void 0&&(w.tidalLock=c),u&&(w.resonance=u),d&&(w.renderHints=d),p?.length&&(w.deriveRules=p),m?.length&&(w.validationRules=m),y?.length&&(w.lockedFields=y),h?.length&&(w.tolerances=h),I&&Object.keys(I).length>0&&(w.typedBlocks=I),g&&(w.trajectoryId=g),Pe(t,"2.1")&&(w.groups||w.epoch||w.referencePlane||w.tidalLock!==void 0||w.resonance||w.renderHints||w.deriveRules?.length||w.validationRules?.length||w.lockedFields?.length||w.tolerances?.length||w.typedBlocks||w.trajectoryId)&&z(t,n,e.id,e.location),w.trajectoryId&&he(t,n,`${e.id}.trajectory`,e.location),w}function La(e,t){return{...e,participantObjectIds:[...new Set(e.participantObjectIds)],tags:[...new Set(e.tags)],positions:t.map(n=>Pa(n))}}function Pa(e){let t=En(e.fields,"event-pose"),n=Fn(t);return{objectId:e.objectId,placement:n,trajectorySegmentId:ae(t.get("segment")?.[0]),trajectoryManeuverId:ae(t.get("maneuver")?.[0]),inner:J(t.get("inner")?.[0],"inner"),outer:J(t.get("outer")?.[0],"outer"),epoch:ae(t.get("epoch")?.[0]),referencePlane:ae(t.get("referencePlane")?.[0])}}function En(e,t="object"){let n=new Map;for(let r of e){let i=Le(r.key);if(!i&&!An.has(r.key))throw f.fromLocation(`Unknown field "${r.key}"`,r.location);if(!i?.allowRepeat&&n.has(r.key))throw f.fromLocation(`Duplicate field "${r.key}"`,r.location);let o=n.get(r.key)??[];o.push(r),n.set(r.key,o)}return n}function Fn(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 f.fromLocation("Object has multiple placement modes",a?.location)}if(t)return{mode:"orbit",target:_(t),distance:J(e.get("distance")?.[0],"distance"),semiMajor:J(e.get("semiMajor")?.[0],"semiMajor"),eccentricity:Ba(e.get("eccentricity")?.[0],"eccentricity"),period:J(e.get("period")?.[0],"period"),angle:J(e.get("angle")?.[0],"angle"),inclination:J(e.get("inclination")?.[0],"inclination"),phase:J(e.get("phase")?.[0],"phase")};if(n){let a=_(n);return{mode:"at",target:a,reference:$n(a,n.location)}}if(r)return{mode:"surface",target:_(r)};if(i){let a=_(i),l=It(a);return{mode:"free",distance:l??void 0,descriptor:l?void 0:a}}return null}function Da(e,t){let n={};for(let[r,i]of t.entries()){let o=i[0],a=Le(r);!o||!a?.legacySchema||a.legacySchema.placement||($t(r,e,o.location),n[r]=jn(r,o.values,o.location))}return n}function Cn(e,t){let n={};for(let r of e){if(r.key in n)throw f.fromLocation(`Duplicate ${t} key "${r.key}"`,r.location);n[r.key]=r.value}return n}function Ea(e){let t={};for(let n of Object.keys(e)){let r=e[n];r?.length&&(t[n]=Cn(r,n))}return t}function Fa(e){let t={},n=e.get("renderLabel")?.[0],r=e.get("renderOrbit")?.[0],i=e.get("renderPriority")?.[0];return n&&(t.renderLabel=q(_(n),"renderLabel",n.location)),r&&(t.renderOrbit=q(_(r),"renderOrbit",r.location)),i&&(t.renderPriority=et(_(i),"renderPriority",i.location)),Object.keys(t).length>0?t:void 0}function Ca(e){if(e.values.length!==2)throw f.fromLocation('Field "resonance" expects "<targetObjectId> <ratio>"',e.location);let t=e.values[1];if(!/^\d+:\d+$/.test(t))throw f.fromLocation(`Invalid resonance ratio "${t}"`,e.location);return{targetObjectId:e.values[0],ratio:t}}function Va(e){if(e.values.length!==2)throw f.fromLocation('Field "derive" expects "<field> <strategy>"',e.location);return{field:e.values[0],strategy:e.values[1]}}function Ra(e){if(e.values.length!==2)throw f.fromLocation('Field "tolerance" expects "<field> <value>"',e.location);let t=e.values[1],n=It(t),r=Number(t);return{field:e.values[0],value:n??(Number.isFinite(r)?r:t)}}function za(e){return e?[...new Set(e.values)]:[]}function ae(e){return e&&e.values.join(" ").trim()||null}function J(e,t){return e?F(_(e),e.location,t):void 0}function Ba(e,t){return e?et(_(e),t,e.location):void 0}function _(e){return Te(e.values,e.key,e.location)}function Le(e){return rt.get(e)}function Vn(e,t){for(let n of e){let r=Le(n.key);if(!r)throw f.fromLocation(`Unknown field "${n.key}"`,n.location);if(r.legacySchema){$t(n.key,t,n.location);continue}if((n.key==="renderLabel"||n.key==="renderOrbit"||n.key==="tidalLock")&&n.values.length!==1)throw f.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function z(e,t,n,r){Pe(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 se(e,t,n,r){Pe(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 he(e,t,n,r){Pe(e,"3.0")&&t.push({code:"parse.schema30.featureCompatibility",severity:"warning",source:"parse",message:`Feature "${n}" requires schema 3.0; parsed in compatibility mode because the document header is "schema ${e}".`,line:r.line,column:r.column})}function Pe(e,t){return On(e)<On(t)}function On(e){switch(e){case"2.0-draft":return 0;case"2.0":return 1;case"2.1":return 2;case"2.5":return 3;case"2.6":return 4;case"3.0":return 5;default:return 6}}function _a(e){let t=[...e],n=[],r=!1,i=!1,o=null,a=1,l=1;for(let s=0;s<t.length;s++){let c=t[s],u=t[s+1];if(i){if(c==="*"&&u==="/"){t[s]=" ",t[s+1]=" ",i=!1,o=null,s++,l+=2;continue}c!==`
|
|
2
|
-
`&&c!=="\r"&&(t[
|
|
3
|
-
`?(a++,
|
|
4
|
-
`&&t[d]!=="\r";)t[d]=" ",d++;
|
|
5
|
-
`?(a++,
|
|
6
|
-
`}var
|
|
7
|
-
`&&o!=="\r"&&(t[i]=" ");continue}if(!n&&o==="/"&&a==="*"){t[i]=" ",t[i+1]=" ",r=!0,i++;continue}if(!n&&o==="#"){t[i]=" ";let
|
|
8
|
-
`&&t[
|
|
9
|
-
<text class="wo-subtitle" x="56" y="88">${
|
|
10
|
-
<text class="wo-meta" x="56" y="${e.height-42}">${
|
|
1
|
+
"use strict";var WorldOrbitMarkdown=(()=>{var ht=Object.defineProperty;var gr=Object.getOwnPropertyDescriptor;var wr=Object.getOwnPropertyNames;var vr=Object.prototype.hasOwnProperty;var Ir=(e,t)=>{for(var n in t)ht(e,n,{get:t[n],enumerable:!0})},$r=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of wr(t))!vr.call(e,i)&&i!==n&&ht(e,i,{get:()=>t[i],enumerable:!(r=gr(t,i))||r.enumerable});return e};var jr=e=>$r(ht({},"__esModule",{value:!0}),e);var tl={};Ir(tl,{rehypeWorldOrbit:()=>ur,remarkWorldOrbit:()=>lr,renderWorldOrbitBlock:()=>we,renderWorldOrbitError:()=>Ut});var f=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 Ie=["system","star","planet","moon","belt","asteroid","comet","ring","craft","structure","phenomenon"],z=Ie.filter(e=>e!=="system"),xr=["star","planet","moon","asteroid","comet","craft","structure","phenomenon"],qt=["craft","structure","phenomenon"],Z=["star","planet","moon","belt","asteroid","comet","ring","craft","structure","phenomenon"],Sr=["star","planet","moon","belt","asteroid","comet","ring","craft","structure","phenomenon"];function I(e,t){return{key:e,...t}}var _e=new Set(Ie),Xt=new Map([I("orbit",{kind:"string",placement:!0,arity:"single",objectTypes:Z}),I("distance",{kind:"unit",placement:!0,arity:"single",objectTypes:Z,unitFamily:"distance"}),I("semiMajor",{kind:"unit",placement:!0,arity:"single",objectTypes:Z,unitFamily:"distance"}),I("eccentricity",{kind:"number",placement:!0,arity:"single",objectTypes:Z}),I("period",{kind:"unit",placement:!0,arity:"single",objectTypes:Z,unitFamily:"duration"}),I("angle",{kind:"unit",placement:!0,arity:"single",objectTypes:Z,unitFamily:"angle"}),I("inclination",{kind:"unit",placement:!0,arity:"single",objectTypes:Z,unitFamily:"angle"}),I("phase",{kind:"unit",placement:!0,arity:"single",objectTypes:Z,unitFamily:"angle"}),I("at",{kind:"string",placement:!0,arity:"single",objectTypes:qt}),I("surface",{kind:"string",placement:!0,arity:"single",objectTypes:qt}),I("free",{kind:"string",placement:!0,arity:"single",objectTypes:Sr}),I("kind",{kind:"string",placement:!1,arity:"single",objectTypes:z}),I("class",{kind:"string",placement:!1,arity:"single",objectTypes:z}),I("culture",{kind:"string",placement:!1,arity:"single",objectTypes:z}),I("tags",{kind:"list",placement:!1,arity:"multiple",objectTypes:Ie}),I("color",{kind:"string",placement:!1,arity:"single",objectTypes:Ie}),I("image",{kind:"string",placement:!1,arity:"single",objectTypes:xr}),I("hidden",{kind:"boolean",placement:!1,arity:"single",objectTypes:Ie}),I("radius",{kind:"unit",placement:!1,arity:"single",objectTypes:z,unitFamily:"radius"}),I("mass",{kind:"unit",placement:!1,arity:"single",objectTypes:z,unitFamily:"mass"}),I("density",{kind:"unit",placement:!1,arity:"single",objectTypes:z,unitFamily:"generic"}),I("gravity",{kind:"unit",placement:!1,arity:"single",objectTypes:z,unitFamily:"generic"}),I("temperature",{kind:"unit",placement:!1,arity:"single",objectTypes:z,unitFamily:"generic"}),I("albedo",{kind:"number",placement:!1,arity:"single",objectTypes:z}),I("atmosphere",{kind:"string",placement:!1,arity:"single",objectTypes:["planet","moon","asteroid","comet","phenomenon"]}),I("inner",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),I("outer",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),I("view",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),I("scale",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),I("units",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),I("title",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),I("on",{kind:"string",placement:!1,arity:"single",objectTypes:z}),I("source",{kind:"string",placement:!1,arity:"single",objectTypes:z}),I("cycle",{kind:"unit",placement:!1,arity:"single",objectTypes:z,unitFamily:"duration"}),I("trajectory",{kind:"string",placement:!1,arity:"single",objectTypes:["craft","structure"]})].map(e=>[e.key,e])),kr=new Set(Xt.keys());function E(e){return Xt.get(e)}function Ht(e){return kr.has(e)}function Kt(e,t){return e.objectTypes.includes(t)}function Ne(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 $e(e,t={}){let n=[],r=t.columnOffset??0,i="",o=null,a=!1,s=!1,l=null,c=()=>{o!==null&&(n.push({value:i,column:o,quoted:a}),i="",o=null,a=!1)};for(let u=0;u<e.length;u++){let d=e[u],p=r+u+1;if(s&&d==="\\"){let h=e[u+1];if(h==='"'||h==="\\"){i+=h,u++;continue}}if(d==='"'){s?s=!1:(o===null&&(o=p),a=!0,l=p,s=!0);continue}if(!s&&/\s/.test(d)){c();continue}o===null&&(o=p),i+=d}if(s)throw new f("Unclosed quote in line",t.line,l??r+e.length);return c(),n}function We(e){return e.match(/^\s*/)?.[0].length??0}function je(e){let t=e.split(/\r?\n/),n=[],r=null,i=null,o=!1,a=!1,s=null,l=null,c=null,u=null;for(let d=0;d<t.length;d++){let p=t[d],h=d+1;if(!p.trim())continue;let y=We(p),g=$e(p.slice(y),{line:h,columnOffset:y});if(g.length!==0){if(y===0){if(o=!1,a=!1,s=null,l=null,c=null,u=null,g.length>=1&&g[0].value==="theme"){a=!0,l=0,r={type:"theme",preset:g.length>=2?g[1].value:null,blocks:[],location:{line:h,column:g[0].column}};continue}let b=Mr(g,h);n.push(b),i=b;continue}if(a){if(g.length>=2&&g[0].value==="preset"&&(!c||y<=c)){r&&(r.preset=g[1].value);continue}u&&c!==null&&y>c?u.fields.push(Ar(g,h)):(c=y,u={type:"theme-block",target:g[0].value,fields:[],location:{line:h,column:g[0].column}},r?.blocks.push(u));continue}if(!i)throw new f("Indented line without parent object",h,y+1);if(g.length===1&&g[0].value==="info"){o=!0,s=y;continue}o&&y<=(s??0)&&(o=!1),o?i.infoEntries.push(Lr(g,h)):i.blockFields.push(Tr(g,h))}}return{type:"document",theme:r,objects:n}}function Mr(e,t){if(e.length<2)throw new f("Invalid object declaration",t,e[0]?.column??1);let[n,r,...i]=e;if(!_e.has(n.value))throw new f(`Unknown object type "${n.value}"`,t,n.column);return{type:"object",objectType:n.value,name:r.value,inlineFields:Or(i,t),blockFields:[],infoEntries:[],location:{line:t,column:n.column}}}function Or(e,t){let n=[],r=0;for(;r<e.length;){let i=e[r],o=E(i.value);if(!o)throw new f(`Unknown field "${i.value}"`,t,i.column);r++;let a=[];if(o.arity==="multiple")for(;r<e.length&&!Ht(e[r].value);)a.push(e[r]),r++;else{let s=e[r];s&&(a.push(s),r++)}if(a.length===0)throw new f(`Missing value for field "${i.value}"`,t,i.column);n.push({type:"field",key:i.value,values:a.map(s=>s.value),location:{line:t,column:i.column}})}return n}function Tr(e,t){if(e.length<2)throw new f("Invalid field line",t,e[0]?.column??1);if(!E(e[0].value))throw new f(`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 Ar(e,t){if(e.length<2)throw new f("Invalid theme field line",t,e[0]?.column??1);return{type:"field",key:e[0].value,values:e.slice(1).map(n=>n.value),location:{line:t,column:e[0].column}}}function Lr(e,t){if(e.length<2)throw new f("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)?$/,Pr=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),Dr=/^[A-Za-z][A-Za-z0-9+.-]*:/;function xe(e){let t=null,n=[],r=e.theme?Er(e.theme):null;for(let i of e.objects){let o=Cr(i);if(i.objectType==="system"){if(t)throw f.fromLocation("Only one system object is allowed",i.location);t=o}else n.push(o)}return{format:"worldorbit",version:"1.0",schemaVersion:"1.0",theme:r,system:t,groups:[],relations:[],events:[],trajectories:[],objects:n}}function Er(e){let t={};for(let n of e.blocks){let r=Jt(n.fields);t[n.target]=Fr(r)}return{preset:e.preset,styles:t}}function Fr(e){let t={};for(let[n,r]of e.entries()){if(r.values.length===1){let i=r.values[0];if(i==="true"){t[n]=!0;continue}if(i==="false"){t[n]=!1;continue}let o=Number(i);if(!Number.isNaN(o)&&i.trim()!==""){t[n]=o;continue}}t[n]=r.values.join(" ")}return t}function Cr(e){let t=[...e.inlineFields,...e.blockFields];Vr(e.objectType,t);let n=Jt(t),r=zr(e.objectType,n),i=Rr(n),o=Nr(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:o}:{type:e.objectType,id:e.name,properties:i,placement:r,info:o}}function Vr(e,t){for(let n of t){let r=E(n.key);if(!r)throw f.fromLocation(`Unknown field "${n.key}"`,n.location);if(!Kt(r,e))throw f.fromLocation(`Field "${n.key}" is not valid on "${e}"`,n.location);if(r.arity==="single"&&n.values.length!==1)throw f.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function Jt(e){let t=new Map;for(let n of e){if(t.has(n.key))throw f.fromLocation(`Duplicate field "${n.key}"`,n.location);t.set(n.key,n)}return t}function zr(e,t){let n=t.has("orbit"),r=t.has("at"),i=t.has("surface"),o=t.has("free"),a=[n,r,i,o].filter(Boolean).length;if(a>1){let s=t.get("orbit")??t.get("at")??t.get("surface")??t.get("free");throw f.fromLocation("Object has multiple placement modes",s?.location)}if(e==="system"&&a>0)throw f.fromLocation("System objects cannot declare placement",[...t.values()][0]?.location);if(n)return{mode:"orbit",target:Ue(t,"orbit"),distance:pe(t,"distance"),semiMajor:pe(t,"semiMajor"),eccentricity:Yr(t,"eccentricity"),period:pe(t,"period"),angle:pe(t,"angle"),inclination:pe(t,"inclination"),phase:pe(t,"phase")};if(r){let s=Ye(t,"at"),l=Ue(t,"at");return{mode:"at",target:l,reference:Wr(l,s.location)}}if(i)return{mode:"surface",target:Ue(t,"surface")};if(o){let s=Ue(t,"free"),l=Ur(s);return{mode:"free",distance:l??void 0,descriptor:l?void 0:s}}return null}function Rr(e){let t={};for(let[n,r]of e.entries()){let i=E(n);if(!(!i||i.placement))switch(i.kind){case"list":t[n]=r.values;break;case"boolean":t[n]=Gr(r);break;case"number":t[n]=en(me(r),n,r.location);break;case"unit":t[n]=Qt(me(r),r.location,n);break;case"string":t[n]=Br(n,r);break}}return t}function Br(e,t){let n=t.values.join(" ").trim();return e==="image"&&_r(n,t.location),n}function _r(e,t){if(!e)throw f.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw f.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match(Dr);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw f.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function Nr(e){let t={};for(let n of e){if(n.key in t)throw f.fromLocation(`Duplicate info key "${n.key}"`,n.location);t[n.key]=n.value}return t}function Wr(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw f.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 f.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 Qt(e,t,n){let r=e.match(Zt);if(!r)throw f.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let o=E(n);if(o?.unitFamily&&!Ne(o.unitFamily,i.unit))throw f.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function Ur(e){let t=e.match(Zt);return t?{value:Number(t[1]),unit:t[2]??null}:null}function pe(e,t){if(!e.has(t))return;let n=Ye(e,t);return Qt(me(n),n.location,t)}function Yr(e,t){if(!e.has(t))return;let n=Ye(e,t);return en(me(n),t,n.location)}function en(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw f.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function Gr(e){let t=me(e).toLowerCase(),n=Pr.get(t);if(n===void 0)throw f.fromLocation(`Invalid boolean value "${t}" for "${e.key}"`,e.location);return n}function Ye(e,t){let n=e.get(t);if(!n)throw new f(`Missing value for key "${t}"`);return n}function Ue(e,t){return me(Ye(e,t))}function me(e){if(e.values.length!==1)throw f.fromLocation(`Field "${e.key}" expects exactly one value`,e.location);return e.values[0]}var qr=new Set(["star","planet","moon","asteroid","comet"]);function Se(e){let t=new Set,n=new Map;for(let r of e.objects){if(t.has(r.id))throw new f(`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 f(`Unknown placement target "${r.placement.target}" on "${r.id}"`);if(r.placement.mode==="surface"){let i=n.get(r.placement.target);if(!i||!qr.has(i.type))throw new f(`Surface target "${r.placement.target}" on "${r.id}" is not surface-capable`)}r.placement.mode==="at"&&(r.placement.reference.kind==="lagrange"&&Xr(r,r.placement.reference,t),r.placement.reference.kind==="anchor"&&Hr(r,r.placement.reference,t))}}function Xr(e,t,n){if(!n.has(t.primary))throw new f(`Unknown Lagrange reference "${t.primary}" on "${e.id}"`);if(t.secondary&&!n.has(t.secondary))throw new f(`Unknown Lagrange reference "${t.secondary}" on "${e.id}"`)}function Hr(e,t,n){if(!n.has(t.objectId))throw new f(`Unknown anchor target "${t.objectId}" on "${e.id}"`)}function le(e,t,n=`${t}.failed`){return e instanceof f?{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)}}var ke=1495978707e-1,Kr=6371,Zr=71492,Jr=695700,Qr=63241.077,ei=206264.806,ti=206264806,cn=.68,ni=.2,un=28;function N(e,t={}){let n=oi(t),r=n.width,i=n.height,o=n.padding,a=ii(e),s=si(e,t.projection),l=It(t.camera??null),c=vt(s,l),u=fi(a),d=ui(a,t.scaleModel,t.bodyScaleMode),p=e.system?.id??null,h=t.activeEventId??null,y=ri(e.objects,e.events??[],h),g=pi(y,r,i,o,u,d),b=new Map(y.map(v=>[v.id,v])),x=to(y,b),j=new Map,m=[],S=[],G=[],D=[],re=[],ie=new Map,fe=new Map;for(let v of y){let V=v.placement;if(!V){G.push(v);continue}if(V.mode==="orbit"){an(fe,V.target,v);continue}if(V.mode==="surface"){an(ie,V.target,v);continue}if(V.mode==="at"){re.push(v);continue}D.push(v)}let ve=D.length>0?r*.42:r/2,oe=i/2,T={orbitChildren:fe,surfaceChildren:ie,objectMap:b,spacingFactor:u,projection:c,scaleModel:d,sceneMetricScale:g},ae=G.find(v=>v.type==="star")??G[0]??null;ae&>(ae,ve,oe,0,j,m,S,T);let q=G.filter(v=>v.id!==ae?.id);if(q.length>0){let v=Math.min(r,i)*.28*u*d.orbitDistanceMultiplier;q.forEach((V,A)=>{let mt=Le(A,q.length,-Math.PI/2),se=Pe(mt,v,c,1);gt(V,ve+se.x,oe+se.y,0,j,m,S,T)})}D.forEach((v,V)=>{let A=r-o-140-so(v.placement?.mode==="free"?v.placement.distance:void 0,d,g),mt=Math.max(76,(i-o*2-180)/Math.max(1,D.length)*u)*d.freePlacementMultiplier,se=o+92+V*mt;j.set(v.id,{object:v,x:A,y:se,radius:Ze(v,0,d,g),sortKey:Qe(A,se,0)}),S.push({object:v,groupId:x.groupIds.get(v.id)??null,x1:A-60,y1:se,x2:A-18,y2:se,mode:"free"}),He(v,j,m,S,T,1)}),re.forEach((v,V)=>{if(j.has(v.id)||!v.placement||v.placement.mode!=="at")return;let A=Qi(v.placement.reference,j,b,V,re.length,r,i,o,T);j.set(v.id,{object:v,x:A.x,y:A.y,radius:Ze(v,2,d,g),sortKey:Qe(A.x,A.y,2),anchorX:A.anchorX,anchorY:A.anchorY}),A.anchorX!==void 0&&A.anchorY!==void 0&&S.push({object:v,groupId:x.groupIds.get(v.id)??null,x1:A.anchorX,y1:A.anchorY,x2:A.x,y2:A.y,mode:"at"}),He(v,j,m,S,T,2)});let P=[...j.values()].map(v=>mi(v,d,x)),X=m.map(v=>hi(v,x.groupIds.get(v.object.id)??null)),Re=S.map(v=>bi(v)),Be=yi(P,r,i,d.labelMultiplier),Yt=Si(e,P),pt=ki(e.events??[],P,h),Gt=Mi(e,P,pt,t),pr=$i(X,Gt,Yt,pt,Re,P,Be),mr=ji(P,X,Re,Be,x,d.labelMultiplier),hr=xi(e,P),br=Di(e,s,n.preset,x,b),yr=Ui(r,i,P,X,Re,Be,d.labelMultiplier);return{width:r,height:i,padding:o,renderPreset:n.preset,projection:s,renderProjection:c,camera:l,scaleModel:d,title:String(e.system?.title??e.system?.properties.title??e.system?.id??"WorldOrbit")||"WorldOrbit",subtitle:ci(s,c,a,l),systemId:p,viewMode:s,layoutPreset:a,metadata:{format:e.format,version:e.version,view:s,renderProjection:c,scale:String(e.system?.properties.scale??a),units:String(e.system?.properties.units??"mixed"),preset:n.preset??"custom","body.scaleMode":d.bodyScaleMode,...l?.azimuth!==null?{"camera.azimuth":String(l?.azimuth)}:{},...l?.elevation!==null?{"camera.elevation":String(l?.elevation)}:{},...l?.roll!==null?{"camera.roll":String(l?.roll)}:{},...l?.distance!==null?{"camera.distance":String(l?.distance)}:{}},contentBounds:yr,layers:pr,groups:mr,semanticGroups:hr,viewpoints:br,events:pt,activeEventId:h,trajectories:Gt,objects:P,orbitVisuals:X,relations:Yt,leaders:Re,labels:Be}}function ri(e,t,n){let r=e.map(s=>structuredClone(s));if(!n)return r;let i=t.find(s=>s.id===n);if(!i)return r;let o=new Map(r.map(s=>[s.id,s])),a=new Set([...i.targetObjectId?[i.targetObjectId]:[],...i.participantObjectIds,...i.positions.map(s=>s.objectId)]);for(let s of a){let l=o.get(s);l&&(i.epoch&&(l.epoch=i.epoch),i.referencePlane&&(l.referencePlane=i.referencePlane))}for(let s of i.positions){let l=o.get(s.objectId);l&&(s.placement&&(l.placement=structuredClone(s.placement)),s.inner&&(l.properties.inner={...s.inner}),s.outer&&(l.properties.outer={...s.outer}),s.epoch&&(l.epoch=s.epoch),s.referencePlane&&(l.referencePlane=s.referencePlane))}return r}function ii(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 oi(e){let t=ai(e.preset);return{width:e.width??t.width,height:e.height??t.height,padding:e.padding??t.padding,preset:e.preset??null}}function ai(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 si(e,t){if(t==="topdown"||t==="isometric"||t==="orthographic"||t==="perspective")return t;let n=String(e.system?.properties.view??"topdown").toLowerCase();return mn(n)??"topdown"}function vt(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 It(e){if(!e)return null;let t={azimuth:bt(e.azimuth),elevation:bt(e.elevation),roll:bt(e.roll),distance:li(e.distance)};return t.azimuth!==null||t.elevation!==null||t.roll!==null||t.distance!==null?t:null}function bt(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function li(e){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:null}function ci(e,t,n,r){let i=[`${sn(e)} view`,`${sn(n)} layout`];if(e!==t&&i.push(`2D ${t} fallback`),r){let o=[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);o.length>0&&i.push(`camera ${o.join(" / ")}`)}return i.join(" - ")}function ui(e,t,n){return{...di(e),...n?{bodyScaleMode:n}:{},...t}}function di(e){switch(e){case"compact":return{orbitDistanceMultiplier:.84,bodyRadiusMultiplier:.92,labelMultiplier:.9,freePlacementMultiplier:.9,ringThicknessMultiplier:.92,minBodyRadius:4,maxBodyRadius:36,bodyScaleMode:"readable"};case"presentation":return{orbitDistanceMultiplier:1.2,bodyRadiusMultiplier:1.18,labelMultiplier:1.08,freePlacementMultiplier:1.05,ringThicknessMultiplier:1.16,minBodyRadius:5,maxBodyRadius:48,bodyScaleMode:"readable"};default:return{orbitDistanceMultiplier:1,bodyRadiusMultiplier:1,labelMultiplier:1,freePlacementMultiplier:1,ringThicknessMultiplier:1,minBodyRadius:4,maxBodyRadius:40,bodyScaleMode:"readable"}}}function fi(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function pi(e,t,n,r,i,o){let a=[],s=[];for(let h of e){let y=co(h);y!==null&&y>0&&s.push(y);let g=h.placement;if(g){if(g.mode==="orbit"){let b=Q(g.semiMajor??g.distance??null);b!==null&&b>0&&a.push(b);continue}if(g.mode==="free"){let b=Q(g.distance??null);b!==null&&b>0&&a.push(b)}}}let l=Math.max(...a,0),c=Math.max(...s,0),u=Math.max(l,c*6,0),d=u+Math.max(Math.sqrt(u),c*2,l>0?.25:0);return d<=0?{pixelsPerMetric:null,hasExplicitScale:!1}:{pixelsPerMetric:Math.max(Math.min(t,n)/2-r-24,120)*i*o.orbitDistanceMultiplier/d,hasExplicitScale:!0}}function mi(e,t,n){let{object:r,x:i,y:o,radius:a,sortKey:s,anchorX:l,anchorY:c}=e,u=r.renderHints?.renderPriority??0;return{renderId:Y(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:o,radius:a,visualRadius:ao(r,a,t),sortKey:s+u*.001,anchorX:l,anchorY:c,label:r.id,secondaryLabel:r.type==="structure"||r.type==="craft"?String(r.properties.kind??r.type):r.type,fillColor:uo(r.properties.color),imageHref:typeof r.properties.image=="string"&&r.properties.image.trim()?r.properties.image:void 0,hidden:r.properties.hidden===!0}}function hi(e,t){return{renderId:`${Y(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 bi(e){return{renderId:`${Y(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 yi(e,t,n,r){let i=[],o=[],a=new Map(e.map(l=>[l.objectId,l])),s=[...e].filter(l=>!l.hidden&&l.object.renderHints?.renderLabel!==!1).sort(gi);for(let l of s){let c=wi(l,a,o,t,n,r)??fn(l,dn(l,a.get(l.parentId??"")??null,n),0,r);o.push(vn(l,c,r)),i.push({renderId:`${l.renderId}-label`,objectId:l.objectId,object:l.object,groupId:l.groupId,semanticGroupIds:[...l.semanticGroupIds],label:l.label,secondaryLabel:l.secondaryLabel,x:c.x,y:c.labelY,secondaryY:c.secondaryY,textAnchor:c.textAnchor,direction:c.direction,hidden:l.hidden})}return i}function gi(e,t){let n=tn(e)-tn(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 tn(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"craft":case"structure":case"phenomenon":return 5}}function wi(e,t,n,r,i,o){for(let a of vi(e,t,r,i)){let s=a==="left"||a==="right"?4:6;for(let l=0;l<=s;l+=1){let c=fn(e,a,l,o),u=vn(e,c,o);if(!n.some(d=>io(d,u)))return c}}return null}function vi(e,t,n,r){let i=e.parentId?t.get(e.parentId)??null:null,o=dn(e,i,r),a=o==="below"?"above":"below",s=Ii(e,i,n),l=s==="right"?"left":"right";return e.object.type==="craft"||e.object.type==="structure"||e.object.type==="phenomenon"||e.object.placement?.mode==="at"||e.object.placement?.mode==="surface"||e.object.placement?.mode==="free"?[s,o,l,a]:[o,s,a,l]}function dn(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 Ii(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 fn(e,t,n,r){let i=14*r;switch(t){case"above":{let o=e.y-(e.radius+18*r+n*i);return{x:e.x,labelY:o,secondaryY:o-16*r,textAnchor:"middle",direction:t}}case"below":{let o=e.y+e.radius+18*r+n*i;return{x:e.x,labelY:o,secondaryY:o+16*r,textAnchor:"middle",direction:t}}case"left":{let o=e.x-(e.visualRadius+16*r+n*i),a=e.y-4*r;return{x:o,labelY:a,secondaryY:a+16*r,textAnchor:"end",direction:t}}case"right":{let o=e.x+e.visualRadius+16*r+n*i,a=e.y-4*r;return{x:o,labelY:a,secondaryY:a+16*r,textAnchor:"start",direction:t}}}}function $i(e,t,n,r,i,o,a){let s=e.filter(c=>!c.hidden&&!!c.backArcPath).map(c=>c.renderId),l=e.filter(c=>!c.hidden).map(c=>c.renderId);return[{id:"background",renderIds:["wo-bg","wo-bg-glow","wo-grid"]},{id:"guides",renderIds:i.filter(c=>!c.hidden).map(c=>c.renderId)},{id:"orbits-back",renderIds:s},{id:"orbits-front",renderIds:l},{id:"trajectories",renderIds:t.filter(c=>!c.hidden).flatMap(c=>[c.renderId,...c.waypoints.filter(u=>!u.hidden).map(u=>u.renderId)])},{id:"relations",renderIds:n.filter(c=>!c.hidden).map(c=>c.renderId)},{id:"events",renderIds:r.filter(c=>!c.hidden).map(c=>c.renderId)},{id:"objects",renderIds:o.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 ji(e,t,n,r,i,o){let a=new Map,s=l=>{if(!l)return null;let c=a.get(l);if(c)return c;let u=i.groupRoots.get(l)??null,d={renderId:l,rootObjectId:u,label:u??l,objectIds:[],orbitIds:[],labelIds:[],leaderIds:[],contentBounds:Ae(0,0,0,0)};return a.set(l,d),d};for(let l of e){let c=s(l.groupId);c&&!l.hidden&&c.objectIds.push(l.objectId)}for(let l of t){let c=s(l.groupId);c&&!l.hidden&&c.orbitIds.push(l.objectId)}for(let l of n){let c=s(l.groupId);c&&!l.hidden&&c.leaderIds.push(l.objectId)}for(let l of r){let c=s(l.groupId);c&&!l.hidden&&c.labelIds.push(l.objectId)}for(let l of a.values())l.contentBounds=no(l,e,t,n,r,o);return[...a.values()].sort((l,c)=>l.label.localeCompare(c.label))}function xi(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 Si(e,t){let n=new Map(t.map(r=>[r.objectId,r]));return e.relations.map(r=>{let i=n.get(r.from),o=n.get(r.to);return{renderId:`${Y(r.id)}-relation`,relationId:r.id,relation:r,fromObjectId:r.from,toObjectId:r.to,x1:i?.x??0,y1:i?.y??0,x2:o?.x??0,y2:o?.y??0,hidden:r.hidden||!i||!o||i.hidden||o.hidden}}).sort((r,i)=>r.relation.id.localeCompare(i.relation.id))}function ki(e,t,n){let r=new Map(t.map(i=>[i.objectId,i]));return e.map(i=>{let o=[...new Set([...i.targetObjectId?[i.targetObjectId]:[],...i.participantObjectIds])],a=o.map(c=>r.get(c)).filter(Boolean),s=a.length>0?a.reduce((c,u)=>c+u.x,0)/a.length:0,l=a.length>0?a.reduce((c,u)=>c+u.y,0)/a.length:0;return{renderId:`${Y(i.id)}-event`,eventId:i.id,event:i,objectIds:o,participantIds:[...i.participantObjectIds],targetObjectId:i.targetObjectId,x:s,y:l,hidden:i.hidden||a.length===0||a.every(c=>c.hidden)||n!==null&&i.id!==n}}).sort((i,o)=>i.event.id.localeCompare(o.event.id))}function Mi(e,t,n,r){let i=new Map(t.map(o=>[o.objectId,o]));return e.trajectories.map(o=>Oi(o,i,n,r)).sort((o,a)=>o.trajectoryId.localeCompare(a.trajectoryId))}function Oi(e,t,n,r){let i=e.craftObjectId?t.get(e.craftObjectId)??null:null,o=Ai(e,r),a=e.stroke??e.color??i?.fillColor??null,s=e.strokeWidth??2.4,l=r.showTrajectoryWaypoints??e.showWaypoints??!0,c=e.labelMode??(r.showTrajectoryLabels===!1?"hidden":"waypoint"),u=[],d=[],p=new Set,h=i;i&&p.add(i.objectId),e.segments.forEach((y,g)=>{let b=Ti(e,y,g,o,t,h,l);b.path&&u.push(b.path),b.objectIds.forEach(x=>p.add(x)),d.push(...b.waypoints),h=b.lastAnchor??h});for(let y of n.filter(g=>g.event.trajectoryId===e.id)){let g=y.targetObjectId?t.get(y.targetObjectId)??null:y.objectIds.map(b=>t.get(b)??null).find(Boolean)??null;g&&(d.push({renderId:`${Y(`${e.id}-${y.eventId}`)}-waypoint`,trajectoryId:e.id,segmentId:null,maneuverId:null,objectId:g.objectId,x:g.x,y:g.y,label:y.event.label??y.event.id,dateLabel:y.event.epoch??null,hidden:e.hidden||y.hidden||!l}),p.add(g.objectId))}return{renderId:`${Y(e.id)}-trajectory`,trajectoryId:e.id,trajectory:e,craftObjectId:e.craftObjectId,mode:o,path:u.join(" "),stroke:a,strokeWidth:s,marker:e.marker??"arrow",labelMode:c,showWaypoints:l,objectIds:[...p],waypoints:d,hidden:e.hidden||u.length===0}}function Ti(e,t,n,r,i,o,a){let s=Ge(t.fromObjectId,i)??o,l=Ge(t.assist?.objectId??t.aroundObjectId??null,i),c=Ge(t.toObjectId,i)??Ge(t.aroundObjectId,i)??l??s;if(!s||!c)return{path:"",objectIds:[],waypoints:[],lastAnchor:o};let u=[s.objectId,c.objectId];l&&u.push(l.objectId);let d=e.hidden||t.renderHidden===!0||s.hidden||c.hidden,p=[],h=t.waypointLabel??t.label??hn(t.id),y=t.waypointDate??t.epoch??null;a&&(n===0&&p.push(yt(e.id,t.id,null,s,s.label,null,d)),l&&l.objectId!==s.objectId&&l.objectId!==c.objectId&&p.push(yt(e.id,t.id,null,l,h,y,d)),p.push(yt(e.id,t.id,null,c,h,y,d)));let g=r==="solver"?Li(s,nn(s,c,l,n),c,Math.max(10,Math.round((t.sampleDensity??1)*14))):null,b=nn(s,c,l,n),x=r==="solver"?Pi(g??[s,c]):`M ${J(s.x)} ${J(s.y)} Q ${J(b.x)} ${J(b.y)} ${J(c.x)} ${J(c.y)}`;return t.maneuvers.forEach((j,m)=>{if(!a)return;let S=pn(s,b,c,(m+1)/(t.maneuvers.length+1));p.push({renderId:`${Y(`${e.id}-${t.id}-${j.id}`)}-waypoint`,trajectoryId:e.id,segmentId:t.id,maneuverId:j.id,objectId:null,x:S.x,y:S.y,label:j.label??j.kind,dateLabel:j.epoch??null,hidden:d})}),{path:x,objectIds:[...new Set(u)],waypoints:p,lastAnchor:c}}function yt(e,t,n,r,i,o,a){return{renderId:`${Y(`${e}-${t??r.objectId}-${n??r.objectId}`)}-waypoint`,trajectoryId:e,segmentId:t,maneuverId:n,objectId:r.objectId,x:r.x,y:r.y,label:i,dateLabel:o,hidden:a}}function Ai(e,t){let n=t.trajectoryMode??e.renderMode??"auto";return n!=="auto"?n:e.segments.filter(i=>i.fromObjectId||i.toObjectId||i.assist?.objectId||i.aroundObjectId).length>0?"solver":"illustrative"}function Ge(e,t){return e?t.get(e)??null:null}function nn(e,t,n,r){if(n)return{x:n.x,y:n.y};let i=t.x-e.x,o=t.y-e.y,a=Math.max(Math.hypot(i,o),1),s=Math.min(Math.max(a*.18,26),120)*(r%2===0?1:-1),l=-o/a,c=i/a;return{x:(e.x+t.x)/2+l*s,y:(e.y+t.y)/2+c*s}}function Li(e,t,n,r){let i=[];for(let o=0;o<=r;o+=1)i.push(pn(e,t,n,o/r));return i}function pn(e,t,n,r){let i=1-r;return{x:i*i*e.x+2*i*r*t.x+r*r*n.x,y:i*i*e.y+2*i*r*t.y+r*r*n.y}}function Pi(e){return e.length===0?"":e.map((t,n)=>`${n===0?"M":"L"} ${J(t.x)} ${J(t.y)}`).join(" ")}function J(e){return Number.isFinite(e)?e.toFixed(2):"0"}function Di(e,t,n,r,i){let o=Ei(e,t,n),a=new Map;for(let[c,u]of Object.entries(e.system?.info??{})){if(!c.startsWith("viewpoint."))continue;let[d,p,...h]=c.split(".");if(d!=="viewpoint"||!p||h.length===0)continue;let y=Ni(p);if(!y)continue;let g=h.join(".").toLowerCase(),b=a.get(y)??{id:y};Fi(b,g,u,e,t,n,r,i),a.set(y,b)}let s=[...a.values()].map(c=>Ci(c,t,n,i)).filter(Boolean),l=s.findIndex(c=>c.id===o.id);return l>=0?s.splice(l,1,{...o,...s[l],layers:{...o.layers,...s[l].layers},filter:s[l].filter??o.filter,generated:!1}):s.unshift(o),s.sort((c,u)=>c.id==="overview"?-1:u.id==="overview"?1:c.label.localeCompare(u.label))}function Ei(e,t,n){let r=e.system?.title??e.system?.properties.title,i=r?`${String(r)} Overview`:"Overview",o=It(null),a=vt(t,o);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:o,preset:n,rotationDeg:0,scale:null,layers:{},filter:null,generated:!0}}function Fi(e,t,n,r,i,o,a,s){let l=n.trim();switch(t){case"label":case"title":l&&(e.label=l);return;case"summary":case"description":l&&(e.summary=l);return;case"focus":case"object":l&&(e.focus=l);return;case"select":case"selection":l&&(e.select=l);return;case"events":e.eventIds=Te(l);return;case"projection":case"view":e.projection=mn(l)??i;return;case"preset":e.preset=zi(l)??o;return;case"rotation":case"angle":e.rotationDeg=Me(l)??e.rotationDeg??0;return;case"camera.azimuth":e.camera={...e.camera??Xe(),azimuth:Me(l)};return;case"camera.elevation":e.camera={...e.camera??Xe(),elevation:Me(l)};return;case"camera.roll":e.camera={...e.camera??Xe(),roll:Me(l)};return;case"camera.distance":e.camera={...e.camera??Xe(),distance:rn(l)};return;case"zoom":case"scale":e.scale=rn(l);return;case"layers":e.layers=Ri(l);return;case"query":e.filter={...e.filter??qe(),query:l||null};return;case"types":case"objecttypes":e.filter={...e.filter??qe(),objectTypes:Bi(l)};return;case"tags":e.filter={...e.filter??qe(),tags:Te(l)};return;case"groups":e.filter={...e.filter??qe(),groupIds:_i(l,r,a,s)};return}}function Ci(e,t,n,r){let i=e.focus&&r.has(e.focus)?e.focus:null,o=e.select&&r.has(e.select)?e.select:i,a=Vi(e.filter),s=e.label?.trim()||hn(e.id),l=e.projection??t,c=It(e.camera??null),u=vt(l,c);return{id:e.id,label:s,summary:e.summary?.trim()||Wi(s,i,a),objectId:i,selectedObjectId:o,eventIds:[...new Set(e.eventIds??[])],projection:l,renderProjection:u,camera:c,preset:e.preset??n,rotationDeg:e.rotationDeg??0,scale:e.scale??null,layers:e.layers??{},filter:a,generated:!1}}function qe(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Xe(){return{azimuth:null,elevation:null,roll:null,distance:null}}function Vi(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 mn(e){switch(e.toLowerCase()){case"topdown":return"topdown";case"isometric":return"isometric";case"orthographic":return"orthographic";case"perspective":return"perspective";default:return null}}function zi(e){let t=e.toLowerCase();return t==="diagram"||t==="presentation"||t==="atlas-card"||t==="markdown"?t:null}function Me(e){let t=Number(e);return Number.isFinite(t)?t:null}function rn(e){let t=Me(e);return t!==null&&t>0?t:null}function Ri(e){let t={};for(let n of Te(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"||i==="trajectories")&&(t[i]=r)}return t}function Bi(e){return Te(e).filter(t=>t==="star"||t==="planet"||t==="moon"||t==="belt"||t==="asteroid"||t==="comet"||t==="ring"||t==="craft"||t==="structure"||t==="phenomenon")}function _i(e,t,n,r){return Te(e).map(i=>t.schemaVersion==="2.1"||t.schemaVersion==="2.5"||t.schemaVersion==="2.6"||t.groups.some(o=>o.id===i)||i.startsWith("wo-")&&i.endsWith("-group")?i:n.groupIds.has(i)?n.groupIds.get(i)??Oe(i):(r.has(i),Oe(i)))}function Te(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function Ni(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function hn(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Wi(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 Ui(e,t,n,r,i,o,a){let s=Number.POSITIVE_INFINITY,l=Number.POSITIVE_INFINITY,c=Number.NEGATIVE_INFINITY,u=Number.NEGATIVE_INFINITY,d=(p,h)=>{s=Math.min(s,p),l=Math.min(l,h),c=Math.max(c,p),u=Math.max(u,h)};for(let p of r)p.hidden||bn(p,d);for(let p of i)p.hidden||(d(p.x1,p.y1),d(p.x2,p.y2));for(let p of n)p.hidden||yn(p,d);for(let p of o)p.hidden||gn(p,d,a);return!Number.isFinite(s)||!Number.isFinite(l)?Ae(0,0,e,t):Ae(s,l,c,u)}function bn(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,o=$n(e.cx,e.cy,r,i,e.rotationDeg,0,Math.PI*2,un*2);for(let a of o)t(a.x-n,a.y-n),t(a.x+n,a.y+n)}function Ae(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 yn(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 gn(e,t,n){let r=In(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 gt(e,t,n,r,i,o,a,s){i.has(e.id)||(i.set(e.id,{object:e,x:t,y:n,radius:Ze(e,r,s.scaleModel,s.sceneMetricScale),sortKey:Qe(t,n,r)}),He(e,i,o,a,s,r+1))}function He(e,t,n,r,i,o){let a=t.get(e.id);if(!a)return;let s=[...i.orbitChildren.get(e.id)??[]].sort(Yi),l=Gi(s,a.radius,i.spacingFactor,i.scaleModel,i.sceneMetricScale),c=Hi(s,l);s.forEach((d,p)=>{let h=qi(d,p,s.length,a,l,c[p]??l.innerPx,i);n.push({object:d,parentId:e.id,kind:h.kind,cx:h.cx,cy:h.cy,radius:h.radius,rx:h.rx,ry:h.ry,rotationDeg:h.rotationDeg,band:h.band,bandThickness:h.bandThickness,frontArcPath:h.frontArcPath,backArcPath:h.backArcPath}),gt(d,h.objectX,h.objectY,o,t,n,r,i)});let u=[...i.surfaceChildren.get(e.id)??[]];u.forEach((d,p)=>{let h=Le(p,u.length,-Math.PI/3),y=28*i.spacingFactor,g=Pe(h,a.radius,i.projection,i.projection==="isometric"?.9:1),b=Pe(h,a.radius+y,i.projection,i.projection==="isometric"?.9:1),x=a.x+g.x,j=a.y+g.y,m=a.x+b.x,S=a.y+b.y;t.set(d.id,{object:d,x:m,y:S,radius:Ze(d,o+1,i.scaleModel,i.sceneMetricScale),sortKey:Qe(m,S,o+1),anchorX:x,anchorY:j}),r.push({object:d,groupId:i.objectMap.has(d.id)?Oe(ro(d,i.objectMap)):null,x1:x,y1:j,x2:m,y2:S,mode:"surface"}),He(d,t,n,r,i,o+1)})}function Yi(e,t){let n=Ke(e),r=Ke(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 Gi(e,t,n,r,i){let o=e.map(h=>Ke(h)),a=o.filter(h=>h!==null),s=r.bodyScaleMode==="strict"?Math.max(2,8*n*r.orbitDistanceMultiplier):(e.length>2?54:64)*n*r.orbitDistanceMultiplier*.42,l=t+Math.max(s*1.2,24*n),c=(e.length>2?54:64)*n*r.orbitDistanceMultiplier;if(a.length===0)return{metrics:o,minMetric:0,maxMetric:0,metricSpread:0,innerPx:l,stepPx:c,pixelSpread:Math.max(c*Math.max(e.length-1,1),c),minimumGapPx:s,pixelsPerMetric:i.pixelsPerMetric};let u=Math.min(...a),d=Math.max(...a),p=d-u;return{metrics:o,minMetric:u,maxMetric:d,metricSpread:p,innerPx:l,stepPx:c,pixelSpread:Math.max(c*Math.max(e.length-1,1),c),minimumGapPx:s,pixelsPerMetric:i.pixelsPerMetric}}function qi(e,t,n,r,i,o,a){let s=e.placement,l=e.type==="belt"||e.type==="ring";if(!s||s.mode!=="orbit"){let ie=i.innerPx+t*i.stepPx;return{kind:"circle",cx:r.x,cy:r.y,radius:ie,rotationDeg:0,band:l,bandThickness:l?12*a.scaleModel.ringThicknessMultiplier:void 0,objectX:r.x,objectY:r.y-ie}}let c=M(typeof s.eccentricity=="number"?s.eccentricity:0,0,.92),u=o,d=Math.max(u*Math.sqrt(1-c*c),u*.18),p=wt(s.inclination)??0,h=a.projection==="isometric"?Math.max(ni,Math.cos($t(p)))*cn:1,y=Math.max(d*h,u*.14),g=wt(s.angle)??0,b=u*c,x=xn(-b,0,g),j=r.x+x.x,m=r.y+x.y,S=Zi(s.phase,t,n),G=jn(j,m,u,y,g,S),D=a.projection==="topdown"&&c<=1e-4&&Math.abs(g)<=1e-4,re=l?Ji(e,u,i,a.scaleModel):void 0;return{kind:D?"circle":"ellipse",cx:D?r.x:j,cy:D?r.y:m,radius:D?u:void 0,rx:D?void 0:u,ry:D?void 0:y,rotationDeg:g,band:l,bandThickness:re,frontArcPath:a.projection==="isometric"||l?on(j,m,u,y,g,0,Math.PI):void 0,backArcPath:a.projection==="isometric"||l?on(j,m,u,y,g,Math.PI,Math.PI*2):void 0,objectX:G.x,objectY:G.y}}function Xi(e,t){return t.pixelsPerMetric!==null?e*t.pixelsPerMetric:t.innerPx+t.stepPx*Ki(Math.max(e,0)+1)}function Hi(e,t){let n=[];return e.forEach((r,i)=>{let o=Ke(r),a=t.innerPx+i*t.stepPx,s=o===null?a:Xi(o,t),l=i===0?t.innerPx:(n[i-1]??t.innerPx)+t.minimumGapPx;n.push(Math.max(s,l))}),n}function Ke(e){return!e.placement||e.placement.mode!=="orbit"?null:Q(e.placement.semiMajor??e.placement.distance??null)}function Ki(e){return Math.log(e)/Math.log(2)}function Zi(e,t,n){let r=e?wt(e):null;return r!==null?$t(r-90):Le(t,n,-Math.PI/2)}function Ji(e,t,n,r){let i=Q(Je(e.properties.inner)),o=Q(Je(e.properties.outer));if(i!==null&&o!==null){let s=Math.abs(o-i);if(n.pixelsPerMetric!==null){let c=s*n.pixelsPerMetric;return r.bodyScaleMode==="strict"?Math.max(c*r.ringThicknessMultiplier,1):M(Math.max(c*r.ringThicknessMultiplier,8),8,54)}if(n.metricSpread>0)return M(s/n.metricSpread*n.pixelSpread*r.ringThicknessMultiplier,8,54);let l=Math.max(Math.max(i,o),1e-4);return M(s/l*t*.75*r.ringThicknessMultiplier,8,48)}return(e.type==="belt"?18:12)*r.ringThicknessMultiplier}function Qi(e,t,n,r,i,o,a,s,l){if(e.kind==="lagrange")return eo(e,t,n,o,a);if(e.kind==="anchor"){let c=t.get(e.objectId);if(c){let u=Le(r,i,Math.PI/5),d=(c.radius+36)*l.scaleModel.labelMultiplier,p=Pe(u,d,l.projection,l.projection==="isometric"?.92:1);return{x:c.x+p.x,y:c.y+p.y,anchorX:c.x,anchorY:c.y}}}if(e.kind==="named"){let c=t.get(e.name);if(c){let u=Le(r,i,Math.PI/6),d=(c.radius+36)*l.scaleModel.labelMultiplier,p=Pe(u,d,l.projection,l.projection==="isometric"?.92:1);return{x:c.x+p.x,y:c.y+p.y,anchorX:c.x,anchorY:c.y}}}return{x:o-s-170,y:a-s-86-r*58*l.scaleModel.freePlacementMultiplier}}function eo(e,t,n,r,i){let o=e.secondary?t.get(e.primary):oo(e.primary,t,n),a=t.get(e.secondary??e.primary);if(!o||!a)return{x:r*.7,y:i*.25};let s=a.x-o.x,l=a.y-o.y,c=Math.hypot(s,l)||1,u=s/c,d=l/c,p=-d,h=u,y=M(c*.25,24,68);switch(e.point){case"L1":return{x:a.x-u*y,y:a.y-d*y,anchorX:a.x,anchorY:a.y};case"L2":return{x:a.x+u*y,y:a.y+d*y,anchorX:a.x,anchorY:a.y};case"L3":return{x:o.x-u*y,y:o.y-d*y,anchorX:o.x,anchorY:o.y};case"L4":return{x:a.x+(u*.5-p*.8660254)*y,y:a.y+(d*.5-h*.8660254)*y,anchorX:a.x,anchorY:a.y};case"L5":return{x:a.x+(u*.5+p*.8660254)*y,y:a.y+(d*.5+h*.8660254)*y,anchorX:a.x,anchorY:a.y}}}function to(e,t){let n=new Map,r=new Map;for(let c of e){let u=wn(c,t);if(n.set(c.id,u),u){let d=r.get(u);d?d.push(c.id):r.set(u,[c.id])}r.has(c.id)||r.set(c.id,[])}let i=new Map,o=new Map,a=new Map,s=c=>{let u=i.get(c);if(u)return u;let d=new Set,p=[],h=n.get(c)??null;for(;h&&!d.has(h);)p.push(h),d.add(h),h=n.get(h)??null;return i.set(c,p),p},l=c=>{let u=a.get(o.get(c)??"");if(u)return u;let d=n.get(c)??null,p=t.get(c),h=c;return p?.placement&&p.placement.mode!=="free"&&d&&(h=l(d)),h};for(let c of e){s(c.id);let u=l(c.id),d=Oe(u);o.set(c.id,d),a.set(d,u)}return{parentIds:n,childIds:r,ancestorIds:i,groupIds:o,groupRoots:a}}function wn(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 no(e,t,n,r,i,o){let a=Number.POSITIVE_INFINITY,s=Number.POSITIVE_INFINITY,l=Number.NEGATIVE_INFINITY,c=Number.NEGATIVE_INFINITY,u=(d,p)=>{a=Math.min(a,d),s=Math.min(s,p),l=Math.max(l,d),c=Math.max(c,p)};for(let d of t)!d.hidden&&e.objectIds.includes(d.objectId)&&yn(d,u);for(let d of n)!d.hidden&&e.orbitIds.includes(d.objectId)&&bn(d,u);for(let d of r)!d.hidden&&e.leaderIds.includes(d.objectId)&&(u(d.x1,d.y1),u(d.x2,d.y2));for(let d of i)!d.hidden&&e.labelIds.includes(d.objectId)&&gn(d,u,o);return!Number.isFinite(a)||!Number.isFinite(s)?Ae(0,0,0,0):Ae(a,s,l,c)}function ro(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=wn(n,t);if(!i)break;let o=t.get(i);if(!o)break;n=o}return n.id}function vn(e,t,n){return In(t.x,t.labelY,t.secondaryY,t.textAnchor,t.direction,e.label,e.secondaryLabel,n)}function In(e,t,n,r,i,o,a,s){let l=fo(o,a,s),c=l*2,u=i==="above"?18:12,d=i==="above"?8:12,p=e-l,h=e+l;return r==="start"?(p=e,h=e+c):r==="end"&&(p=e-c,h=e),{left:p,right:h,top:Math.min(t,n)-u,bottom:Math.max(t,n)+d}}function io(e,t){return!(e.right<t.left||t.right<e.left||e.bottom<t.top||t.bottom<e.top)}function oo(e,t,n){let r=n.get(e);return!r?.placement||r.placement.mode!=="orbit"?t.get(e):t.get(r.placement.target)}function Ze(e,t,n,r){let i=lo(e.properties.radius,n,r);if(i!==null)return i;let o=n.bodyRadiusMultiplier;switch(e.type){case"star":return M((t===0?28:20)*o,n.minBodyRadius,n.maxBodyRadius);case"planet":return M(12*o,n.minBodyRadius,n.maxBodyRadius);case"moon":return M(7*o,n.minBodyRadius,n.maxBodyRadius);case"belt":return M(5*o,n.minBodyRadius,n.maxBodyRadius);case"asteroid":return M(5*o,n.minBodyRadius,n.maxBodyRadius);case"comet":return M(6*o,n.minBodyRadius,n.maxBodyRadius);case"ring":return M(5*o,n.minBodyRadius,n.maxBodyRadius);case"craft":return M(5*o,n.minBodyRadius,n.maxBodyRadius);case"structure":return M(6*o,n.minBodyRadius,n.maxBodyRadius);case"phenomenon":return M(8*o,n.minBodyRadius,n.maxBodyRadius)}}function ao(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"craft":return t+1.5;case"structure":return t+2;default:return Math.min(t+r,n.maxBodyRadius+10)}}function Q(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/ke;case"m":return e.value/1e3/ke;case"ly":return e.value*Qr;case"pc":return e.value*ei;case"kpc":return e.value*ti;case"re":return e.value*Kr/ke;case"rj":return e.value*Zr/ke;case"sol":return e.value*Jr/ke;default:return e.value}}function so(e,t,n){let r=Q(e??null);if(r===null||r<=0)return 0;if(n.pixelsPerMetric!==null){let i=r*n.pixelsPerMetric*t.freePlacementMultiplier;return t.bodyScaleMode==="strict"?Math.max(i,0):M(i,0,420)}return M(r*96*t.freePlacementMultiplier,0,420)}function lo(e,t,n){let r=Je(e);if(!r)return null;let i=Q(r);if(n.pixelsPerMetric!==null&&i!==null&&i>0){let a=i*n.pixelsPerMetric*t.bodyRadiusMultiplier;return t.bodyScaleMode==="strict"?Math.max(a,.1):M(Math.max(a,t.minBodyRadius),t.minBodyRadius,t.maxBodyRadius)}let o;switch(r.unit){case"sol":o=M(r.value*22,14,40);break;case"re":o=M(r.value*10,6,18);break;case"km":o=M(Math.log10(Math.max(r.value,1))*2.6,4,16);break;default:o=M(r.value*4,4,20);break}return M(o*t.bodyRadiusMultiplier,t.minBodyRadius,t.maxBodyRadius)}function co(e){return Q(Je(e.properties.radius))}function Je(e){return!e||typeof e!="object"||!("value"in e)?null:e}function wt(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function Le(e,t,n){return t<=1?n:n+e*Math.PI*2/t}function on(e,t,n,r,i,o,a){let s=$n(e,t,n,r,i,o,a,un);return s.length===0?"":s.map((l,c)=>`${c===0?"M":"L"} ${ln(l.x)} ${ln(l.y)}`).join(" ")}function $n(e,t,n,r,i,o,a,s){let l=[];for(let c=0;c<=s;c+=1){let u=o+(a-o)*c/s;l.push(jn(e,t,n,r,i,u))}return l}function jn(e,t,n,r,i,o){let a=n*Math.cos(o),s=r*Math.sin(o),l=xn(a,s,i);return{x:e+l.x,y:t+l.y}}function xn(e,t,n){let r=$t(n);return{x:e*Math.cos(r)-t*Math.sin(r),y:e*Math.sin(r)+t*Math.cos(r)}}function Pe(e,t,n,r){let i=n==="isometric"?cn*r:r;return{x:Math.cos(e)*t,y:Math.sin(e)*t*i}}function Qe(e,t,n){return t*1e3+e+n*.01}function M(e,t,n){return Math.min(Math.max(e,t),n)}function an(e,t,n){let r=e.get(t);r?r.push(n):e.set(t,[n])}function Y(e){return`wo-${e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"object"}`}function Oe(e){return`${Y(e)}-group`}function uo(e){return typeof e=="string"&&e.trim()?e:void 0}function fo(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 sn(e){return e.length>0?e[0].toUpperCase()+e.slice(1):e}function $t(e){return e*Math.PI/180}function ln(e){return Number.isInteger(e)?String(e):e.toFixed(2)}var Mn=86400,et=Mn*365.25,tt=18,Sn=180;function it(e,t={}){let n={width:t.width,height:t.height,padding:t.padding,preset:t.preset,projection:t.projection,camera:t.camera,scaleModel:t.scaleModel,bodyScaleMode:t.bodyScaleMode,activeEventId:t.activeEventId},r=N(e,n),i=go(r.layoutPreset,t.spatialScaleModel),o={x:r.contentBounds.centerX,y:r.contentBounds.centerY},a=new Map(r.objects.map(b=>[b.objectId,b])),s=new Map(r.orbitVisuals.map(b=>[b.objectId,b])),l=new Map;for(let b of r.objects){let x=b.object.placement;!x||x.mode!=="orbit"||l.set(b.objectId,xt(x))}let c=Math.min(...[...l.values()].filter(b=>Number.isFinite(b)&&b>0))||1,u=new Map,d=r.objects.map(b=>po(b,r,o,a,s,i,u,c)),p=new Map(d.map(b=>[b.objectId,b])),h=r.orbitVisuals.map(b=>mo(b,p,c,r.activeEventId!==null)),y=r.trajectories.map(b=>ho(b,p)),g=d.map(b=>({objectId:b.objectId,center:{...b.position},radius:b.visualRadius+i.focusPadding}));return{width:r.width,height:r.height,padding:r.padding,renderPreset:r.renderPreset,projection:r.projection,camera:r.camera,scaleModel:i,title:r.title,subtitle:r.subtitle,systemId:r.systemId,viewMode:"3d",layoutPreset:r.layoutPreset,metadata:{...r.metadata,"viewer.mode":"3d"},contentBounds:vo(d),semanticGroups:r.semanticGroups,viewpoints:r.viewpoints,activeEventId:r.activeEventId,timeFrozen:r.activeEventId!==null,objects:d,orbits:h,trajectories:y,focusTargets:g}}function po(e,t,n,r,i,o,a,s){let l=nt(e,t,n,r,i,a),c=St(e.object,i.get(e.objectId),s,t.activeEventId!==null);return{objectId:e.objectId,object:e.object,parentId:e.parentId,ancestorIds:e.ancestorIds.slice(),childIds:e.childIds.slice(),groupId:e.groupId,semanticGroupIds:e.semanticGroupIds.slice(),position:l,radius:he(e.radius*o.bodyRadiusMultiplier,o.minBodyRadius,o.maxBodyRadius),visualRadius:he(e.visualRadius*o.bodyRadiusMultiplier,o.minBodyRadius,o.maxBodyRadius+24),label:e.label,secondaryLabel:e.secondaryLabel,fillColor:e.fillColor,imageHref:e.imageHref,hidden:e.hidden,motion:c}}function mo(e,t,n,r){let i=t.get(e.objectId),o=t.get(e.parentId);return{objectId:e.objectId,object:e.object,parentId:e.parentId,groupId:e.groupId,semanticGroupIds:e.semanticGroupIds.slice(),center:o?.position??{x:0,y:0,z:0},kind:e.kind,radius:e.radius,semiMajor:e.radius??e.rx??0,semiMinor:e.radius??e.ry??0,rotationDeg:e.rotationDeg,inclinationDeg:i?.motion?.inclinationDeg??rt(e.object.placement?.mode==="orbit"?e.object.placement.inclination:void 0)??0,band:e.band,bandThickness:e.bandThickness,hidden:e.hidden,motion:i?.motion??St(e.object,e,n,r)}}function ho(e,t){let n=jo(e.path).map(r=>({x:r.x,y:0,z:r.y}));return{trajectoryId:e.trajectoryId,trajectory:e.trajectory,craftObjectId:e.craftObjectId,mode:e.mode,stroke:e.stroke,strokeWidth:e.strokeWidth,marker:e.marker,labelMode:e.labelMode,showWaypoints:e.showWaypoints,samples:n,waypoints:e.waypoints.map(r=>{let i=r.objectId?t.get(r.objectId)??null:null;return{trajectoryId:r.trajectoryId,segmentId:r.segmentId,maneuverId:r.maneuverId,objectId:r.objectId,position:i?{...i.position}:{x:r.x,y:0,z:r.y},label:r.label,dateLabel:r.dateLabel,hidden:r.hidden}}),hidden:e.hidden}}function nt(e,t,n,r,i,o){let a=o.get(e.objectId);if(a)return a;let s=e.object.placement,l;if(s?.mode==="orbit"&&e.parentId){let c=r.get(e.parentId),u=c?nt(c,t,n,r,i,o):{x:0,y:0,z:0},d=i.get(e.objectId),p=St(e.object,d,1,t.activeEventId!==null),h=p?bo(p,0):{x:(e.x-n.x)*.8,y:0,z:(e.y-n.y)*.8};l=Io(u,h)}else if(s?.mode==="surface"&&e.parentId){let c=r.get(e.parentId),u=c?nt(c,t,n,r,i,o):{x:0,y:0,z:0},d=c?.visualRadius??16,p=$o(e.objectId),h=p*Math.PI*2;l={x:u.x+Math.cos(h)*(d+e.visualRadius*.9),y:u.y+Math.sin(p*Math.PI)*Math.max(e.visualRadius*.2,2),z:u.z+Math.sin(h)*(d+e.visualRadius*.9)}}else if(s?.mode==="at"&&e.parentId){let c=r.get(e.parentId),u=c?nt(c,t,n,r,i,o):{x:0,y:0,z:0},d=e.anchorX??c?.x??n.x,p=e.anchorY??c?.y??n.y;l={x:u.x+(e.x-d),y:u.y,z:u.z+(e.y-p)}}else l={x:(e.x-n.x)*.8,y:0,z:(e.y-n.y)*.8};return o.set(e.objectId,l),l}function bo(e,t){let n=e.phase0Deg+e.angularVelocityDegPerSecond*t,r=jt(n),i=jt(e.rotationDeg),o=jt(e.inclinationDeg),a=Math.cos(r)*e.semiMajor,s=Math.sin(r)*e.semiMinor,l=a*Math.cos(i)-s*Math.sin(i),c=a*Math.sin(i)+s*Math.cos(i);return{x:l,y:c*Math.sin(o),z:c*Math.cos(o)}}function St(e,t,n,r){let i=e.placement;if(!i||i.mode!=="orbit")return null;let o=t?.radius??t?.rx??he(xt(i)*48,24,1200),a=t?.radius??t?.ry??o,s=yo(i.period),l=xt(i),c=he(l/Math.max(n,1e-4),1,20),u=he(s?tt*c:tt*Math.pow(c,.75),tt,Sn);return{phase0Deg:rt(i.phase)??0,rotationDeg:rt(i.angle)??t?.rotationDeg??0,inclinationDeg:rt(i.inclination)??0,semiMajor:o,semiMinor:a,eccentricity:i.eccentricity??0,periodSeconds:s,angularVelocityDegPerSecond:360/Math.max(u,.001),heuristic:s===null,frozen:r}}function xt(e){let t=kn(e.semiMajor)??kn(e.distance)??1;return Math.max(t,.01)}function kn(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/1495978707e-1;case"m":return e.value/149597870700;case"re":return e.value*6371/1495978707e-1;case"rj":return e.value*71492/1495978707e-1;case"sol":return e.value*695700/1495978707e-1;case"ly":return e.value*63241.077;case"pc":return e.value*206264.806;case"kpc":return e.value*206264806;default:return e.value}}function yo(e){if(!e)return null;switch(e.unit){case"s":return e.value;case"min":return e.value*60;case"h":return e.value*3600;case"d":return e.value*Mn;case"y":return e.value*et;case"ky":return e.value*et*1e3;case"my":return e.value*et*1e6;case"gy":return e.value*et*1e9;default:return null}}function rt(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function go(e,t){return{...wo(e),...t}}function wo(e){switch(e){case"compact":return{orbitDistanceMultiplier:.92,bodyRadiusMultiplier:.92,markerSizeMultiplier:.92,ringThicknessMultiplier:.9,focusPadding:10,minBodyRadius:4,maxBodyRadius:34};case"presentation":return{orbitDistanceMultiplier:1.15,bodyRadiusMultiplier:1.12,markerSizeMultiplier:1.08,ringThicknessMultiplier:1.14,focusPadding:16,minBodyRadius:5,maxBodyRadius:44};default:return{orbitDistanceMultiplier:1,bodyRadiusMultiplier:1,markerSizeMultiplier:1,ringThicknessMultiplier:1,focusPadding:12,minBodyRadius:4,maxBodyRadius:40}}}function vo(e){if(e.length===0)return{minX:0,minY:0,minZ:0,maxX:0,maxY:0,maxZ:0,width:0,height:0,depth:0,center:{x:0,y:0,z:0}};let t=Number.POSITIVE_INFINITY,n=Number.POSITIVE_INFINITY,r=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY,o=Number.NEGATIVE_INFINITY,a=Number.NEGATIVE_INFINITY;for(let s of e)t=Math.min(t,s.position.x-s.visualRadius),n=Math.min(n,s.position.y-s.visualRadius),r=Math.min(r,s.position.z-s.visualRadius),i=Math.max(i,s.position.x+s.visualRadius),o=Math.max(o,s.position.y+s.visualRadius),a=Math.max(a,s.position.z+s.visualRadius);return{minX:t,minY:n,minZ:r,maxX:i,maxY:o,maxZ:a,width:i-t,height:o-n,depth:a-r,center:{x:(t+i)/2,y:(n+o)/2,z:(r+a)/2}}}function Io(e,t){return{x:e.x+t.x,y:e.y+t.y,z:e.z+t.z}}function $o(e){let t=0;for(let n=0;n<e.length;n+=1)t=t*31+e.charCodeAt(n)>>>0;return t%1e4/1e4}function he(e,t,n){return Math.min(Math.max(e,t),n)}function jt(e){return e*Math.PI/180}function jo(e){let t=[...e.matchAll(/[MLQ]\s*(-?\d+(?:\.\d+)?)\s+(-?\d+(?:\.\d+)?)(?:\s+(-?\d+(?:\.\d+)?)\s+(-?\d+(?:\.\d+)?))?(?:\s+(-?\d+(?:\.\d+)?)\s+(-?\d+(?:\.\d+)?))?/g)];if(t.length===0)return[];let n=[];for(let r of t){let i=r[0][0];if(i==="M"||i==="L"){n.push({x:Number(r[1]),y:Number(r[2])});continue}i==="Q"&&(n.push({x:Number(r[1]),y:Number(r[2])}),n.push({x:Number(r[5]),y:Number(r[6])}))}return n}function kt(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:Ao(e.system),info:Lo(e.system)}:null,r=e.objects.map(xo);return Oo(r,e.events??[],t.activeEventId??null),{format:"worldorbit",version:"1.0",schemaVersion:e.version,theme:e.theme??null,system:n,groups:structuredClone(e.groups??[]),relations:structuredClone(e.relations??[]),events:e.events.map(So),trajectories:e.trajectories.map(Mo),objects:r}}function xo(e){return{...e,trajectoryId:e.trajectoryId??null,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:To(e.properties),placement:e.placement?structuredClone(e.placement):null,info:{...e.info}}}function So(e){return{...e,trajectoryId:e.trajectoryId??null,participantObjectIds:[...e.participantObjectIds],tags:[...e.tags],positions:e.positions.map(ko)}}function ko(e){return{objectId:e.objectId,placement:On(e.placement),trajectorySegmentId:e.trajectorySegmentId??null,trajectoryManeuverId:e.trajectoryManeuverId??null,inner:e.inner?{...e.inner}:void 0,outer:e.outer?{...e.outer}:void 0,epoch:e.epoch??null,referencePlane:e.referencePlane??null}}function Mo(e){return structuredClone(e)}function On(e){return e?structuredClone(e):null}function Oo(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])),o=new Set([...r.targetObjectId?[r.targetObjectId]:[],...r.participantObjectIds,...r.positions.map(a=>a.objectId)]);for(let a of o){let s=i.get(a);s&&(r.epoch&&(s.epoch=r.epoch),r.referencePlane&&(s.referencePlane=r.referencePlane))}for(let a of r.positions){let s=i.get(a.objectId);s&&(a.placement&&(s.placement=On(a.placement)),a.inner&&(s.properties.inner={...a.inner}),a.outer&&(s.properties.outer={...a.outer}),a.epoch&&(s.epoch=a.epoch),a.referencePlane&&(s.referencePlane=a.referencePlane))}}function To(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 Ao(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 Lo(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=Po(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 Po(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","trajectories","labels","metadata"])e[i]!==void 0&&t.push(e[i]?i:`-${i}`);return t.join(" ")}var Tn=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,Fo=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),Co=/^[A-Za-z][A-Za-z0-9+.-]*:/;function H(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function be(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function F(e,t,n){let r=e.match(Tn);if(!r)throw f.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let o=E(n);if(o?.unitFamily&&!Ne(o.unitFamily,i.unit))throw f.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function Mt(e){let t=e.match(Tn);return t?{value:Number(t[1]),unit:t[2]??null}:null}function ot(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw f.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function W(e,t,n){let r=Fo.get(e.toLowerCase());if(r===void 0)throw f.fromLocation(`Invalid boolean value "${e}" for "${t}"`,n);return r}function An(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw f.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 f.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 Vo(e,t){if(!e)throw f.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw f.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match(Co);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw f.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function Ln(e,t,n){let r=E(e);if(!r)throw f.fromLocation(`Unknown field "${e}"`,n);if(r.arity==="single"&&t.length!==1)throw f.fromLocation(`Field "${e}" expects exactly one value`,n);switch(r.kind){case"list":return t;case"boolean":return W(De(t,e,n),e,n);case"number":return ot(De(t,e,n),e,n);case"unit":return F(De(t,e,n),n,e);case"string":{let i=t.join(" ").trim();return e==="image"&&Vo(i,n),i}}}function Ot(e,t,n){let r=E(e);if(!r)throw f.fromLocation(`Unknown field "${e}"`,n);if(!r.objectTypes.includes(t))throw f.fromLocation(`Field "${e}" is not valid on "${t}"`,n)}function De(e,t,n){if(e.length!==1)throw f.fromLocation(`Field "${t}" expects exactly one value`,n);return e[0]}var Dn=new Set(["star","planet","moon","asteroid","comet"]),zo=332946.0487,Ro=1047.3486,at=1495978707e-1,Bo=6371,_o=695700,No=63241.077,Wo=206264.806,Uo=206264806;function st(e,t){let n=[],r=new Map(e.objects.map(l=>[l.id,l])),i=new Set(e.groups.map(l=>l.id)),o=new Set(e.events.map(l=>l.id)),a=new Map(e.trajectories.map(l=>[l.id,l]));e.system||n.push(w("validate.system.required","Atlas documents must declare exactly one system."));let s=new Map;for(let[l,c]of[["group",e.groups.map(u=>u.id)],["viewpoint",e.system?.viewpoints.map(u=>u.id)??[]],["annotation",e.system?.annotations.map(u=>u.id)??[]],["relation",e.relations.map(u=>u.id)],["event",e.events.map(u=>u.id)],["trajectory",e.trajectories.map(u=>u.id)],["object",e.objects.map(u=>u.id)]])for(let u of c){let d=s.get(u);d?n.push(w("validate.id.duplicate",`Duplicate ${l} id "${u}" already used by ${d}.`)):s.set(u,l)}for(let l of e.relations)Yo(l,r,n);for(let l of e.system?.viewpoints??[])Go(l,i,o,t,n,r);for(let l of e.objects)qo(l,e.system,r,i,a,n);for(let l of e.events)Xo(l,e.system,r,a,n);for(let l of e.trajectories)Ko(l,r,n);return n}function Yo(e,t,n){e.from?t.has(e.from)||n.push(w("validate.relation.from.unknown",`Unknown relation source "${e.from}" on "${e.id}".`)):n.push(w("validate.relation.from.required",`Relation "${e.id}" is missing a "from" target.`)),e.to?t.has(e.to)||n.push(w("validate.relation.to.unknown",`Unknown relation target "${e.to}" on "${e.id}".`)):n.push(w("validate.relation.to.required",`Relation "${e.id}" is missing a "to" target.`)),e.kind||n.push(w("validate.relation.kind.required",`Relation "${e.id}" is missing a "kind" value.`))}function Go(e,t,n,r,i,o){let a=e.filter;if(r==="2.1"||r==="2.5"||r==="2.6"){if(a)for(let s of a.groupIds)t.has(s)||i.push(k("validate.viewpoint.group.unknown",`Unknown group "${s}" in viewpoint "${e.id}".`,void 0,`viewpoint.${e.id}.groups`));for(let s of e.events??[])n.has(s)||i.push(k("validate.viewpoint.event.unknown",`Unknown event "${s}" in viewpoint "${e.id}".`,void 0,`viewpoint.${e.id}.events`))}ra(e.projection,i,`viewpoint.${e.id}.projection`,e.id),ia(e.camera,e.projection,e.rotationDeg,i,e.id,e.focusObjectId,e.selectedObjectId,a,o)}function qo(e,t,n,r,i,o){let a=e.placement,s=a?.mode==="orbit"?a:null,l=a?.mode==="orbit"?n.get(a.target)??null:null;if(e.groups)for(let c of e.groups)r.has(c)||o.push(k("validate.group.unknown",`Unknown group "${c}" on "${e.id}".`,e.id,"groups"));if(typeof e.epoch=="string"&&!e.epoch.trim()&&o.push(k("validate.epoch.empty",`Object "${e.id}" defines an empty epoch string.`,e.id,"epoch")),typeof e.referencePlane=="string"&&!e.referencePlane.trim()&&o.push(k("validate.referencePlane.empty",`Object "${e.id}" defines an empty reference plane string.`,e.id,"referencePlane")),e.trajectoryId&&(i.has(e.trajectoryId)?En(e)||o.push(w("validate.trajectory.object.invalidType",`Only craft or legacy ship-like structures may reference trajectories; found "${e.type}" on "${e.id}".`,e.id,"trajectory")):o.push(w("validate.trajectory.object.unknown",`Unknown trajectory "${e.trajectoryId}" on "${e.id}".`,e.id,"trajectory"))),s&&(n.has(s.target)||o.push(w("validate.orbit.target.unknown",`Unknown placement target "${s.target}" on "${e.id}".`,e.id,"orbit")),s.distance&&s.semiMajor&&o.push(w("validate.orbit.distanceConflict",`Object "${e.id}" cannot declare both "distance" and "semiMajor".`,e.id,"distance")),s.phase&&!e.epoch&&!t?.epoch&&o.push(k("validate.phase.epochMissing",`Object "${e.id}" sets "phase" without an object or system epoch.`,e.id,"phase")),s.inclination&&!e.referencePlane&&!t?.referencePlane&&o.push(k("validate.inclination.referencePlaneMissing",`Object "${e.id}" sets "inclination" without an object or system reference plane.`,e.id,"inclination")),s.period&&!At(l?.properties.mass)&&o.push(k("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?Dn.has(c.type)||o.push(w("validate.surface.target.invalid",`Surface target "${a.target}" on "${e.id}" is not surface-capable.`,e.id,"surface")):o.push(w("validate.surface.target.unknown",`Unknown placement target "${a.target}" on "${e.id}".`,e.id,"surface"))}if(a?.mode==="at"&&(e.type!=="craft"&&e.type!=="structure"&&e.type!=="phenomenon"&&o.push(w("validate.at.objectType",`Only craft, structures, and phenomena may use "at" placement; found "${e.type}" on "${e.id}".`,e.id,"at")),ta(e,n,o)||o.push(w("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)&&o.push(k("validate.resonance.orbitMismatch",`Resonance target "${e.resonance.targetObjectId}" on "${e.id}" does not share a compatible orbital parent.`,e.id,"resonance")):o.push(w("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"){o.push(k("validate.derive.unsupported",`Unsupported derive rule "${c.field} ${c.strategy}" on "${e.id}".`,e.id,"derive"));continue}let u=Pn(e,l);if(u===null){o.push(k("validate.derive.inputsMissing",`Object "${e.id}" requests "derive period kepler" but lacks enough input data.`,e.id,"derive"));continue}s?.period||o.push(Tt("validate.derive.period.available",`Object "${e.id}" can derive a Kepler period of ${la(u)}.`,e.id,"derive"))}for(let c of e.validationRules??[]){if(c.rule!=="kepler"){o.push(k("validate.rule.unsupported",`Unsupported validation rule "${c.rule}" on "${e.id}".`,e.id,"validate"));continue}let u=Fn(s?.period),d=Pn(e,l);if(u===null||d===null)continue;let p=sa(e,"period");Math.abs(u-d)>p&&o.push(w("validate.kepler.mismatch",`Object "${e.id}" fails Kepler validation for "period".`,e.id,"validate"))}}function Xo(e,t,n,r,i){let o=`event.${e.id}`,a=new Set;e.kind.trim()||i.push(w("validate.event.kind.required",`Event "${e.id}" is missing a "kind" value.`,void 0,`${o}.kind`)),typeof e.epoch=="string"&&!e.epoch.trim()&&i.push(k("validate.event.epoch.empty",`Event "${e.id}" defines an empty epoch string.`,void 0,`${o}.epoch`)),typeof e.referencePlane=="string"&&!e.referencePlane.trim()&&i.push(k("validate.event.referencePlane.empty",`Event "${e.id}" defines an empty reference plane string.`,void 0,`${o}.referencePlane`)),e.trajectoryId&&!r.has(e.trajectoryId)&&i.push(w("validate.event.trajectory.unknown",`Unknown trajectory "${e.trajectoryId}" on event "${e.id}".`,void 0,`${o}.trajectory`)),!e.targetObjectId&&e.participantObjectIds.length===0&&i.push(w("validate.event.references.required",`Event "${e.id}" must define a "target" or at least one participant.`,void 0,`${o}.participants`)),e.targetObjectId&&(a.add(e.targetObjectId),n.has(e.targetObjectId)||i.push(w("validate.event.target.unknown",`Unknown event target "${e.targetObjectId}" on "${e.id}".`,void 0,`${o}.target`)));let s=new Set;for(let u of e.participantObjectIds){if(a.add(u),s.has(u)){i.push(k("validate.event.participants.duplicate",`Event "${e.id}" repeats participant "${u}".`,void 0,`${o}.participants`));continue}s.add(u),n.has(u)||i.push(w("validate.event.participants.unknown",`Unknown event participant "${u}" on "${e.id}".`,void 0,`${o}.participants`))}e.targetObjectId&&e.participantObjectIds.length>0&&!e.participantObjectIds.includes(e.targetObjectId)&&i.push(k("validate.event.target.notParticipant",`Event "${e.id}" defines a target outside its participants list.`,void 0,`${o}.target`)),e.positions.length===0&&i.push(k("validate.event.positions.missing",`Event "${e.id}" has no positions block and cannot drive a scene snapshot.`,void 0,`${o}.positions`)),/(?:^|[-_])(solar-eclipse|lunar-eclipse|transit|occultation)(?:$|[-_])/.test(e.kind)&&a.size<3&&i.push(k("validate.event.kind.participants",`Event "${e.id}" looks like an eclipse or transit but references fewer than three bodies.`,void 0,`${o}.participants`));let l=new Set;for(let u of e.positions){let d=`${o}.pose.${u.objectId}`;if(l.has(u.objectId)){i.push(w("validate.event.pose.duplicate",`Event "${e.id}" defines "${u.objectId}" more than once in positions.`,void 0,d));continue}l.add(u.objectId);let p=n.get(u.objectId);if(!p){i.push(w("validate.event.pose.object.unknown",`Unknown event pose object "${u.objectId}" on "${e.id}".`,void 0,d));continue}a.has(u.objectId)||i.push(k("validate.event.pose.unreferenced",`Event pose "${u.objectId}" on "${e.id}" is not listed in target/participants.`,void 0,d)),Ho(u,p,e,t,n,r,i,d,e.id)}let c=[...a].filter(u=>!l.has(u));e.positions.length>0&&c.length>0&&i.push(k("validate.event.positions.partial",`Event "${e.id}" leaves ${c.length} referenced object(s) on their base placement.`,void 0,`${o}.positions`))}function Ho(e,t,n,r,i,o,a,s,l){let c=e.placement;if(!c){a.push(w("validate.event.pose.placement.required",`Event "${l}" pose "${e.objectId}" is missing a placement mode.`,void 0,s));return}if(e.trajectorySegmentId&&!Qo(o,e.trajectorySegmentId)&&a.push(w("validate.event.pose.segment.unknown",`Unknown trajectory segment "${e.trajectorySegmentId}" on "${l}:${e.objectId}".`,void 0,`${s}.segment`)),e.trajectoryManeuverId&&!ea(o,e.trajectoryManeuverId)&&a.push(w("validate.event.pose.maneuver.unknown",`Unknown trajectory maneuver "${e.trajectoryManeuverId}" on "${l}:${e.objectId}".`,void 0,`${s}.maneuver`)),c.mode==="orbit"){i.has(c.target)||a.push(w("validate.event.pose.orbit.target.unknown",`Unknown event orbit target "${c.target}" on "${l}:${e.objectId}".`,void 0,`${s}.orbit`)),c.distance&&c.semiMajor&&a.push(w("validate.event.pose.orbit.distanceConflict",`Event "${l}" pose "${e.objectId}" cannot declare both "distance" and "semiMajor".`,void 0,`${s}.distance`)),c.phase&&!oa(r,t,n,e)&&a.push(k("validate.event.pose.phase.epochMissing",`Event "${l}" pose "${e.objectId}" sets "phase" without an effective epoch.`,void 0,`${s}.phase`)),c.inclination&&!aa(r,t,n,e)&&a.push(k("validate.event.pose.inclination.referencePlaneMissing",`Event "${l}" pose "${e.objectId}" sets "inclination" without an effective reference plane.`,void 0,`${s}.inclination`)),c.period&&!At(i.get(c.target)?.properties.mass)&&a.push(k("validate.event.pose.period.massMissing",`Event "${l}" pose "${e.objectId}" sets "period" but its central mass cannot be derived.`,void 0,`${s}.period`));return}if(c.mode==="surface"){let u=i.get(c.target);u?Dn.has(u.type)||a.push(w("validate.event.pose.surface.target.invalid",`Event surface target "${c.target}" on "${l}:${e.objectId}" is not surface-capable.`,void 0,`${s}.surface`)):a.push(w("validate.event.pose.surface.target.unknown",`Unknown event surface target "${c.target}" on "${l}:${e.objectId}".`,void 0,`${s}.surface`));return}if(c.mode==="at"){t.type!=="craft"&&t.type!=="structure"&&t.type!=="phenomenon"&&a.push(w("validate.event.pose.at.objectType",`Only craft, structures, and phenomena may use "at" placement in events; found "${t.type}" on "${l}:${e.objectId}".`,void 0,`${s}.at`));let u=c.reference;u.kind==="named"&&!i.has(u.name)?a.push(w("validate.event.pose.at.target.unknown",`Unknown event at-reference target "${c.target}" on "${l}:${e.objectId}".`,void 0,`${s}.at`)):u.kind==="anchor"&&!i.has(u.objectId)?a.push(w("validate.event.pose.anchor.target.unknown",`Unknown event anchor target "${u.objectId}" on "${l}:${e.objectId}".`,void 0,`${s}.at`)):u.kind==="lagrange"&&(i.has(u.primary)?u.secondary&&!i.has(u.secondary)&&a.push(w("validate.event.pose.lagrange.secondary.unknown",`Unknown event Lagrange target "${u.secondary}" on "${l}:${e.objectId}".`,void 0,`${s}.at`)):a.push(w("validate.event.pose.lagrange.primary.unknown",`Unknown event Lagrange target "${u.primary}" on "${l}:${e.objectId}".`,void 0,`${s}.at`)))}}function Ko(e,t,n){if(e.craftObjectId){let r=t.get(e.craftObjectId);r?En(r)||n.push(w("validate.trajectory.craft.invalidType",`Trajectory "${e.id}" targets "${e.craftObjectId}", which is not craft-like.`,void 0,`trajectory.${e.id}.craft`)):n.push(w("validate.trajectory.craft.unknown",`Unknown craft "${e.craftObjectId}" on trajectory "${e.id}".`,void 0,`trajectory.${e.id}.craft`))}for(let r of e.segments)Zo(e.id,r,t,n)}function Zo(e,t,n,r){let i=`trajectory.${e}.segment.${t.id}`;for(let[o,a]of[["from",t.fromObjectId],["to",t.toObjectId],["around",t.aroundObjectId]])a&&!n.has(a)&&r.push(w(`validate.trajectory.segment.${o}.unknown`,`Unknown ${o} object "${a}" on trajectory "${e}" segment "${t.id}".`,void 0,`${i}.${o}`));t.assist?.objectId&&!n.has(t.assist.objectId)&&r.push(w("validate.trajectory.segment.assist.unknown",`Unknown assist object "${t.assist.objectId}" on trajectory "${e}" segment "${t.id}".`,void 0,`${i}.assist`)),t.kind==="flyby"&&!t.assist?.objectId&&r.push(w("validate.trajectory.segment.assist.required",`Trajectory "${e}" segment "${t.id}" is a flyby and requires an "assist" object.`,void 0,`${i}.assist`)),(t.kind==="capture"||t.kind==="departure")&&!t.toObjectId&&!t.aroundObjectId&&r.push(w("validate.trajectory.segment.target.required",`Trajectory "${e}" segment "${t.id}" requires a target reference.`,void 0,`${i}.to`));for(let o of t.maneuvers)Jo(e,t.id,o,r)}function Jo(e,t,n,r){n.kind.trim()||r.push(w("validate.trajectory.maneuver.kind.required",`Trajectory "${e}" segment "${t}" maneuver "${n.id}" is missing a kind.`,void 0,`trajectory.${e}.segment.${t}.maneuver.${n.id}.kind`))}function En(e){if(e.type==="craft")return!0;if(e.type!=="structure")return!1;let t=typeof e.properties.kind=="string"?e.properties.kind.toLowerCase():"";return t==="ship"||t==="probe"||t==="station"}function Qo(e,t){for(let n of e.values()){let r=n.segments.find(i=>i.id===t);if(r)return r}return null}function ea(e,t){for(let n of e.values())for(let r of n.segments){let i=r.maneuvers.find(o=>o.id===t);if(i)return i}return null}function ta(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(w("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(w("validate.lagrange.secondary.unknown",`Unknown Lagrange reference "${r.secondary}" on "${e.id}".`,e.id,"at")),!1):!0:(n.push(w("validate.lagrange.primary.unknown",`Unknown Lagrange reference "${r.primary}" on "${e.id}".`,e.id,"at")),!1):!0}function Pn(e,t){let n=e.placement;if(!n||n.mode!=="orbit")return null;let r=na(n.semiMajor??n.distance),i=At(t?.properties.mass);return r===null||i===null||i<=0?null:Math.sqrt(r**3/i)*365.25}function na(e){if(!e)return null;switch(e.unit){case null:case"au":return e.value;case"km":return e.value/at;case"m":return e.value/(at*1e3);case"ly":return e.value*No;case"pc":return e.value*Wo;case"kpc":return e.value*Uo;case"re":return e.value*Bo/at;case"sol":return e.value*_o/at;default:return null}}function At(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/zo;case"mj":return t.value/Ro;default:return null}}function Fn(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 ra(e,t,n,r){e!=="topdown"&&e!=="isometric"&&e!=="orthographic"&&e!=="perspective"&&t.push(w("validate.viewpoint.projection.invalid",`Unknown projection "${String(e)}" in viewpoint "${r}".`,void 0,n))}function ia(e,t,n,r,i,o,a,s,l){if(!e)return;let c=`viewpoint.${i}.camera`;for(let[d,p]of[["azimuth",e.azimuth],["elevation",e.elevation],["roll",e.roll],["distance",e.distance]])p!==null&&(!Number.isFinite(p)||d==="distance"&&p<=0)&&r.push(w("validate.viewpoint.camera.invalid",`Invalid camera ${d} "${String(p)}" in viewpoint "${i}".`,void 0,`${c}.${d}`));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,`${c}.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,c)),t==="isometric"&&e.elevation!==null&&r.push(Tt("validate.viewpoint.camera.isometricStored",`Camera elevation on isometric viewpoint "${i}" is preserved semantically for future 3D rendering.`,void 0,`${c}.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,`${c}.azimuth`)),o!==null&&l.has(o)||a!==null&&l.has(a)||s||r.push(Tt("validate.viewpoint.camera.anchorMissing",`Viewpoint "${i}" stores camera settings without a focus object, selection, or filter anchor.`,void 0,c))}function oa(e,t,n,r){return ee(r?.epoch)??ee(n?.epoch)??ee(t.epoch)??ee(e?.epoch)??null}function aa(e,t,n,r){return ee(r?.referencePlane)??ee(n?.referencePlane)??ee(t.referencePlane)??ee(e?.referencePlane)??null}function ee(e){return typeof e=="string"&&e.trim()?e.trim():null}function sa(e,t){let n=e.tolerances?.find(r=>r.field===t)?.value;return typeof n=="number"?n:n&&typeof n=="object"&&"value"in n?Fn(n)??0:0}function la(e){return`${Math.round(e*100)/100}d`}function w(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 Tt(e,t,n,r){return{code:e,severity:"info",source:"validate",message:t,objectId:n,field:r}}var ca=new Set(["climate","habitability","settlement"]),ua=new Set(["departure","transfer","flyby","capture","stationkeeping","escape"]),lt=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","trajectory"]){let t=E(e);t&<.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},{key:"trajectory",inlineMode:"single",allowRepeat:!1}])lt.set(e.key,{key:e.key,version:e.key==="trajectory"?"3.0":"2.1",inlineMode:e.inlineMode,allowRepeat:e.allowRepeat});var da=new Set(lt.keys()),Vn=new Set(["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","inner","outer","epoch","referencePlane","segment","maneuver"]);function Lt(e){return fa(e)}function fa(e,t){let n=ns(e),r=n.source.split(/\r?\n/),i=[],o=!1,a="2.0",s=null,l=null,c=[],u=[],d=[],p=[],h=[],y=new Map,g=!1,b=!1,x=new Set,j=new Set,m=new Set,S=new Set,G=new Set,D=new Set;for(let T=0;T<r.length;T++){let ae=r[T],q=T+1;if(!ae.trim())continue;let P=We(ae),X=$e(ae.slice(P),{line:q,columnOffset:P});if(X.length!==0){if(!o){a=pa(X,q),o=!0,n.comments.length>0&&ge(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(P===0){l=ma(X,q,a,i,s,c,u,d,p,h,y,x,j,m,S,G,D,{sawDefaults:g,sawAtlas:b}),l.kind==="system"?s=l.system:l.kind==="defaults"?g=!0:l.kind==="atlas"&&(b=!0);continue}if(!l)throw new f("Indented line without parent atlas section",q,P+1);ja(l,P,X,q)}}if(!o)throw new f('Missing required atlas schema header "schema 2.0", "schema 3.0", or "schema 3.1"');let re=c.map(T=>Ya(T,a,i)),ie=p.map(T=>Ga(T,y.get(T.id)??[])),fe=t??(a==="2.0-draft"?"2.0":a),ve={format:"worldorbit",sourceVersion:"1.0",theme:null,system:s,groups:u,relations:d,events:ie,trajectories:h,objects:re,diagnostics:i};if(fe==="2.0-draft"){let T={...ve,version:"2.0-draft",schemaVersion:"2.0-draft"};return T.diagnostics.push(...st(T,a)),T}let oe={...ve,version:fe,schemaVersion:fe};return a==="2.0-draft"&&oe.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".'}),oe.diagnostics.push(...st(oe,a)),oe}function pa(e,t){if(e.length!==2||e[0].value.toLowerCase()!=="schema"||!["2.0-draft","2.0","2.1","2.5","2.6","3.0","3.1"].includes(e[1].value.toLowerCase()))throw new f('Expected atlas header "schema 2.0", "schema 2.1", "schema 2.5", "schema 2.6", "schema 3.0", "schema 3.1", or legacy "schema 2.0-draft"',t,e[0]?.column??1);let n=e[1].value.toLowerCase();return n==="2.6"?"2.6":n==="3.0"?"3.0":n==="3.1"?"3.1":n==="2.5"?"2.5":n==="2.1"?"2.1":n==="2.0-draft"?"2.0-draft":"2.0"}function ma(e,t,n,r,i,o,a,s,l,c,u,d,p,h,y,g,b,x){switch(e[0]?.value.toLowerCase()){case"system":if(i)throw new f('Atlas section "system" may only appear once',t,e[0].column);return ha(e,t,n,r);case"defaults":if(!i)throw new f('Atlas section "defaults" requires a preceding system declaration',t,e[0].column);if(x.sawDefaults)throw new f('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 f('Atlas section "atlas" requires a preceding system declaration',t,e[0].column);if(x.sawAtlas)throw new f('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 f('Atlas section "viewpoint" requires a preceding system declaration',t,e[0].column);return ba(e,t,i,d,n,r);case"annotation":if(!i)throw new f('Atlas section "annotation" requires a preceding system declaration',t,e[0].column);return ya(e,t,i,p);case"group":return B(n,r,"group",{line:t,column:e[0].column}),ga(e,t,a,h);case"relation":return B(n,r,"relation",{line:t,column:e[0].column}),wa(e,t,s,y);case"event":return B(n,r,"event",{line:t,column:e[0].column}),va(e,t,l,u,g,n,r);case"trajectory":return ye(n,r,"trajectory",{line:t,column:e[0].column}),Ia(e,t,c,b,n,r);case"object":return $a(e,t,n,r,o);default:throw new f(`Unknown atlas section "${e[0]?.value??""}"`,t,e[0]?.column??1)}}function ha(e,t,n,r){if(e.length!==2)throw new f("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 ba(e,t,n,r,i,o){if(e.length!==2)throw new f("Invalid viewpoint declaration",t,e[0]?.column??1);let a=H(e[1].value);if(!a)throw new f("Viewpoint id must not be empty",t,e[1].column);if(r.has(a))throw new f(`Duplicate viewpoint id "${a}"`,t,e[1].column);let s={id:a,label:be(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(s),r.add(a),{kind:"viewpoint",viewpoint:s,sourceSchemaVersion:i,diagnostics:o,seenFields:new Set,inFilter:!1,filterIndent:null,seenFilterFields:new Set,inCamera:!1,cameraIndent:null,seenCameraFields:new Set}}function ya(e,t,n,r){if(e.length!==2)throw new f("Invalid annotation declaration",t,e[0]?.column??1);let i=H(e[1].value);if(!i)throw new f("Annotation id must not be empty",t,e[1].column);if(r.has(i))throw new f(`Duplicate annotation id "${i}"`,t,e[1].column);let o={id:i,label:be(i),targetObjectId:null,body:"",tags:[],sourceObjectId:null};return n.annotations.push(o),r.add(i),{kind:"annotation",annotation:o,seenFields:new Set}}function ga(e,t,n,r){if(e.length!==2)throw new f("Invalid group declaration",t,e[0]?.column??1);let i=H(e[1].value);if(!i)throw new f("Group id must not be empty",t,e[1].column);if(r.has(i))throw new f(`Duplicate group id "${i}"`,t,e[1].column);let o={id:i,label:be(i),summary:"",color:null,tags:[],hidden:!1};return n.push(o),r.add(i),{kind:"group",group:o,seenFields:new Set}}function wa(e,t,n,r){if(e.length!==2)throw new f("Invalid relation declaration",t,e[0]?.column??1);let i=H(e[1].value);if(!i)throw new f("Relation id must not be empty",t,e[1].column);if(r.has(i))throw new f(`Duplicate relation id "${i}"`,t,e[1].column);let o={id:i,from:"",to:"",kind:"",label:null,summary:null,tags:[],color:null,hidden:!1};return n.push(o),r.add(i),{kind:"relation",relation:o,seenFields:new Set}}function va(e,t,n,r,i,o,a){if(e.length!==2)throw new f("Invalid event declaration",t,e[0]?.column??1);let s=H(e[1].value);if(!s)throw new f("Event id must not be empty",t,e[1].column);if(i.has(s))throw new f(`Duplicate event id "${s}"`,t,e[1].column);let l={id:s,kind:"",label:be(s),summary:null,targetObjectId:null,participantObjectIds:[],timing:null,visibility:null,epoch:null,referencePlane:null,tags:[],color:null,hidden:!1,positions:[]},c=[];return n.push(l),r.set(s,c),i.add(s),{kind:"event",event:l,sourceSchemaVersion:o,diagnostics:a,seenFields:new Set,rawPoses:c,inPositions:!1,positionsIndent:null,activePose:null,poseIndent:null,activePoseSeenFields:new Set}}function Ia(e,t,n,r,i,o){if(e.length!==2)throw new f("Invalid trajectory declaration",t,e[0]?.column??1);let a=H(e[1].value);if(!a)throw new f("Trajectory id must not be empty",t,e[1].column);if(r.has(a))throw new f(`Duplicate trajectory id "${a}"`,t,e[1].column);let s={id:a,label:be(a),summary:null,craftObjectId:null,tags:[],color:null,renderMode:null,stroke:null,strokeWidth:null,marker:null,labelMode:null,showWaypoints:null,hidden:!1,segments:[]};return n.push(s),r.add(a),{kind:"trajectory",trajectory:s,sourceSchemaVersion:i,diagnostics:o,seenFields:new Set,inSegment:!1,segmentIndent:null,activeSegment:null,activeSegmentSeenFields:new Set,inManeuver:!1,maneuverIndent:null,activeManeuver:null,activeManeuverSeenFields:new Set}}function $a(e,t,n,r,i){if(e.length<3)throw new f("Invalid atlas object declaration",t,e[0]?.column??1);let o=e[1],a=e[2],s=o.value;if(!_e.has(s)||s==="system")throw new f(`Unknown object type "${o.value}"`,t,o.column);let l={objectType:s,id:a.value,fields:Wa(e.slice(3),t,s,n,r),infoEntries:[],typedBlockEntries:{},location:{line:t,column:o.column}};return i.push(l),{kind:"object",objectNode:l,sourceSchemaVersion:n,diagnostics:r,activeBlock:null,blockIndent:null,seenInfoKeys:new Set,seenTypedBlockKeys:{}}}function ja(e,t,n,r){switch(e.kind){case"system":xa(e,n,r);return;case"defaults":Sa(e,n,r);return;case"atlas":ka(e,t,n,r);return;case"viewpoint":Ma(e,t,n,r);return;case"annotation":Aa(e,n,r);return;case"group":La(e,n,r);return;case"relation":Pa(e,n,r);return;case"event":Da(e,t,n,r);return;case"trajectory":Ea(e,t,n,r);return;case"object":za(e,t,n,r);return}}function xa(e,t,n){let r=_(t,e.seenFields,n),i=$(t,n);switch(r){case"title":e.system.title=i;return;case"description":B(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.description=i;return;case"epoch":B(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.epoch=i;return;case"referenceplane":B(e.sourceSchemaVersion,e.diagnostics,"referencePlane",{line:n,column:t[0].column}),e.system.referencePlane=i;return;default:throw new f(`Unknown system atlas field "${t[0].value}"`,n,t[0].column)}}function Sa(e,t,n){let r=_(t,e.seenFields,n),i=$(t,n);switch(r){case"view":Rn(i)&&ue(e.sourceSchemaVersion,e.diagnostics,"defaults.view",{line:n,column:t[0].column}),e.system.defaults.view=zn(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=Bn(i,n,t[0].column);return;case"theme":e.system.defaults.theme=i;return;default:throw new f(`Unknown defaults field "${t[0].value}"`,n,t[0].column)}}function ka(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 f(`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 f(`Unknown atlas field "${n[0].value}"`,r,n[0].column)}function Ma(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){Oa(e,n,r);return}if(e.inFilter){Ta(e,n,r);return}if(n.length===1&&n[0].value.toLowerCase()==="camera"){if(ue(e.sourceSchemaVersion,e.diagnostics,"viewpoint.camera",{line:r,column:n[0].column}),e.seenFields.has("camera"))throw new f('Duplicate viewpoint field "camera"',r,n[0].column);e.seenFields.add("camera"),e.inCamera=!0,e.cameraIndent=t,e.viewpoint.camera=e.viewpoint.camera??Pt();return}if(n.length===1&&n[0].value.toLowerCase()==="filter"){if(e.seenFields.has("filter"))throw new f('Duplicate viewpoint field "filter"',r,n[0].column);e.seenFields.add("filter"),e.inFilter=!0,e.filterIndent=t;return}let i=_(n,e.seenFields,r),o=$(n,r);switch(i){case"label":e.viewpoint.label=o;return;case"summary":e.viewpoint.summary=o;return;case"focus":e.viewpoint.focusObjectId=o;return;case"select":e.viewpoint.selectedObjectId=o;return;case"projection":Rn(o)&&ue(e.sourceSchemaVersion,e.diagnostics,"projection",{line:r,column:n[0].column}),e.viewpoint.projection=zn(o,r,n[0].column);return;case"preset":e.viewpoint.preset=Bn(o,r,n[0].column);return;case"zoom":e.viewpoint.zoom=Ee(o,r,n[0].column,"zoom");return;case"rotation":e.viewpoint.rotationDeg=ne(o,r,n[0].column,"rotation");return;case"camera":ue(e.sourceSchemaVersion,e.diagnostics,"viewpoint.camera",{line:r,column:n[0].column}),e.viewpoint.camera=Na(n.slice(1),r,e.viewpoint.camera);return;case"layers":e.viewpoint.layers=Ba(n.slice(1),r,e.sourceSchemaVersion,e.diagnostics);return;case"events":B(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 f(`Unknown viewpoint field "${n[0].value}"`,r,n[0].column)}}function Oa(e,t,n){let r=_(t,e.seenCameraFields,n),i=$(t,n),o=e.viewpoint.camera??Pt();switch(r){case"azimuth":o.azimuth=ne(i,n,t[0].column,"camera.azimuth");break;case"elevation":o.elevation=ne(i,n,t[0].column,"camera.elevation");break;case"roll":o.roll=ne(i,n,t[0].column,"camera.roll");break;case"distance":o.distance=Ee(i,n,t[0].column,"camera.distance");break;default:throw new f(`Unknown viewpoint camera field "${t[0].value}"`,n,t[0].column)}e.viewpoint.camera=o}function Ta(e,t,n){let r=_(t,e.seenFilterFields,n),i=e.viewpoint.filter??_a();switch(r){case"query":i.query=$(t,n);break;case"objecttypes":i.objectTypes=Ra(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 f(`Unknown viewpoint filter field "${t[0].value}"`,n,t[0].column)}e.viewpoint.filter=i}function Aa(e,t,n){switch(_(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 f(`Unknown annotation field "${t[0].value}"`,n,t[0].column)}}function La(e,t,n){switch(_(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=W($(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new f(`Unknown group field "${t[0].value}"`,n,t[0].column)}}function Pa(e,t,n){switch(_(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=W($(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new f(`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")&&ue(e.sourceSchemaVersion,e.diagnostics,`pose.${n[0].value}`,{line:r,column:n[0]?.column??1}),(n[0]?.value==="segment"||n[0]?.value==="maneuver")&&ye(e.sourceSchemaVersion,e.diagnostics,`pose.${n[0].value}`,{line:r,column:n[0]?.column??1}),e.activePose.fields.push(Va(n,r,e.activePoseSeenFields));return}if(e.inPositions){if(n.length!==2||n[0].value.toLowerCase()!=="pose")throw new f(`Unknown event positions field "${n[0].value}"`,r,n[0]?.column??1);let o=n[1].value;if(!o.trim())throw new f("Event pose object id must not be empty",r,n[1].column);let a={objectId:o,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 f('Duplicate event field "positions"',r,n[0].column);e.seenFields.add("positions"),e.inPositions=!0,e.positionsIndent=t;return}switch(_(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"trajectory":ye(e.sourceSchemaVersion,e.diagnostics,"event.trajectory",{line:r,column:n[0].column}),e.event.trajectoryId=$(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":ue(e.sourceSchemaVersion,e.diagnostics,"event.epoch",{line:r,column:n[0].column}),e.event.epoch=$(n,r);return;case"referenceplane":ue(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=W($(n,r),"hidden",{line:r,column:n[0].column});return;default:throw new f(`Unknown event field "${n[0].value}"`,r,n[0].column)}}function Ea(e,t,n,r){if(e.activeManeuver&&t<=(e.maneuverIndent??0)&&(e.activeManeuver=null,e.maneuverIndent=null,e.activeManeuverSeenFields.clear(),e.inManeuver=!1),e.activeSegment&&t<=(e.segmentIndent??0)&&(e.activeSegment=null,e.segmentIndent=null,e.activeSegmentSeenFields.clear(),e.inSegment=!1),e.activeManeuver){Ca(e,n,r);return}if(e.activeSegment){if(n[0]?.value.toLowerCase()==="maneuver"){if(n.length!==2)throw new f("Invalid trajectory maneuver declaration",r,n[0]?.column??1);let a=H(n[1].value);if(!a)throw new f("Trajectory maneuver id must not be empty",r,n[1].column);if(e.activeSegment.maneuvers.some(l=>l.id===a))throw new f(`Duplicate trajectory maneuver id "${a}"`,r,n[1].column);let s={id:a,kind:"burn",label:null,epoch:null,notes:[]};e.activeSegment.maneuvers.push(s),e.activeManeuver=s,e.inManeuver=!0,e.maneuverIndent=t,e.activeManeuverSeenFields=new Set;return}Fa(e,n,r);return}if(n[0]?.value.toLowerCase()==="segment"){if(n.length!==2)throw new f("Invalid trajectory segment declaration",r,n[0]?.column??1);let a=H(n[1].value);if(!a)throw new f("Trajectory segment id must not be empty",r,n[1].column);if(e.trajectory.segments.some(l=>l.id===a))throw new f(`Duplicate trajectory segment id "${a}"`,r,n[1].column);let s={id:a,kind:"transfer",label:null,summary:null,fromObjectId:null,toObjectId:null,aroundObjectId:null,assist:null,epoch:null,waypointLabel:null,waypointDate:null,renderHidden:null,sampleDensity:null,notes:[],maneuvers:[]};e.trajectory.segments.push(s),e.activeSegment={id:a,fields:[],maneuvers:s.maneuvers,assist:null,location:{line:r,column:n[0].column}},e.inSegment=!0,e.segmentIndent=t,e.activeSegmentSeenFields=new Set;return}let i=_(n,e.seenFields,r),o=$(n,r);switch(i){case"label":e.trajectory.label=o;return;case"summary":e.trajectory.summary=o;return;case"craft":e.trajectory.craftObjectId=o;return;case"tags":e.trajectory.tags=C(n.slice(1),r,"tags");return;case"color":e.trajectory.color=o;return;case"rendermode":if(R(e.sourceSchemaVersion,e.diagnostics,"trajectory.renderMode",{line:r,column:n[0].column}),o!=="illustrative"&&o!=="solver"&&o!=="auto")throw new f(`Unknown trajectory render mode "${o}"`,r,n[0].column);e.trajectory.renderMode=o;return;case"stroke":R(e.sourceSchemaVersion,e.diagnostics,"trajectory.stroke",{line:r,column:n[0].column}),e.trajectory.stroke=o;return;case"strokewidth":R(e.sourceSchemaVersion,e.diagnostics,"trajectory.strokeWidth",{line:r,column:n[0].column}),e.trajectory.strokeWidth=Ee(o,r,n[0].column,"strokeWidth");return;case"marker":R(e.sourceSchemaVersion,e.diagnostics,"trajectory.marker",{line:r,column:n[0].column}),e.trajectory.marker=o;return;case"labelmode":R(e.sourceSchemaVersion,e.diagnostics,"trajectory.labelMode",{line:r,column:n[0].column}),e.trajectory.labelMode=o;return;case"showwaypoints":R(e.sourceSchemaVersion,e.diagnostics,"trajectory.showWaypoints",{line:r,column:n[0].column}),e.trajectory.showWaypoints=W(o,"showWaypoints",{line:r,column:n[0].column});return;case"hidden":e.trajectory.hidden=W(o,"hidden",{line:r,column:n[0].column});return;default:throw new f(`Unknown trajectory field "${n[0].value}"`,r,n[0].column)}}function Fa(e,t,n){let r=e.activeSegment;if(!r)return;let i=_(t,e.activeSegmentSeenFields,n),o=$(t,n),a=e.trajectory.segments.find(s=>s.id===r.id);switch(i){case"kind":{let s=o.toLowerCase();if(!ua.has(s))throw new f(`Unknown trajectory segment kind "${o}"`,n,t[0].column);a.kind=s;return}case"label":a.label=o;return;case"summary":a.summary=o;return;case"from":a.fromObjectId=o;return;case"to":a.toObjectId=o;return;case"around":a.aroundObjectId=o;return;case"assist":a.assist={objectId:o,notes:[]};return;case"epoch":a.epoch=o;return;case"periapsis":a.periapsis=F(o,{line:n,column:t[0].column},"periapsis");return;case"apoapsis":a.apoapsis=F(o,{line:n,column:t[0].column},"apoapsis");return;case"inclination":a.inclination=F(o,{line:n,column:t[0].column},"inclination");return;case"duration":a.duration=F(o,{line:n,column:t[0].column},"duration");return;case"deltav":a.deltaV=F(o,{line:n,column:t[0].column});return;case"phaseangle":a.phaseAngle=F(o,{line:n,column:t[0].column},"phaseAngle");return;case"turnangle":a.turnAngle=F(o,{line:n,column:t[0].column},"turnAngle");return;case"energy":a.energy=F(o,{line:n,column:t[0].column});return;case"waypointlabel":R(e.sourceSchemaVersion,e.diagnostics,"segment.waypointLabel",{line:n,column:t[0].column}),a.waypointLabel=o;return;case"waypointdate":R(e.sourceSchemaVersion,e.diagnostics,"segment.waypointDate",{line:n,column:t[0].column}),a.waypointDate=o;return;case"renderhidden":R(e.sourceSchemaVersion,e.diagnostics,"segment.renderHidden",{line:n,column:t[0].column}),a.renderHidden=W(o,"renderHidden",{line:n,column:t[0].column});return;case"sampledensity":R(e.sourceSchemaVersion,e.diagnostics,"segment.sampleDensity",{line:n,column:t[0].column}),a.sampleDensity=Ee(o,n,t[0].column,"sampleDensity");return;case"notes":a.notes=C(t.slice(1),n,"notes");return;default:throw new f(`Unknown trajectory segment field "${t[0].value}"`,n,t[0].column)}}function Ca(e,t,n){let r=e.activeManeuver;if(!r)return;let i=_(t,e.activeManeuverSeenFields,n),o=$(t,n);switch(i){case"kind":r.kind=o;return;case"label":r.label=o;return;case"epoch":r.epoch=o;return;case"deltav":r.deltaV=F(o,{line:n,column:t[0].column});return;case"duration":r.duration=F(o,{line:n,column:t[0].column},"duration");return;case"notes":r.notes=C(t.slice(1),n,"notes");return;default:throw new f(`Unknown trajectory maneuver field "${t[0].value}"`,n,t[0].column)}}function Va(e,t,n){if(e.length<2)throw new f("Invalid event pose field line",t,e[0]?.column??1);let r=e[0].value;if(!Vn.has(r))throw new f(`Unknown event pose field "${r}"`,t,e[0].column);if(n.has(r))throw new f(`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 za(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"||ca.has(i)){i!=="info"&&B(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 f(`Duplicate info key "${i.key}"`,r,n[0].column);e.seenInfoKeys.add(i.key),e.objectNode.infoEntries.push(i);return}let o=e.activeBlock,a=e.seenTypedBlockKeys[o]??(e.seenTypedBlockKeys[o]=new Set);if(a.has(i.key))throw new f(`Duplicate ${o} key "${i.key}"`,r,n[0].column);a.add(i.key),(e.objectNode.typedBlockEntries[o]??(e.objectNode.typedBlockEntries[o]=[])).push(i);return}e.objectNode.fields.push(Ua(n,r,e.objectNode.objectType,e.sourceSchemaVersion,e.diagnostics))}function _(e,t,n){if(e.length<2)throw new f("Invalid atlas field line",n,e[0]?.column??1);let r=e[0].value.toLowerCase();if(t.has(r))throw new f(`Duplicate atlas field "${e[0].value}"`,n,e[0].column);return t.add(r),r}function $(e,t){if(e.length<2)throw new f("Missing value for atlas field",t,e[0]?.column??1);return e.slice(1).map(n=>n.value).join(" ").trim()}function Ra(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 Ba(e,t,n,r){let i={};for(let o of C(e,t,"layers")){let a=!o.startsWith("-")&&!o.startsWith("!"),s=o.replace(/^[-!]+/,"").toLowerCase();if(s==="orbits"){i["orbits-back"]=a,i["orbits-front"]=a;continue}(s==="background"||s==="guides"||s==="orbits-back"||s==="orbits-front"||s==="relations"||s==="events"||s==="objects"||s==="labels"||s==="metadata"||s==="trajectories")&&(s==="events"&&n&&r&&B(n,r,"layers.events",{line:t,column:e[0]?.column??1}),i[s]=a)}return i}function C(e,t,n){if(e.length===0)throw new f(`Missing value for atlas field "${n}"`,t,1);let r=e.map(i=>i.value).filter(Boolean);if(r.length===0)throw new f(`Missing value for atlas field "${n}"`,t,e[0]?.column??1);return r}function zn(e,t,n){let r=e.toLowerCase();if(r!=="topdown"&&r!=="isometric"&&r!=="orthographic"&&r!=="perspective")throw new f(`Unknown projection "${e}"`,t,n);return r}function Rn(e){let t=e.toLowerCase();return t==="orthographic"||t==="perspective"}function Bn(e,t,n){let r=e.toLowerCase();if(r==="diagram"||r==="presentation"||r==="atlas-card"||r==="markdown")return r;throw new f(`Unknown render preset "${e}"`,t,n)}function Ee(e,t,n,r){let i=ne(e,t,n,r);if(i<=0)throw new f(`Field "${r}" must be greater than zero`,t,n);return i}function ne(e,t,n,r){let i=Number(e);if(!Number.isFinite(i))throw new f(`Invalid numeric value "${e}" for "${r}"`,t,n);return i}function _a(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Pt(){return{azimuth:null,elevation:null,roll:null,distance:null}}function Na(e,t,n){if(e.length===0||e.length%2!==0)throw new f('Field "camera" expects "<field> <value>" pairs',t,e[0]?.column??1);let r=n?{...n}:Pt(),i=new Set;for(let o=0;o<e.length;o+=2){let a=e[o],s=e[o+1],l=a.value.toLowerCase();if(i.has(l))throw new f(`Duplicate viewpoint camera field "${a.value}"`,t,a.column);i.add(l);let c=s.value;switch(l){case"azimuth":r.azimuth=ne(c,t,a.column,"camera.azimuth");break;case"elevation":r.elevation=ne(c,t,a.column,"camera.elevation");break;case"roll":r.roll=ne(c,t,a.column,"camera.roll");break;case"distance":r.distance=Ee(c,t,a.column,"camera.distance");break;default:throw new f(`Unknown viewpoint camera field "${a.value}"`,t,a.column)}}return r}function Wa(e,t,n,r,i){let o=[],a=0;for(;a<e.length;){let s=e[a],l=Fe(s.value);if(!l)throw new f(`Unknown field "${s.value}"`,t,s.column);l.version==="2.1"?B(r,i,s.value,{line:t,column:s.column}):l.version==="3.0"?ye(r,i,s.value,{line:t,column:s.column}):l.version==="3.1"&&R(r,i,s.value,{line:t,column:s.column}),a++;let c=[];if(l.inlineMode==="single"){let u=e[a];u&&(c.push(u),a++)}else if(l.inlineMode==="pair")for(let u=0;u<2;u++){let d=e[a];if(!d)break;c.push(d),a++}else for(;a<e.length&&!da.has(e[a].value);)c.push(e[a]),a++;if(c.length===0)throw new f(`Missing value for field "${s.value}"`,t,s.column);o.push({type:"field",key:s.value,values:c.map(u=>u.value),location:{line:t,column:s.column}})}return Yn(o,n),o}function Ua(e,t,n,r,i){if(e.length<2)throw new f("Invalid field line",t,e[0]?.column??1);let o=Fe(e[0].value);if(!o)throw new f(`Unknown field "${e[0].value}"`,t,e[0].column);o.version==="2.1"?B(r,i,e[0].value,{line:t,column:e[0].column}):o.version==="3.0"?ye(r,i,e[0].value,{line:t,column:e[0].column}):o.version==="3.1"&&R(r,i,e[0].value,{line:t,column:e[0].column});let a={type:"field",key:e[0].value,values:e.slice(1).map(s=>s.value),location:{line:t,column:e[0].column}};return Yn([a],n),a}function _n(e,t,n){if(e.length<2)throw new f(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 Ya(e,t,n){let r=Nn(e.fields),i=Wn(r),o=Xa(e.objectType,r),a=es(r.get("groups")?.[0]),s=ce(r.get("epoch")?.[0]),l=ce(r.get("referencePlane")?.[0]),c=r.has("tidalLock")?W(U(r.get("tidalLock")[0]),"tidalLock",r.get("tidalLock")[0].location):void 0,u=r.has("resonance")?Za(r.get("resonance")[0]):void 0,d=Ka(r),p=r.get("derive")?.map(S=>Ja(S)),h=r.get("validate")?.map(S=>({rule:U(S)})),y=r.has("locked")?[...new Set(r.get("locked").flatMap(S=>S.values))]:void 0,g=r.get("tolerance")?.map(S=>Qa(S)),b=Ha(e.typedBlockEntries),x=Un(e.infoEntries,"info"),j=ce(r.get("trajectory")?.[0]),m={type:e.objectType,id:e.id,properties:o,placement:i,info:x};return a.length>0&&(m.groups=a),s&&(m.epoch=s),l&&(m.referencePlane=l),c!==void 0&&(m.tidalLock=c),u&&(m.resonance=u),d&&(m.renderHints=d),p?.length&&(m.deriveRules=p),h?.length&&(m.validationRules=h),y?.length&&(m.lockedFields=y),g?.length&&(m.tolerances=g),b&&Object.keys(b).length>0&&(m.typedBlocks=b),j&&(m.trajectoryId=j),ge(t,"2.1")&&(m.groups||m.epoch||m.referencePlane||m.tidalLock!==void 0||m.resonance||m.renderHints||m.deriveRules?.length||m.validationRules?.length||m.lockedFields?.length||m.tolerances?.length||m.typedBlocks||m.trajectoryId)&&B(t,n,e.id,e.location),m.trajectoryId&&ye(t,n,`${e.id}.trajectory`,e.location),m}function Ga(e,t){return{...e,participantObjectIds:[...new Set(e.participantObjectIds)],tags:[...new Set(e.tags)],positions:t.map(n=>qa(n))}}function qa(e){let t=Nn(e.fields,"event-pose"),n=Wn(t);return{objectId:e.objectId,placement:n,trajectorySegmentId:ce(t.get("segment")?.[0]),trajectoryManeuverId:ce(t.get("maneuver")?.[0]),inner:te(t.get("inner")?.[0],"inner"),outer:te(t.get("outer")?.[0],"outer"),epoch:ce(t.get("epoch")?.[0]),referencePlane:ce(t.get("referencePlane")?.[0])}}function Nn(e,t="object"){let n=new Map;for(let r of e){let i=Fe(r.key);if(!i&&!Vn.has(r.key))throw f.fromLocation(`Unknown field "${r.key}"`,r.location);if(!i?.allowRepeat&&n.has(r.key))throw f.fromLocation(`Duplicate field "${r.key}"`,r.location);let o=n.get(r.key)??[];o.push(r),n.set(r.key,o)}return n}function Wn(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 f.fromLocation("Object has multiple placement modes",a?.location)}if(t)return{mode:"orbit",target:U(t),distance:te(e.get("distance")?.[0],"distance"),semiMajor:te(e.get("semiMajor")?.[0],"semiMajor"),eccentricity:ts(e.get("eccentricity")?.[0],"eccentricity"),period:te(e.get("period")?.[0],"period"),angle:te(e.get("angle")?.[0],"angle"),inclination:te(e.get("inclination")?.[0],"inclination"),phase:te(e.get("phase")?.[0],"phase")};if(n){let a=U(n);return{mode:"at",target:a,reference:An(a,n.location)}}if(r)return{mode:"surface",target:U(r)};if(i){let a=U(i),s=Mt(a);return{mode:"free",distance:s??void 0,descriptor:s?void 0:a}}return null}function Xa(e,t){let n={};for(let[r,i]of t.entries()){let o=i[0],a=Fe(r);!o||!a?.legacySchema||a.legacySchema.placement||(Ot(r,e,o.location),n[r]=Ln(r,o.values,o.location))}return n}function Un(e,t){let n={};for(let r of e){if(r.key in n)throw f.fromLocation(`Duplicate ${t} key "${r.key}"`,r.location);n[r.key]=r.value}return n}function Ha(e){let t={};for(let n of Object.keys(e)){let r=e[n];r?.length&&(t[n]=Un(r,n))}return t}function Ka(e){let t={},n=e.get("renderLabel")?.[0],r=e.get("renderOrbit")?.[0],i=e.get("renderPriority")?.[0];return n&&(t.renderLabel=W(U(n),"renderLabel",n.location)),r&&(t.renderOrbit=W(U(r),"renderOrbit",r.location)),i&&(t.renderPriority=ot(U(i),"renderPriority",i.location)),Object.keys(t).length>0?t:void 0}function Za(e){if(e.values.length!==2)throw f.fromLocation('Field "resonance" expects "<targetObjectId> <ratio>"',e.location);let t=e.values[1];if(!/^\d+:\d+$/.test(t))throw f.fromLocation(`Invalid resonance ratio "${t}"`,e.location);return{targetObjectId:e.values[0],ratio:t}}function Ja(e){if(e.values.length!==2)throw f.fromLocation('Field "derive" expects "<field> <strategy>"',e.location);return{field:e.values[0],strategy:e.values[1]}}function Qa(e){if(e.values.length!==2)throw f.fromLocation('Field "tolerance" expects "<field> <value>"',e.location);let t=e.values[1],n=Mt(t),r=Number(t);return{field:e.values[0],value:n??(Number.isFinite(r)?r:t)}}function es(e){return e?[...new Set(e.values)]:[]}function ce(e){return e&&e.values.join(" ").trim()||null}function te(e,t){return e?F(U(e),e.location,t):void 0}function ts(e,t){return e?ot(U(e),t,e.location):void 0}function U(e){return De(e.values,e.key,e.location)}function Fe(e){return lt.get(e)}function Yn(e,t){for(let n of e){let r=Fe(n.key);if(!r)throw f.fromLocation(`Unknown field "${n.key}"`,n.location);if(r.legacySchema){Ot(n.key,t,n.location);continue}if((n.key==="renderLabel"||n.key==="renderOrbit"||n.key==="tidalLock")&&n.values.length!==1)throw f.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function B(e,t,n,r){ge(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 ue(e,t,n,r){ge(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 ye(e,t,n,r){ge(e,"3.0")&&t.push({code:"parse.schema30.featureCompatibility",severity:"warning",source:"parse",message:`Feature "${n}" requires schema 3.0; parsed in compatibility mode because the document header is "schema ${e}".`,line:r.line,column:r.column})}function R(e,t,n,r){ge(e,"3.1")&&t.push({code:"parse.schema31.featureCompatibility",severity:"warning",source:"parse",message:`Feature "${n}" requires schema 3.1; parsed in compatibility mode because the document header is "schema ${e}".`,line:r.line,column:r.column})}function ge(e,t){return Cn(e)<Cn(t)}function Cn(e){switch(e){case"2.0-draft":return 0;case"2.0":return 1;case"2.1":return 2;case"2.5":return 3;case"2.6":return 4;case"3.0":return 5;case"3.1":return 6;default:return 7}}function ns(e){let t=[...e],n=[],r=!1,i=!1,o=null,a=1,s=1;for(let l=0;l<t.length;l++){let c=t[l],u=t[l+1];if(i){if(c==="*"&&u==="/"){t[l]=" ",t[l+1]=" ",i=!1,o=null,l++,s+=2;continue}c!==`
|
|
2
|
+
`&&c!=="\r"&&(t[l]=" "),c===`
|
|
3
|
+
`?(a++,s=1):s++;continue}if(!r&&c==="/"&&u==="*"){n.push({kind:"block",line:a,column:s}),t[l]=" ",t[l+1]=" ",i=!0,o={line:a,column:s},l++,s+=2;continue}if(!r&&c==="#"&&!rs(t,l)){n.push({kind:"line",line:a,column:s}),t[l]=" ";let d=l+1;for(;d<t.length&&t[d]!==`
|
|
4
|
+
`&&t[d]!=="\r";)t[d]=" ",d++;s+=d-l,l=d-1;continue}c==='"'&&t[l-1]!=="\\"&&(r=!r),c===`
|
|
5
|
+
`?(a++,s=1):s++}if(i)throw f.fromLocation("Unclosed block comment",o??void 0);return{source:t.join(""),comments:n}}function rs(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===`
|
|
6
|
+
`}var is=/^schema\s+(?:2(?:\.0|\.1|\.5|\.6)?|3(?:\.0|\.1)?)$/i,os=/^schema\s+2\.1$/i,as=/^schema\s+2\.5$/i,ss=/^schema\s+2\.6$/i,ls=/^schema\s+3(?:\.0)?$/i,cs=/^schema\s+3\.1$/i,us=/^schema\s+2\.0-draft$/i;function Gn(e){for(let t of ds(e).split(/\r?\n/)){let n=t.trim();if(n)return us.test(n)?"2.0-draft":os.test(n)?"2.1":as.test(n)?"2.5":ss.test(n)?"2.6":ls.test(n)?"3.0":cs.test(n)?"3.1":is.test(n)?"2.0":"1.0"}return"1.0"}function ds(e){let t=[...e],n=!1,r=!1;for(let i=0;i<t.length;i++){let o=t[i],a=t[i+1];if(r){if(o==="*"&&a==="/"){t[i]=" ",t[i+1]=" ",r=!1,i++;continue}o!==`
|
|
7
|
+
`&&o!=="\r"&&(t[i]=" ");continue}if(!n&&o==="/"&&a==="*"){t[i]=" ",t[i+1]=" ",r=!0,i++;continue}if(!n&&o==="#"){t[i]=" ";let s=i+1;for(;s<t.length&&t[s]!==`
|
|
8
|
+
`&&t[s]!=="\r";)t[s]=" ",s++;i=s-1;continue}o==='"'&&t[i-1]!=="\\"&&(n=!n)}return t.join("")}function de(e){let t=qn(e);if(!t.ok||!t.value){let n=t.diagnostics[0];throw new f(n?.message??"Failed to load WorldOrbit source",n?.line,n?.column)}return t.value}function qn(e){let t=Gn(e);if(t==="2.0"||t==="2.0-draft"||t==="2.1"||t==="2.5"||t==="2.6"||t==="3.0"||t==="3.1")return fs(e,t);let n;try{n=je(e)}catch(i){return{ok:!1,value:null,diagnostics:[le(i,"parse")]}}let r;try{r=xe(n)}catch(i){return{ok:!1,value:null,diagnostics:[le(i,"normalize")]}}try{Se(r)}catch(i){return{ok:!1,value:null,diagnostics:[le(i,"validate")]}}return{ok:!0,value:{schemaVersion:t,ast:n,document:r,atlasDocument:null,draftDocument:null,diagnostics:[]},diagnostics:[]}}function fs(e,t){let n;try{n=Lt(e)}catch(a){return{ok:!1,value:null,diagnostics:[le(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=kt(n)}catch(a){return{ok:!1,value:null,diagnostics:[le(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 bs={background:!0,guides:!0,relations:!0,events:!0,orbits:!0,trajectories:!0,objects:!0,labels:!0,structures:!0,metadata:!0},ct={atlas:{name:"atlas",backgroundStart:"#041018",backgroundEnd:"#0a2331",backgroundGlow:"rgba(240, 180, 100, 0.18)",panel:"rgba(7, 17, 27, 0.9)",panelLine:"rgba(168, 207, 242, 0.18)",relation:"rgba(240, 180, 100, 0.42)",orbit:"rgba(163, 209, 255, 0.24)",orbitBand:"rgba(255, 190, 120, 0.28)",guide:"rgba(255, 255, 255, 0.04)",leader:"rgba(225, 238, 255, 0.4)",ink:"#e8f0ff",muted:"rgba(232, 240, 255, 0.7)",accent:"#f0b464",accentStrong:"#ff7f5f",selected:"rgba(255, 214, 139, 0.92)",starCore:"#ffcc67",starStroke:"rgba(255, 245, 203, 0.85)",starGlow:"#ffe8a3",spaceFog:"#07131d",starfield:"rgba(226, 239, 255, 0.9)",starfieldDim:"rgba(164, 194, 228, 0.45)",objectSpecular:"#f5f8ff",orbitOpacity:.34,orbitBandOpacity:.24,selectionHalo:"rgba(255, 214, 139, 0.9)",atmosphere:"rgba(143, 202, 255, 0.4)",cometTail:"rgba(193, 243, 255, 0.7)",fontFamily:'"Segoe UI Variable", "Bahnschrift", sans-serif',displayFont:'"Bahnschrift", "Segoe UI Variable", sans-serif'},nightglass:{name:"nightglass",backgroundStart:"#07131f",backgroundEnd:"#13283a",backgroundGlow:"rgba(120, 255, 215, 0.16)",panel:"rgba(7, 20, 30, 0.9)",panelLine:"rgba(120, 255, 215, 0.16)",relation:"rgba(156, 231, 255, 0.42)",orbit:"rgba(120, 255, 215, 0.2)",orbitBand:"rgba(137, 185, 255, 0.24)",guide:"rgba(255, 255, 255, 0.035)",leader:"rgba(192, 255, 233, 0.42)",ink:"#edfff8",muted:"rgba(237, 255, 248, 0.68)",accent:"#78ffd7",accentStrong:"#9ce7ff",selected:"rgba(120, 255, 215, 0.9)",starCore:"#e5f98c",starStroke:"rgba(246, 255, 217, 0.9)",starGlow:"#fffab4",spaceFog:"#071723",starfield:"rgba(220, 255, 245, 0.9)",starfieldDim:"rgba(124, 212, 195, 0.42)",objectSpecular:"#ecfffb",orbitOpacity:.3,orbitBandOpacity:.22,selectionHalo:"rgba(120, 255, 215, 0.85)",atmosphere:"rgba(120, 255, 215, 0.32)",cometTail:"rgba(181, 255, 236, 0.68)",fontFamily:'"Segoe UI Variable", "Bahnschrift", sans-serif',displayFont:'"Bahnschrift", "Segoe UI Variable", sans-serif'},ember:{name:"ember",backgroundStart:"#17090b",backgroundEnd:"#31111a",backgroundGlow:"rgba(255, 127, 95, 0.18)",panel:"rgba(24, 9, 13, 0.9)",panelLine:"rgba(255, 166, 149, 0.16)",relation:"rgba(255, 178, 125, 0.42)",orbit:"rgba(255, 188, 164, 0.22)",orbitBand:"rgba(255, 214, 139, 0.24)",guide:"rgba(255, 255, 255, 0.03)",leader:"rgba(255, 223, 209, 0.42)",ink:"#fff3ee",muted:"rgba(255, 243, 238, 0.68)",accent:"#ffb27d",accentStrong:"#ff7f5f",selected:"rgba(255, 178, 125, 0.9)",starCore:"#ffb766",starStroke:"rgba(255, 236, 205, 0.88)",starGlow:"#ffe2ad",spaceFog:"#1c0d12",starfield:"rgba(255, 232, 214, 0.88)",starfieldDim:"rgba(255, 176, 138, 0.38)",objectSpecular:"#fff0e6",orbitOpacity:.3,orbitBandOpacity:.24,selectionHalo:"rgba(255, 178, 125, 0.85)",atmosphere:"rgba(255, 190, 140, 0.26)",cometTail:"rgba(255, 214, 173, 0.62)",fontFamily:'"Segoe UI Variable", "Bahnschrift", sans-serif',displayFont:'"Bahnschrift", "Segoe UI Variable", sans-serif'}};function Ce(e){return e?typeof e=="string"?ct[e]??ct.atlas:{...ct.atlas,...e}:ct.atlas}function Dt(e){return{...bs,...e}}function ut(e){if(!e)return null;let t={query:e.query?.trim()||void 0,objectTypes:Et(e.objectTypes??[]),tags:Et((e.tags??[]).map(n=>n.trim()).filter(Boolean)),groupIds:Et((e.groupIds??[]).map(n=>n.trim()).filter(Boolean)),includeAncestors:e.includeAncestors??!0};return ys(t)?t:null}function ys(e){return!!(e&&(e.query?.trim()||e.objectTypes?.length||e.tags?.length||e.groupIds?.length))}function Ft(e,t){let n=ut(t),r=new Set;for(let i of e.objects)if(!i.hidden&&gs(i,n)&&(r.add(i.objectId),n?.includeAncestors!==!1))for(let o of i.ancestorIds)r.add(o);return n?r:new Set(e.objects.filter(i=>!i.hidden).map(i=>i.objectId))}function gs(e,t){if(!t)return!0;if(t.objectTypes?.length&&!t.objectTypes.includes(e.object.type))return!1;if(t.groupIds?.length&&(!e.groupId||!t.groupIds.includes(e.groupId))){let n=e.semanticGroupIds.length>0&&t.groupIds.some(i=>e.semanticGroupIds.includes(i)),r=!!(e.groupId&&t.groupIds.includes(e.groupId));if(!n&&!r)return!1}if(t.tags?.length){let n=Array.isArray(e.object.properties.tags)?e.object.properties.tags.filter(r=>typeof r=="string"):[];if(!t.tags.every(r=>n.includes(r)))return!1}if(t.query?.trim()){let n=ws(e.object,e.label).toLowerCase();if(!t.query.toLowerCase().split(/\s+/).filter(Boolean).every(i=>n.includes(i)))return!1}return!0}function ws(e,t){let n=Object.values(e.info),r=Object.values(e.properties).flatMap(i=>Array.isArray(i)?i:typeof i=="object"&&i&&"value"in i?[String(i.value),String(i.unit??"")]:[String(i)]).filter(Boolean);return[e.id,t,e.type,...r,...n].join(" ")}function Et(e){return[...new Set(e)]}var dt="worldorbit-camera-root";function K(e,t={}){let n=Ce(t.theme),r=Vs(t.preset??e.renderPreset??void 0),i=Dt({...r.layers,...t.layers}),o=t.subtitle??e.subtitle,a=Ft(e,t.filter??null),s=e.objects.filter(m=>!m.hidden).filter(m=>a.has(m.objectId)).filter(m=>i.structures||!Ve(m.object)).sort((m,S)=>m.sortKey-S.sortKey),l=e.labels.filter(m=>!m.hidden).filter(m=>a.has(m.objectId)).filter(m=>i.structures||!Ve(m.object)),c=xs(s),u=i.orbits?js(e,a,i.structures):{back:"",front:""},d=i.guides?e.leaders.filter(m=>!m.hidden).filter(m=>a.has(m.objectId)).filter(m=>i.structures||!Ve(m.object)).map(m=>`<line class="wo-leader wo-leader-${m.mode}" x1="${m.x1}" y1="${m.y1}" x2="${m.x2}" y2="${m.y2}" data-render-id="${O(m.renderId)}" data-group-id="${L(m.groupId??"")}" />`).join(""):"",p=i.relations?e.relations.filter(m=>!m.hidden).filter(m=>a.has(m.fromObjectId)&&a.has(m.toObjectId)).map(m=>`<line class="wo-relation" x1="${m.x1}" y1="${m.y1}" x2="${m.x2}" y2="${m.y2}" data-render-id="${O(m.renderId)}" data-relation-id="${L(m.relationId)}" />`).join(""):"",h=i.trajectories?Is(e,a,{showLabels:t.showTrajectoryLabels??!0,showWaypoints:t.showTrajectoryWaypoints??!0,includeStructures:i.structures}):"",y=i.events?e.events.filter(m=>!m.hidden).map(m=>vs(e,m,a,n)).join(""):"",g=i.objects?s.map(m=>Ss(m,t.selectedObjectId??null,n)).join(""):"",b=i.labels?l.map(m=>ks(e,m,t.selectedObjectId??null)).join(""):"",x=i.metadata?`<text class="wo-title" x="56" y="64">${O(e.title)}</text>
|
|
9
|
+
<text class="wo-subtitle" x="56" y="88">${O(o)}</text>
|
|
10
|
+
<text class="wo-meta" x="56" y="${e.height-42}">${O(Rs(e))}</text>`:"",j=i.background?`<rect class="wo-bg" x="0" y="0" width="${e.width}" height="${e.height}" rx="28" ry="28" />
|
|
11
11
|
<rect class="wo-bg-glow" x="0" y="0" width="${e.width}" height="${e.height}" rx="28" ry="28" />
|
|
12
|
-
${i.guides?
|
|
13
|
-
<title id="worldorbit-title">${
|
|
14
|
-
<desc id="worldorbit-desc">A ${
|
|
12
|
+
${i.guides?zs(e.width,e.height):""}`:"";return`<svg xmlns="http://www.w3.org/2000/svg" data-worldorbit-svg="true" width="${e.width}" height="${e.height}" viewBox="0 0 ${e.width} ${e.height}" preserveAspectRatio="xMidYMid meet" role="img" aria-labelledby="worldorbit-title worldorbit-desc">
|
|
13
|
+
<title id="worldorbit-title">${O(e.title)}</title>
|
|
14
|
+
<desc id="worldorbit-desc">A ${O(e.viewMode)} WorldOrbit render with ${s.length} visible objects.</desc>
|
|
15
15
|
<defs>
|
|
16
16
|
<linearGradient id="wo-bg" x1="0%" y1="0%" x2="100%" y2="100%">
|
|
17
17
|
<stop offset="0%" stop-color="${n.backgroundStart}" />
|
|
@@ -25,6 +25,9 @@
|
|
|
25
25
|
<stop offset="0%" stop-color="${n.backgroundGlow}" />
|
|
26
26
|
<stop offset="100%" stop-color="transparent" />
|
|
27
27
|
</radialGradient>
|
|
28
|
+
<marker id="wo-trajectory-arrow" markerWidth="12" markerHeight="12" refX="10" refY="6" orient="auto" markerUnits="strokeWidth">
|
|
29
|
+
<path d="M 0 0 L 12 6 L 0 12 z" fill="${n.accent}" />
|
|
30
|
+
</marker>
|
|
28
31
|
${c}
|
|
29
32
|
</defs>
|
|
30
33
|
<style>
|
|
@@ -36,6 +39,10 @@
|
|
|
36
39
|
.wo-orbit-front { opacity: 0.9; }
|
|
37
40
|
.wo-orbit-band { stroke: ${n.orbitBand}; stroke-linecap: round; }
|
|
38
41
|
.wo-relation { stroke: ${n.relation}; stroke-width: 2; stroke-dasharray: 10 6; }
|
|
42
|
+
.wo-trajectory { fill: none; stroke: ${n.accent}; stroke-width: 2.4; stroke-linecap: round; stroke-linejoin: round; opacity: 0.92; }
|
|
43
|
+
.wo-trajectory-waypoint { fill: ${n.spaceFog}; stroke: ${n.selected}; stroke-width: 1.4; }
|
|
44
|
+
.wo-trajectory-label { fill: ${n.accent}; font-family: ${n.fontFamily}; font-weight: 700; letter-spacing: 0.04em; text-transform: uppercase; }
|
|
45
|
+
.wo-trajectory-date { fill: ${n.muted}; font-family: ${n.fontFamily}; font-weight: 500; }
|
|
39
46
|
.wo-event-line { stroke: ${n.accent}; stroke-width: 1.6; stroke-dasharray: 5 5; opacity: 0.72; }
|
|
40
47
|
.wo-event-node { fill: ${n.accent}; stroke: ${n.selected}; stroke-width: 1.4; opacity: 0.92; }
|
|
41
48
|
.wo-event-label { fill: ${n.accent}; font-family: ${n.fontFamily}; font-weight: 700; letter-spacing: 0.04em; text-transform: uppercase; }
|
|
@@ -65,39 +72,46 @@
|
|
|
65
72
|
.wo-selection-ring { display: none; fill: none; stroke-width: 2; stroke-dasharray: 6 5; }
|
|
66
73
|
.wo-object-image { pointer-events: none; }
|
|
67
74
|
</style>
|
|
68
|
-
${
|
|
69
|
-
${
|
|
75
|
+
${j}
|
|
76
|
+
${x}
|
|
70
77
|
<g data-worldorbit-world="true">
|
|
71
|
-
<g data-worldorbit-camera-root="${
|
|
78
|
+
<g data-worldorbit-camera-root="${dt}" id="${dt}">
|
|
72
79
|
<g data-worldorbit-world-content="true">
|
|
73
80
|
${i.orbits?`<g data-layer-id="orbits-back">${u.back}</g>`:""}
|
|
74
81
|
${i.guides?`<g data-layer-id="guides">${d}</g>`:""}
|
|
75
82
|
${i.relations?`<g data-layer-id="relations">${p}</g>`:""}
|
|
76
|
-
${i.events?`<g data-layer-id="events">${
|
|
77
|
-
${i.objects?`<g data-layer-id="objects">${
|
|
83
|
+
${i.events?`<g data-layer-id="events">${y}</g>`:""}
|
|
84
|
+
${i.objects?`<g data-layer-id="objects">${g}</g>`:""}
|
|
78
85
|
${i.orbits?`<g data-layer-id="orbits-front">${u.front}</g>`:""}
|
|
79
|
-
${i.
|
|
86
|
+
${i.trajectories?`<g data-layer-id="trajectories">${h}</g>`:""}
|
|
87
|
+
${i.labels?`<g data-layer-id="labels">${b}</g>`:""}
|
|
80
88
|
</g>
|
|
81
89
|
</g>
|
|
82
90
|
</g>
|
|
83
|
-
</svg>`}function
|
|
84
|
-
${
|
|
91
|
+
</svg>`}function vs(e,t,n,r){let i=t.objectIds.filter(l=>n.has(l)).map(l=>e.objects.find(c=>c.objectId===l&&!c.hidden)).filter(Boolean);if(i.length===0)return"";let o=t.event.color||r.accent,a=t.event.label||t.event.id,s=i.map(l=>`<line class="wo-event-line" x1="${t.x}" y1="${t.y}" x2="${l.x}" y2="${l.y}" stroke="${L(o)}" data-event-id="${L(t.eventId)}" data-object-id="${L(l.objectId)}" />`).join("");return`<g class="wo-event" data-render-id="${O(t.renderId)}" data-event-id="${L(t.eventId)}">
|
|
92
|
+
${s}
|
|
85
93
|
<circle class="wo-event-node" cx="${t.x}" cy="${t.y}" r="5" fill="${L(o)}" />
|
|
86
|
-
<text class="wo-event-label" x="${t.x}" y="${t.y-10}" text-anchor="middle" font-size="10">${
|
|
87
|
-
</g>`}function
|
|
88
|
-
<
|
|
89
|
-
${
|
|
90
|
-
|
|
94
|
+
<text class="wo-event-label" x="${t.x}" y="${t.y-10}" text-anchor="middle" font-size="10">${O(a)}</text>
|
|
95
|
+
</g>`}function Is(e,t,n){return e.trajectories.filter(r=>!r.hidden).filter(r=>r.objectIds.length===0||r.objectIds.some(i=>t.has(i))).filter(r=>n.includeStructures||!r.objectIds.some(i=>{let o=e.objects.find(a=>a.objectId===i)?.object;return o?Ve(o):!1})).map(r=>{let i=r.stroke??"#f0b464",o=r.marker==="none"?"":' marker-end="url(#wo-trajectory-arrow)"',a=r.showWaypoints&&n.showWaypoints?r.waypoints.filter(s=>!s.hidden).map(s=>$s(r,s,n.showLabels)).join(""):"";return`<g class="wo-trajectory-group" data-render-id="${O(r.renderId)}" data-trajectory-id="${L(r.trajectoryId)}">
|
|
96
|
+
<path class="wo-trajectory wo-trajectory-${r.mode}" d="${r.path}" stroke="${L(i)}" stroke-width="${r.strokeWidth}"${o} />
|
|
97
|
+
${a}
|
|
98
|
+
</g>`}).join("")}function $s(e,t,n){let r=n&&e.labelMode!=="hidden"?[t.label?`<text class="wo-trajectory-label" x="${t.x+10}" y="${t.y-10}" font-size="10">${O(t.label)}</text>`:"",t.dateLabel?`<text class="wo-trajectory-date" x="${t.x+10}" y="${t.y+4}" font-size="9">${O(t.dateLabel)}</text>`:""].join(""):"";return`<g class="wo-trajectory-waypoint-group" data-render-id="${O(t.renderId)}" data-trajectory-id="${L(t.trajectoryId)}">
|
|
99
|
+
<circle class="wo-trajectory-waypoint" cx="${t.x}" cy="${t.y}" r="4.5" />
|
|
100
|
+
${r}
|
|
101
|
+
</g>`}function js(e,t,n){let r=[],i=[];for(let o of e.orbitVisuals.filter(a=>!a.hidden&&t.has(a.objectId)&&(n||!Ve(a.object)))){let a=o.bandThickness??(o.band?10:1.5),s=o.band?"wo-orbit wo-orbit-band wo-orbit-node":"wo-orbit wo-orbit-node",l=`data-render-id="${O(o.renderId)}" data-orbit-object-id="${L(o.objectId)}" data-parent-id="${L(o.parentId)}" data-group-id="${L(o.groupId??"")}"`;if(o.backArcPath||o.frontArcPath){o.backArcPath&&r.push(`<path class="${s} wo-orbit-back" d="${o.backArcPath}" stroke-width="${a}" ${l} />`),o.frontArcPath&&i.push(`<path class="${s} wo-orbit-front" d="${o.frontArcPath}" stroke-width="${a}" ${l} />`);continue}if(o.kind==="ellipse"){let c=o.rx??o.radius??0,u=o.ry??o.radius??0;i.push(`<ellipse class="${s} wo-orbit-front" cx="${o.cx}" cy="${o.cy}" rx="${c}" ry="${u}" transform="rotate(${o.rotationDeg} ${o.cx} ${o.cy})" stroke-width="${a}" ${l} />`);continue}i.push(`<circle class="${s} wo-orbit-front" cx="${o.cx}" cy="${o.cy}" r="${o.radius??0}" stroke-width="${a}" ${l} />`)}return{back:r.join(""),front:i.join("")}}function xs(e){return e.filter(t=>!!t.imageHref).map(t=>Ts(t)).join("")}function Ss(e,t,n){let{object:r,x:i,y:o,radius:a,visualRadius:s}=e,l=t===e.objectId?" wo-object-selected":"",c=r.properties.kind?` wo-kind-${String(r.properties.kind).toLowerCase().replace(/[^a-z0-9-]/g,"-")}`:"",u=Ls(e,n),d=Os(e),p=d?Hn(r,i,o,a,u,{outlineOnly:!0}):"";return`<g class="wo-object wo-object-${r.type}${c}${l}" data-object-id="${O(e.objectId)}" data-parent-id="${L(e.parentId??"")}" data-group-id="${L(e.groupId??"")}" data-render-id="${O(e.renderId)}" tabindex="0" role="button" aria-label="${O(`${r.type} ${e.objectId}`)}">
|
|
102
|
+
<circle class="wo-selection-ring" cx="${i}" cy="${o}" r="${s+8}" />
|
|
103
|
+
${Ms(e,u)}
|
|
104
|
+
${Hn(r,i,o,a,u)}
|
|
91
105
|
${d}
|
|
92
106
|
${p}
|
|
93
|
-
</g>`}function
|
|
94
|
-
<text class="wo-label" x="${t.x}" y="${t.y}" text-anchor="${t.textAnchor}" font-size="${14*i}">${
|
|
95
|
-
<text class="wo-label-secondary" x="${t.x}" y="${t.secondaryY}" text-anchor="${t.textAnchor}" font-size="${11*i}">${
|
|
96
|
-
</g>`}function
|
|
97
|
-
<circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${i.stroke}" stroke-width="2" />`;case"planet":case"moon":case"belt":case"asteroid":case"ring":return`<circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${i.stroke}" stroke-width="${o.outlineOnly?1.5:1.4}" />`;case"comet":return o.outlineOnly?`<circle cx="${t}" cy="${n}" r="${r}" fill="transparent" stroke="${i.stroke}" stroke-width="1.4" />`:`<path d="M ${t-r*2} ${n+r*1.3} Q ${t-r*.7} ${n+r*.3} ${t-r*.45} ${n}" fill="none" stroke="${
|
|
98
|
-
<circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${i.stroke}" stroke-width="1.4" />`;case"craft":return`<polygon points="${
|
|
99
|
-
<circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${i.stroke}" stroke-width="2" />`:
|
|
107
|
+
</g>`}function ks(e,t,n){let r=n===t.objectId?" wo-object-label-selected":"",i=e.scaleModel.labelMultiplier;return`<g class="wo-object-label${r}" data-object-id="${O(t.objectId)}" data-group-id="${L(t.groupId??"")}" data-render-id="${O(t.renderId)}">
|
|
108
|
+
<text class="wo-label" x="${t.x}" y="${t.y}" text-anchor="${t.textAnchor}" font-size="${14*i}">${O(t.label)}</text>
|
|
109
|
+
<text class="wo-label-secondary" x="${t.x}" y="${t.secondaryY}" text-anchor="${t.textAnchor}" font-size="${11*i}">${O(t.secondaryLabel)}</text>
|
|
110
|
+
</g>`}function Hn(e,t,n,r,i,o={}){let a=o.outlineOnly?"transparent":i.fill,s=i.tail??i.fill;switch(e.type){case"star":return o.outlineOnly?`<circle cx="${t}" cy="${n}" r="${r}" fill="transparent" stroke="${i.stroke}" stroke-width="2" />`:`<circle cx="${t}" cy="${n}" r="${r*2.4}" fill="${i.glow??"url(#wo-star-glow)"}" opacity="0.84" />
|
|
111
|
+
<circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${i.stroke}" stroke-width="2" />`;case"planet":case"moon":case"belt":case"asteroid":case"ring":return`<circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${i.stroke}" stroke-width="${o.outlineOnly?1.5:1.4}" />`;case"comet":return o.outlineOnly?`<circle cx="${t}" cy="${n}" r="${r}" fill="transparent" stroke="${i.stroke}" stroke-width="1.4" />`:`<path d="M ${t-r*2} ${n+r*1.3} Q ${t-r*.7} ${n+r*.3} ${t-r*.45} ${n}" fill="none" stroke="${s}" stroke-width="${Math.max(2,r*.8)}" stroke-linecap="round" opacity="0.85" />
|
|
112
|
+
<circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${i.stroke}" stroke-width="1.4" />`;case"craft":return`<polygon points="${Ct(t,n,r*.85)}" fill="${a}" stroke="${i.stroke}" stroke-width="1.4" />`;case"structure":return`<polygon points="${Ct(t,n,r)}" fill="${a}" stroke="${i.stroke}" stroke-width="1.4" />`;case"phenomenon":{let l=String(e.properties.kind??"").toLowerCase().replace(/_/g,"-");return o.outlineOnly?l==="black-hole"||l==="nebula"||l==="galaxy"||l==="dwarf-galaxy"?`<circle cx="${t}" cy="${n}" r="${r}" fill="transparent" stroke="${i.stroke}" stroke-width="1.4" />`:`<polygon points="${Vt(t,n,r)}" fill="transparent" stroke="${i.stroke}" stroke-width="1.4" />`:l==="black-hole"?`<ellipse cx="${t}" cy="${n}" rx="${r*2.4}" ry="${r*.55}" fill="none" stroke="${i.accentRing??i.stroke}" stroke-width="3.5" />
|
|
113
|
+
<circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${i.stroke}" stroke-width="2" />`:l==="galaxy"?`<ellipse cx="${t}" cy="${n}" rx="${r*2.6}" ry="${r}" fill="${i.halo??"none"}" stroke="none" />
|
|
100
114
|
<ellipse cx="${t}" cy="${n}" rx="${r*1.5}" ry="${r*.42}" fill="${a}" stroke="${i.stroke}" stroke-width="1.2" />
|
|
101
|
-
<circle cx="${t}" cy="${n}" r="${r*.28}" fill="${i.core??"#fff"}" stroke="none" />`:
|
|
102
|
-
<circle cx="${t}" cy="${n}" r="${r*.25}" fill="${i.core??"#fff"}" stroke="none" />`:
|
|
103
|
-
<circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${i.stroke}" stroke-width="1" />`:`<polygon points="${
|
|
115
|
+
<circle cx="${t}" cy="${n}" r="${r*.28}" fill="${i.core??"#fff"}" stroke="none" />`:l==="dwarf-galaxy"?`<ellipse cx="${t}" cy="${n}" rx="${r*1.6}" ry="${r*.55}" fill="${a}" stroke="${i.stroke}" stroke-width="1" />
|
|
116
|
+
<circle cx="${t}" cy="${n}" r="${r*.25}" fill="${i.core??"#fff"}" stroke="none" />`:l==="nebula"?`<circle cx="${t}" cy="${n}" r="${r*2.2}" fill="${i.halo??"none"}" stroke="none" />
|
|
117
|
+
<circle cx="${t}" cy="${n}" r="${r}" fill="${a}" stroke="${i.stroke}" stroke-width="1" />`:`<polygon points="${Vt(t,n,r)}" fill="${a}" stroke="${i.stroke}" stroke-width="1.4" />`}}}function Ms(e,t){if(!t.atmosphere)return"";let{object:n,x:r,y:i,radius:o}=e;return n.type!=="planet"&&n.type!=="moon"&&n.type!=="asteroid"?"":`<circle cx="${r}" cy="${i}" r="${o+4}" fill="none" stroke="${t.atmosphere}" stroke-width="4" opacity="0.45" />`}function Os(e){if(!e.imageHref)return"";let t=As(e);return`<image class="wo-object-image" x="${t.x}" y="${t.y}" width="${t.width}" height="${t.height}" href="${L(e.imageHref)}" preserveAspectRatio="xMidYMid slice" clip-path="url(#${L(Jn(e))})" />`}function Ts(e){let{x:t,y:n,radius:r}=e,i="";switch(e.object.type){case"star":case"planet":case"moon":case"asteroid":case"comet":i=`<circle cx="${t}" cy="${n}" r="${r}" />`;break;case"structure":i=`<polygon points="${Ct(t,n,r)}" />`;break;case"phenomenon":i=`<polygon points="${Vt(t,n,r)}" />`;break;default:return""}return`<clipPath id="${L(Jn(e))}" clipPathUnits="userSpaceOnUse">${i}</clipPath>`}function As(e){let{object:t,x:n,y:r,radius:i}=e;switch(t.type){case"structure":return{x:n-i,y:r-i,width:i*2,height:i*2};case"phenomenon":return{x:n-i*1.2,y:r-i*1.2,width:i*2.4,height:i*2.4};default:return{x:n-i,y:r-i,width:i*2,height:i*2}}}function Ls(e,t){let n=String(e.object.properties.kind??"").toLowerCase().replace(/_/g,"-"),r=Ps(e.object.type,n,t),i=e.fillColor&&_s(e.fillColor)?e.fillColor:r.fill,o=Kn(e.object.properties.albedo),a=Kn(e.object.properties.temperature),s=Es(i,a,o,e.object.type),l=ze(s,"#ffffff",.4)??r.stroke,c=Cs(e.object.properties.atmosphere),u=e.object.type==="star"?Zn(ze(s,"#fff2cb",.4)??s,.82):void 0;return{fill:s,stroke:l,glow:u,atmosphere:c,tail:e.object.type==="comet"?Zn(ze(s,"#ffffff",.5)??s,.72):void 0}}function Ps(e,t,n){switch(e){case"star":return{fill:n.starCore,stroke:n.starStroke};case"planet":return{fill:"#72b7ff",stroke:"#d8efff"};case"moon":return{fill:"#c7d7ea",stroke:"#f2f8ff"};case"belt":return{fill:"#d9aa74",stroke:"#f7d5aa"};case"asteroid":return{fill:"#a7a5b8",stroke:"#ebe5ff"};case"comet":return{fill:"#9ce7ff",stroke:"#e7fbff"};case"ring":return{fill:"#e59f7d",stroke:"#fff0d3"};case"craft":return{fill:"#ffb47f",stroke:"#fff0d3"};case"structure":return{fill:n.accentStrong,stroke:"#fff2ea"};case"phenomenon":return Ds(t)}}function Ds(e){return e==="galaxy"?{fill:"rgba(165,125,255,0.55)",stroke:"rgba(210,185,255,0.75)",halo:"rgba(160,120,255,0.10)",core:"#ede0ff"}:e==="dwarf-galaxy"?{fill:"rgba(190,165,255,0.45)",stroke:"rgba(220,205,255,0.75)",core:"#ddd0ff"}:e==="black-hole"?{fill:"#040408",stroke:"#ff6a00",accentRing:"rgba(255,140,20,0.72)"}:e==="nebula"?{fill:"rgba(105,205,255,0.45)",stroke:"rgba(180,235,255,0.72)",halo:"rgba(100,200,255,0.08)"}:e==="void"?{fill:"#05080f",stroke:"rgba(130,160,255,0.4)"}:{fill:"#78ffd7",stroke:"#e9fff7"}}function Es(e,t,n,r){let i=e;if(t!==null){let o=Fs(t,r);i=ze(i,o,r==="star"?.42:.2)??i}if(n!==null){let o=Math.min(Math.max(n,0),1);i=ze(i,o>=.5?"#ffffff":"#0f1520",Math.abs(o-.5)*.7)??i}return i}function Fs(e,t){return t==="star"?e>=8e3?"#d7ebff":e>=6e3?"#fff3d8":e>=4e3?"#ffd39a":"#ff9d76":e<=180?"#8fd8ff":e>=600?"#ffb56e":"#fff1c4"}function Cs(e){if(typeof e!="string"||!e.trim())return;let t=e.trim().toLowerCase();return t.includes("methane")?"rgba(134, 236, 255, 0.75)":t.includes("nitrogen")||t.includes("oxygen")||t.includes("air")?"rgba(122, 194, 255, 0.75)":t.includes("carbon")||t.includes("co2")?"rgba(255, 198, 138, 0.75)":t.includes("sulfur")?"rgba(255, 233, 138, 0.75)":"rgba(180, 222, 255, 0.68)"}function Vs(e){switch(e){case"presentation":return{layers:{background:!0,guides:!0,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!0}};case"atlas-card":return{layers:{background:!0,guides:!1,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!0}};case"markdown":return{layers:{background:!0,guides:!1,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!1}};default:return{layers:{background:!0,guides:!0,orbits:!0,objects:!0,labels:!0,structures:!0,metadata:!0}}}}function Kn(e){return typeof e=="number"?e:e&&typeof e=="object"&&"value"in e?e.value:null}function Jn(e){return`${e.renderId}-clip`}function Ct(e,t,n){return`${e},${t-n} ${e+n},${t} ${e},${t+n} ${e-n},${t}`}function Vt(e,t,n){return`${e},${t-n*1.2} ${e+n*.9},${t-n*.3} ${e+n*1.2},${t+n*.8} ${e},${t+n*1.2} ${e-n*1.1},${t+n*.3} ${e-n*.8},${t-n*.8}`}function zs(e,t){let n=Array.from({length:10},(i,o)=>{let a=90+o*((e-180)/9);return`<line class="wo-grid" x1="${a}" y1="120" x2="${a}" y2="${t-70}" />`}).join(""),r=Array.from({length:6},(i,o)=>{let a=150+o*((t-240)/5);return`<line class="wo-grid" x1="56" y1="${a}" x2="${e-56}" y2="${a}" />`}).join("");return`${n}${r}`}function Rs(e){return[`${e.layoutPreset} layout`,`${e.viewMode} view`,`${e.renderPreset??"custom"} preset`,`schema ${e.metadata.version??"1.0"}`].join(" - ")}function Ve(e){return e.type==="structure"||e.type==="phenomenon"}function ze(e,t,n){let r=zt(e),i=zt(t);if(!r||!i)return;let o=Math.min(Math.max(n,0),1);return Bs({r:Math.round(r.r+(i.r-r.r)*o),g:Math.round(r.g+(i.g-r.g)*o),b:Math.round(r.b+(i.b-r.b)*o)})}function Zn(e,t){let n=zt(e);return n?`rgba(${n.r}, ${n.g}, ${n.b}, ${t})`:e}function zt(e){let t=e.trim();return/^#[0-9a-f]{6}$/i.test(t)?{r:Number.parseInt(t.slice(1,3),16),g:Number.parseInt(t.slice(3,5),16),b:Number.parseInt(t.slice(5,7),16)}:/^#[0-9a-f]{3}$/i.test(t)?{r:Number.parseInt(t[1]+t[1],16),g:Number.parseInt(t[2]+t[2],16),b:Number.parseInt(t[3]+t[3],16)}:null}function Bs(e){let t=n=>n.toString(16).padStart(2,"0");return`#${t(e.r)}${t(e.g)}${t(e.b)}`}function _s(e){return!!e.trim()}function O(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function L(e){return O(e)}function ir(e){return encodeURIComponent(JSON.stringify(e))}function Nt(e,t,n={}){return{version:"2.0",mode:Bt(t),scene:e,spatialScene:n.spatialScene,options:{viewMode:n.viewMode??or(Bt(t)),initialViewpointId:n.initialViewpointId,initialSelectionObjectId:n.initialSelectionObjectId,initialFilter:n.initialFilter??null,atlasState:n.atlasState??null,minimap:n.minimap}}}function Wt(e,t={}){let n={...e,options:{...e.options,theme:t.theme??e.options?.theme,layers:t.layers??e.options?.layers,subtitle:t.subtitle??e.options?.subtitle,preset:t.preset??e.options?.preset,viewMode:t.viewMode??e.options?.viewMode??or(Bt(e.mode)),initialViewpointId:t.initialViewpointId??e.options?.initialViewpointId,initialSelectionObjectId:t.initialSelectionObjectId??e.options?.initialSelectionObjectId,initialFilter:t.initialFilter??e.options?.initialFilter??null,atlasState:t.atlasState??e.options?.atlasState??null,minimap:t.minimap??e.options?.minimap}},r=K(e.scene,{theme:n.options?.theme,layers:n.options?.layers,filter:n.options?.initialFilter??null,selectedObjectId:n.options?.initialSelectionObjectId??null,subtitle:n.options?.subtitle,preset:n.options?.preset});return`<div class="${ft(t.className??"worldorbit-embed")}" data-worldorbit-embed="true" data-worldorbit-mode="${n.mode}" data-worldorbit-preset="${ft(n.options?.preset??e.scene.renderPreset??"custom")}" data-worldorbit-viewpoint="${ft(n.options?.initialViewpointId??"")}" data-worldorbit-payload="${ft(ir(n))}">${r}</div>`}function ft(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function Bt(e){return!e||e==="interactive"?"interactive-2d":e}function or(e){return e==="interactive-3d"?"3d":"2d"}function we(e,t={}){try{let n=de(e),r=N(n.document,ar(n,t)),i=t.mode??"static";if(i==="interactive"||i==="interactive-2d"||i==="interactive-3d"){let o=i==="interactive"?"interactive-2d":i;return Wt(Nt(r,o,{spatialScene:o==="interactive-3d"?it(n.document,ar(n,t)):void 0,viewMode:o==="interactive-3d"?"3d":"2d",initialViewpointId:t.initialViewpointId,initialSelectionObjectId:t.initialSelectionObjectId,initialFilter:t.initialFilter??null,atlasState:t.atlasState??null,minimap:t.minimap}),{className:t.className??"worldorbit-block worldorbit-interactive",theme:t.theme,layers:t.layers,subtitle:t.subtitle,preset:t.preset,viewMode:o==="interactive-3d"?"3d":"2d",initialViewpointId:t.initialViewpointId,initialSelectionObjectId:t.initialSelectionObjectId,initialFilter:t.initialFilter??null,atlasState:t.atlasState??null,minimap:t.minimap})}return`<figure class="${Js(t.className??"worldorbit-block worldorbit-static")}">${K(r,t)}</figure>`}catch(n){if(t.strict)throw n;return Ut(n instanceof Error?n.message:String(n))}}function Ut(e){return`<pre class="worldorbit-error">WorldOrbit error: ${sr(e)}</pre>`}function sr(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">")}function Js(e){return sr(e).replaceAll('"',""")}function ar(e,t){let n=e.atlasDocument??e.draftDocument;return t.preset||!n?.system?.defaults.preset?t:{...t,preset:n.system.defaults.preset}}function lr(e={}){return function(n){cr(n,(r,i,o)=>{!o||i===-1||r.type!=="code"||!Qs(r.lang)||(o.children[i]={type:"html",value:we(r.value??"",e)})})}}function cr(e,t,n=null){let r=e.children??[];for(let i=0;i<r.length;i+=1){let o=r[i];t(o,i,e),cr(o,t,e)}n||t(e,-1,null)}function Qs(e){return(e??"").trim().toLowerCase()==="worldorbit"}function ur(e={}){return function(n){dr(n,(r,i,o)=>{if(!o||i===-1||r.type!=="element"||r.tagName!=="pre")return;let a=r.children?.[0];if(!a||a.type!=="element"||a.tagName!=="code"||!el(a.properties?.className).includes("language-worldorbit"))return;let l=fr(a);o.children[i]={type:"raw",value:we(l,e)}})}}function dr(e,t,n=null){let r=e.children??[];for(let i=0;i<r.length;i+=1){let o=r[i];t(o,i,e),dr(o,t,e)}n||t(e,-1,null)}function el(e){return Array.isArray(e)?e.map(t=>String(t)):typeof e=="string"?e.split(/\s+/).filter(Boolean):[]}function fr(e){return e.type==="text"?e.value??"":(e.children??[]).map(t=>fr(t)).join("")}return jr(tl);})();
|