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.
Files changed (48) hide show
  1. package/README.md +17 -18
  2. package/dist/browser/core/dist/draft-parse.js +131 -12
  3. package/dist/browser/core/dist/draft.js +4 -4
  4. package/dist/browser/core/dist/format.js +42 -3
  5. package/dist/browser/core/dist/load.js +7 -2
  6. package/dist/browser/core/dist/scene.js +215 -3
  7. package/dist/browser/core/dist/solver.d.ts +8 -1
  8. package/dist/browser/core/dist/solver.js +72 -0
  9. package/dist/browser/core/dist/spatial-scene.js +56 -0
  10. package/dist/browser/core/dist/types.d.ts +74 -2
  11. package/dist/browser/viewer/dist/render.js +71 -15
  12. package/dist/browser/viewer/dist/theme.js +1 -0
  13. package/dist/browser/viewer/dist/types.d.ts +7 -0
  14. package/dist/browser/viewer/dist/viewer.js +27 -0
  15. package/dist/obsidian-plugin/main.js +81 -67
  16. package/dist/unpkg/core/dist/draft-parse.js +131 -12
  17. package/dist/unpkg/core/dist/draft.js +4 -4
  18. package/dist/unpkg/core/dist/format.js +42 -3
  19. package/dist/unpkg/core/dist/load.js +7 -2
  20. package/dist/unpkg/core/dist/scene.js +215 -3
  21. package/dist/unpkg/core/dist/solver.d.ts +8 -1
  22. package/dist/unpkg/core/dist/solver.js +72 -0
  23. package/dist/unpkg/core/dist/spatial-scene.js +56 -0
  24. package/dist/unpkg/core/dist/types.d.ts +74 -2
  25. package/dist/unpkg/viewer/dist/render.js +71 -15
  26. package/dist/unpkg/viewer/dist/theme.js +1 -0
  27. package/dist/unpkg/viewer/dist/types.d.ts +7 -0
  28. package/dist/unpkg/viewer/dist/viewer.js +27 -0
  29. package/dist/unpkg/worldorbit-core.min.js +12 -12
  30. package/dist/unpkg/worldorbit-editor.min.js +336 -322
  31. package/dist/unpkg/worldorbit-markdown.min.js +50 -36
  32. package/dist/unpkg/worldorbit-viewer.min.js +225 -211
  33. package/dist/unpkg/worldorbit.js +473 -19
  34. package/dist/unpkg/worldorbit.min.js +229 -215
  35. package/package.json +1 -1
  36. package/packages/core/dist/draft-parse.js +131 -12
  37. package/packages/core/dist/draft.js +4 -4
  38. package/packages/core/dist/format.js +42 -3
  39. package/packages/core/dist/load.js +7 -2
  40. package/packages/core/dist/scene.js +215 -3
  41. package/packages/core/dist/solver.d.ts +8 -1
  42. package/packages/core/dist/solver.js +72 -0
  43. package/packages/core/dist/spatial-scene.js +56 -0
  44. package/packages/core/dist/types.d.ts +74 -2
  45. package/packages/viewer/dist/render.js +71 -15
  46. package/packages/viewer/dist/theme.js +1 -0
  47. package/packages/viewer/dist/types.d.ts +7 -0
  48. package/packages/viewer/dist/viewer.js +27 -0
@@ -1,12 +1,12 @@
1
- "use strict";var WorldOrbitCore=(()=>{var ht=Object.defineProperty;var Ar=Object.getOwnPropertyDescriptor;var Fr=Object.getOwnPropertyNames;var Er=Object.prototype.hasOwnProperty;var Lr=(e,t)=>{for(var n in t)ht(e,n,{get:t[n],enumerable:!0})},Rr=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Fr(t))!Er.call(e,i)&&i!==n&&ht(e,i,{get:()=>t[i],enumerable:!(r=Ar(t,i))||r.enumerable});return e};var _r=e=>Rr(ht({},"__esModule",{value:!0}),e);var qs={};Lr(qs,{WORLDORBIT_FIELD_KEYS:()=>Kt,WORLDORBIT_FIELD_SCHEMAS:()=>yt,WORLDORBIT_OBJECT_TYPES:()=>je,WorldOrbitError:()=>d,cloneAtlasDocument:()=>lt,createDiagnostic:()=>tn,createEmptyAtlasDocument:()=>_t,createTrajectorySolverSnapshot:()=>Fn,detectWorldOrbitSchemaVersion:()=>Wt,diagnosticFromError:()=>L,evaluateSpatialSceneAtTime:()=>Pn,extractWorldOrbitBlocks:()=>kr,formatAtlasDocument:()=>rt,formatDocument:()=>it,formatDraftDocument:()=>St,getAtlasDocumentNode:()=>zt,getFieldSchema:()=>F,isKnownFieldKey:()=>gt,listAtlasDocumentPaths:()=>pr,load:()=>Us,loadWorldOrbitSource:()=>pt,loadWorldOrbitSourceWithDiagnostics:()=>Yt,materializeAtlasDocument:()=>Fe,materializeDraftDocument:()=>Ln,normalizeDocument:()=>G,normalizeWithDiagnostics:()=>nn,parse:()=>Or,parseSafe:()=>Ws,parseWithDiagnostics:()=>Ue,parseWorldOrbit:()=>ee,parseWorldOrbitAtlas:()=>ct,parseWorldOrbitDraft:()=>rr,removeAtlasDocumentNode:()=>hr,render:()=>Bs,renderDocumentToScene:()=>K,renderDocumentToSpatialScene:()=>Tn,resolveAtlasDiagnosticPath:()=>Vt,resolveAtlasDiagnostics:()=>Ct,rotatePoint:()=>pn,stringify:()=>Ys,supportsObjectType:()=>vt,tokenizeLine:()=>Xt,tokenizeLineDetailed:()=>ue,unitFamilyAllowsUnit:()=>xe,updateAtlasDocumentNode:()=>mr,upgradeDocumentToDraftV2:()=>nt,upgradeDocumentToV2:()=>Ae,upsertAtlasDocumentNode:()=>Nt,validateAtlasDocumentWithDiagnostics:()=>yr,validateDocument:()=>H,validateDocumentWithDiagnostics:()=>rn});var d=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 $e=["system","star","planet","moon","belt","asteroid","comet","ring","craft","structure","phenomenon"],N=$e.filter(e=>e!=="system"),zr=["star","planet","moon","asteroid","comet","craft","structure","phenomenon"],Ht=["craft","structure","phenomenon"],Q=["star","planet","moon","belt","asteroid","comet","ring","craft","structure","phenomenon"],Nr=["star","planet","moon","belt","asteroid","comet","ring","craft","structure","phenomenon"];function $(e,t){return{key:e,...t}}var je=new Set($e),yt=new Map([$("orbit",{kind:"string",placement:!0,arity:"single",objectTypes:Q}),$("distance",{kind:"unit",placement:!0,arity:"single",objectTypes:Q,unitFamily:"distance"}),$("semiMajor",{kind:"unit",placement:!0,arity:"single",objectTypes:Q,unitFamily:"distance"}),$("eccentricity",{kind:"number",placement:!0,arity:"single",objectTypes:Q}),$("period",{kind:"unit",placement:!0,arity:"single",objectTypes:Q,unitFamily:"duration"}),$("angle",{kind:"unit",placement:!0,arity:"single",objectTypes:Q,unitFamily:"angle"}),$("inclination",{kind:"unit",placement:!0,arity:"single",objectTypes:Q,unitFamily:"angle"}),$("phase",{kind:"unit",placement:!0,arity:"single",objectTypes:Q,unitFamily:"angle"}),$("at",{kind:"string",placement:!0,arity:"single",objectTypes:Ht}),$("surface",{kind:"string",placement:!0,arity:"single",objectTypes:Ht}),$("free",{kind:"string",placement:!0,arity:"single",objectTypes:Nr}),$("kind",{kind:"string",placement:!1,arity:"single",objectTypes:N}),$("class",{kind:"string",placement:!1,arity:"single",objectTypes:N}),$("culture",{kind:"string",placement:!1,arity:"single",objectTypes:N}),$("tags",{kind:"list",placement:!1,arity:"multiple",objectTypes:$e}),$("color",{kind:"string",placement:!1,arity:"single",objectTypes:$e}),$("image",{kind:"string",placement:!1,arity:"single",objectTypes:zr}),$("hidden",{kind:"boolean",placement:!1,arity:"single",objectTypes:$e}),$("radius",{kind:"unit",placement:!1,arity:"single",objectTypes:N,unitFamily:"radius"}),$("mass",{kind:"unit",placement:!1,arity:"single",objectTypes:N,unitFamily:"mass"}),$("density",{kind:"unit",placement:!1,arity:"single",objectTypes:N,unitFamily:"generic"}),$("gravity",{kind:"unit",placement:!1,arity:"single",objectTypes:N,unitFamily:"generic"}),$("temperature",{kind:"unit",placement:!1,arity:"single",objectTypes:N,unitFamily:"generic"}),$("albedo",{kind:"number",placement:!1,arity:"single",objectTypes:N}),$("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:N}),$("source",{kind:"string",placement:!1,arity:"single",objectTypes:N}),$("cycle",{kind:"unit",placement:!1,arity:"single",objectTypes:N,unitFamily:"duration"}),$("trajectory",{kind:"string",placement:!1,arity:"single",objectTypes:["craft","structure"]})].map(e=>[e.key,e])),Kt=new Set(yt.keys());function F(e){return yt.get(e)}function gt(e){return Kt.has(e)}function vt(e,t){return e.objectTypes.includes(t)}function xe(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 Xt(e){return ue(e).map(t=>t.value)}function ue(e,t={}){let n=[],r=t.columnOffset??0,i="",a=null,o=!1,c=!1,s=null,l=()=>{a!==null&&(n.push({value:i,column:a,quoted:o}),i="",a=null,o=!1)};for(let u=0;u<e.length;u++){let f=e[u],p=r+u+1;if(c&&f==="\\"){let m=e[u+1];if(m==='"'||m==="\\"){i+=m,u++;continue}}if(f==='"'){c?c=!1:(a===null&&(a=p),o=!0,s=p,c=!0);continue}if(!c&&/\s/.test(f)){l();continue}a===null&&(a=p),i+=f}if(c)throw new d("Unclosed quote in line",t.line,s??r+e.length);return l(),n}function Ce(e){return e.match(/^\s*/)?.[0].length??0}function ee(e){let t=e.split(/\r?\n/),n=[],r=null,i=null,a=!1,o=!1,c=null,s=null,l=null,u=null;for(let f=0;f<t.length;f++){let p=t[f],m=f+1;if(!p.trim())continue;let g=Ce(p),h=ue(p.slice(g),{line:m,columnOffset:g});if(h.length!==0){if(g===0){if(a=!1,o=!1,c=null,s=null,l=null,u=null,h.length>=1&&h[0].value==="theme"){o=!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=Cr(h,m);n.push(I),i=I;continue}if(o){if(h.length>=2&&h[0].value==="preset"&&(!l||g<=l)){r&&(r.preset=h[1].value);continue}u&&l!==null&&g>l?u.fields.push(Ur(h,m)):(l=g,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 d("Indented line without parent object",m,g+1);if(h.length===1&&h[0].value==="info"){a=!0,c=g;continue}a&&g<=(c??0)&&(a=!1),a?i.infoEntries.push(Wr(h,m)):i.blockFields.push(Br(h,m))}}return{type:"document",theme:r,objects:n}}function Cr(e,t){if(e.length<2)throw new d("Invalid object declaration",t,e[0]?.column??1);let[n,r,...i]=e;if(!je.has(n.value))throw new d(`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],a=F(i.value);if(!a)throw new d(`Unknown field "${i.value}"`,t,i.column);r++;let o=[];if(a.arity==="multiple")for(;r<e.length&&!gt(e[r].value);)o.push(e[r]),r++;else{let c=e[r];c&&(o.push(c),r++)}if(o.length===0)throw new d(`Missing value for field "${i.value}"`,t,i.column);n.push({type:"field",key:i.value,values:o.map(c=>c.value),location:{line:t,column:i.column}})}return n}function Br(e,t){if(e.length<2)throw new d("Invalid field line",t,e[0]?.column??1);if(!F(e[0].value))throw new d(`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 Ur(e,t){if(e.length<2)throw new d("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 Wr(e,t){if(e.length<2)throw new d("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)?$/,Yr=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),qr=/^[A-Za-z][A-Za-z0-9+.-]*:/;function G(e){let t=null,n=[],r=e.theme?Gr(e.theme):null;for(let i of e.objects){let a=Kr(i);if(i.objectType==="system"){if(t)throw d.fromLocation("Only one system object is allowed",i.location);t=a}else n.push(a)}return{format:"worldorbit",version:"1.0",schemaVersion:"1.0",theme:r,system:t,groups:[],relations:[],events:[],trajectories:[],objects:n}}function Gr(e){let t={};for(let n of e.blocks){let r=Jt(n.fields);t[n.target]=Hr(r)}return{preset:e.preset,styles:t}}function Hr(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 a=Number(i);if(!Number.isNaN(a)&&i.trim()!==""){t[n]=a;continue}}t[n]=r.values.join(" ")}return t}function Kr(e){let t=[...e.inlineFields,...e.blockFields];Xr(e.objectType,t);let n=Jt(t),r=Zr(e.objectType,n),i=Jr(n),a=ti(e.infoEntries);return e.objectType==="system"?{type:"system",id:e.name,title:typeof i.title=="string"?i.title:null,description:null,epoch:null,referencePlane:null,properties:i,info:a}:{type:e.objectType,id:e.name,properties:i,placement:r,info:a}}function Xr(e,t){for(let n of t){let r=F(n.key);if(!r)throw d.fromLocation(`Unknown field "${n.key}"`,n.location);if(!vt(r,e))throw d.fromLocation(`Field "${n.key}" is not valid on "${e}"`,n.location);if(r.arity==="single"&&n.values.length!==1)throw d.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 d.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"),a=t.has("free"),o=[n,r,i,a].filter(Boolean).length;if(o>1){let c=t.get("orbit")??t.get("at")??t.get("surface")??t.get("free");throw d.fromLocation("Object has multiple placement modes",c?.location)}if(e==="system"&&o>0)throw d.fromLocation("System objects cannot declare placement",[...t.values()][0]?.location);if(n)return{mode:"orbit",target:Ve(t,"orbit"),distance:he(t,"distance"),semiMajor:he(t,"semiMajor"),eccentricity:ii(t,"eccentricity"),period:he(t,"period"),angle:he(t,"angle"),inclination:he(t,"inclination"),phase:he(t,"phase")};if(r){let c=Be(t,"at"),s=Ve(t,"at");return{mode:"at",target:s,reference:ni(s,c.location)}}if(i)return{mode:"surface",target:Ve(t,"surface")};if(a){let c=Ve(t,"free"),s=ri(c);return{mode:"free",distance:s??void 0,descriptor:s?void 0:c}}return null}function Jr(e){let t={};for(let[n,r]of e.entries()){let i=F(n);if(!(!i||i.placement))switch(i.kind){case"list":t[n]=r.values;break;case"boolean":t[n]=ai(r);break;case"number":t[n]=en(ye(r),n,r.location);break;case"unit":t[n]=Qt(ye(r),r.location,n);break;case"string":t[n]=Qr(n,r);break}}return t}function Qr(e,t){let n=t.values.join(" ").trim();return e==="image"&&ei(n,t.location),n}function ei(e,t){if(!e)throw d.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw d.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match(qr);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw d.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function ti(e){let t={};for(let n of e){if(n.key in t)throw d.fromLocation(`Duplicate info key "${n.key}"`,n.location);t[n.key]=n.value}return t}function ni(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw d.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 d.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 d.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let a=F(n);if(a?.unitFamily&&!xe(a.unitFamily,i.unit))throw d.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function ri(e){let t=e.match(Zt);return t?{value:Number(t[1]),unit:t[2]??null}:null}function he(e,t){if(!e.has(t))return;let n=Be(e,t);return Qt(ye(n),n.location,t)}function ii(e,t){if(!e.has(t))return;let n=Be(e,t);return en(ye(n),t,n.location)}function en(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw d.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function ai(e){let t=ye(e).toLowerCase(),n=Yr.get(t);if(n===void 0)throw d.fromLocation(`Invalid boolean value "${t}" for "${e.key}"`,e.location);return n}function Be(e,t){let n=e.get(t);if(!n)throw new d(`Missing value for key "${t}"`);return n}function Ve(e,t){return ye(Be(e,t))}function ye(e){if(e.values.length!==1)throw d.fromLocation(`Field "${e.key}" expects exactly one value`,e.location);return e.values[0]}var oi=new Set(["star","planet","moon","asteroid","comet"]);function H(e){let t=new Set,n=new Map;for(let r of e.objects){if(t.has(r.id))throw new d(`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 d(`Unknown placement target "${r.placement.target}" on "${r.id}"`);if(r.placement.mode==="surface"){let i=n.get(r.placement.target);if(!i||!oi.has(i.type))throw new d(`Surface target "${r.placement.target}" on "${r.id}" is not surface-capable`)}r.placement.mode==="at"&&(r.placement.reference.kind==="lagrange"&&si(r,r.placement.reference,t),r.placement.reference.kind==="anchor"&&ci(r,r.placement.reference,t))}}function si(e,t,n){if(!n.has(t.primary))throw new d(`Unknown Lagrange reference "${t.primary}" on "${e.id}"`);if(t.secondary&&!n.has(t.secondary))throw new d(`Unknown Lagrange reference "${t.secondary}" on "${e.id}"`)}function ci(e,t,n){if(!n.has(t.objectId))throw new d(`Unknown anchor target "${t.objectId}" on "${e.id}"`)}function tn(e){return{...e}}function L(e,t,n=`${t}.failed`){return e instanceof d?{code:n,severity:"error",source:t,message:e.message,line:e.line,column:e.column}:e instanceof Error?{code:n,severity:"error",source:t,message:e.message}:{code:n,severity:"error",source:t,message:String(e)}}function Ue(e){let t;try{t=ee(e)}catch(r){return{ok:!1,value:null,diagnostics:[L(r,"parse")]}}let n;try{n=G(t)}catch(r){return{ok:!1,value:null,diagnostics:[L(r,"normalize")]}}try{H(n)}catch(r){return{ok:!1,value:null,diagnostics:[L(r,"validate")]}}return{ok:!0,value:{ast:t,document:n},diagnostics:[]}}function nn(e){try{return{ok:!0,value:G(e),diagnostics:[]}}catch(t){return{ok:!1,value:null,diagnostics:[L(t,"normalize")]}}}function rn(e){try{return H(e),{ok:!0,value:e,diagnostics:[]}}catch(t){return{ok:!1,value:null,diagnostics:[L(t,"validate")]}}}var ke=1495978707e-1,li=6371,ui=71492,di=695700,fi=63241.077,pi=206264.806,mi=206264806,dn=.68,hi=.2,fn=28;function K(e,t={}){let n=vi(t),r=n.width,i=n.height,a=n.padding,o=gi(e),c=wi(e,t.projection),s=jt(t.camera??null),l=$t(c,s),u=ki(o),f=ji(o,t.scaleModel,t.bodyScaleMode),p=e.system?.id??null,m=t.activeEventId??null,g=yi(e.objects,e.events??[],m),h=Oi(g,r,i,a,u,f),I=new Map(g.map(w=>[w.id,w])),M=la(g,I),k=new Map,b=[],O=[],W=[],E=[],ae=[],oe=new Map,me=new Map;for(let w of g){let z=w.placement;if(!z){W.push(w);continue}if(z.mode==="orbit"){cn(me,z.target,w);continue}if(z.mode==="surface"){cn(oe,z.target,w);continue}if(z.mode==="at"){ae.push(w);continue}E.push(w)}let Ie=E.length>0?r*.42:r/2,se=i/2,T={orbitChildren:me,surfaceChildren:oe,objectMap:I,spacingFactor:u,projection:l,scaleModel:f,sceneMetricScale:h},ce=W.find(w=>w.type==="star")??W[0]??null;ce&&wt(ce,Ie,se,0,k,b,O,T);let Y=W.filter(w=>w.id!==ce?.id);if(Y.length>0){let w=Math.min(r,i)*.28*u*f.orbitDistanceMultiplier;Y.forEach((z,P)=>{let mt=Pe(P,Y.length,-Math.PI/2),le=De(mt,w,l,1);wt(z,Ie+le.x,se+le.y,0,k,b,O,T)})}E.forEach((w,z)=>{let P=r-a-140-ha(w.placement?.mode==="free"?w.placement.distance:void 0,f,h),mt=Math.max(76,(i-a*2-180)/Math.max(1,E.length)*u)*f.freePlacementMultiplier,le=a+92+z*mt;k.set(w.id,{object:w,x:P,y:le,radius:He(w,0,f,h),sortKey:Xe(P,le,0)}),O.push({object:w,groupId:M.groupIds.get(w.id)??null,x1:P-60,y1:le,x2:P-18,y2:le,mode:"free"}),qe(w,k,b,O,T,1)}),ae.forEach((w,z)=>{if(k.has(w.id)||!w.placement||w.placement.mode!=="at")return;let P=sa(w.placement.reference,k,I,z,ae.length,r,i,a,T);k.set(w.id,{object:w,x:P.x,y:P.y,radius:He(w,2,f,h),sortKey:Xe(P.x,P.y,2),anchorX:P.anchorX,anchorY:P.anchorY}),P.anchorX!==void 0&&P.anchorY!==void 0&&O.push({object:w,groupId:M.groupIds.get(w.id)??null,x1:P.anchorX,y1:P.anchorY,x2:P.x,y2:P.y,mode:"at"}),qe(w,k,b,O,T,2)});let A=[...k.values()].map(w=>Si(w,f,M)),q=b.map(w=>Mi(w,M.groupIds.get(w.object.id)??null)),ze=O.map(w=>Ti(w)),Ne=Pi(A,r,i,f.labelMultiplier),qt=zi(e,A),Gt=Ni(e.events??[],A,m),Sr=Li(q,qt,Gt,ze,A,Ne),Mr=Ri(A,q,ze,Ne,M,f.labelMultiplier),Tr=_i(e,A),Pr=Ci(e,c,n.preset,M,I),Dr=Ji(r,i,A,q,ze,Ne,f.labelMultiplier);return{width:r,height:i,padding:a,renderPreset:n.preset,projection:c,renderProjection:l,camera:s,scaleModel:f,title:String(e.system?.title??e.system?.properties.title??e.system?.id??"WorldOrbit")||"WorldOrbit",subtitle:$i(c,l,o,s),systemId:p,viewMode:c,layoutPreset:o,metadata:{format:e.format,version:e.version,view:c,renderProjection:l,scale:String(e.system?.properties.scale??o),units:String(e.system?.properties.units??"mixed"),preset:n.preset??"custom","body.scaleMode":f.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:Dr,layers:Sr,groups:Mr,semanticGroups:Tr,viewpoints:Pr,events:Gt,activeEventId:m,objects:A,orbitVisuals:q,relations:qt,leaders:ze,labels:Ne}}function pn(e,t,n){let r=Ze(n),i=Math.cos(r),a=Math.sin(r),o=e.x-t.x,c=e.y-t.y;return{x:t.x+o*i-c*a,y:t.y+o*a+c*i}}function yi(e,t,n){let r=e.map(c=>structuredClone(c));if(!n)return r;let i=t.find(c=>c.id===n);if(!i)return r;let a=new Map(r.map(c=>[c.id,c])),o=new Set([...i.targetObjectId?[i.targetObjectId]:[],...i.participantObjectIds,...i.positions.map(c=>c.objectId)]);for(let c of o){let s=a.get(c);s&&(i.epoch&&(s.epoch=i.epoch),i.referencePlane&&(s.referencePlane=i.referencePlane))}for(let c of i.positions){let s=a.get(c.objectId);s&&(c.placement&&(s.placement=structuredClone(c.placement)),c.inner&&(s.properties.inner={...c.inner}),c.outer&&(s.properties.outer={...c.outer}),c.epoch&&(s.epoch=c.epoch),c.referencePlane&&(s.referencePlane=c.referencePlane))}return r}function gi(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 vi(e){let t=bi(e.preset);return{width:e.width??t.width,height:e.height??t.height,padding:e.padding??t.padding,preset:e.preset??null}}function bi(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 wi(e,t){if(t==="topdown"||t==="isometric"||t==="orthographic"||t==="perspective")return t;let n=String(e.system?.properties.view??"topdown").toLowerCase();return yn(n)??"topdown"}function $t(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 jt(e){if(!e)return null;let t={azimuth:bt(e.azimuth),elevation:bt(e.elevation),roll:bt(e.roll),distance:Ii(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 Ii(e){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:null}function $i(e,t,n,r){let i=[`${ln(e)} view`,`${ln(n)} layout`];if(e!==t&&i.push(`2D ${t} fallback`),r){let a=[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);a.length>0&&i.push(`camera ${a.join(" / ")}`)}return i.join(" - ")}function ji(e,t,n){return{...xi(e),...n?{bodyScaleMode:n}:{},...t}}function xi(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 ki(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function Oi(e,t,n,r,i,a){let o=[],c=[];for(let m of e){let g=ga(m);g!==null&&g>0&&c.push(g);let h=m.placement;if(h){if(h.mode==="orbit"){let I=te(h.semiMajor??h.distance??null);I!==null&&I>0&&o.push(I);continue}if(h.mode==="free"){let I=te(h.distance??null);I!==null&&I>0&&o.push(I)}}}let s=Math.max(...o,0),l=Math.max(...c,0),u=Math.max(s,l*6,0),f=u+Math.max(Math.sqrt(u),l*2,s>0?.25:0);return f<=0?{pixelsPerMetric:null,hasExplicitScale:!1}:{pixelsPerMetric:Math.max(Math.min(t,n)/2-r-24,120)*i*a.orbitDistanceMultiplier/f,hasExplicitScale:!0}}function Si(e,t,n){let{object:r,x:i,y:a,radius:o,sortKey:c,anchorX:s,anchorY:l}=e,u=r.renderHints?.renderPriority??0;return{renderId:ge(r.id),objectId:r.id,object:r,parentId:n.parentIds.get(r.id)??null,ancestorIds:n.ancestorIds.get(r.id)??[],childIds:n.childIds.get(r.id)??[],groupId:n.groupIds.get(r.id)??null,semanticGroupIds:[...r.groups??[]],x:i,y:a,radius:o,visualRadius:ma(r,o,t),sortKey:c+u*.001,anchorX:s,anchorY:l,label:r.id,secondaryLabel:r.type==="structure"||r.type==="craft"?String(r.properties.kind??r.type):r.type,fillColor:va(r.properties.color),imageHref:typeof r.properties.image=="string"&&r.properties.image.trim()?r.properties.image:void 0,hidden:r.properties.hidden===!0}}function Mi(e,t){return{renderId:`${ge(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 Ti(e){return{renderId:`${ge(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 Pi(e,t,n,r){let i=[],a=[],o=new Map(e.map(s=>[s.objectId,s])),c=[...e].filter(s=>!s.hidden&&s.object.renderHints?.renderLabel!==!1).sort(Di);for(let s of c){let l=Ai(s,o,a,t,n,r)??hn(s,mn(s,o.get(s.parentId??"")??null,n),0,r);a.push(In(s,l,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:l.x,y:l.labelY,secondaryY:l.secondaryY,textAnchor:l.textAnchor,direction:l.direction,hidden:s.hidden})}return i}function Di(e,t){let n=an(e)-an(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 an(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 Ai(e,t,n,r,i,a){for(let o of Fi(e,t,r,i)){let c=o==="left"||o==="right"?4:6;for(let s=0;s<=c;s+=1){let l=hn(e,o,s,a),u=In(e,l,a);if(!n.some(f=>fa(f,u)))return l}}return null}function Fi(e,t,n,r){let i=e.parentId?t.get(e.parentId)??null:null,a=mn(e,i,r),o=a==="below"?"above":"below",c=Ei(e,i,n),s=c==="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"?[c,a,s,o]:[a,c,o,s]}function mn(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 Ei(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 hn(e,t,n,r){let i=14*r;switch(t){case"above":{let a=e.y-(e.radius+18*r+n*i);return{x:e.x,labelY:a,secondaryY:a-16*r,textAnchor:"middle",direction:t}}case"below":{let a=e.y+e.radius+18*r+n*i;return{x:e.x,labelY:a,secondaryY:a+16*r,textAnchor:"middle",direction:t}}case"left":{let a=e.x-(e.visualRadius+16*r+n*i),o=e.y-4*r;return{x:a,labelY:o,secondaryY:o+16*r,textAnchor:"end",direction:t}}case"right":{let a=e.x+e.visualRadius+16*r+n*i,o=e.y-4*r;return{x:a,labelY:o,secondaryY:o+16*r,textAnchor:"start",direction:t}}}}function Li(e,t,n,r,i,a){let o=e.filter(s=>!s.hidden&&!!s.backArcPath).map(s=>s.renderId),c=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:o},{id:"orbits-front",renderIds:c},{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:a.filter(s=>!s.hidden).map(s=>s.renderId)},{id:"metadata",renderIds:["wo-title","wo-subtitle","wo-meta"]}]}function Ri(e,t,n,r,i,a){let o=new Map,c=s=>{if(!s)return null;let l=o.get(s);if(l)return l;let u=i.groupRoots.get(s)??null,f={renderId:s,rootObjectId:u,label:u??s,objectIds:[],orbitIds:[],labelIds:[],leaderIds:[],contentBounds:Te(0,0,0,0)};return o.set(s,f),f};for(let s of e){let l=c(s.groupId);l&&!s.hidden&&l.objectIds.push(s.objectId)}for(let s of t){let l=c(s.groupId);l&&!s.hidden&&l.orbitIds.push(s.objectId)}for(let s of n){let l=c(s.groupId);l&&!s.hidden&&l.leaderIds.push(s.objectId)}for(let s of r){let l=c(s.groupId);l&&!s.hidden&&l.labelIds.push(s.objectId)}for(let s of o.values())s.contentBounds=ua(s,e,t,n,r,a);return[...o.values()].sort((s,l)=>s.label.localeCompare(l.label))}function _i(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 zi(e,t){let n=new Map(t.map(r=>[r.objectId,r]));return e.relations.map(r=>{let i=n.get(r.from),a=n.get(r.to);return{renderId:`${ge(r.id)}-relation`,relationId:r.id,relation:r,fromObjectId:r.from,toObjectId:r.to,x1:i?.x??0,y1:i?.y??0,x2:a?.x??0,y2:a?.y??0,hidden:r.hidden||!i||!a||i.hidden||a.hidden}}).sort((r,i)=>r.relation.id.localeCompare(i.relation.id))}function Ni(e,t,n){let r=new Map(t.map(i=>[i.objectId,i]));return e.map(i=>{let a=[...new Set([...i.targetObjectId?[i.targetObjectId]:[],...i.participantObjectIds])],o=a.map(l=>r.get(l)).filter(Boolean),c=o.length>0?o.reduce((l,u)=>l+u.x,0)/o.length:0,s=o.length>0?o.reduce((l,u)=>l+u.y,0)/o.length:0;return{renderId:`${ge(i.id)}-event`,eventId:i.id,event:i,objectIds:a,participantIds:[...i.participantObjectIds],targetObjectId:i.targetObjectId,x:c,y:s,hidden:i.hidden||o.length===0||o.every(l=>l.hidden)||n!==null&&i.id!==n}}).sort((i,a)=>i.event.id.localeCompare(a.event.id))}function Ci(e,t,n,r,i){let a=Vi(e,t,n),o=new Map;for(let[l,u]of Object.entries(e.system?.info??{})){if(!l.startsWith("viewpoint."))continue;let[f,p,...m]=l.split(".");if(f!=="viewpoint"||!p||m.length===0)continue;let g=Ki(p);if(!g)continue;let h=m.join(".").toLowerCase(),I=o.get(g)??{id:g};Bi(I,h,u,e,t,n,r,i),o.set(g,I)}let c=[...o.values()].map(l=>Ui(l,t,n,i)).filter(Boolean),s=c.findIndex(l=>l.id===a.id);return s>=0?c.splice(s,1,{...a,...c[s],layers:{...a.layers,...c[s].layers},filter:c[s].filter??a.filter,generated:!1}):c.unshift(a),c.sort((l,u)=>l.id==="overview"?-1:u.id==="overview"?1:l.label.localeCompare(u.label))}function Vi(e,t,n){let r=e.system?.title??e.system?.properties.title,i=r?`${String(r)} Overview`:"Overview",a=jt(null),o=$t(t,a);return{id:"overview",label:i,summary:"Fit the whole system with the current atlas defaults.",objectId:null,selectedObjectId:null,eventIds:[],projection:t,renderProjection:o,camera:a,preset:n,rotationDeg:0,scale:null,layers:{},filter:null,generated:!0}}function Bi(e,t,n,r,i,a,o,c){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=Me(s);return;case"projection":case"view":e.projection=yn(s)??i;return;case"preset":e.preset=Yi(s)??a;return;case"rotation":case"angle":e.rotationDeg=Oe(s)??e.rotationDeg??0;return;case"camera.azimuth":e.camera={...e.camera??Ye(),azimuth:Oe(s)};return;case"camera.elevation":e.camera={...e.camera??Ye(),elevation:Oe(s)};return;case"camera.roll":e.camera={...e.camera??Ye(),roll:Oe(s)};return;case"camera.distance":e.camera={...e.camera??Ye(),distance:on(s)};return;case"zoom":case"scale":e.scale=on(s);return;case"layers":e.layers=qi(s);return;case"query":e.filter={...e.filter??We(),query:s||null};return;case"types":case"objecttypes":e.filter={...e.filter??We(),objectTypes:Gi(s)};return;case"tags":e.filter={...e.filter??We(),tags:Me(s)};return;case"groups":e.filter={...e.filter??We(),groupIds:Hi(s,r,o,c)};return}}function Ui(e,t,n,r){let i=e.focus&&r.has(e.focus)?e.focus:null,a=e.select&&r.has(e.select)?e.select:i,o=Wi(e.filter),c=e.label?.trim()||Xi(e.id),s=e.projection??t,l=jt(e.camera??null),u=$t(s,l);return{id:e.id,label:c,summary:e.summary?.trim()||Zi(c,i,o),objectId:i,selectedObjectId:a,eventIds:[...new Set(e.eventIds??[])],projection:s,renderProjection:u,camera:l,preset:e.preset??n,rotationDeg:e.rotationDeg??0,scale:e.scale??null,layers:e.layers??{},filter:o,generated:!1}}function We(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Ye(){return{azimuth:null,elevation:null,roll:null,distance:null}}function Wi(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 yn(e){switch(e.toLowerCase()){case"topdown":return"topdown";case"isometric":return"isometric";case"orthographic":return"orthographic";case"perspective":return"perspective";default:return null}}function Yi(e){let t=e.toLowerCase();return t==="diagram"||t==="presentation"||t==="atlas-card"||t==="markdown"?t:null}function Oe(e){let t=Number(e);return Number.isFinite(t)?t:null}function on(e){let t=Oe(e);return t!==null&&t>0?t:null}function qi(e){let t={};for(let n of Me(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 Gi(e){return Me(e).filter(t=>t==="star"||t==="planet"||t==="moon"||t==="belt"||t==="asteroid"||t==="comet"||t==="ring"||t==="craft"||t==="structure"||t==="phenomenon")}function Hi(e,t,n,r){return Me(e).map(i=>t.schemaVersion==="2.1"||t.schemaVersion==="2.5"||t.schemaVersion==="2.6"||t.groups.some(a=>a.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 Me(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function Ki(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function Xi(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Zi(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 Ji(e,t,n,r,i,a,o){let c=Number.POSITIVE_INFINITY,s=Number.POSITIVE_INFINITY,l=Number.NEGATIVE_INFINITY,u=Number.NEGATIVE_INFINITY,f=(p,m)=>{c=Math.min(c,p),s=Math.min(s,m),l=Math.max(l,p),u=Math.max(u,m)};for(let p of r)p.hidden||gn(p,f);for(let p of i)p.hidden||(f(p.x1,p.y1),f(p.x2,p.y2));for(let p of n)p.hidden||vn(p,f);for(let p of a)p.hidden||bn(p,f,o);return!Number.isFinite(c)||!Number.isFinite(s)?Te(0,0,e,t):Te(c,s,l,u)}function gn(e,t){let n=e.bandThickness!==void 0?e.bandThickness/2+4:e.band?10:3;if(e.kind==="circle"&&e.radius!==void 0){t(e.cx-e.radius-n,e.cy-e.radius-n),t(e.cx+e.radius+n,e.cy+e.radius+n);return}let r=e.rx??e.radius??0,i=e.ry??e.radius??0,a=jn(e.cx,e.cy,r,i,e.rotationDeg,0,Math.PI*2,fn*2);for(let o of a)t(o.x-n,o.y-n),t(o.x+n,o.y+n)}function Te(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 vn(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 bn(e,t,n){let r=$n(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 wt(e,t,n,r,i,a,o,c){i.has(e.id)||(i.set(e.id,{object:e,x:t,y:n,radius:He(e,r,c.scaleModel,c.sceneMetricScale),sortKey:Xe(t,n,r)}),qe(e,i,a,o,c,r+1))}function qe(e,t,n,r,i,a){let o=t.get(e.id);if(!o)return;let c=[...i.orbitChildren.get(e.id)??[]].sort(Qi),s=ea(c,o.radius,i.spacingFactor,i.scaleModel,i.sceneMetricScale),l=ra(c,s);c.forEach((f,p)=>{let m=ta(f,p,c.length,o,s,l[p]??s.innerPx,i);n.push({object:f,parentId:e.id,kind:m.kind,cx:m.cx,cy:m.cy,radius:m.radius,rx:m.rx,ry:m.ry,rotationDeg:m.rotationDeg,band:m.band,bandThickness:m.bandThickness,frontArcPath:m.frontArcPath,backArcPath:m.backArcPath}),wt(f,m.objectX,m.objectY,a,t,n,r,i)});let u=[...i.surfaceChildren.get(e.id)??[]];u.forEach((f,p)=>{let m=Pe(p,u.length,-Math.PI/3),g=28*i.spacingFactor,h=De(m,o.radius,i.projection,i.projection==="isometric"?.9:1),I=De(m,o.radius+g,i.projection,i.projection==="isometric"?.9:1),M=o.x+h.x,k=o.y+h.y,b=o.x+I.x,O=o.y+I.y;t.set(f.id,{object:f,x:b,y:O,radius:He(f,a+1,i.scaleModel,i.sceneMetricScale),sortKey:Xe(b,O,a+1),anchorX:M,anchorY:k}),r.push({object:f,groupId:i.objectMap.has(f.id)?Se(da(f,i.objectMap)):null,x1:M,y1:k,x2:b,y2:O,mode:"surface"}),qe(f,t,n,r,i,a+1)})}function Qi(e,t){let n=Ge(e),r=Ge(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 ea(e,t,n,r,i){let a=e.map(m=>Ge(m)),o=a.filter(m=>m!==null),c=r.bodyScaleMode==="strict"?Math.max(2,8*n*r.orbitDistanceMultiplier):(e.length>2?54:64)*n*r.orbitDistanceMultiplier*.42,s=t+Math.max(c*1.2,24*n),l=(e.length>2?54:64)*n*r.orbitDistanceMultiplier;if(o.length===0)return{metrics:a,minMetric:0,maxMetric:0,metricSpread:0,innerPx:s,stepPx:l,pixelSpread:Math.max(l*Math.max(e.length-1,1),l),minimumGapPx:c,pixelsPerMetric:i.pixelsPerMetric};let u=Math.min(...o),f=Math.max(...o),p=f-u;return{metrics:a,minMetric:u,maxMetric:f,metricSpread:p,innerPx:s,stepPx:l,pixelSpread:Math.max(l*Math.max(e.length-1,1),l),minimumGapPx:c,pixelsPerMetric:i.pixelsPerMetric}}function ta(e,t,n,r,i,a,o){let c=e.placement,s=e.type==="belt"||e.type==="ring";if(!c||c.mode!=="orbit"){let oe=i.innerPx+t*i.stepPx;return{kind:"circle",cx:r.x,cy:r.y,radius:oe,rotationDeg:0,band:s,bandThickness:s?12*o.scaleModel.ringThicknessMultiplier:void 0,objectX:r.x,objectY:r.y-oe}}let l=S(typeof c.eccentricity=="number"?c.eccentricity:0,0,.92),u=a,f=Math.max(u*Math.sqrt(1-l*l),u*.18),p=It(c.inclination)??0,m=o.projection==="isometric"?Math.max(hi,Math.cos(Ze(p)))*dn:1,g=Math.max(f*m,u*.14),h=It(c.angle)??0,I=u*l,M=kn(-I,0,h),k=r.x+M.x,b=r.y+M.y,O=aa(c.phase,t,n),W=xn(k,b,u,g,h,O),E=o.projection==="topdown"&&l<=1e-4&&Math.abs(h)<=1e-4,ae=s?oa(e,u,i,o.scaleModel):void 0;return{kind:E?"circle":"ellipse",cx:E?r.x:k,cy:E?r.y:b,radius:E?u:void 0,rx:E?void 0:u,ry:E?void 0:g,rotationDeg:h,band:s,bandThickness:ae,frontArcPath:o.projection==="isometric"||s?sn(k,b,u,g,h,0,Math.PI):void 0,backArcPath:o.projection==="isometric"||s?sn(k,b,u,g,h,Math.PI,Math.PI*2):void 0,objectX:W.x,objectY:W.y}}function na(e,t){return t.pixelsPerMetric!==null?e*t.pixelsPerMetric:t.innerPx+t.stepPx*ia(Math.max(e,0)+1)}function ra(e,t){let n=[];return e.forEach((r,i)=>{let a=Ge(r),o=t.innerPx+i*t.stepPx,c=a===null?o:na(a,t),s=i===0?t.innerPx:(n[i-1]??t.innerPx)+t.minimumGapPx;n.push(Math.max(c,s))}),n}function Ge(e){return!e.placement||e.placement.mode!=="orbit"?null:te(e.placement.semiMajor??e.placement.distance??null)}function ia(e){return Math.log(e)/Math.log(2)}function aa(e,t,n){let r=e?It(e):null;return r!==null?Ze(r-90):Pe(t,n,-Math.PI/2)}function oa(e,t,n,r){let i=te(Ke(e.properties.inner)),a=te(Ke(e.properties.outer));if(i!==null&&a!==null){let c=Math.abs(a-i);if(n.pixelsPerMetric!==null){let l=c*n.pixelsPerMetric;return r.bodyScaleMode==="strict"?Math.max(l*r.ringThicknessMultiplier,1):S(Math.max(l*r.ringThicknessMultiplier,8),8,54)}if(n.metricSpread>0)return S(c/n.metricSpread*n.pixelSpread*r.ringThicknessMultiplier,8,54);let s=Math.max(Math.max(i,a),1e-4);return S(c/s*t*.75*r.ringThicknessMultiplier,8,48)}return(e.type==="belt"?18:12)*r.ringThicknessMultiplier}function sa(e,t,n,r,i,a,o,c,s){if(e.kind==="lagrange")return ca(e,t,n,a,o);if(e.kind==="anchor"){let l=t.get(e.objectId);if(l){let u=Pe(r,i,Math.PI/5),f=(l.radius+36)*s.scaleModel.labelMultiplier,p=De(u,f,s.projection,s.projection==="isometric"?.92:1);return{x:l.x+p.x,y:l.y+p.y,anchorX:l.x,anchorY:l.y}}}if(e.kind==="named"){let l=t.get(e.name);if(l){let u=Pe(r,i,Math.PI/6),f=(l.radius+36)*s.scaleModel.labelMultiplier,p=De(u,f,s.projection,s.projection==="isometric"?.92:1);return{x:l.x+p.x,y:l.y+p.y,anchorX:l.x,anchorY:l.y}}}return{x:a-c-170,y:o-c-86-r*58*s.scaleModel.freePlacementMultiplier}}function ca(e,t,n,r,i){let a=e.secondary?t.get(e.primary):pa(e.primary,t,n),o=t.get(e.secondary??e.primary);if(!a||!o)return{x:r*.7,y:i*.25};let c=o.x-a.x,s=o.y-a.y,l=Math.hypot(c,s)||1,u=c/l,f=s/l,p=-f,m=u,g=S(l*.25,24,68);switch(e.point){case"L1":return{x:o.x-u*g,y:o.y-f*g,anchorX:o.x,anchorY:o.y};case"L2":return{x:o.x+u*g,y:o.y+f*g,anchorX:o.x,anchorY:o.y};case"L3":return{x:a.x-u*g,y:a.y-f*g,anchorX:a.x,anchorY:a.y};case"L4":return{x:o.x+(u*.5-p*.8660254)*g,y:o.y+(f*.5-m*.8660254)*g,anchorX:o.x,anchorY:o.y};case"L5":return{x:o.x+(u*.5+p*.8660254)*g,y:o.y+(f*.5+m*.8660254)*g,anchorX:o.x,anchorY:o.y}}}function la(e,t){let n=new Map,r=new Map;for(let l of e){let u=wn(l,t);if(n.set(l.id,u),u){let f=r.get(u);f?f.push(l.id):r.set(u,[l.id])}r.has(l.id)||r.set(l.id,[])}let i=new Map,a=new Map,o=new Map,c=l=>{let u=i.get(l);if(u)return u;let f=new Set,p=[],m=n.get(l)??null;for(;m&&!f.has(m);)p.push(m),f.add(m),m=n.get(m)??null;return i.set(l,p),p},s=l=>{let u=o.get(a.get(l)??"");if(u)return u;let f=n.get(l)??null,p=t.get(l),m=l;return p?.placement&&p.placement.mode!=="free"&&f&&(m=s(f)),m};for(let l of e){c(l.id);let u=s(l.id),f=Se(u);a.set(l.id,f),o.set(f,u)}return{parentIds:n,childIds:r,ancestorIds:i,groupIds:a,groupRoots:o}}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 ua(e,t,n,r,i,a){let o=Number.POSITIVE_INFINITY,c=Number.POSITIVE_INFINITY,s=Number.NEGATIVE_INFINITY,l=Number.NEGATIVE_INFINITY,u=(f,p)=>{o=Math.min(o,f),c=Math.min(c,p),s=Math.max(s,f),l=Math.max(l,p)};for(let f of t)!f.hidden&&e.objectIds.includes(f.objectId)&&vn(f,u);for(let f of n)!f.hidden&&e.orbitIds.includes(f.objectId)&&gn(f,u);for(let f of r)!f.hidden&&e.leaderIds.includes(f.objectId)&&(u(f.x1,f.y1),u(f.x2,f.y2));for(let f of i)!f.hidden&&e.labelIds.includes(f.objectId)&&bn(f,u,a);return!Number.isFinite(o)||!Number.isFinite(c)?Te(0,0,0,0):Te(o,c,s,l)}function da(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 a=t.get(i);if(!a)break;n=a}return n.id}function In(e,t,n){return $n(t.x,t.labelY,t.secondaryY,t.textAnchor,t.direction,e.label,e.secondaryLabel,n)}function $n(e,t,n,r,i,a,o,c){let s=ba(a,o,c),l=s*2,u=i==="above"?18:12,f=i==="above"?8:12,p=e-s,m=e+s;return r==="start"?(p=e,m=e+l):r==="end"&&(p=e-l,m=e),{left:p,right:m,top:Math.min(t,n)-u,bottom:Math.max(t,n)+f}}function fa(e,t){return!(e.right<t.left||t.right<e.left||e.bottom<t.top||t.bottom<e.top)}function pa(e,t,n){let r=n.get(e);return!r?.placement||r.placement.mode!=="orbit"?t.get(e):t.get(r.placement.target)}function He(e,t,n,r){let i=ya(e.properties.radius,n,r);if(i!==null)return i;let a=n.bodyRadiusMultiplier;switch(e.type){case"star":return S((t===0?28:20)*a,n.minBodyRadius,n.maxBodyRadius);case"planet":return S(12*a,n.minBodyRadius,n.maxBodyRadius);case"moon":return S(7*a,n.minBodyRadius,n.maxBodyRadius);case"belt":return S(5*a,n.minBodyRadius,n.maxBodyRadius);case"asteroid":return S(5*a,n.minBodyRadius,n.maxBodyRadius);case"comet":return S(6*a,n.minBodyRadius,n.maxBodyRadius);case"ring":return S(5*a,n.minBodyRadius,n.maxBodyRadius);case"craft":return S(5*a,n.minBodyRadius,n.maxBodyRadius);case"structure":return S(6*a,n.minBodyRadius,n.maxBodyRadius);case"phenomenon":return S(8*a,n.minBodyRadius,n.maxBodyRadius)}}function ma(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 te(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*fi;case"pc":return e.value*pi;case"kpc":return e.value*mi;case"re":return e.value*li/ke;case"rj":return e.value*ui/ke;case"sol":return e.value*di/ke;default:return e.value}}function ha(e,t,n){let r=te(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):S(i,0,420)}return S(r*96*t.freePlacementMultiplier,0,420)}function ya(e,t,n){let r=Ke(e);if(!r)return null;let i=te(r);if(n.pixelsPerMetric!==null&&i!==null&&i>0){let o=i*n.pixelsPerMetric*t.bodyRadiusMultiplier;return t.bodyScaleMode==="strict"?Math.max(o,.1):S(Math.max(o,t.minBodyRadius),t.minBodyRadius,t.maxBodyRadius)}let a;switch(r.unit){case"sol":a=S(r.value*22,14,40);break;case"re":a=S(r.value*10,6,18);break;case"km":a=S(Math.log10(Math.max(r.value,1))*2.6,4,16);break;default:a=S(r.value*4,4,20);break}return S(a*t.bodyRadiusMultiplier,t.minBodyRadius,t.maxBodyRadius)}function ga(e){return te(Ke(e.properties.radius))}function Ke(e){return!e||typeof e!="object"||!("value"in e)?null:e}function It(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function Pe(e,t,n){return t<=1?n:n+e*Math.PI*2/t}function sn(e,t,n,r,i,a,o){let c=jn(e,t,n,r,i,a,o,fn);return c.length===0?"":c.map((s,l)=>`${l===0?"M":"L"} ${un(s.x)} ${un(s.y)}`).join(" ")}function jn(e,t,n,r,i,a,o,c){let s=[];for(let l=0;l<=c;l+=1){let u=a+(o-a)*l/c;s.push(xn(e,t,n,r,i,u))}return s}function xn(e,t,n,r,i,a){let o=n*Math.cos(a),c=r*Math.sin(a),s=kn(o,c,i);return{x:e+s.x,y:t+s.y}}function kn(e,t,n){let r=Ze(n);return{x:e*Math.cos(r)-t*Math.sin(r),y:e*Math.sin(r)+t*Math.cos(r)}}function De(e,t,n,r){let i=n==="isometric"?dn*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 S(e,t,n){return Math.min(Math.max(e,t),n)}function cn(e,t,n){let r=e.get(t);r?r.push(n):e.set(t,[n])}function ge(e){return`wo-${e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"object"}`}function Se(e){return`${ge(e)}-group`}function va(e){return typeof e=="string"&&e.trim()?e:void 0}function ba(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 ln(e){return e.length>0?e[0].toUpperCase()+e.slice(1):e}function Ze(e){return e*Math.PI/180}function un(e){return Number.isInteger(e)?String(e):e.toFixed(2)}var Mn=86400,Je=Mn*365.25,Qe=18,On=180;function Tn(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=K(e,n),i=ja(r.layoutPreset,t.spatialScaleModel),a={x:r.contentBounds.centerX,y:r.contentBounds.centerY},o=new Map(r.objects.map(h=>[h.objectId,h])),c=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,kt(I))}let l=Math.min(...[...s.values()].filter(h=>Number.isFinite(h)&&h>0))||1,u=new Map,f=r.objects.map(h=>wa(h,r,a,o,c,i,u,l)),p=new Map(f.map(h=>[h.objectId,h])),m=r.orbitVisuals.map(h=>Ia(h,p,l,r.activeEventId!==null)),g=f.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:ka(f),semanticGroups:r.semanticGroups,viewpoints:r.viewpoints,activeEventId:r.activeEventId,timeFrozen:r.activeEventId!==null,objects:f,orbits:m,focusTargets:g}}function wa(e,t,n,r,i,a,o,c){let s=et(e,t,n,r,i,o),l=Ot(e.object,i.get(e.objectId),c,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:ve(e.radius*a.bodyRadiusMultiplier,a.minBodyRadius,a.maxBodyRadius),visualRadius:ve(e.visualRadius*a.bodyRadiusMultiplier,a.minBodyRadius,a.maxBodyRadius+24),label:e.label,secondaryLabel:e.secondaryLabel,fillColor:e.fillColor,imageHref:e.imageHref,hidden:e.hidden,motion:l}}function Ia(e,t,n,r){let i=t.get(e.objectId),a=t.get(e.parentId);return{objectId:e.objectId,object:e.object,parentId:e.parentId,groupId:e.groupId,semanticGroupIds:e.semanticGroupIds.slice(),center:a?.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??tt(e.object.placement?.mode==="orbit"?e.object.placement.inclination:void 0)??0,band:e.band,bandThickness:e.bandThickness,hidden:e.hidden,motion:i?.motion??Ot(e.object,e,n,r)}}function et(e,t,n,r,i,a){let o=a.get(e.objectId);if(o)return o;let c=e.object.placement,s;if(c?.mode==="orbit"&&e.parentId){let l=r.get(e.parentId),u=l?et(l,t,n,r,i,a):{x:0,y:0,z:0},f=i.get(e.objectId),p=Ot(e.object,f,1,t.activeEventId!==null),m=p?Dn(p,0):{x:(e.x-n.x)*.8,y:0,z:(e.y-n.y)*.8};s=An(u,m)}else if(c?.mode==="surface"&&e.parentId){let l=r.get(e.parentId),u=l?et(l,t,n,r,i,a):{x:0,y:0,z:0},f=l?.visualRadius??16,p=Oa(e.objectId),m=p*Math.PI*2;s={x:u.x+Math.cos(m)*(f+e.visualRadius*.9),y:u.y+Math.sin(p*Math.PI)*Math.max(e.visualRadius*.2,2),z:u.z+Math.sin(m)*(f+e.visualRadius*.9)}}else if(c?.mode==="at"&&e.parentId){let l=r.get(e.parentId),u=l?et(l,t,n,r,i,a):{x:0,y:0,z:0},f=e.anchorX??l?.x??n.x,p=e.anchorY??l?.y??n.y;s={x:u.x+(e.x-f),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 a.set(e.objectId,s),s}function Pn(e,t){let n=new Map(e.objects.map(a=>[a.objectId,a])),r=new Map,i=a=>{let o=r.get(a);if(o)return o;let c=n.get(a);if(!c)return{x:0,y:0,z:0};let s={...c.position};if(c.motion&&c.parentId){let l=i(c.parentId),u=Dn(c.motion,e.timeFrozen?0:t);s=An(l,u)}return r.set(a,s),s};for(let a of e.objects)i(a.objectId);return r}function Dn(e,t){let n=e.phase0Deg+e.angularVelocityDegPerSecond*t,r=xt(n),i=xt(e.rotationDeg),a=xt(e.inclinationDeg),o=Math.cos(r)*e.semiMajor,c=Math.sin(r)*e.semiMinor,s=o*Math.cos(i)-c*Math.sin(i),l=o*Math.sin(i)+c*Math.cos(i);return{x:s,y:l*Math.sin(a),z:l*Math.cos(a)}}function Ot(e,t,n,r){let i=e.placement;if(!i||i.mode!=="orbit")return null;let a=t?.radius??t?.rx??ve(kt(i)*48,24,1200),o=t?.radius??t?.ry??a,c=$a(i.period),s=kt(i),l=ve(s/Math.max(n,1e-4),1,20),u=ve(c?Qe*l:Qe*Math.pow(l,.75),Qe,On);return{phase0Deg:tt(i.phase)??0,rotationDeg:tt(i.angle)??t?.rotationDeg??0,inclinationDeg:tt(i.inclination)??0,semiMajor:a,semiMinor:o,eccentricity:i.eccentricity??0,periodSeconds:c,angularVelocityDegPerSecond:360/Math.max(u,.001),heuristic:c===null,frozen:r}}function kt(e){let t=Sn(e.semiMajor)??Sn(e.distance)??1;return Math.max(t,.01)}function Sn(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 $a(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*Je;case"ky":return e.value*Je*1e3;case"my":return e.value*Je*1e6;case"gy":return e.value*Je*1e9;default:return null}}function tt(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function ja(e,t){return{...xa(e),...t}}function xa(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 ka(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,a=Number.NEGATIVE_INFINITY,o=Number.NEGATIVE_INFINITY;for(let c of e)t=Math.min(t,c.position.x-c.visualRadius),n=Math.min(n,c.position.y-c.visualRadius),r=Math.min(r,c.position.z-c.visualRadius),i=Math.max(i,c.position.x+c.visualRadius),a=Math.max(a,c.position.y+c.visualRadius),o=Math.max(o,c.position.z+c.visualRadius);return{minX:t,minY:n,minZ:r,maxX:i,maxY:a,maxZ:o,width:i-t,height:a-n,depth:o-r,center:{x:(t+i)/2,y:(n+a)/2,z:(r+o)/2}}}function An(e,t){return{x:e.x+t.x,y:e.y+t.y,z:e.z+t.z}}function Oa(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 ve(e,t,n){return Math.min(Math.max(e,t),n)}function xt(e){return e*Math.PI/180}function Fn(e){return{trajectoryId:e.id,craftObjectId:e.craftObjectId,segments:e.segments.map(t=>({segmentId:t.id,kind:t.kind,fromObjectId:t.fromObjectId,toObjectId:t.toObjectId,aroundObjectId:t.aroundObjectId,assistObjectId:t.assist?.objectId??null,duration:t.duration??null,deltaV:t.deltaV??null})),maneuvers:e.segments.flatMap(t=>t.maneuvers.map(n=>Sa(t.id,n)))}}function Sa(e,t){return{segmentId:e,maneuverId:t.id,kind:t.kind,epoch:t.epoch,deltaV:t.deltaV??null,duration:t.duration??null}}function Ae(e,t={}){let n=K(e,t),r=[],i=Pa(e,r),a=Da(e,r),o=Ta(e,n.renderPreset??t.preset??null,n.projection),c=e.system?Ma(e,o,i,a,r,n.renderPreset??t.preset??null):null;return n.viewpoints.some(s=>!s.generated)&&r.push({code:"upgrade.viewpoints.structured",severity:"info",source:"upgrade",message:`Promoted ${n.viewpoints.filter(s=>!s.generated).length} document-defined viewpoint(s) into the 2.0 atlas section.`}),{format:"worldorbit",version:"3.0",schemaVersion:"3.0",sourceVersion:e.version,theme:e.theme??null,system:c,groups:structuredClone(e.groups??[]),relations:structuredClone(e.relations??[]),events:structuredClone(e.events??[]),trajectories:[],objects:e.objects.map(Rn).map(Ra),diagnostics:r}}function nt(e,t={}){return Wa(Ae(e,t))}function Fe(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:Va(e.system),info:Ba(e.system)}:null,r=e.objects.map(Rn);return _a(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(Fa),trajectories:e.trajectories.map(La),objects:r}}function Ln(e){return Fe(e)}function Ma(e,t,n,r,i,a){let o=K(e,{preset:a??void 0,projection:t.view});return{type:"system",id:e.system?.id??"WorldOrbit",title:e.system?.title??(typeof e.system?.properties.title=="string"?e.system.properties.title:null),description:e.system?.description??null,epoch:e.system?.epoch??null,referencePlane:e.system?.referencePlane??null,defaults:t,atlasMetadata:n,viewpoints:o.viewpoints.map(Aa),annotations:r}}function Ta(e,t,n){let r=typeof e.system?.properties.view=="string"?e.system.properties.view.toLowerCase():null;return{view:r==="topdown"||r==="isometric"||r==="orthographic"||r==="perspective"?r:n,scale:typeof e.system?.properties.scale=="string"?e.system.properties.scale:null,units:typeof e.system?.properties.units=="string"?e.system.properties.units:null,preset:t,theme:typeof e.system?.info["atlas.theme"]=="string"?e.system.info["atlas.theme"]:null}}function Pa(e,t){let n={};for(let[i,a]of Object.entries(e.system?.info??{}))i.startsWith("viewpoint.")||i.startsWith("annotation.")||(n[i]=a);let r=Object.keys(n);return r.length>0&&t.push({code:"upgrade.atlasMetadata.preserved",severity:"warning",source:"upgrade",message:`Preserved ${r.length} system info entr${r.length===1?"y":"ies"} as atlas metadata in the 2.0 atlas document.`}),n}function Da(e,t){let n=new Map;for(let[r,i]of Object.entries(e.system?.info??{})){if(!r.startsWith("annotation."))continue;let[,a,...o]=r.split(".");if(!a||o.length===0)continue;let c=En(a);if(!c)continue;let s=n.get(c)??{id:c};switch(o.join(".").toLowerCase()){case"label":s.label=i;break;case"target":case"object":s.targetObjectId=i.trim()||null;break;case"body":case"text":case"description":s.body=i;break;case"tags":s.tags=Na(i);break}n.set(c,s)}for(let r of e.objects){let i=r.info.description;if(!i)continue;let a=En(`${r.id}-notes`);n.has(a)||(n.set(a,{id:a,label:`${r.id} Notes`,targetObjectId:r.id,body:i,tags:Array.isArray(r.properties.tags)?r.properties.tags.filter(o=>typeof o=="string"):[]}),t.push({code:"upgrade.annotation.objectDescription",severity:"info",source:"upgrade",message:`Lifted ${r.id}.info.description into structured atlas annotation "${a}".`,objectId:r.id,field:"description"}))}return[...n.values()].filter(r=>r.body||r.label).map(r=>({id:r.id,label:r.label??Ca(r.id),targetObjectId:r.targetObjectId??null,body:r.body??"",tags:r.tags??[],sourceObjectId:r.targetObjectId??null})).sort((r,i)=>r.label.localeCompare(i.label))}function Aa(e){return{id:e.id,label:e.label,summary:e.summary,focusObjectId:e.objectId,selectedObjectId:e.selectedObjectId,events:[...e.eventIds],projection:e.projection,preset:e.preset,zoom:e.scale,rotationDeg:e.rotationDeg,camera:e.camera?{...e.camera}:null,layers:{...e.layers},filter:e.filter?{query:e.filter.query,objectTypes:[...e.filter.objectTypes],tags:[...e.filter.tags],groupIds:[...e.filter.groupIds]}:null}}function Rn(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:za(e.properties),placement:e.placement?structuredClone(e.placement):null,info:{...e.info}}}function Fa(e){return{...e,trajectoryId:e.trajectoryId??null,participantObjectIds:[...e.participantObjectIds],tags:[...e.tags],positions:e.positions.map(Ea)}}function Ea(e){return{objectId:e.objectId,placement:_n(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 La(e){return structuredClone(e)}function Ra(e){if(e.type!=="structure")return e;let t=typeof e.properties.kind=="string"?e.properties.kind.toLowerCase():"";return["ship","probe","station"].includes(t)?{...e,type:"craft"}:e}function _n(e){return e?structuredClone(e):null}function _a(e,t,n){if(!n)return;let r=t.find(o=>o.id===n);if(!r)return;let i=new Map(e.map(o=>[o.id,o])),a=new Set([...r.targetObjectId?[r.targetObjectId]:[],...r.participantObjectIds,...r.positions.map(o=>o.objectId)]);for(let o of a){let c=i.get(o);c&&(r.epoch&&(c.epoch=r.epoch),r.referencePlane&&(c.referencePlane=r.referencePlane))}for(let o of r.positions){let c=i.get(o.objectId);c&&(o.placement&&(c.placement=_n(o.placement)),o.inner&&(c.properties.inner={...o.inner}),o.outer&&(c.properties.outer={...o.outer}),o.epoch&&(c.epoch=o.epoch),o.referencePlane&&(c.referencePlane=o.referencePlane))}}function za(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 Na(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function En(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function Ca(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Va(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 Ba(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=Ua(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 Ua(e){let t=[],n=e["orbits-front"],r=e["orbits-back"];(n!==void 0||r!==void 0)&&t.push(n!==!1||r!==!1?"orbits":"-orbits");for(let i of["background","guides","relations","events","objects","labels","metadata"])e[i]!==void 0&&t.push(e[i]?i:`-${i}`);return t.join(" ")}function Wa(e){return{...e,version:"2.0-draft",schemaVersion:"2.0-draft"}}var zn=["title","view","scale","units","kind","class","tags","color","image","hidden","orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","radius","mass","density","gravity","temperature","albedo","atmosphere","inner","outer","on","source","cycle"];function it(e,t={}){let n=t.schema??"auto";if(n==="2.0"||n==="2.1"||n==="2.5"||n==="2.6"||n==="3.0"||n==="2.0-draft"||e.version==="2.0"||e.version==="2.1"||e.version==="2.5"||e.version==="3.0"||e.version==="2.6"||e.version==="2.0-draft"){if(n==="2.0-draft"){let s=e.version==="2.0-draft"?e:e.version==="2.0"||e.version==="2.1"||e.version==="2.5"||e.version==="2.6"?{...e,version:"2.0-draft",schemaVersion:"2.0-draft"}:nt(e);return St(s)}let c=e.version==="2.0"||e.version==="2.1"||e.version==="2.5"||e.version==="2.6"||e.version==="3.0"?e:e.version==="2.0-draft"?{...e,version:"2.0",schemaVersion:"2.0"}:Ae(e);return(n==="2.0"||n==="2.1"||n==="2.5"||n==="2.6"||n==="3.0")&&c.version!==n?rt({...c,version:n,schemaVersion:n}):rt(c)}let i=[],a=e;a.system&&i.push(...Ya(a.system));let o=[...a.objects].sort(Pt);for(let c of o)i.length>0&&i.push(""),i.push(...Ga(c));return i.join(`
2
- `)}function rt(e){let t=[`schema ${e.version}`,""];e.system&&t.push(...Cn(e.system));for(let r of[...e.groups].sort(X))t.push(""),t.push(...Wn(r));for(let r of[...e.relations].sort(X))t.push(""),t.push(...Yn(r));for(let r of[...e.events].sort(X))t.push(""),t.push(...qn(r));for(let r of[...e.trajectories].sort(X))t.push(""),t.push(...Ja(r));let n=[...e.objects].sort(Pt);return n.length>0&&t.at(-1)!==""&&t.push(""),n.forEach((r,i)=>{i>0&&t.push(""),t.push(...Vn(r))}),t.join(`
3
- `)}function St(e){let t=e.version==="2.0-draft"?e:{...e,version:"2.0-draft",schemaVersion:"2.0-draft"},n=["schema 2.0-draft",""];t.system&&n.push(...Cn(t.system));for(let i of[...t.groups].sort(X))n.push(""),n.push(...Wn(i));for(let i of[...t.relations].sort(X))n.push(""),n.push(...Yn(i));for(let i of[...t.events].sort(X))n.push(""),n.push(...qn(i));let r=[...t.objects].sort(Pt);return r.length>0&&n.at(-1)!==""&&n.push(""),r.forEach((i,a)=>{a>0&&n.push(""),n.push(...Vn(i))}),n.join(`
4
- `)}function Ya(e){return qa("system",e.id,e.properties,null,e.info)}function qa(e,t,n,r,i){let a=[`${e} ${t}`],o=[...Mt(r),...Un(n)];for(let s of o)a.push(` ${s}`);let c=Object.entries(i).sort(([s],[l])=>s.localeCompare(l));if(c.length>0){o.length>0&&a.push(""),a.push(" info");for(let[s,l]of c)a.push(` ${s} ${y(l)}`)}return a}function Cn(e){let t=[`system ${e.id}`];if(e.title&&t.push(` title ${y(e.title)}`),e.description&&t.push(` description ${y(e.description)}`),e.epoch&&t.push(` epoch ${y(e.epoch)}`),e.referencePlane&&t.push(` referencePlane ${y(e.referencePlane)}`),t.push(""),t.push("defaults"),t.push(` view ${e.defaults.view}`),e.defaults.scale&&t.push(` scale ${y(e.defaults.scale)}`),e.defaults.units&&t.push(` units ${y(e.defaults.units)}`),e.defaults.preset&&t.push(` preset ${e.defaults.preset}`),e.defaults.theme&&t.push(` theme ${y(e.defaults.theme)}`),Object.keys(e.atlasMetadata).length>0){t.push(""),t.push("atlas"),t.push(" metadata");for(let[n,r]of Object.entries(e.atlasMetadata).sort(([i],[a])=>i.localeCompare(a)))t.push(` ${n} ${y(r)}`)}for(let n of e.viewpoints)t.push(""),t.push(...Ka(n));for(let n of e.annotations)t.push(""),t.push(...Xa(n));return t}function Ga(e){return Bn(e.type,e.id,e)}function Vn(e){return Bn(`object ${e.type}`,e.id,e)}function Bn(e,t,n){let r=[`${e} ${t}`],i=[...Mt(n.placement),...Un(n.properties),...Ha(n)];for(let o of i)r.push(` ${o}`);let a=Object.entries(n.info).sort(([o],[c])=>o.localeCompare(c));if(a.length>0){i.length>0&&r.push(""),r.push(" info");for(let[o,c]of a)r.push(` ${o} ${y(c)}`)}for(let o of["climate","habitability","settlement"]){let c=Object.entries(n.typedBlocks?.[o]??{}).sort(([s],[l])=>s.localeCompare(l));if(c.length>0){r.push(""),r.push(` ${o}`);for(let[s,l]of c)r.push(` ${s} ${y(l)}`)}}return r}function Mt(e){if(!e)return[];switch(e.mode){case"orbit":return[`orbit ${e.target}`,...D("distance",e.distance),...D("semiMajor",e.semiMajor),...no("eccentricity",e.eccentricity),...D("period",e.period),...D("angle",e.angle),...D("inclination",e.inclination),...D("phase",e.phase)];case"at":return[`at ${ro(e.reference)}`];case"surface":return[`surface ${e.target}`];case"free":return[`free ${e.distance?Tt(e.distance):e.descriptor??""}`.trim()]}}function Un(e){return Object.keys(e).sort(ao).map(t=>`${t} ${Gn(e[t])}`)}function Ha(e){let t=[];e.groups?.length&&t.push(`groups ${e.groups.join(" ")}`),e.trajectoryId&&t.push(`trajectory ${e.trajectoryId}`),e.epoch&&t.push(`epoch ${y(e.epoch)}`),e.referencePlane&&t.push(`referencePlane ${y(e.referencePlane)}`),e.tidalLock!==void 0&&t.push(`tidalLock ${e.tidalLock?"true":"false"}`),e.renderHints?.renderLabel!==void 0&&t.push(`renderLabel ${e.renderHints.renderLabel?"true":"false"}`),e.renderHints?.renderOrbit!==void 0&&t.push(`renderOrbit ${e.renderHints.renderOrbit?"true":"false"}`),e.renderHints?.renderPriority!==void 0&&t.push(`renderPriority ${e.renderHints.renderPriority}`),e.resonance&&t.push(`resonance ${e.resonance.targetObjectId} ${e.resonance.ratio}`);for(let n of e.deriveRules??[])t.push(`derive ${n.field} ${n.strategy}`);for(let n of e.validationRules??[])t.push(`validate ${n.rule}`);e.lockedFields?.length&&t.push(`locked ${e.lockedFields.join(" ")}`);for(let n of e.tolerances??[])t.push(`tolerance ${n.field} ${Gn(n.value)}`);return t}function Ka(e){let t=[`viewpoint ${e.id}`,` label ${y(e.label)}`];e.focusObjectId&&t.push(` focus ${e.focusObjectId}`),e.selectedObjectId&&e.selectedObjectId!==e.focusObjectId&&t.push(` select ${e.selectedObjectId}`),e.summary&&t.push(` summary ${y(e.summary)}`),e.projection&&t.push(` projection ${e.projection}`),e.preset&&t.push(` preset ${e.preset}`),e.zoom!==null&&t.push(` zoom ${e.zoom}`),e.rotationDeg!==0&&t.push(` rotation ${e.rotationDeg}`),e.camera&&to(e.camera)&&(t.push(" camera"),e.camera.azimuth!==null&&t.push(` azimuth ${e.camera.azimuth}`),e.camera.elevation!==null&&t.push(` elevation ${e.camera.elevation}`),e.camera.roll!==null&&t.push(` roll ${e.camera.roll}`),e.camera.distance!==null&&t.push(` distance ${e.camera.distance}`));let n=io(e.layers);return n.length>0&&t.push(` layers ${n.join(" ")}`),e.events.length>0&&t.push(` events ${e.events.join(" ")}`),e.filter&&(t.push(" filter"),e.filter.query&&t.push(` query ${y(e.filter.query)}`),e.filter.objectTypes.length>0&&t.push(` objectTypes ${e.filter.objectTypes.join(" ")}`),e.filter.tags.length>0&&t.push(` tags ${e.filter.tags.map(y).join(" ")}`),e.filter.groupIds.length>0&&t.push(` groups ${e.filter.groupIds.join(" ")}`)),t}function Xa(e){let t=[`annotation ${e.id}`,` label ${y(e.label)}`];return e.targetObjectId&&t.push(` target ${e.targetObjectId}`),t.push(` body ${y(e.body)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(y).join(" ")}`),t}function Wn(e){let t=[`group ${e.id}`,` label ${y(e.label)}`];return e.summary&&t.push(` summary ${y(e.summary)}`),e.color&&t.push(` color ${y(e.color)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(y).join(" ")}`),e.hidden&&t.push(" hidden true"),t}function Yn(e){let t=[`relation ${e.id}`];return e.from&&t.push(` from ${y(e.from)}`),e.to&&t.push(` to ${y(e.to)}`),e.kind&&t.push(` kind ${y(e.kind)}`),e.label&&t.push(` label ${y(e.label)}`),e.summary&&t.push(` summary ${y(e.summary)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(y).join(" ")}`),e.color&&t.push(` color ${y(e.color)}`),e.hidden&&t.push(" hidden true"),t}function qn(e){let t=[`event ${e.id}`,` kind ${y(e.kind)}`];if(e.label&&t.push(` label ${y(e.label)}`),e.summary&&t.push(` summary ${y(e.summary)}`),e.trajectoryId&&t.push(` trajectory ${e.trajectoryId}`),e.targetObjectId&&t.push(` target ${e.targetObjectId}`),e.participantObjectIds.length>0&&t.push(` participants ${e.participantObjectIds.join(" ")}`),e.timing&&t.push(` timing ${y(e.timing)}`),e.visibility&&t.push(` visibility ${y(e.visibility)}`),e.epoch&&t.push(` epoch ${y(e.epoch)}`),e.referencePlane&&t.push(` referencePlane ${y(e.referencePlane)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(y).join(" ")}`),e.color&&t.push(` color ${y(e.color)}`),e.hidden&&t.push(" hidden true"),e.positions.length>0){t.push(""),t.push(" positions");for(let n of[...e.positions].sort(oo)){t.push(` pose ${n.objectId}`);for(let r of Za(n))t.push(` ${r}`)}}return t}function Za(e){return[...Mt(e.placement),...e.trajectorySegmentId?[`segment ${e.trajectorySegmentId}`]:[],...e.trajectoryManeuverId?[`maneuver ${e.trajectoryManeuverId}`]:[],...e.epoch?[`epoch ${y(e.epoch)}`]:[],...e.referencePlane?[`referencePlane ${y(e.referencePlane)}`]:[],...D("inner",e.inner),...D("outer",e.outer)]}function Ja(e){let t=[`trajectory ${e.id}`];e.label&&t.push(` label ${y(e.label)}`),e.summary&&t.push(` summary ${y(e.summary)}`),e.craftObjectId&&t.push(` craft ${e.craftObjectId}`),e.tags.length>0&&t.push(` tags ${e.tags.map(y).join(" ")}`),e.color&&t.push(` color ${y(e.color)}`),e.hidden&&t.push(" hidden true");for(let n of[...e.segments].sort(X)){t.push(""),t.push(` segment ${n.id}`);for(let r of Qa(n))t.push(` ${r}`);for(let r of[...n.maneuvers].sort(X)){t.push(` maneuver ${r.id}`);for(let i of eo(r))t.push(` ${i}`)}}return t}function Qa(e){return[`kind ${e.kind}`,...e.label?[`label ${y(e.label)}`]:[],...e.summary?[`summary ${y(e.summary)}`]:[],...e.fromObjectId?[`from ${e.fromObjectId}`]:[],...e.toObjectId?[`to ${e.toObjectId}`]:[],...e.aroundObjectId?[`around ${e.aroundObjectId}`]:[],...e.assist?.objectId?[`assist ${e.assist.objectId}`]:[],...e.epoch?[`epoch ${y(e.epoch)}`]:[],...D("periapsis",e.periapsis),...D("apoapsis",e.apoapsis),...D("inclination",e.inclination),...D("duration",e.duration),...D("deltaV",e.deltaV),...D("phaseAngle",e.phaseAngle),...D("turnAngle",e.turnAngle),...D("energy",e.energy),...e.notes.length>0?[`notes ${e.notes.map(y).join(" ")}`]:[]]}function eo(e){return[`kind ${y(e.kind)}`,...e.label?[`label ${y(e.label)}`]:[],...e.epoch?[`epoch ${y(e.epoch)}`]:[],...D("deltaV",e.deltaV),...D("duration",e.duration),...e.notes.length>0?[`notes ${e.notes.map(y).join(" ")}`]:[]]}function to(e){return e.azimuth!==null||e.elevation!==null||e.roll!==null||e.distance!==null}function Gn(e){return Array.isArray(e)?e.map(t=>y(t)).join(" "):typeof e=="boolean"?e?"true":"false":typeof e=="number"?String(e):typeof e=="string"?y(e):Tt(e)}function Tt(e){return`${e.value}${e.unit??""}`}function D(e,t){return t?[`${e} ${Tt(t)}`]:[]}function no(e,t){return t===void 0?[]:[`${e} ${t}`]}function ro(e){switch(e.kind){case"lagrange":return e.secondary?`${e.primary}-${e.secondary}:${e.point}`:`${e.primary}:${e.point}`;case"anchor":return`${e.objectId}:${e.anchor}`;case"named":return e.name}}function io(e){let t=[],n=e["orbits-front"],r=e["orbits-back"];(n!==void 0||r!==void 0)&&t.push(n!==!1||r!==!1?"orbits":"-orbits");for(let i of["background","guides","relations","events","objects","labels","metadata"])e[i]!==void 0&&t.push(e[i]?i:`-${i}`);return t}function ao(e,t){let n=zn.indexOf(e),r=zn.indexOf(t);return n===-1&&r===-1?e.localeCompare(t):n===-1?1:r===-1?-1:n-r}function Pt(e,t){let n=Nn(e.type),r=Nn(t.type);return n!==r?n-r:e.id.localeCompare(t.id)}function X(e,t){return e.id.localeCompare(t.id)}function oo(e,t){return e.objectId.localeCompare(t.objectId)}function Nn(e){switch(e){case"star":return 0;case"planet":return 1;case"moon":return 2;case"belt":return 3;case"asteroid":return 4;case"comet":return 5;case"ring":return 6;case"craft":return 7;case"structure":return 8;case"phenomenon":return 9}}function y(e){return!/\s/.test(e)&&!e.includes('"')?e:`"${e.replaceAll("\\","\\\\").replaceAll('"','\\"')}"`}var Hn=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,so=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),co=/^[A-Za-z][A-Za-z0-9+.-]*:/;function Z(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 R(e,t,n){let r=e.match(Hn);if(!r)throw d.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let a=F(n);if(a?.unitFamily&&!xe(a.unitFamily,i.unit))throw d.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function Dt(e){let t=e.match(Hn);return t?{value:Number(t[1]),unit:t[2]??null}:null}function at(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw d.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function J(e,t,n){let r=so.get(e.toLowerCase());if(r===void 0)throw d.fromLocation(`Invalid boolean value "${e}" for "${t}"`,n);return r}function Kn(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw d.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 d.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 lo(e,t){if(!e)throw d.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw d.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 d.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function Xn(e,t,n){let r=F(e);if(!r)throw d.fromLocation(`Unknown field "${e}"`,n);if(r.arity==="single"&&t.length!==1)throw d.fromLocation(`Field "${e}" expects exactly one value`,n);switch(r.kind){case"list":return t;case"boolean":return J(Ee(t,e,n),e,n);case"number":return at(Ee(t,e,n),e,n);case"unit":return R(Ee(t,e,n),n,e);case"string":{let i=t.join(" ").trim();return e==="image"&&lo(i,n),i}}}function At(e,t,n){let r=F(e);if(!r)throw d.fromLocation(`Unknown field "${e}"`,n);if(!r.objectTypes.includes(t))throw d.fromLocation(`Field "${e}" is not valid on "${t}"`,n)}function Ee(e,t,n){if(e.length!==1)throw d.fromLocation(`Field "${t}" expects exactly one value`,n);return e[0]}var Jn=new Set(["star","planet","moon","asteroid","comet"]),uo=332946.0487,fo=1047.3486,ot=1495978707e-1,po=6371,mo=695700,ho=63241.077,yo=206264.806,go=206264806;function Le(e,t){let n=[],r=new Map(e.objects.map(s=>[s.id,s])),i=new Set(e.groups.map(s=>s.id)),a=new Set(e.events.map(s=>s.id)),o=new Map(e.trajectories.map(s=>[s.id,s]));e.system||n.push(v("validate.system.required","Atlas documents must declare exactly one system."));let c=new Map;for(let[s,l]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 l){let f=c.get(u);f?n.push(v("validate.id.duplicate",`Duplicate ${s} id "${u}" already used by ${f}.`)):c.set(u,s)}for(let s of e.relations)vo(s,r,n);for(let s of e.system?.viewpoints??[])bo(s,i,a,t,n,r);for(let s of e.objects)wo(s,e.system,r,i,o,n);for(let s of e.events)Io(s,e.system,r,o,n);for(let s of e.trajectories)jo(s,r,n);return n}function vo(e,t,n){e.from?t.has(e.from)||n.push(v("validate.relation.from.unknown",`Unknown relation source "${e.from}" on "${e.id}".`)):n.push(v("validate.relation.from.required",`Relation "${e.id}" is missing a "from" target.`)),e.to?t.has(e.to)||n.push(v("validate.relation.to.unknown",`Unknown relation target "${e.to}" on "${e.id}".`)):n.push(v("validate.relation.to.required",`Relation "${e.id}" is missing a "to" target.`)),e.kind||n.push(v("validate.relation.kind.required",`Relation "${e.id}" is missing a "kind" value.`))}function bo(e,t,n,r,i,a){let o=e.filter;if(r==="2.1"||r==="2.5"||r==="2.6"){if(o)for(let c of o.groupIds)t.has(c)||i.push(x("validate.viewpoint.group.unknown",`Unknown group "${c}" in viewpoint "${e.id}".`,void 0,`viewpoint.${e.id}.groups`));for(let c of e.events??[])n.has(c)||i.push(x("validate.viewpoint.event.unknown",`Unknown event "${c}" in viewpoint "${e.id}".`,void 0,`viewpoint.${e.id}.events`))}Po(e.projection,i,`viewpoint.${e.id}.projection`,e.id),Do(e.camera,e.projection,e.rotationDeg,i,e.id,e.focusObjectId,e.selectedObjectId,o,a)}function wo(e,t,n,r,i,a){let o=e.placement,c=o?.mode==="orbit"?o:null,s=o?.mode==="orbit"?n.get(o.target)??null:null;if(e.groups)for(let l of e.groups)r.has(l)||a.push(x("validate.group.unknown",`Unknown group "${l}" on "${e.id}".`,e.id,"groups"));if(typeof e.epoch=="string"&&!e.epoch.trim()&&a.push(x("validate.epoch.empty",`Object "${e.id}" defines an empty epoch string.`,e.id,"epoch")),typeof e.referencePlane=="string"&&!e.referencePlane.trim()&&a.push(x("validate.referencePlane.empty",`Object "${e.id}" defines an empty reference plane string.`,e.id,"referencePlane")),e.trajectoryId&&(i.has(e.trajectoryId)?Qn(e)||a.push(v("validate.trajectory.object.invalidType",`Only craft or legacy ship-like structures may reference trajectories; found "${e.type}" on "${e.id}".`,e.id,"trajectory")):a.push(v("validate.trajectory.object.unknown",`Unknown trajectory "${e.trajectoryId}" on "${e.id}".`,e.id,"trajectory"))),c&&(n.has(c.target)||a.push(v("validate.orbit.target.unknown",`Unknown placement target "${c.target}" on "${e.id}".`,e.id,"orbit")),c.distance&&c.semiMajor&&a.push(v("validate.orbit.distanceConflict",`Object "${e.id}" cannot declare both "distance" and "semiMajor".`,e.id,"distance")),c.phase&&!e.epoch&&!t?.epoch&&a.push(x("validate.phase.epochMissing",`Object "${e.id}" sets "phase" without an object or system epoch.`,e.id,"phase")),c.inclination&&!e.referencePlane&&!t?.referencePlane&&a.push(x("validate.inclination.referencePlaneMissing",`Object "${e.id}" sets "inclination" without an object or system reference plane.`,e.id,"inclination")),c.period&&!Et(s?.properties.mass)&&a.push(x("validate.period.massMissing",`Object "${e.id}" sets "period" but its central mass cannot be derived.`,e.id,"period"))),o?.mode==="surface"){let l=n.get(o.target);l?Jn.has(l.type)||a.push(v("validate.surface.target.invalid",`Surface target "${o.target}" on "${e.id}" is not surface-capable.`,e.id,"surface")):a.push(v("validate.surface.target.unknown",`Unknown placement target "${o.target}" on "${e.id}".`,e.id,"surface"))}if(o?.mode==="at"&&(e.type!=="craft"&&e.type!=="structure"&&e.type!=="phenomenon"&&a.push(v("validate.at.objectType",`Only craft, structures, and phenomena may use "at" placement; found "${e.type}" on "${e.id}".`,e.id,"at")),Mo(e,n,a)||a.push(v("validate.at.target.unknown",`Unknown at-reference target "${o.target}" on "${e.id}".`,e.id,"at"))),e.resonance){let l=n.get(e.resonance.targetObjectId);l?(e.placement?.mode!=="orbit"||l.placement?.mode!=="orbit"||e.placement.target!==l.placement.target)&&a.push(x("validate.resonance.orbitMismatch",`Resonance target "${e.resonance.targetObjectId}" on "${e.id}" does not share a compatible orbital parent.`,e.id,"resonance")):a.push(v("validate.resonance.target.unknown",`Unknown resonance target "${e.resonance.targetObjectId}" on "${e.id}".`,e.id,"resonance"))}for(let l of e.deriveRules??[]){if(l.field!=="period"||l.strategy!=="kepler"){a.push(x("validate.derive.unsupported",`Unsupported derive rule "${l.field} ${l.strategy}" on "${e.id}".`,e.id,"derive"));continue}let u=Zn(e,s);if(u===null){a.push(x("validate.derive.inputsMissing",`Object "${e.id}" requests "derive period kepler" but lacks enough input data.`,e.id,"derive"));continue}c?.period||a.push(Ft("validate.derive.period.available",`Object "${e.id}" can derive a Kepler period of ${Lo(u)}.`,e.id,"derive"))}for(let l of e.validationRules??[]){if(l.rule!=="kepler"){a.push(x("validate.rule.unsupported",`Unsupported validation rule "${l.rule}" on "${e.id}".`,e.id,"validate"));continue}let u=er(c?.period),f=Zn(e,s);if(u===null||f===null)continue;let p=Eo(e,"period");Math.abs(u-f)>p&&a.push(v("validate.kepler.mismatch",`Object "${e.id}" fails Kepler validation for "period".`,e.id,"validate"))}}function Io(e,t,n,r,i){let a=`event.${e.id}`,o=new Set;e.kind.trim()||i.push(v("validate.event.kind.required",`Event "${e.id}" is missing a "kind" value.`,void 0,`${a}.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,`${a}.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,`${a}.referencePlane`)),e.trajectoryId&&!r.has(e.trajectoryId)&&i.push(v("validate.event.trajectory.unknown",`Unknown trajectory "${e.trajectoryId}" on event "${e.id}".`,void 0,`${a}.trajectory`)),!e.targetObjectId&&e.participantObjectIds.length===0&&i.push(v("validate.event.references.required",`Event "${e.id}" must define a "target" or at least one participant.`,void 0,`${a}.participants`)),e.targetObjectId&&(o.add(e.targetObjectId),n.has(e.targetObjectId)||i.push(v("validate.event.target.unknown",`Unknown event target "${e.targetObjectId}" on "${e.id}".`,void 0,`${a}.target`)));let c=new Set;for(let u of e.participantObjectIds){if(o.add(u),c.has(u)){i.push(x("validate.event.participants.duplicate",`Event "${e.id}" repeats participant "${u}".`,void 0,`${a}.participants`));continue}c.add(u),n.has(u)||i.push(v("validate.event.participants.unknown",`Unknown event participant "${u}" on "${e.id}".`,void 0,`${a}.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,`${a}.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,`${a}.positions`)),/(?:^|[-_])(solar-eclipse|lunar-eclipse|transit|occultation)(?:$|[-_])/.test(e.kind)&&o.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,`${a}.participants`));let s=new Set;for(let u of e.positions){let f=`${a}.pose.${u.objectId}`;if(s.has(u.objectId)){i.push(v("validate.event.pose.duplicate",`Event "${e.id}" defines "${u.objectId}" more than once in positions.`,void 0,f));continue}s.add(u.objectId);let p=n.get(u.objectId);if(!p){i.push(v("validate.event.pose.object.unknown",`Unknown event pose object "${u.objectId}" on "${e.id}".`,void 0,f));continue}o.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,f)),$o(u,p,e,t,n,r,i,f,e.id)}let l=[...o].filter(u=>!s.has(u));e.positions.length>0&&l.length>0&&i.push(x("validate.event.positions.partial",`Event "${e.id}" leaves ${l.length} referenced object(s) on their base placement.`,void 0,`${a}.positions`))}function $o(e,t,n,r,i,a,o,c,s){let l=e.placement;if(!l){o.push(v("validate.event.pose.placement.required",`Event "${s}" pose "${e.objectId}" is missing a placement mode.`,void 0,c));return}if(e.trajectorySegmentId&&!Oo(a,e.trajectorySegmentId)&&o.push(v("validate.event.pose.segment.unknown",`Unknown trajectory segment "${e.trajectorySegmentId}" on "${s}:${e.objectId}".`,void 0,`${c}.segment`)),e.trajectoryManeuverId&&!So(a,e.trajectoryManeuverId)&&o.push(v("validate.event.pose.maneuver.unknown",`Unknown trajectory maneuver "${e.trajectoryManeuverId}" on "${s}:${e.objectId}".`,void 0,`${c}.maneuver`)),l.mode==="orbit"){i.has(l.target)||o.push(v("validate.event.pose.orbit.target.unknown",`Unknown event orbit target "${l.target}" on "${s}:${e.objectId}".`,void 0,`${c}.orbit`)),l.distance&&l.semiMajor&&o.push(v("validate.event.pose.orbit.distanceConflict",`Event "${s}" pose "${e.objectId}" cannot declare both "distance" and "semiMajor".`,void 0,`${c}.distance`)),l.phase&&!Ao(r,t,n,e)&&o.push(x("validate.event.pose.phase.epochMissing",`Event "${s}" pose "${e.objectId}" sets "phase" without an effective epoch.`,void 0,`${c}.phase`)),l.inclination&&!Fo(r,t,n,e)&&o.push(x("validate.event.pose.inclination.referencePlaneMissing",`Event "${s}" pose "${e.objectId}" sets "inclination" without an effective reference plane.`,void 0,`${c}.inclination`)),l.period&&!Et(i.get(l.target)?.properties.mass)&&o.push(x("validate.event.pose.period.massMissing",`Event "${s}" pose "${e.objectId}" sets "period" but its central mass cannot be derived.`,void 0,`${c}.period`));return}if(l.mode==="surface"){let u=i.get(l.target);u?Jn.has(u.type)||o.push(v("validate.event.pose.surface.target.invalid",`Event surface target "${l.target}" on "${s}:${e.objectId}" is not surface-capable.`,void 0,`${c}.surface`)):o.push(v("validate.event.pose.surface.target.unknown",`Unknown event surface target "${l.target}" on "${s}:${e.objectId}".`,void 0,`${c}.surface`));return}if(l.mode==="at"){t.type!=="craft"&&t.type!=="structure"&&t.type!=="phenomenon"&&o.push(v("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,`${c}.at`));let u=l.reference;u.kind==="named"&&!i.has(u.name)?o.push(v("validate.event.pose.at.target.unknown",`Unknown event at-reference target "${l.target}" on "${s}:${e.objectId}".`,void 0,`${c}.at`)):u.kind==="anchor"&&!i.has(u.objectId)?o.push(v("validate.event.pose.anchor.target.unknown",`Unknown event anchor target "${u.objectId}" on "${s}:${e.objectId}".`,void 0,`${c}.at`)):u.kind==="lagrange"&&(i.has(u.primary)?u.secondary&&!i.has(u.secondary)&&o.push(v("validate.event.pose.lagrange.secondary.unknown",`Unknown event Lagrange target "${u.secondary}" on "${s}:${e.objectId}".`,void 0,`${c}.at`)):o.push(v("validate.event.pose.lagrange.primary.unknown",`Unknown event Lagrange target "${u.primary}" on "${s}:${e.objectId}".`,void 0,`${c}.at`)))}}function jo(e,t,n){if(e.craftObjectId){let r=t.get(e.craftObjectId);r?Qn(r)||n.push(v("validate.trajectory.craft.invalidType",`Trajectory "${e.id}" targets "${e.craftObjectId}", which is not craft-like.`,void 0,`trajectory.${e.id}.craft`)):n.push(v("validate.trajectory.craft.unknown",`Unknown craft "${e.craftObjectId}" on trajectory "${e.id}".`,void 0,`trajectory.${e.id}.craft`))}for(let r of e.segments)xo(e.id,r,t,n)}function xo(e,t,n,r){let i=`trajectory.${e}.segment.${t.id}`;for(let[a,o]of[["from",t.fromObjectId],["to",t.toObjectId],["around",t.aroundObjectId]])o&&!n.has(o)&&r.push(v(`validate.trajectory.segment.${a}.unknown`,`Unknown ${a} object "${o}" on trajectory "${e}" segment "${t.id}".`,void 0,`${i}.${a}`));t.assist?.objectId&&!n.has(t.assist.objectId)&&r.push(v("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(v("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(v("validate.trajectory.segment.target.required",`Trajectory "${e}" segment "${t.id}" requires a target reference.`,void 0,`${i}.to`));for(let a of t.maneuvers)ko(e,t.id,a,r)}function ko(e,t,n,r){n.kind.trim()||r.push(v("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 Qn(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 Oo(e,t){for(let n of e.values()){let r=n.segments.find(i=>i.id===t);if(r)return r}return null}function So(e,t){for(let n of e.values())for(let r of n.segments){let i=r.maneuvers.find(a=>a.id===t);if(i)return i}return null}function Mo(e,t,n){let r=e.placement?.mode==="at"?e.placement.reference:null;return r?r.kind==="named"?t.has(r.name):r.kind==="anchor"?t.has(r.objectId)?!0:(n.push(v("validate.anchor.target.unknown",`Unknown anchor target "${r.objectId}" on "${e.id}".`,e.id,"at")),!1):t.has(r.primary)?r.secondary&&!t.has(r.secondary)?(n.push(v("validate.lagrange.secondary.unknown",`Unknown Lagrange reference "${r.secondary}" on "${e.id}".`,e.id,"at")),!1):!0:(n.push(v("validate.lagrange.primary.unknown",`Unknown Lagrange reference "${r.primary}" on "${e.id}".`,e.id,"at")),!1):!0}function Zn(e,t){let n=e.placement;if(!n||n.mode!=="orbit")return null;let r=To(n.semiMajor??n.distance),i=Et(t?.properties.mass);return r===null||i===null||i<=0?null:Math.sqrt(r**3/i)*365.25}function To(e){if(!e)return null;switch(e.unit){case null:case"au":return e.value;case"km":return e.value/ot;case"m":return e.value/(ot*1e3);case"ly":return e.value*ho;case"pc":return e.value*yo;case"kpc":return e.value*go;case"re":return e.value*po/ot;case"sol":return e.value*mo/ot;default:return null}}function Et(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/uo;case"mj":return t.value/fo;default:return null}}function er(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 Po(e,t,n,r){e!=="topdown"&&e!=="isometric"&&e!=="orthographic"&&e!=="perspective"&&t.push(v("validate.viewpoint.projection.invalid",`Unknown projection "${String(e)}" in viewpoint "${r}".`,void 0,n))}function Do(e,t,n,r,i,a,o,c,s){if(!e)return;let l=`viewpoint.${i}.camera`;for(let[f,p]of[["azimuth",e.azimuth],["elevation",e.elevation],["roll",e.roll],["distance",e.distance]])p!==null&&(!Number.isFinite(p)||f==="distance"&&p<=0)&&r.push(v("validate.viewpoint.camera.invalid",`Invalid camera ${f} "${String(p)}" in viewpoint "${i}".`,void 0,`${l}.${f}`));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,`${l}.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,l)),t==="isometric"&&e.elevation!==null&&r.push(Ft("validate.viewpoint.camera.isometricStored",`Camera elevation on isometric viewpoint "${i}" is preserved semantically for future 3D rendering.`,void 0,`${l}.elevation`)),e.azimuth!==null&&e.azimuth!==0&&n!==0&&r.push(x("validate.viewpoint.rotation.cameraOverlap",`Viewpoint "${i}" uses camera.azimuth; keep "rotation" only for 2D screen rotation to avoid ambiguity.`,void 0,`${l}.azimuth`)),a!==null&&s.has(a)||o!==null&&s.has(o)||c||r.push(Ft("validate.viewpoint.camera.anchorMissing",`Viewpoint "${i}" stores camera settings without a focus object, selection, or filter anchor.`,void 0,l))}function Ao(e,t,n,r){return ne(r?.epoch)??ne(n?.epoch)??ne(t.epoch)??ne(e?.epoch)??null}function Fo(e,t,n,r){return ne(r?.referencePlane)??ne(n?.referencePlane)??ne(t.referencePlane)??ne(e?.referencePlane)??null}function ne(e){return typeof e=="string"&&e.trim()?e.trim():null}function Eo(e,t){let n=e.tolerances?.find(r=>r.field===t)?.value;return typeof n=="number"?n:n&&typeof n=="object"&&"value"in n?er(n)??0:0}function Lo(e){return`${Math.round(e*100)/100}d`}function v(e,t,n,r){return{code:e,severity:"error",source:"validate",message:t,objectId:n,field:r}}function x(e,t,n,r){return{code:e,severity:"warning",source:"validate",message:t,objectId:n,field:r}}function Ft(e,t,n,r){return{code:e,severity:"info",source:"validate",message:t,objectId:n,field:r}}var Ro=new Set(["climate","habitability","settlement"]),_o=new Set(["departure","transfer","flyby","capture","stationkeeping","escape"]),st=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=F(e);t&&st.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}])st.set(e.key,{key:e.key,version:e.key==="trajectory"?"3.0":"2.1",inlineMode:e.inlineMode,allowRepeat:e.allowRepeat});var zo=new Set(st.keys()),nr=new Set(["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","inner","outer","epoch","referencePlane","segment","maneuver"]);function ct(e){return ir(e)}function rr(e){return ir(e,"2.0-draft")}function ir(e,t){let n=Ms(e),r=n.source.split(/\r?\n/),i=[],a=!1,o="2.0",c=null,s=null,l=[],u=[],f=[],p=[],m=[],g=new Map,h=!1,I=!1,M=new Set,k=new Set,b=new Set,O=new Set,W=new Set,E=new Set;for(let T=0;T<r.length;T++){let ce=r[T],Y=T+1;if(!ce.trim())continue;let A=Ce(ce),q=ue(ce.slice(A),{line:Y,columnOffset:A});if(q.length!==0){if(!a){o=No(q,Y),a=!0,n.comments.length>0&&_e(o,"2.1")&&i.push({code:"parse.schema21.commentCompatibility",severity:"warning",source:"parse",message:`Comments require schema 2.1; parsed in compatibility mode because the document header is "schema ${o}".`,line:n.comments[0].line,column:n.comments[0].column});continue}if(A===0){s=Co(q,Y,o,i,c,l,u,f,p,m,g,M,k,b,O,W,E,{sawDefaults:h,sawAtlas:I}),s.kind==="system"?c=s.system:s.kind==="defaults"?h=!0:s.kind==="atlas"&&(I=!0);continue}if(!s)throw new d("Indented line without parent atlas section",Y,A+1);Ko(s,A,q,Y)}}if(!a)throw new d('Missing required atlas schema header "schema 2.0" or "schema 3.0"');let ae=l.map(T=>gs(T,o,i)),oe=p.map(T=>vs(T,g.get(T.id)??[])),me=t??(o==="2.0-draft"?"2.0":o),Ie={format:"worldorbit",sourceVersion:"1.0",theme:null,system:c,groups:u,relations:f,events:oe,trajectories:m,objects:ae,diagnostics:i};if(me==="2.0-draft"){let T={...Ie,version:"2.0-draft",schemaVersion:"2.0-draft"};return T.diagnostics.push(...Le(T,o)),T}let se={...Ie,version:me,schemaVersion:me};return o==="2.0-draft"&&se.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".'}),se.diagnostics.push(...Le(se,o)),se}function No(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 d('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 Co(e,t,n,r,i,a,o,c,s,l,u,f,p,m,g,h,I,M){switch(e[0]?.value.toLowerCase()){case"system":if(i)throw new d('Atlas section "system" may only appear once',t,e[0].column);return Vo(e,t,n,r);case"defaults":if(!i)throw new d('Atlas section "defaults" requires a preceding system declaration',t,e[0].column);if(M.sawDefaults)throw new d('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 d('Atlas section "atlas" requires a preceding system declaration',t,e[0].column);if(M.sawAtlas)throw new d('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 d('Atlas section "viewpoint" requires a preceding system declaration',t,e[0].column);return Bo(e,t,i,f,n,r);case"annotation":if(!i)throw new d('Atlas section "annotation" requires a preceding system declaration',t,e[0].column);return Uo(e,t,i,p);case"group":return C(n,r,"group",{line:t,column:e[0].column}),Wo(e,t,o,m);case"relation":return C(n,r,"relation",{line:t,column:e[0].column}),Yo(e,t,c,g);case"event":return C(n,r,"event",{line:t,column:e[0].column}),qo(e,t,s,u,h,n,r);case"trajectory":return we(n,r,"trajectory",{line:t,column:e[0].column}),Go(e,t,l,I,n,r);case"object":return Ho(e,t,n,r,a);default:throw new d(`Unknown atlas section "${e[0]?.value??""}"`,t,e[0]?.column??1)}}function Vo(e,t,n,r){if(e.length!==2)throw new d("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 Bo(e,t,n,r,i,a){if(e.length!==2)throw new d("Invalid viewpoint declaration",t,e[0]?.column??1);let o=Z(e[1].value);if(!o)throw new d("Viewpoint id must not be empty",t,e[1].column);if(r.has(o))throw new d(`Duplicate viewpoint id "${o}"`,t,e[1].column);let c={id:o,label:be(o),summary:"",focusObjectId:null,selectedObjectId:null,events:[],projection:n.defaults.view,preset:n.defaults.preset,zoom:null,rotationDeg:0,camera:null,layers:{},filter:null};return n.viewpoints.push(c),r.add(o),{kind:"viewpoint",viewpoint:c,sourceSchemaVersion:i,diagnostics:a,seenFields:new Set,inFilter:!1,filterIndent:null,seenFilterFields:new Set,inCamera:!1,cameraIndent:null,seenCameraFields:new Set}}function Uo(e,t,n,r){if(e.length!==2)throw new d("Invalid annotation declaration",t,e[0]?.column??1);let i=Z(e[1].value);if(!i)throw new d("Annotation id must not be empty",t,e[1].column);if(r.has(i))throw new d(`Duplicate annotation id "${i}"`,t,e[1].column);let a={id:i,label:be(i),targetObjectId:null,body:"",tags:[],sourceObjectId:null};return n.annotations.push(a),r.add(i),{kind:"annotation",annotation:a,seenFields:new Set}}function Wo(e,t,n,r){if(e.length!==2)throw new d("Invalid group declaration",t,e[0]?.column??1);let i=Z(e[1].value);if(!i)throw new d("Group id must not be empty",t,e[1].column);if(r.has(i))throw new d(`Duplicate group id "${i}"`,t,e[1].column);let a={id:i,label:be(i),summary:"",color:null,tags:[],hidden:!1};return n.push(a),r.add(i),{kind:"group",group:a,seenFields:new Set}}function Yo(e,t,n,r){if(e.length!==2)throw new d("Invalid relation declaration",t,e[0]?.column??1);let i=Z(e[1].value);if(!i)throw new d("Relation id must not be empty",t,e[1].column);if(r.has(i))throw new d(`Duplicate relation id "${i}"`,t,e[1].column);let a={id:i,from:"",to:"",kind:"",label:null,summary:null,tags:[],color:null,hidden:!1};return n.push(a),r.add(i),{kind:"relation",relation:a,seenFields:new Set}}function qo(e,t,n,r,i,a,o){if(e.length!==2)throw new d("Invalid event declaration",t,e[0]?.column??1);let c=Z(e[1].value);if(!c)throw new d("Event id must not be empty",t,e[1].column);if(i.has(c))throw new d(`Duplicate event id "${c}"`,t,e[1].column);let s={id:c,kind:"",label:be(c),summary:null,targetObjectId:null,participantObjectIds:[],timing:null,visibility:null,epoch:null,referencePlane:null,tags:[],color:null,hidden:!1,positions:[]},l=[];return n.push(s),r.set(c,l),i.add(c),{kind:"event",event:s,sourceSchemaVersion:a,diagnostics:o,seenFields:new Set,rawPoses:l,inPositions:!1,positionsIndent:null,activePose:null,poseIndent:null,activePoseSeenFields:new Set}}function Go(e,t,n,r,i,a){if(e.length!==2)throw new d("Invalid trajectory declaration",t,e[0]?.column??1);let o=Z(e[1].value);if(!o)throw new d("Trajectory id must not be empty",t,e[1].column);if(r.has(o))throw new d(`Duplicate trajectory id "${o}"`,t,e[1].column);let c={id:o,label:be(o),summary:null,craftObjectId:null,tags:[],color:null,hidden:!1,segments:[]};return n.push(c),r.add(o),{kind:"trajectory",trajectory:c,sourceSchemaVersion:i,diagnostics:a,seenFields:new Set,inSegment:!1,segmentIndent:null,activeSegment:null,activeSegmentSeenFields:new Set,inManeuver:!1,maneuverIndent:null,activeManeuver:null,activeManeuverSeenFields:new Set}}function Ho(e,t,n,r,i){if(e.length<3)throw new d("Invalid atlas object declaration",t,e[0]?.column??1);let a=e[1],o=e[2],c=a.value;if(!je.has(c)||c==="system")throw new d(`Unknown object type "${a.value}"`,t,a.column);let s={objectType:c,id:o.value,fields:hs(e.slice(3),t,c,n,r),infoEntries:[],typedBlockEntries:{},location:{line:t,column:a.column}};return i.push(s),{kind:"object",objectNode:s,sourceSchemaVersion:n,diagnostics:r,activeBlock:null,blockIndent:null,seenInfoKeys:new Set,seenTypedBlockKeys:{}}}function Ko(e,t,n,r){switch(e.kind){case"system":Xo(e,n,r);return;case"defaults":Zo(e,n,r);return;case"atlas":Jo(e,t,n,r);return;case"viewpoint":Qo(e,t,n,r);return;case"annotation":ns(e,n,r);return;case"group":rs(e,n,r);return;case"relation":is(e,n,r);return;case"event":as(e,t,n,r);return;case"trajectory":os(e,t,n,r);return;case"object":us(e,t,n,r);return}}function Xo(e,t,n){let r=V(t,e.seenFields,n),i=j(t,n);switch(r){case"title":e.system.title=i;return;case"description":C(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.description=i;return;case"epoch":C(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.epoch=i;return;case"referenceplane":C(e.sourceSchemaVersion,e.diagnostics,"referencePlane",{line:n,column:t[0].column}),e.system.referencePlane=i;return;default:throw new d(`Unknown system atlas field "${t[0].value}"`,n,t[0].column)}}function Zo(e,t,n){let r=V(t,e.seenFields,n),i=j(t,n);switch(r){case"view":or(i)&&fe(e.sourceSchemaVersion,e.diagnostics,"defaults.view",{line:n,column:t[0].column}),e.system.defaults.view=ar(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=sr(i,n,t[0].column);return;case"theme":e.system.defaults.theme=i;return;default:throw new d(`Unknown defaults field "${t[0].value}"`,n,t[0].column)}}function Jo(e,t,n,r){if(e.inMetadata&&t<=(e.metadataIndent??0)&&(e.inMetadata=!1,e.metadataIndent=null),e.inMetadata){let i=cr(n,r,"Invalid atlas metadata entry");if(i.key in e.system.atlasMetadata)throw new d(`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 d(`Unknown atlas field "${n[0].value}"`,r,n[0].column)}function Qo(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){es(e,n,r);return}if(e.inFilter){ts(e,n,r);return}if(n.length===1&&n[0].value.toLowerCase()==="camera"){if(fe(e.sourceSchemaVersion,e.diagnostics,"viewpoint.camera",{line:r,column:n[0].column}),e.seenFields.has("camera"))throw new d('Duplicate viewpoint field "camera"',r,n[0].column);e.seenFields.add("camera"),e.inCamera=!0,e.cameraIndent=t,e.viewpoint.camera=e.viewpoint.camera??Rt();return}if(n.length===1&&n[0].value.toLowerCase()==="filter"){if(e.seenFields.has("filter"))throw new d('Duplicate viewpoint field "filter"',r,n[0].column);e.seenFields.add("filter"),e.inFilter=!0,e.filterIndent=t;return}let i=V(n,e.seenFields,r),a=j(n,r);switch(i){case"label":e.viewpoint.label=a;return;case"summary":e.viewpoint.summary=a;return;case"focus":e.viewpoint.focusObjectId=a;return;case"select":e.viewpoint.selectedObjectId=a;return;case"projection":or(a)&&fe(e.sourceSchemaVersion,e.diagnostics,"projection",{line:r,column:n[0].column}),e.viewpoint.projection=ar(a,r,n[0].column);return;case"preset":e.viewpoint.preset=sr(a,r,n[0].column);return;case"zoom":e.viewpoint.zoom=Lt(a,r,n[0].column,"zoom");return;case"rotation":e.viewpoint.rotationDeg=ie(a,r,n[0].column,"rotation");return;case"camera":fe(e.sourceSchemaVersion,e.diagnostics,"viewpoint.camera",{line:r,column:n[0].column}),e.viewpoint.camera=ms(n.slice(1),r,e.viewpoint.camera);return;case"layers":e.viewpoint.layers=fs(n.slice(1),r,e.sourceSchemaVersion,e.diagnostics);return;case"events":C(e.sourceSchemaVersion,e.diagnostics,"viewpoint.events",{line:r,column:n[0].column}),e.viewpoint.events=_(n.slice(1),r,"events");return;default:throw new d(`Unknown viewpoint field "${n[0].value}"`,r,n[0].column)}}function es(e,t,n){let r=V(t,e.seenCameraFields,n),i=j(t,n),a=e.viewpoint.camera??Rt();switch(r){case"azimuth":a.azimuth=ie(i,n,t[0].column,"camera.azimuth");break;case"elevation":a.elevation=ie(i,n,t[0].column,"camera.elevation");break;case"roll":a.roll=ie(i,n,t[0].column,"camera.roll");break;case"distance":a.distance=Lt(i,n,t[0].column,"camera.distance");break;default:throw new d(`Unknown viewpoint camera field "${t[0].value}"`,n,t[0].column)}e.viewpoint.camera=a}function ts(e,t,n){let r=V(t,e.seenFilterFields,n),i=e.viewpoint.filter??ps();switch(r){case"query":i.query=j(t,n);break;case"objecttypes":i.objectTypes=ds(t.slice(1),n);break;case"tags":i.tags=_(t.slice(1),n,"tags");break;case"groups":i.groupIds=_(t.slice(1),n,"groups");break;default:throw new d(`Unknown viewpoint filter field "${t[0].value}"`,n,t[0].column)}e.viewpoint.filter=i}function ns(e,t,n){switch(V(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=_(t.slice(1),n,"tags");return;default:throw new d(`Unknown annotation field "${t[0].value}"`,n,t[0].column)}}function rs(e,t,n){switch(V(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=_(t.slice(1),n,"tags");return;case"hidden":e.group.hidden=J(j(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new d(`Unknown group field "${t[0].value}"`,n,t[0].column)}}function is(e,t,n){switch(V(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=_(t.slice(1),n,"tags");return;case"color":e.relation.color=j(t,n);return;case"hidden":e.relation.hidden=J(j(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new d(`Unknown relation field "${t[0].value}"`,n,t[0].column)}}function as(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")&&fe(e.sourceSchemaVersion,e.diagnostics,`pose.${n[0].value}`,{line:r,column:n[0]?.column??1}),(n[0]?.value==="segment"||n[0]?.value==="maneuver")&&we(e.sourceSchemaVersion,e.diagnostics,`pose.${n[0].value}`,{line:r,column:n[0]?.column??1}),e.activePose.fields.push(ls(n,r,e.activePoseSeenFields));return}if(e.inPositions){if(n.length!==2||n[0].value.toLowerCase()!=="pose")throw new d(`Unknown event positions field "${n[0].value}"`,r,n[0]?.column??1);let a=n[1].value;if(!a.trim())throw new d("Event pose object id must not be empty",r,n[1].column);let o={objectId:a,fields:[],location:{line:r,column:n[0].column}};e.rawPoses.push(o),e.activePose=o,e.poseIndent=t,e.activePoseSeenFields=new Set;return}if(n.length===1&&n[0].value.toLowerCase()==="positions"){if(e.seenFields.has("positions"))throw new d('Duplicate event field "positions"',r,n[0].column);e.seenFields.add("positions"),e.inPositions=!0,e.positionsIndent=t;return}switch(V(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":we(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=_(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":fe(e.sourceSchemaVersion,e.diagnostics,"event.epoch",{line:r,column:n[0].column}),e.event.epoch=j(n,r);return;case"referenceplane":fe(e.sourceSchemaVersion,e.diagnostics,"event.referencePlane",{line:r,column:n[0].column}),e.event.referencePlane=j(n,r);return;case"tags":e.event.tags=_(n.slice(1),r,"tags");return;case"color":e.event.color=j(n,r);return;case"hidden":e.event.hidden=J(j(n,r),"hidden",{line:r,column:n[0].column});return;default:throw new d(`Unknown event field "${n[0].value}"`,r,n[0].column)}}function os(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){cs(e,n,r);return}if(e.activeSegment){if(n[0]?.value.toLowerCase()==="maneuver"){if(n.length!==2)throw new d("Invalid trajectory maneuver declaration",r,n[0]?.column??1);let o=Z(n[1].value);if(!o)throw new d("Trajectory maneuver id must not be empty",r,n[1].column);if(e.activeSegment.maneuvers.some(s=>s.id===o))throw new d(`Duplicate trajectory maneuver id "${o}"`,r,n[1].column);let c={id:o,kind:"burn",label:null,epoch:null,notes:[]};e.activeSegment.maneuvers.push(c),e.activeManeuver=c,e.inManeuver=!0,e.maneuverIndent=t,e.activeManeuverSeenFields=new Set;return}ss(e,n,r);return}if(n[0]?.value.toLowerCase()==="segment"){if(n.length!==2)throw new d("Invalid trajectory segment declaration",r,n[0]?.column??1);let o=Z(n[1].value);if(!o)throw new d("Trajectory segment id must not be empty",r,n[1].column);if(e.trajectory.segments.some(s=>s.id===o))throw new d(`Duplicate trajectory segment id "${o}"`,r,n[1].column);let c={id:o,kind:"transfer",label:null,summary:null,fromObjectId:null,toObjectId:null,aroundObjectId:null,assist:null,epoch:null,notes:[],maneuvers:[]};e.trajectory.segments.push(c),e.activeSegment={id:o,fields:[],maneuvers:c.maneuvers,assist:null,location:{line:r,column:n[0].column}},e.inSegment=!0,e.segmentIndent=t,e.activeSegmentSeenFields=new Set;return}let i=V(n,e.seenFields,r),a=j(n,r);switch(i){case"label":e.trajectory.label=a;return;case"summary":e.trajectory.summary=a;return;case"craft":e.trajectory.craftObjectId=a;return;case"tags":e.trajectory.tags=_(n.slice(1),r,"tags");return;case"color":e.trajectory.color=a;return;case"hidden":e.trajectory.hidden=J(a,"hidden",{line:r,column:n[0].column});return;default:throw new d(`Unknown trajectory field "${n[0].value}"`,r,n[0].column)}}function ss(e,t,n){let r=e.activeSegment;if(!r)return;let i=V(t,e.activeSegmentSeenFields,n),a=j(t,n),o=e.trajectory.segments.find(c=>c.id===r.id);switch(i){case"kind":{let c=a.toLowerCase();if(!_o.has(c))throw new d(`Unknown trajectory segment kind "${a}"`,n,t[0].column);o.kind=c;return}case"label":o.label=a;return;case"summary":o.summary=a;return;case"from":o.fromObjectId=a;return;case"to":o.toObjectId=a;return;case"around":o.aroundObjectId=a;return;case"assist":o.assist={objectId:a,notes:[]};return;case"epoch":o.epoch=a;return;case"periapsis":o.periapsis=R(a,{line:n,column:t[0].column},"periapsis");return;case"apoapsis":o.apoapsis=R(a,{line:n,column:t[0].column},"apoapsis");return;case"inclination":o.inclination=R(a,{line:n,column:t[0].column},"inclination");return;case"duration":o.duration=R(a,{line:n,column:t[0].column},"duration");return;case"deltav":o.deltaV=R(a,{line:n,column:t[0].column});return;case"phaseangle":o.phaseAngle=R(a,{line:n,column:t[0].column},"phaseAngle");return;case"turnangle":o.turnAngle=R(a,{line:n,column:t[0].column},"turnAngle");return;case"energy":o.energy=R(a,{line:n,column:t[0].column});return;case"notes":o.notes=_(t.slice(1),n,"notes");return;default:throw new d(`Unknown trajectory segment field "${t[0].value}"`,n,t[0].column)}}function cs(e,t,n){let r=e.activeManeuver;if(!r)return;let i=V(t,e.activeManeuverSeenFields,n),a=j(t,n);switch(i){case"kind":r.kind=a;return;case"label":r.label=a;return;case"epoch":r.epoch=a;return;case"deltav":r.deltaV=R(a,{line:n,column:t[0].column});return;case"duration":r.duration=R(a,{line:n,column:t[0].column},"duration");return;case"notes":r.notes=_(t.slice(1),n,"notes");return;default:throw new d(`Unknown trajectory maneuver field "${t[0].value}"`,n,t[0].column)}}function ls(e,t,n){if(e.length<2)throw new d("Invalid event pose field line",t,e[0]?.column??1);let r=e[0].value;if(!nr.has(r))throw new d(`Unknown event pose field "${r}"`,t,e[0].column);if(n.has(r))throw new d(`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 us(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"||Ro.has(i)){i!=="info"&&C(e.sourceSchemaVersion,e.diagnostics,i,{line:r,column:n[0].column}),e.activeBlock=i,e.blockIndent=t;return}}if(e.activeBlock){let i=cr(n,r,`Invalid ${e.activeBlock} entry`);if(e.activeBlock==="info"){if(e.seenInfoKeys.has(i.key))throw new d(`Duplicate info key "${i.key}"`,r,n[0].column);e.seenInfoKeys.add(i.key),e.objectNode.infoEntries.push(i);return}let a=e.activeBlock,o=e.seenTypedBlockKeys[a]??(e.seenTypedBlockKeys[a]=new Set);if(o.has(i.key))throw new d(`Duplicate ${a} key "${i.key}"`,r,n[0].column);o.add(i.key),(e.objectNode.typedBlockEntries[a]??(e.objectNode.typedBlockEntries[a]=[])).push(i);return}e.objectNode.fields.push(ys(n,r,e.objectNode.objectType,e.sourceSchemaVersion,e.diagnostics))}function V(e,t,n){if(e.length<2)throw new d("Invalid atlas field line",n,e[0]?.column??1);let r=e[0].value.toLowerCase();if(t.has(r))throw new d(`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 d("Missing value for atlas field",t,e[0]?.column??1);return e.slice(1).map(n=>n.value).join(" ").trim()}function ds(e,t){return _(e,t,"objectTypes").filter(n=>n==="star"||n==="planet"||n==="moon"||n==="belt"||n==="asteroid"||n==="comet"||n==="ring"||n==="structure"||n==="phenomenon")}function fs(e,t,n,r){let i={};for(let a of _(e,t,"layers")){let o=!a.startsWith("-")&&!a.startsWith("!"),c=a.replace(/^[-!]+/,"").toLowerCase();if(c==="orbits"){i["orbits-back"]=o,i["orbits-front"]=o;continue}(c==="background"||c==="guides"||c==="orbits-back"||c==="orbits-front"||c==="relations"||c==="events"||c==="objects"||c==="labels"||c==="metadata")&&(c==="events"&&n&&r&&C(n,r,"layers.events",{line:t,column:e[0]?.column??1}),i[c]=o)}return i}function _(e,t,n){if(e.length===0)throw new d(`Missing value for atlas field "${n}"`,t,1);let r=e.map(i=>i.value).filter(Boolean);if(r.length===0)throw new d(`Missing value for atlas field "${n}"`,t,e[0]?.column??1);return r}function ar(e,t,n){let r=e.toLowerCase();if(r!=="topdown"&&r!=="isometric"&&r!=="orthographic"&&r!=="perspective")throw new d(`Unknown projection "${e}"`,t,n);return r}function or(e){let t=e.toLowerCase();return t==="orthographic"||t==="perspective"}function sr(e,t,n){let r=e.toLowerCase();if(r==="diagram"||r==="presentation"||r==="atlas-card"||r==="markdown")return r;throw new d(`Unknown render preset "${e}"`,t,n)}function Lt(e,t,n,r){let i=ie(e,t,n,r);if(i<=0)throw new d(`Field "${r}" must be greater than zero`,t,n);return i}function ie(e,t,n,r){let i=Number(e);if(!Number.isFinite(i))throw new d(`Invalid numeric value "${e}" for "${r}"`,t,n);return i}function ps(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Rt(){return{azimuth:null,elevation:null,roll:null,distance:null}}function ms(e,t,n){if(e.length===0||e.length%2!==0)throw new d('Field "camera" expects "<field> <value>" pairs',t,e[0]?.column??1);let r=n?{...n}:Rt(),i=new Set;for(let a=0;a<e.length;a+=2){let o=e[a],c=e[a+1],s=o.value.toLowerCase();if(i.has(s))throw new d(`Duplicate viewpoint camera field "${o.value}"`,t,o.column);i.add(s);let l=c.value;switch(s){case"azimuth":r.azimuth=ie(l,t,o.column,"camera.azimuth");break;case"elevation":r.elevation=ie(l,t,o.column,"camera.elevation");break;case"roll":r.roll=ie(l,t,o.column,"camera.roll");break;case"distance":r.distance=Lt(l,t,o.column,"camera.distance");break;default:throw new d(`Unknown viewpoint camera field "${o.value}"`,t,o.column)}}return r}function hs(e,t,n,r,i){let a=[],o=0;for(;o<e.length;){let c=e[o],s=Re(c.value);if(!s)throw new d(`Unknown field "${c.value}"`,t,c.column);s.version==="2.1"?C(r,i,c.value,{line:t,column:c.column}):s.version==="3.0"&&we(r,i,c.value,{line:t,column:c.column}),o++;let l=[];if(s.inlineMode==="single"){let u=e[o];u&&(l.push(u),o++)}else if(s.inlineMode==="pair")for(let u=0;u<2;u++){let f=e[o];if(!f)break;l.push(f),o++}else for(;o<e.length&&!zo.has(e[o].value);)l.push(e[o]),o++;if(l.length===0)throw new d(`Missing value for field "${c.value}"`,t,c.column);a.push({type:"field",key:c.value,values:l.map(u=>u.value),location:{line:t,column:c.column}})}return fr(a,n),a}function ys(e,t,n,r,i){if(e.length<2)throw new d("Invalid field line",t,e[0]?.column??1);let a=Re(e[0].value);if(!a)throw new d(`Unknown field "${e[0].value}"`,t,e[0].column);a.version==="2.1"?C(r,i,e[0].value,{line:t,column:e[0].column}):a.version==="3.0"&&we(r,i,e[0].value,{line:t,column:e[0].column});let o={type:"field",key:e[0].value,values:e.slice(1).map(c=>c.value),location:{line:t,column:e[0].column}};return fr([o],n),o}function cr(e,t,n){if(e.length<2)throw new d(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 gs(e,t,n){let r=lr(e.fields),i=ur(r),a=ws(e.objectType,r),o=Os(r.get("groups")?.[0]),c=de(r.get("epoch")?.[0]),s=de(r.get("referencePlane")?.[0]),l=r.has("tidalLock")?J(U(r.get("tidalLock")[0]),"tidalLock",r.get("tidalLock")[0].location):void 0,u=r.has("resonance")?js(r.get("resonance")[0]):void 0,f=$s(r),p=r.get("derive")?.map(O=>xs(O)),m=r.get("validate")?.map(O=>({rule:U(O)})),g=r.has("locked")?[...new Set(r.get("locked").flatMap(O=>O.values))]:void 0,h=r.get("tolerance")?.map(O=>ks(O)),I=Is(e.typedBlockEntries),M=dr(e.infoEntries,"info"),k=de(r.get("trajectory")?.[0]),b={type:e.objectType,id:e.id,properties:a,placement:i,info:M};return o.length>0&&(b.groups=o),c&&(b.epoch=c),s&&(b.referencePlane=s),l!==void 0&&(b.tidalLock=l),u&&(b.resonance=u),f&&(b.renderHints=f),p?.length&&(b.deriveRules=p),m?.length&&(b.validationRules=m),g?.length&&(b.lockedFields=g),h?.length&&(b.tolerances=h),I&&Object.keys(I).length>0&&(b.typedBlocks=I),k&&(b.trajectoryId=k),_e(t,"2.1")&&(b.groups||b.epoch||b.referencePlane||b.tidalLock!==void 0||b.resonance||b.renderHints||b.deriveRules?.length||b.validationRules?.length||b.lockedFields?.length||b.tolerances?.length||b.typedBlocks||b.trajectoryId)&&C(t,n,e.id,e.location),b.trajectoryId&&we(t,n,`${e.id}.trajectory`,e.location),b}function vs(e,t){return{...e,participantObjectIds:[...new Set(e.participantObjectIds)],tags:[...new Set(e.tags)],positions:t.map(n=>bs(n))}}function bs(e){let t=lr(e.fields,"event-pose"),n=ur(t);return{objectId:e.objectId,placement:n,trajectorySegmentId:de(t.get("segment")?.[0]),trajectoryManeuverId:de(t.get("maneuver")?.[0]),inner:re(t.get("inner")?.[0],"inner"),outer:re(t.get("outer")?.[0],"outer"),epoch:de(t.get("epoch")?.[0]),referencePlane:de(t.get("referencePlane")?.[0])}}function lr(e,t="object"){let n=new Map;for(let r of e){let i=Re(r.key);if(!i&&!nr.has(r.key))throw d.fromLocation(`Unknown field "${r.key}"`,r.location);if(!i?.allowRepeat&&n.has(r.key))throw d.fromLocation(`Duplicate field "${r.key}"`,r.location);let a=n.get(r.key)??[];a.push(r),n.set(r.key,a)}return n}function ur(e){let t=e.get("orbit")?.[0],n=e.get("at")?.[0],r=e.get("surface")?.[0],i=e.get("free")?.[0];if([t,n,r,i].filter(Boolean).length>1){let o=t??n??r??i;throw d.fromLocation("Object has multiple placement modes",o?.location)}if(t)return{mode:"orbit",target:U(t),distance:re(e.get("distance")?.[0],"distance"),semiMajor:re(e.get("semiMajor")?.[0],"semiMajor"),eccentricity:Ss(e.get("eccentricity")?.[0],"eccentricity"),period:re(e.get("period")?.[0],"period"),angle:re(e.get("angle")?.[0],"angle"),inclination:re(e.get("inclination")?.[0],"inclination"),phase:re(e.get("phase")?.[0],"phase")};if(n){let o=U(n);return{mode:"at",target:o,reference:Kn(o,n.location)}}if(r)return{mode:"surface",target:U(r)};if(i){let o=U(i),c=Dt(o);return{mode:"free",distance:c??void 0,descriptor:c?void 0:o}}return null}function ws(e,t){let n={};for(let[r,i]of t.entries()){let a=i[0],o=Re(r);!a||!o?.legacySchema||o.legacySchema.placement||(At(r,e,a.location),n[r]=Xn(r,a.values,a.location))}return n}function dr(e,t){let n={};for(let r of e){if(r.key in n)throw d.fromLocation(`Duplicate ${t} key "${r.key}"`,r.location);n[r.key]=r.value}return n}function Is(e){let t={};for(let n of Object.keys(e)){let r=e[n];r?.length&&(t[n]=dr(r,n))}return t}function $s(e){let t={},n=e.get("renderLabel")?.[0],r=e.get("renderOrbit")?.[0],i=e.get("renderPriority")?.[0];return n&&(t.renderLabel=J(U(n),"renderLabel",n.location)),r&&(t.renderOrbit=J(U(r),"renderOrbit",r.location)),i&&(t.renderPriority=at(U(i),"renderPriority",i.location)),Object.keys(t).length>0?t:void 0}function js(e){if(e.values.length!==2)throw d.fromLocation('Field "resonance" expects "<targetObjectId> <ratio>"',e.location);let t=e.values[1];if(!/^\d+:\d+$/.test(t))throw d.fromLocation(`Invalid resonance ratio "${t}"`,e.location);return{targetObjectId:e.values[0],ratio:t}}function xs(e){if(e.values.length!==2)throw d.fromLocation('Field "derive" expects "<field> <strategy>"',e.location);return{field:e.values[0],strategy:e.values[1]}}function ks(e){if(e.values.length!==2)throw d.fromLocation('Field "tolerance" expects "<field> <value>"',e.location);let t=e.values[1],n=Dt(t),r=Number(t);return{field:e.values[0],value:n??(Number.isFinite(r)?r:t)}}function Os(e){return e?[...new Set(e.values)]:[]}function de(e){return e&&e.values.join(" ").trim()||null}function re(e,t){return e?R(U(e),e.location,t):void 0}function Ss(e,t){return e?at(U(e),t,e.location):void 0}function U(e){return Ee(e.values,e.key,e.location)}function Re(e){return st.get(e)}function fr(e,t){for(let n of e){let r=Re(n.key);if(!r)throw d.fromLocation(`Unknown field "${n.key}"`,n.location);if(r.legacySchema){At(n.key,t,n.location);continue}if((n.key==="renderLabel"||n.key==="renderOrbit"||n.key==="tidalLock")&&n.values.length!==1)throw d.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function C(e,t,n,r){_e(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 fe(e,t,n,r){_e(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 we(e,t,n,r){_e(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 _e(e,t){return tr(e)<tr(t)}function tr(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 Ms(e){let t=[...e],n=[],r=!1,i=!1,a=null,o=1,c=1;for(let s=0;s<t.length;s++){let l=t[s],u=t[s+1];if(i){if(l==="*"&&u==="/"){t[s]=" ",t[s+1]=" ",i=!1,a=null,s++,c+=2;continue}l!==`
5
- `&&l!=="\r"&&(t[s]=" "),l===`
6
- `?(o++,c=1):c++;continue}if(!r&&l==="/"&&u==="*"){n.push({kind:"block",line:o,column:c}),t[s]=" ",t[s+1]=" ",i=!0,a={line:o,column:c},s++,c+=2;continue}if(!r&&l==="#"&&!Ts(t,s)){n.push({kind:"line",line:o,column:c}),t[s]=" ";let f=s+1;for(;f<t.length&&t[f]!==`
7
- `&&t[f]!=="\r";)t[f]=" ",f++;c+=f-s,s=f-1;continue}l==='"'&&t[s-1]!=="\\"&&(r=!r),l===`
8
- `?(o++,c=1):c++}if(i)throw d.fromLocation("Unclosed block comment",a??void 0);return{source:t.join(""),comments:n}}function Ts(e,t){let n=t+1,r=0;for(;n<e.length&&/[0-9a-f]/i.test(e[n]??"");)n++,r++;if(![3,4,6,8].includes(r))return!1;let i=e[n];return i===void 0||i===" "||i===" "||i==="\r"||i===`
9
- `}function _t(e="WorldOrbit",t="3.0"){return{format:"worldorbit",version:t,schemaVersion:t,sourceVersion:"1.0",theme:{preset:"blueprint",styles:{}},system:{type:"system",id:e,title:e,description:null,epoch:null,referencePlane:null,defaults:{view:"topdown",scale:null,units:null,preset:null,theme:null},atlasMetadata:{},viewpoints:[],annotations:[]},groups:[],relations:[],events:[],trajectories:[],objects:[],diagnostics:[]}}function lt(e){return structuredClone(e)}function pr(e){let t=[{kind:"system"},{kind:"defaults"}];if(e.system){for(let n of Object.keys(e.system.atlasMetadata).sort())t.push({kind:"metadata",key:n});for(let n of[...e.system.viewpoints].sort(B))t.push({kind:"viewpoint",id:n.id});for(let n of[...e.system.annotations].sort(B))t.push({kind:"annotation",id:n.id})}for(let n of[...e.groups].sort(B))t.push({kind:"group",id:n.id});for(let n of[...e.relations].sort(B))t.push({kind:"relation",id:n.id});for(let n of[...e.events].sort(B)){t.push({kind:"event",id:n.id});for(let r of[...n.positions].sort(xr))t.push({kind:"event-pose",id:n.id,key:r.objectId})}for(let n of[...e.trajectories].sort(B)){t.push({kind:"trajectory",id:n.id});for(let r of[...n.segments].sort(B)){t.push({kind:"trajectory-segment",id:n.id,key:r.id});for(let i of[...r.maneuvers].sort(B))t.push({kind:"trajectory-maneuver",id:n.id,key:`${r.id}:${i.id}`})}}for(let n of[...e.objects].sort(B))t.push({kind:"object",id:n.id});return t}function zt(e,t){switch(t.kind){case"system":return e.system;case"defaults":return e.system?.defaults??null;case"metadata":return t.key?e.system?.atlasMetadata[t.key]??null:null;case"group":return t.id?vr(e,t.id):null;case"event":return t.id?ut(e,t.id):null;case"event-pose":return t.id&&t.key?wr(e,t.id,t.key):null;case"trajectory":return t.id?dt(e,t.id):null;case"trajectory-segment":return t.id&&t.key?ft(e,t.id,t.key):null;case"trajectory-maneuver":return t.id&&t.key?Ir(e,t.id,t.key):null;case"object":return t.id?gr(e,t.id):null;case"viewpoint":return t.id?$r(e.system,t.id):null;case"annotation":return t.id?jr(e.system,t.id):null;case"relation":return t.id?br(e,t.id):null}}function Nt(e,t,n){let r=lt(e),i=Bt(r);switch(t.kind){case"system":return r.system=n,r;case"defaults":return i.defaults={...i.defaults,...n},r;case"metadata":if(!t.key)throw new Error('Metadata updates require a "key" value.');return n==null||n===""?delete i.atlasMetadata[t.key]:i.atlasMetadata[t.key]=String(n),r;case"group":if(!t.id)throw new Error('Group updates require an "id" value.');return pe(r.groups,n),r;case"event":if(!t.id)throw new Error('Event updates require an "id" value.');return pe(r.events,n),r;case"event-pose":if(!t.id||!t.key)throw new Error('Event pose updates require an event "id" and pose "key" value.');return Ps(r.events,t.id,n),r;case"trajectory":if(!t.id)throw new Error('Trajectory updates require an "id" value.');return pe(r.trajectories,n),r;case"trajectory-segment":if(!t.id||!t.key)throw new Error('Trajectory segment updates require a trajectory "id" and segment "key" value.');return Ds(r.trajectories,t.id,n),r;case"trajectory-maneuver":if(!t.id||!t.key)throw new Error('Trajectory maneuver updates require a trajectory "id" and maneuver "key" value.');return As(r.trajectories,t.id,t.key,n),r;case"object":if(!t.id)throw new Error('Object updates require an "id" value.');return pe(r.objects,n),r;case"viewpoint":if(!t.id)throw new Error('Viewpoint updates require an "id" value.');return pe(i.viewpoints,n),r;case"annotation":if(!t.id)throw new Error('Annotation updates require an "id" value.');return pe(i.annotations,n),r;case"relation":if(!t.id)throw new Error('Relation updates require an "id" value.');return pe(r.relations,n),r}}function mr(e,t,n){return Nt(e,t,n(zt(e,t)))}function hr(e,t){let n=lt(e),r=Bt(n);switch(t.kind){case"metadata":return t.key&&delete r.atlasMetadata[t.key],n;case"object":return t.id&&(n.objects=n.objects.filter(i=>i.id!==t.id)),n;case"group":return t.id&&(n.groups=n.groups.filter(i=>i.id!==t.id)),n;case"event":return t.id&&(n.events=n.events.filter(i=>i.id!==t.id)),n;case"event-pose":if(t.id&&t.key){let i=ut(n,t.id);i&&(i.positions=i.positions.filter(a=>a.objectId!==t.key))}return n;case"trajectory":return t.id&&(n.trajectories=n.trajectories.filter(i=>i.id!==t.id)),n;case"trajectory-segment":if(t.id&&t.key){let i=dt(n,t.id);i&&(i.segments=i.segments.filter(a=>a.id!==t.key))}return n;case"trajectory-maneuver":if(t.id&&t.key){let i=Ut(t.key);if(i){let a=ft(n,t.id,i.segmentId);a&&(a.maneuvers=a.maneuvers.filter(o=>o.id!==i.maneuverId))}}return n;case"viewpoint":return t.id&&(r.viewpoints=r.viewpoints.filter(i=>i.id!==t.id)),n;case"annotation":return t.id&&(r.annotations=r.annotations.filter(i=>i.id!==t.id)),n;case"relation":return t.id&&(n.relations=n.relations.filter(i=>i.id!==t.id)),n;default:return n}}function Ct(e,t){return t.map(n=>({diagnostic:n,path:Vt(e,n)}))}function Vt(e,t){if(t.objectId&&gr(e,t.objectId))return{kind:"object",id:t.objectId};if(t.field?.startsWith("group.")){let n=t.field.split(".");if(n[1]&&vr(e,n[1]))return{kind:"group",id:n[1]}}if(t.field?.startsWith("viewpoint.")){let n=t.field.split(".");if(n[1]&&$r(e.system,n[1]))return{kind:"viewpoint",id:n[1]}}if(t.field?.startsWith("annotation.")){let n=t.field.split(".");if(n[1]&&jr(e.system,n[1]))return{kind:"annotation",id:n[1]}}if(t.field?.startsWith("relation.")){let n=t.field.split(".");if(n[1]&&br(e,n[1]))return{kind:"relation",id:n[1]}}if(t.field?.startsWith("event.")){let n=t.field.split(".");if(n[1]&&ut(e,n[1]))return n[2]==="pose"&&n[3]&&wr(e,n[1],n[3])?{kind:"event-pose",id:n[1],key:n[3]}:{kind:"event",id:n[1]}}if(t.field?.startsWith("trajectory.")){let n=t.field.split(".");if(n[1]&&dt(e,n[1]))return n[2]==="segment"&&n[3]&&ft(e,n[1],n[3])?n[4]==="maneuver"&&n[5]&&Ir(e,n[1],`${n[3]}:${n[5]}`)?{kind:"trajectory-maneuver",id:n[1],key:`${n[3]}:${n[5]}`}:{kind:"trajectory-segment",id:n[1],key:n[3]}:{kind:"trajectory",id:n[1]}}return t.field&&t.field in Bt(e).atlasMetadata?{kind:"metadata",key:t.field}:null}function yr(e){let t=[...e.diagnostics,...Le(e,e.version)];return Ct(e,t)}function Bt(e){return e.system||(e.system=_t().system),e.system}function gr(e,t){return e.objects.find(n=>n.id===t)??null}function vr(e,t){return e.groups.find(n=>n.id===t)??null}function br(e,t){return e.relations.find(n=>n.id===t)??null}function ut(e,t){return e.events.find(n=>n.id===t)??null}function wr(e,t,n){return ut(e,t)?.positions.find(r=>r.objectId===n)??null}function dt(e,t){return e.trajectories.find(n=>n.id===t)??null}function ft(e,t,n){return dt(e,t)?.segments.find(r=>r.id===n)??null}function Ir(e,t,n){let r=Ut(n);return r?ft(e,t,r.segmentId)?.maneuvers.find(i=>i.id===r.maneuverId)??null:null}function $r(e,t){return e?.viewpoints.find(n=>n.id===t)??null}function jr(e,t){return e?.annotations.find(n=>n.id===t)??null}function pe(e,t){let n=e.findIndex(r=>r.id===t.id);if(n===-1){e.push(t),e.sort(B);return}e[n]=t}function Ps(e,t,n){let r=e.find(a=>a.id===t);if(!r)throw new Error(`Unknown event "${t}" for pose update.`);let i=r.positions.findIndex(a=>a.objectId===n.objectId);if(i===-1){r.positions.push(n),r.positions.sort(xr);return}r.positions[i]=n}function Ds(e,t,n){let r=e.find(a=>a.id===t);if(!r)throw new Error(`Unknown trajectory "${t}" for segment update.`);let i=r.segments.findIndex(a=>a.id===n.id);if(i===-1){r.segments.push(n),r.segments.sort(B);return}r.segments[i]=n}function As(e,t,n,r){let i=Ut(n);if(!i)throw new Error(`Invalid trajectory maneuver key "${n}".`);let a=e.find(s=>s.id===t);if(!a)throw new Error(`Unknown trajectory "${t}" for maneuver update.`);let o=a.segments.find(s=>s.id===i.segmentId);if(!o)throw new Error(`Unknown trajectory segment "${i.segmentId}" on "${t}".`);let c=o.maneuvers.findIndex(s=>s.id===r.id);if(c===-1){o.maneuvers.push(r),o.maneuvers.sort(B);return}o.maneuvers[c]=r}function Ut(e){let t=e.indexOf(":");return t<=0||t>=e.length-1?null:{segmentId:e.slice(0,t),maneuverId:e.slice(t+1)}}function B(e,t){return e.id.localeCompare(t.id)}function xr(e,t){return e.objectId.localeCompare(t.objectId)}var Fs=/^schema\s+(?:2(?:\.0|\.1|\.5|\.6)?|3(?:\.0)?)$/i,Es=/^schema\s+2\.1$/i,Ls=/^schema\s+2\.5$/i,Rs=/^schema\s+2\.6$/i,_s=/^schema\s+3(?:\.0)?$/i,zs=/^schema\s+2\.0-draft$/i;function Wt(e){for(let t of Ns(e).split(/\r?\n/)){let n=t.trim();if(n)return zs.test(n)?"2.0-draft":Es.test(n)?"2.1":Ls.test(n)?"2.5":Rs.test(n)?"2.6":_s.test(n)?"3.0":Fs.test(n)?"2.0":"1.0"}return"1.0"}function Ns(e){let t=[...e],n=!1,r=!1;for(let i=0;i<t.length;i++){let a=t[i],o=t[i+1];if(r){if(a==="*"&&o==="/"){t[i]=" ",t[i+1]=" ",r=!1,i++;continue}a!==`
10
- `&&a!=="\r"&&(t[i]=" ");continue}if(!n&&a==="/"&&o==="*"){t[i]=" ",t[i+1]=" ",r=!0,i++;continue}if(!n&&a==="#"){t[i]=" ";let c=i+1;for(;c<t.length&&t[c]!==`
11
- `&&t[c]!=="\r";)t[c]=" ",c++;i=c-1;continue}a==='"'&&t[i-1]!=="\\"&&(n=!n)}return t.join("")}function pt(e){let t=Yt(e);if(!t.ok||!t.value){let n=t.diagnostics[0];throw new d(n?.message??"Failed to load WorldOrbit source",n?.line,n?.column)}return t.value}function Yt(e){let t=Wt(e);if(t==="2.0"||t==="2.0-draft"||t==="2.1"||t==="2.5"||t==="2.6"||t==="3.0")return Cs(e,t);let n;try{n=ee(e)}catch(i){return{ok:!1,value:null,diagnostics:[L(i,"parse")]}}let r;try{r=G(n)}catch(i){return{ok:!1,value:null,diagnostics:[L(i,"normalize")]}}try{H(r)}catch(i){return{ok:!1,value:null,diagnostics:[L(i,"validate")]}}return{ok:!0,value:{schemaVersion:t,ast:n,document:r,atlasDocument:null,draftDocument:null,diagnostics:[]},diagnostics:[]}}function Cs(e,t){let n;try{n=ct(e)}catch(o){return{ok:!1,value:null,diagnostics:[L(o,"parse","load.atlas.failed")]}}let r=[...n.diagnostics];if(r.some(o=>o.severity==="error"))return{ok:!1,value:null,diagnostics:r};let i;try{i=Fe(n)}catch(o){return{ok:!1,value:null,diagnostics:[L(o,"normalize","load.atlas.materialize.failed")]}}return{ok:!0,value:{schemaVersion:t,ast:null,document:i,atlasDocument:n,draftDocument:n,diagnostics:r},diagnostics:r}}var Vs=/^```worldorbit(?:\s+(.*))?\s*$/;function kr(e){let t=e.split(/\r?\n/),n=[],r=!1,i=null,a=0,o=[];return t.forEach((c,s)=>{let l=s+1;if(!r){let u=c.match(Vs);u&&(r=!0,i=u[1]??null,a=l,o=[]);return}if(c.trim()==="```"){n.push({source:o.join(`
12
- `),info:i,startLine:a,endLine:l}),r=!1,i=null,a=0,o=[];return}o.push(c)}),n}function Or(e){let t=ee(e),n=G(t);return H(n),{ast:t,document:n}}function Bs(e){let t=Or(e);return{...t,scene:K(t.document)}}function Us(e){return pt(e)}function Ws(e){return Ue(e)}function Ys(e,t={}){return it(e,t)}return _r(qs);})();
1
+ "use strict";var WorldOrbitCore=(()=>{var wt=Object.defineProperty;var Cr=Object.getOwnPropertyDescriptor;var Vr=Object.getOwnPropertyNames;var Br=Object.prototype.hasOwnProperty;var Ur=(e,t)=>{for(var n in t)wt(e,n,{get:t[n],enumerable:!0})},Wr=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Vr(t))!Br.call(e,i)&&i!==n&&wt(e,i,{get:()=>t[i],enumerable:!(r=Cr(t,i))||r.enumerable});return e};var Yr=e=>Wr(wt({},"__esModule",{value:!0}),e);var cc={};Ur(cc,{WORLDORBIT_FIELD_KEYS:()=>en,WORLDORBIT_FIELD_SCHEMAS:()=>It,WORLDORBIT_OBJECT_TYPES:()=>Oe,WorldOrbitError:()=>f,cloneAtlasDocument:()=>pt,createDiagnostic:()=>sn,createEmptyAtlasDocument:()=>Bt,createTrajectorySolverSnapshot:()=>Vn,detectWorldOrbitSchemaVersion:()=>Kt,diagnosticFromError:()=>E,evaluateSpatialSceneAtTime:()=>Nn,extractWorldOrbitBlocks:()=>Ar,formatAtlasDocument:()=>st,formatDocument:()=>ct,formatDraftDocument:()=>At,getAtlasDocumentNode:()=>Ut,getFieldSchema:()=>A,isKnownFieldKey:()=>$t,listAtlasDocumentPaths:()=>Ir,load:()=>ac,loadWorldOrbitSource:()=>gt,loadWorldOrbitSourceWithDiagnostics:()=>Xt,materializeAtlasDocument:()=>Re,materializeDraftDocument:()=>Un,normalizeDocument:()=>Z,normalizeWithDiagnostics:()=>cn,parse:()=>Fr,parseSafe:()=>oc,parseWithDiagnostics:()=>qe,parseWorldOrbit:()=>ne,parseWorldOrbitAtlas:()=>ft,parseWorldOrbitDraft:()=>dr,removeAtlasDocumentNode:()=>jr,render:()=>ic,renderDocumentToScene:()=>H,renderDocumentToSpatialScene:()=>_n,resolveAtlasDiagnosticPath:()=>qt,resolveAtlasDiagnostics:()=>Yt,rotatePoint:()=>vn,stringify:()=>sc,supportsObjectType:()=>jt,tokenizeLine:()=>tn,tokenizeLineDetailed:()=>pe,unitFamilyAllowsUnit:()=>Se,updateAtlasDocumentNode:()=>$r,upgradeDocumentToDraftV2:()=>ot,upgradeDocumentToV2:()=>Ee,upsertAtlasDocumentNode:()=>Wt,validateAtlasDocumentWithDiagnostics:()=>xr,validateDocument:()=>J,validateDocumentWithDiagnostics:()=>ln});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 ke=["system","star","planet","moon","belt","asteroid","comet","ring","craft","structure","phenomenon"],z=ke.filter(e=>e!=="system"),qr=["star","planet","moon","asteroid","comet","craft","structure","phenomenon"],Qt=["craft","structure","phenomenon"],te=["star","planet","moon","belt","asteroid","comet","ring","craft","structure","phenomenon"],Hr=["star","planet","moon","belt","asteroid","comet","ring","craft","structure","phenomenon"];function $(e,t){return{key:e,...t}}var Oe=new Set(ke),It=new Map([$("orbit",{kind:"string",placement:!0,arity:"single",objectTypes:te}),$("distance",{kind:"unit",placement:!0,arity:"single",objectTypes:te,unitFamily:"distance"}),$("semiMajor",{kind:"unit",placement:!0,arity:"single",objectTypes:te,unitFamily:"distance"}),$("eccentricity",{kind:"number",placement:!0,arity:"single",objectTypes:te}),$("period",{kind:"unit",placement:!0,arity:"single",objectTypes:te,unitFamily:"duration"}),$("angle",{kind:"unit",placement:!0,arity:"single",objectTypes:te,unitFamily:"angle"}),$("inclination",{kind:"unit",placement:!0,arity:"single",objectTypes:te,unitFamily:"angle"}),$("phase",{kind:"unit",placement:!0,arity:"single",objectTypes:te,unitFamily:"angle"}),$("at",{kind:"string",placement:!0,arity:"single",objectTypes:Qt}),$("surface",{kind:"string",placement:!0,arity:"single",objectTypes:Qt}),$("free",{kind:"string",placement:!0,arity:"single",objectTypes:Hr}),$("kind",{kind:"string",placement:!1,arity:"single",objectTypes:z}),$("class",{kind:"string",placement:!1,arity:"single",objectTypes:z}),$("culture",{kind:"string",placement:!1,arity:"single",objectTypes:z}),$("tags",{kind:"list",placement:!1,arity:"multiple",objectTypes:ke}),$("color",{kind:"string",placement:!1,arity:"single",objectTypes:ke}),$("image",{kind:"string",placement:!1,arity:"single",objectTypes:qr}),$("hidden",{kind:"boolean",placement:!1,arity:"single",objectTypes:ke}),$("radius",{kind:"unit",placement:!1,arity:"single",objectTypes:z,unitFamily:"radius"}),$("mass",{kind:"unit",placement:!1,arity:"single",objectTypes:z,unitFamily:"mass"}),$("density",{kind:"unit",placement:!1,arity:"single",objectTypes:z,unitFamily:"generic"}),$("gravity",{kind:"unit",placement:!1,arity:"single",objectTypes:z,unitFamily:"generic"}),$("temperature",{kind:"unit",placement:!1,arity:"single",objectTypes:z,unitFamily:"generic"}),$("albedo",{kind:"number",placement:!1,arity:"single",objectTypes:z}),$("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:z}),$("source",{kind:"string",placement:!1,arity:"single",objectTypes:z}),$("cycle",{kind:"unit",placement:!1,arity:"single",objectTypes:z,unitFamily:"duration"}),$("trajectory",{kind:"string",placement:!1,arity:"single",objectTypes:["craft","structure"]})].map(e=>[e.key,e])),en=new Set(It.keys());function A(e){return It.get(e)}function $t(e){return en.has(e)}function jt(e,t){return e.objectTypes.includes(t)}function Se(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 tn(e){return pe(e).map(t=>t.value)}function pe(e,t={}){let n=[],r=t.columnOffset??0,i="",a=null,o=!1,s=!1,c=null,l=()=>{a!==null&&(n.push({value:i,column:a,quoted:o}),i="",a=null,o=!1)};for(let u=0;u<e.length;u++){let d=e[u],p=r+u+1;if(s&&d==="\\"){let m=e[u+1];if(m==='"'||m==="\\"){i+=m,u++;continue}}if(d==='"'){s?s=!1:(a===null&&(a=p),o=!0,c=p,s=!0);continue}if(!s&&/\s/.test(d)){l();continue}a===null&&(a=p),i+=d}if(s)throw new f("Unclosed quote in line",t.line,c??r+e.length);return l(),n}function Ue(e){return e.match(/^\s*/)?.[0].length??0}function ne(e){let t=e.split(/\r?\n/),n=[],r=null,i=null,a=!1,o=!1,s=null,c=null,l=null,u=null;for(let d=0;d<t.length;d++){let p=t[d],m=d+1;if(!p.trim())continue;let y=Ue(p),g=pe(p.slice(y),{line:m,columnOffset:y});if(g.length!==0){if(y===0){if(a=!1,o=!1,s=null,c=null,l=null,u=null,g.length>=1&&g[0].value==="theme"){o=!0,c=0,r={type:"theme",preset:g.length>=2?g[1].value:null,blocks:[],location:{line:m,column:g[0].column}};continue}let h=Gr(g,m);n.push(h),i=h;continue}if(o){if(g.length>=2&&g[0].value==="preset"&&(!l||y<=l)){r&&(r.preset=g[1].value);continue}u&&l!==null&&y>l?u.fields.push(Zr(g,m)):(l=y,u={type:"theme-block",target:g[0].value,fields:[],location:{line:m,column:g[0].column}},r?.blocks.push(u));continue}if(!i)throw new f("Indented line without parent object",m,y+1);if(g.length===1&&g[0].value==="info"){a=!0,s=y;continue}a&&y<=(s??0)&&(a=!1),a?i.infoEntries.push(Jr(g,m)):i.blockFields.push(Xr(g,m))}}return{type:"document",theme:r,objects:n}}function Gr(e,t){if(e.length<2)throw new f("Invalid object declaration",t,e[0]?.column??1);let[n,r,...i]=e;if(!Oe.has(n.value))throw new f(`Unknown object type "${n.value}"`,t,n.column);return{type:"object",objectType:n.value,name:r.value,inlineFields:Kr(i,t),blockFields:[],infoEntries:[],location:{line:t,column:n.column}}}function Kr(e,t){let n=[],r=0;for(;r<e.length;){let i=e[r],a=A(i.value);if(!a)throw new f(`Unknown field "${i.value}"`,t,i.column);r++;let o=[];if(a.arity==="multiple")for(;r<e.length&&!$t(e[r].value);)o.push(e[r]),r++;else{let s=e[r];s&&(o.push(s),r++)}if(o.length===0)throw new f(`Missing value for field "${i.value}"`,t,i.column);n.push({type:"field",key:i.value,values:o.map(s=>s.value),location:{line:t,column:i.column}})}return n}function Xr(e,t){if(e.length<2)throw new f("Invalid field line",t,e[0]?.column??1);if(!A(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 Zr(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 nn=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,Qr=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),ei=/^[A-Za-z][A-Za-z0-9+.-]*:/;function Z(e){let t=null,n=[],r=e.theme?ti(e.theme):null;for(let i of e.objects){let a=ri(i);if(i.objectType==="system"){if(t)throw f.fromLocation("Only one system object is allowed",i.location);t=a}else n.push(a)}return{format:"worldorbit",version:"1.0",schemaVersion:"1.0",theme:r,system:t,groups:[],relations:[],events:[],trajectories:[],objects:n}}function ti(e){let t={};for(let n of e.blocks){let r=rn(n.fields);t[n.target]=ni(r)}return{preset:e.preset,styles:t}}function ni(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 a=Number(i);if(!Number.isNaN(a)&&i.trim()!==""){t[n]=a;continue}}t[n]=r.values.join(" ")}return t}function ri(e){let t=[...e.inlineFields,...e.blockFields];ii(e.objectType,t);let n=rn(t),r=ai(e.objectType,n),i=oi(n),a=li(e.infoEntries);return e.objectType==="system"?{type:"system",id:e.name,title:typeof i.title=="string"?i.title:null,description:null,epoch:null,referencePlane:null,properties:i,info:a}:{type:e.objectType,id:e.name,properties:i,placement:r,info:a}}function ii(e,t){for(let n of t){let r=A(n.key);if(!r)throw f.fromLocation(`Unknown field "${n.key}"`,n.location);if(!jt(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 rn(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 ai(e,t){let n=t.has("orbit"),r=t.has("at"),i=t.has("surface"),a=t.has("free"),o=[n,r,i,a].filter(Boolean).length;if(o>1){let s=t.get("orbit")??t.get("at")??t.get("surface")??t.get("free");throw f.fromLocation("Object has multiple placement modes",s?.location)}if(e==="system"&&o>0)throw f.fromLocation("System objects cannot declare placement",[...t.values()][0]?.location);if(n)return{mode:"orbit",target:We(t,"orbit"),distance:be(t,"distance"),semiMajor:be(t,"semiMajor"),eccentricity:fi(t,"eccentricity"),period:be(t,"period"),angle:be(t,"angle"),inclination:be(t,"inclination"),phase:be(t,"phase")};if(r){let s=Ye(t,"at"),c=We(t,"at");return{mode:"at",target:c,reference:ui(c,s.location)}}if(i)return{mode:"surface",target:We(t,"surface")};if(a){let s=We(t,"free"),c=di(s);return{mode:"free",distance:c??void 0,descriptor:c?void 0:s}}return null}function oi(e){let t={};for(let[n,r]of e.entries()){let i=A(n);if(!(!i||i.placement))switch(i.kind){case"list":t[n]=r.values;break;case"boolean":t[n]=pi(r);break;case"number":t[n]=on(ve(r),n,r.location);break;case"unit":t[n]=an(ve(r),r.location,n);break;case"string":t[n]=si(n,r);break}}return t}function si(e,t){let n=t.values.join(" ").trim();return e==="image"&&ci(n,t.location),n}function ci(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(ei);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 li(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 ui(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 an(e,t,n){let r=e.match(nn);if(!r)throw f.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let a=A(n);if(a?.unitFamily&&!Se(a.unitFamily,i.unit))throw f.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function di(e){let t=e.match(nn);return t?{value:Number(t[1]),unit:t[2]??null}:null}function be(e,t){if(!e.has(t))return;let n=Ye(e,t);return an(ve(n),n.location,t)}function fi(e,t){if(!e.has(t))return;let n=Ye(e,t);return on(ve(n),t,n.location)}function on(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw f.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function pi(e){let t=ve(e).toLowerCase(),n=Qr.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 We(e,t){return ve(Ye(e,t))}function ve(e){if(e.values.length!==1)throw f.fromLocation(`Field "${e.key}" expects exactly one value`,e.location);return e.values[0]}var mi=new Set(["star","planet","moon","asteroid","comet"]);function J(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||!mi.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"&&hi(r,r.placement.reference,t),r.placement.reference.kind==="anchor"&&yi(r,r.placement.reference,t))}}function hi(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 yi(e,t,n){if(!n.has(t.objectId))throw new f(`Unknown anchor target "${t.objectId}" on "${e.id}"`)}function sn(e){return{...e}}function E(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)}}function qe(e){let t;try{t=ne(e)}catch(r){return{ok:!1,value:null,diagnostics:[E(r,"parse")]}}let n;try{n=Z(t)}catch(r){return{ok:!1,value:null,diagnostics:[E(r,"normalize")]}}try{J(n)}catch(r){return{ok:!1,value:null,diagnostics:[E(r,"validate")]}}return{ok:!0,value:{ast:t,document:n},diagnostics:[]}}function cn(e){try{return{ok:!0,value:Z(e),diagnostics:[]}}catch(t){return{ok:!1,value:null,diagnostics:[E(t,"normalize")]}}}function ln(e){try{return J(e),{ok:!0,value:e,diagnostics:[]}}catch(t){return{ok:!1,value:null,diagnostics:[E(t,"validate")]}}}var Me=1495978707e-1,gi=6371,bi=71492,vi=695700,wi=63241.077,Ii=206264.806,$i=206264806,gn=.68,ji=.2,bn=28;function H(e,t={}){let n=Oi(t),r=n.width,i=n.height,a=n.padding,o=ki(e),s=Mi(e,t.projection),c=Tt(t.camera??null),l=Mt(s,c),u=Ai(o),d=Di(o,t.scaleModel,t.bodyScaleMode),p=e.system?.id??null,m=t.activeEventId??null,y=xi(e.objects,e.events??[],m),g=Fi(y,r,i,a,u,d),h=new Map(y.map(I=>[I.id,I])),k=$a(y,h),x=new Map,w=[],O=[],G=[],F=[],ce=[],le=new Map,ge=new Map;for(let I of y){let N=I.placement;if(!N){G.push(I);continue}if(N.mode==="orbit"){mn(ge,N.target,I);continue}if(N.mode==="surface"){mn(le,N.target,I);continue}if(N.mode==="at"){ce.push(I);continue}F.push(I)}let xe=F.length>0?r*.42:r/2,ue=i/2,T={orbitChildren:ge,surfaceChildren:le,objectMap:h,spacingFactor:u,projection:l,scaleModel:d,sceneMetricScale:g},de=G.find(I=>I.type==="star")??G[0]??null;de&&Ot(de,xe,ue,0,x,w,O,T);let K=G.filter(I=>I.id!==de?.id);if(K.length>0){let I=Math.min(r,i)*.28*u*d.orbitDistanceMultiplier;K.forEach((N,P)=>{let vt=Ae(P,K.length,-Math.PI/2),fe=Fe(vt,I,l,1);Ot(N,xe+fe.x,ue+fe.y,0,x,w,O,T)})}F.forEach((I,N)=>{let P=r-a-140-Ma(I.placement?.mode==="free"?I.placement.distance:void 0,d,g),vt=Math.max(76,(i-a*2-180)/Math.max(1,F.length)*u)*d.freePlacementMultiplier,fe=a+92+N*vt;x.set(I.id,{object:I,x:P,y:fe,radius:Je(I,0,d,g),sortKey:et(P,fe,0)}),O.push({object:I,groupId:k.groupIds.get(I.id)??null,x1:P-60,y1:fe,x2:P-18,y2:fe,mode:"free"}),Xe(I,x,w,O,T,1)}),ce.forEach((I,N)=>{if(x.has(I.id)||!I.placement||I.placement.mode!=="at")return;let P=wa(I.placement.reference,x,h,N,ce.length,r,i,a,T);x.set(I.id,{object:I,x:P.x,y:P.y,radius:Je(I,2,d,g),sortKey:et(P.x,P.y,2),anchorX:P.anchorX,anchorY:P.anchorY}),P.anchorX!==void 0&&P.anchorY!==void 0&&O.push({object:I,groupId:k.groupIds.get(I.id)??null,x1:P.anchorX,y1:P.anchorY,x2:P.x,y2:P.y,mode:"at"}),Xe(I,x,w,O,T,2)});let L=[...x.values()].map(I=>Ei(I,d,k)),X=w.map(I=>Ri(I,k.groupIds.get(I.object.id)??null)),Ve=O.map(I=>_i(I)),Be=Ni(L,r,i,d.labelMultiplier),Zt=qi(e,L),bt=Hi(e.events??[],L,m),Jt=Gi(e,L,bt,t),Er=Ui(X,Jt,Zt,bt,Ve,L,Be),Rr=Wi(L,X,Ve,Be,k,d.labelMultiplier),_r=Yi(e,L),Nr=ea(e,s,n.preset,k,h),zr=da(r,i,L,X,Ve,Be,d.labelMultiplier);return{width:r,height:i,padding:a,renderPreset:n.preset,projection:s,renderProjection:l,camera:c,scaleModel:d,title:String(e.system?.title??e.system?.properties.title??e.system?.id??"WorldOrbit")||"WorldOrbit",subtitle:Pi(s,l,o,c),systemId:p,viewMode:s,layoutPreset:o,metadata:{format:e.format,version:e.version,view:s,renderProjection:l,scale:String(e.system?.properties.scale??o),units:String(e.system?.properties.units??"mixed"),preset:n.preset??"custom","body.scaleMode":d.bodyScaleMode,...c?.azimuth!==null?{"camera.azimuth":String(c?.azimuth)}:{},...c?.elevation!==null?{"camera.elevation":String(c?.elevation)}:{},...c?.roll!==null?{"camera.roll":String(c?.roll)}:{},...c?.distance!==null?{"camera.distance":String(c?.distance)}:{}},contentBounds:zr,layers:Er,groups:Rr,semanticGroups:_r,viewpoints:Nr,events:bt,activeEventId:m,trajectories:Jt,objects:L,orbitVisuals:X,relations:Zt,leaders:Ve,labels:Be}}function vn(e,t,n){let r=tt(n),i=Math.cos(r),a=Math.sin(r),o=e.x-t.x,s=e.y-t.y;return{x:t.x+o*i-s*a,y:t.y+o*a+s*i}}function xi(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 a=new Map(r.map(s=>[s.id,s])),o=new Set([...i.targetObjectId?[i.targetObjectId]:[],...i.participantObjectIds,...i.positions.map(s=>s.objectId)]);for(let s of o){let c=a.get(s);c&&(i.epoch&&(c.epoch=i.epoch),i.referencePlane&&(c.referencePlane=i.referencePlane))}for(let s of i.positions){let c=a.get(s.objectId);c&&(s.placement&&(c.placement=structuredClone(s.placement)),s.inner&&(c.properties.inner={...s.inner}),s.outer&&(c.properties.outer={...s.outer}),s.epoch&&(c.epoch=s.epoch),s.referencePlane&&(c.referencePlane=s.referencePlane))}return r}function ki(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=Si(e.preset);return{width:e.width??t.width,height:e.height??t.height,padding:e.padding??t.padding,preset:e.preset??null}}function Si(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 Mi(e,t){if(t==="topdown"||t==="isometric"||t==="orthographic"||t==="perspective")return t;let n=String(e.system?.properties.view??"topdown").toLowerCase();return jn(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 Tt(e){if(!e)return null;let t={azimuth:xt(e.azimuth),elevation:xt(e.elevation),roll:xt(e.roll),distance:Ti(e.distance)};return t.azimuth!==null||t.elevation!==null||t.roll!==null||t.distance!==null?t:null}function xt(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function Ti(e){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:null}function Pi(e,t,n,r){let i=[`${hn(e)} view`,`${hn(n)} layout`];if(e!==t&&i.push(`2D ${t} fallback`),r){let a=[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);a.length>0&&i.push(`camera ${a.join(" / ")}`)}return i.join(" - ")}function Di(e,t,n){return{...Li(e),...n?{bodyScaleMode:n}:{},...t}}function Li(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 Ai(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function Fi(e,t,n,r,i,a){let o=[],s=[];for(let m of e){let y=Pa(m);y!==null&&y>0&&s.push(y);let g=m.placement;if(g){if(g.mode==="orbit"){let h=ie(g.semiMajor??g.distance??null);h!==null&&h>0&&o.push(h);continue}if(g.mode==="free"){let h=ie(g.distance??null);h!==null&&h>0&&o.push(h)}}}let c=Math.max(...o,0),l=Math.max(...s,0),u=Math.max(c,l*6,0),d=u+Math.max(Math.sqrt(u),l*2,c>0?.25:0);return d<=0?{pixelsPerMetric:null,hasExplicitScale:!1}:{pixelsPerMetric:Math.max(Math.min(t,n)/2-r-24,120)*i*a.orbitDistanceMultiplier/d,hasExplicitScale:!0}}function Ei(e,t,n){let{object:r,x:i,y:a,radius:o,sortKey:s,anchorX:c,anchorY:l}=e,u=r.renderHints?.renderPriority??0;return{renderId:q(r.id),objectId:r.id,object:r,parentId:n.parentIds.get(r.id)??null,ancestorIds:n.ancestorIds.get(r.id)??[],childIds:n.childIds.get(r.id)??[],groupId:n.groupIds.get(r.id)??null,semanticGroupIds:[...r.groups??[]],x:i,y:a,radius:o,visualRadius:Sa(r,o,t),sortKey:s+u*.001,anchorX:c,anchorY:l,label:r.id,secondaryLabel:r.type==="structure"||r.type==="craft"?String(r.properties.kind??r.type):r.type,fillColor:Da(r.properties.color),imageHref:typeof r.properties.image=="string"&&r.properties.image.trim()?r.properties.image:void 0,hidden:r.properties.hidden===!0}}function Ri(e,t){return{renderId:`${q(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 _i(e){return{renderId:`${q(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 Ni(e,t,n,r){let i=[],a=[],o=new Map(e.map(c=>[c.objectId,c])),s=[...e].filter(c=>!c.hidden&&c.object.renderHints?.renderLabel!==!1).sort(zi);for(let c of s){let l=Ci(c,o,a,t,n,r)??In(c,wn(c,o.get(c.parentId??"")??null,n),0,r);a.push(Tn(c,l,r)),i.push({renderId:`${c.renderId}-label`,objectId:c.objectId,object:c.object,groupId:c.groupId,semanticGroupIds:[...c.semanticGroupIds],label:c.label,secondaryLabel:c.secondaryLabel,x:l.x,y:l.labelY,secondaryY:l.secondaryY,textAnchor:l.textAnchor,direction:l.direction,hidden:c.hidden})}return i}function zi(e,t){let n=un(e)-un(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 un(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 Ci(e,t,n,r,i,a){for(let o of Vi(e,t,r,i)){let s=o==="left"||o==="right"?4:6;for(let c=0;c<=s;c+=1){let l=In(e,o,c,a),u=Tn(e,l,a);if(!n.some(d=>ka(d,u)))return l}}return null}function Vi(e,t,n,r){let i=e.parentId?t.get(e.parentId)??null:null,a=wn(e,i,r),o=a==="below"?"above":"below",s=Bi(e,i,n),c=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,a,c,o]:[a,s,o,c]}function wn(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 Bi(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 In(e,t,n,r){let i=14*r;switch(t){case"above":{let a=e.y-(e.radius+18*r+n*i);return{x:e.x,labelY:a,secondaryY:a-16*r,textAnchor:"middle",direction:t}}case"below":{let a=e.y+e.radius+18*r+n*i;return{x:e.x,labelY:a,secondaryY:a+16*r,textAnchor:"middle",direction:t}}case"left":{let a=e.x-(e.visualRadius+16*r+n*i),o=e.y-4*r;return{x:a,labelY:o,secondaryY:o+16*r,textAnchor:"end",direction:t}}case"right":{let a=e.x+e.visualRadius+16*r+n*i,o=e.y-4*r;return{x:a,labelY:o,secondaryY:o+16*r,textAnchor:"start",direction:t}}}}function Ui(e,t,n,r,i,a,o){let s=e.filter(l=>!l.hidden&&!!l.backArcPath).map(l=>l.renderId),c=e.filter(l=>!l.hidden).map(l=>l.renderId);return[{id:"background",renderIds:["wo-bg","wo-bg-glow","wo-grid"]},{id:"guides",renderIds:i.filter(l=>!l.hidden).map(l=>l.renderId)},{id:"orbits-back",renderIds:s},{id:"orbits-front",renderIds:c},{id:"trajectories",renderIds:t.filter(l=>!l.hidden).flatMap(l=>[l.renderId,...l.waypoints.filter(u=>!u.hidden).map(u=>u.renderId)])},{id:"relations",renderIds:n.filter(l=>!l.hidden).map(l=>l.renderId)},{id:"events",renderIds:r.filter(l=>!l.hidden).map(l=>l.renderId)},{id:"objects",renderIds:a.filter(l=>!l.hidden).map(l=>l.renderId)},{id:"labels",renderIds:o.filter(l=>!l.hidden).map(l=>l.renderId)},{id:"metadata",renderIds:["wo-title","wo-subtitle","wo-meta"]}]}function Wi(e,t,n,r,i,a){let o=new Map,s=c=>{if(!c)return null;let l=o.get(c);if(l)return l;let u=i.groupRoots.get(c)??null,d={renderId:c,rootObjectId:u,label:u??c,objectIds:[],orbitIds:[],labelIds:[],leaderIds:[],contentBounds:Le(0,0,0,0)};return o.set(c,d),d};for(let c of e){let l=s(c.groupId);l&&!c.hidden&&l.objectIds.push(c.objectId)}for(let c of t){let l=s(c.groupId);l&&!c.hidden&&l.orbitIds.push(c.objectId)}for(let c of n){let l=s(c.groupId);l&&!c.hidden&&l.leaderIds.push(c.objectId)}for(let c of r){let l=s(c.groupId);l&&!c.hidden&&l.labelIds.push(c.objectId)}for(let c of o.values())c.contentBounds=ja(c,e,t,n,r,a);return[...o.values()].sort((c,l)=>c.label.localeCompare(l.label))}function Yi(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 qi(e,t){let n=new Map(t.map(r=>[r.objectId,r]));return e.relations.map(r=>{let i=n.get(r.from),a=n.get(r.to);return{renderId:`${q(r.id)}-relation`,relationId:r.id,relation:r,fromObjectId:r.from,toObjectId:r.to,x1:i?.x??0,y1:i?.y??0,x2:a?.x??0,y2:a?.y??0,hidden:r.hidden||!i||!a||i.hidden||a.hidden}}).sort((r,i)=>r.relation.id.localeCompare(i.relation.id))}function Hi(e,t,n){let r=new Map(t.map(i=>[i.objectId,i]));return e.map(i=>{let a=[...new Set([...i.targetObjectId?[i.targetObjectId]:[],...i.participantObjectIds])],o=a.map(l=>r.get(l)).filter(Boolean),s=o.length>0?o.reduce((l,u)=>l+u.x,0)/o.length:0,c=o.length>0?o.reduce((l,u)=>l+u.y,0)/o.length:0;return{renderId:`${q(i.id)}-event`,eventId:i.id,event:i,objectIds:a,participantIds:[...i.participantObjectIds],targetObjectId:i.targetObjectId,x:s,y:c,hidden:i.hidden||o.length===0||o.every(l=>l.hidden)||n!==null&&i.id!==n}}).sort((i,a)=>i.event.id.localeCompare(a.event.id))}function Gi(e,t,n,r){let i=new Map(t.map(a=>[a.objectId,a]));return e.trajectories.map(a=>Ki(a,i,n,r)).sort((a,o)=>a.trajectoryId.localeCompare(o.trajectoryId))}function Ki(e,t,n,r){let i=e.craftObjectId?t.get(e.craftObjectId)??null:null,a=Zi(e,r),o=e.stroke??e.color??i?.fillColor??null,s=e.strokeWidth??2.4,c=r.showTrajectoryWaypoints??e.showWaypoints??!0,l=e.labelMode??(r.showTrajectoryLabels===!1?"hidden":"waypoint"),u=[],d=[],p=new Set,m=i;i&&p.add(i.objectId),e.segments.forEach((y,g)=>{let h=Xi(e,y,g,a,t,m,c);h.path&&u.push(h.path),h.objectIds.forEach(k=>p.add(k)),d.push(...h.waypoints),m=h.lastAnchor??m});for(let y of n.filter(g=>g.event.trajectoryId===e.id)){let g=y.targetObjectId?t.get(y.targetObjectId)??null:y.objectIds.map(h=>t.get(h)??null).find(Boolean)??null;g&&(d.push({renderId:`${q(`${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||!c}),p.add(g.objectId))}return{renderId:`${q(e.id)}-trajectory`,trajectoryId:e.id,trajectory:e,craftObjectId:e.craftObjectId,mode:a,path:u.join(" "),stroke:o,strokeWidth:s,marker:e.marker??"arrow",labelMode:l,showWaypoints:c,objectIds:[...p],waypoints:d,hidden:e.hidden||u.length===0}}function Xi(e,t,n,r,i,a,o){let s=He(t.fromObjectId,i)??a,c=He(t.assist?.objectId??t.aroundObjectId??null,i),l=He(t.toObjectId,i)??He(t.aroundObjectId,i)??c??s;if(!s||!l)return{path:"",objectIds:[],waypoints:[],lastAnchor:a};let u=[s.objectId,l.objectId];c&&u.push(c.objectId);let d=e.hidden||t.renderHidden===!0||s.hidden||l.hidden,p=[],m=t.waypointLabel??t.label??xn(t.id),y=t.waypointDate??t.epoch??null;o&&(n===0&&p.push(kt(e.id,t.id,null,s,s.label,null,d)),c&&c.objectId!==s.objectId&&c.objectId!==l.objectId&&p.push(kt(e.id,t.id,null,c,m,y,d)),p.push(kt(e.id,t.id,null,l,m,y,d)));let g=r==="solver"?Ji(s,dn(s,l,c,n),l,Math.max(10,Math.round((t.sampleDensity??1)*14))):null,h=dn(s,l,c,n),k=r==="solver"?Qi(g??[s,l]):`M ${re(s.x)} ${re(s.y)} Q ${re(h.x)} ${re(h.y)} ${re(l.x)} ${re(l.y)}`;return t.maneuvers.forEach((x,w)=>{if(!o)return;let O=$n(s,h,l,(w+1)/(t.maneuvers.length+1));p.push({renderId:`${q(`${e.id}-${t.id}-${x.id}`)}-waypoint`,trajectoryId:e.id,segmentId:t.id,maneuverId:x.id,objectId:null,x:O.x,y:O.y,label:x.label??x.kind,dateLabel:x.epoch??null,hidden:d})}),{path:k,objectIds:[...new Set(u)],waypoints:p,lastAnchor:l}}function kt(e,t,n,r,i,a,o){return{renderId:`${q(`${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:a,hidden:o}}function Zi(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 He(e,t){return e?t.get(e)??null:null}function dn(e,t,n,r){if(n)return{x:n.x,y:n.y};let i=t.x-e.x,a=t.y-e.y,o=Math.max(Math.hypot(i,a),1),s=Math.min(Math.max(o*.18,26),120)*(r%2===0?1:-1),c=-a/o,l=i/o;return{x:(e.x+t.x)/2+c*s,y:(e.y+t.y)/2+l*s}}function Ji(e,t,n,r){let i=[];for(let a=0;a<=r;a+=1)i.push($n(e,t,n,a/r));return i}function $n(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 Qi(e){return e.length===0?"":e.map((t,n)=>`${n===0?"M":"L"} ${re(t.x)} ${re(t.y)}`).join(" ")}function re(e){return Number.isFinite(e)?e.toFixed(2):"0"}function ea(e,t,n,r,i){let a=ta(e,t,n),o=new Map;for(let[l,u]of Object.entries(e.system?.info??{})){if(!l.startsWith("viewpoint."))continue;let[d,p,...m]=l.split(".");if(d!=="viewpoint"||!p||m.length===0)continue;let y=la(p);if(!y)continue;let g=m.join(".").toLowerCase(),h=o.get(y)??{id:y};na(h,g,u,e,t,n,r,i),o.set(y,h)}let s=[...o.values()].map(l=>ra(l,t,n,i)).filter(Boolean),c=s.findIndex(l=>l.id===a.id);return c>=0?s.splice(c,1,{...a,...s[c],layers:{...a.layers,...s[c].layers},filter:s[c].filter??a.filter,generated:!1}):s.unshift(a),s.sort((l,u)=>l.id==="overview"?-1:u.id==="overview"?1:l.label.localeCompare(u.label))}function ta(e,t,n){let r=e.system?.title??e.system?.properties.title,i=r?`${String(r)} Overview`:"Overview",a=Tt(null),o=Mt(t,a);return{id:"overview",label:i,summary:"Fit the whole system with the current atlas defaults.",objectId:null,selectedObjectId:null,eventIds:[],projection:t,renderProjection:o,camera:a,preset:n,rotationDeg:0,scale:null,layers:{},filter:null,generated:!0}}function na(e,t,n,r,i,a,o,s){let c=n.trim();switch(t){case"label":case"title":c&&(e.label=c);return;case"summary":case"description":c&&(e.summary=c);return;case"focus":case"object":c&&(e.focus=c);return;case"select":case"selection":c&&(e.select=c);return;case"events":e.eventIds=De(c);return;case"projection":case"view":e.projection=jn(c)??i;return;case"preset":e.preset=aa(c)??a;return;case"rotation":case"angle":e.rotationDeg=Te(c)??e.rotationDeg??0;return;case"camera.azimuth":e.camera={...e.camera??Ke(),azimuth:Te(c)};return;case"camera.elevation":e.camera={...e.camera??Ke(),elevation:Te(c)};return;case"camera.roll":e.camera={...e.camera??Ke(),roll:Te(c)};return;case"camera.distance":e.camera={...e.camera??Ke(),distance:fn(c)};return;case"zoom":case"scale":e.scale=fn(c);return;case"layers":e.layers=oa(c);return;case"query":e.filter={...e.filter??Ge(),query:c||null};return;case"types":case"objecttypes":e.filter={...e.filter??Ge(),objectTypes:sa(c)};return;case"tags":e.filter={...e.filter??Ge(),tags:De(c)};return;case"groups":e.filter={...e.filter??Ge(),groupIds:ca(c,r,o,s)};return}}function ra(e,t,n,r){let i=e.focus&&r.has(e.focus)?e.focus:null,a=e.select&&r.has(e.select)?e.select:i,o=ia(e.filter),s=e.label?.trim()||xn(e.id),c=e.projection??t,l=Tt(e.camera??null),u=Mt(c,l);return{id:e.id,label:s,summary:e.summary?.trim()||ua(s,i,o),objectId:i,selectedObjectId:a,eventIds:[...new Set(e.eventIds??[])],projection:c,renderProjection:u,camera:l,preset:e.preset??n,rotationDeg:e.rotationDeg??0,scale:e.scale??null,layers:e.layers??{},filter:o,generated:!1}}function Ge(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Ke(){return{azimuth:null,elevation:null,roll:null,distance:null}}function ia(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 jn(e){switch(e.toLowerCase()){case"topdown":return"topdown";case"isometric":return"isometric";case"orthographic":return"orthographic";case"perspective":return"perspective";default:return null}}function aa(e){let t=e.toLowerCase();return t==="diagram"||t==="presentation"||t==="atlas-card"||t==="markdown"?t:null}function Te(e){let t=Number(e);return Number.isFinite(t)?t:null}function fn(e){let t=Te(e);return t!==null&&t>0?t:null}function oa(e){let t={};for(let n of De(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 sa(e){return De(e).filter(t=>t==="star"||t==="planet"||t==="moon"||t==="belt"||t==="asteroid"||t==="comet"||t==="ring"||t==="craft"||t==="structure"||t==="phenomenon")}function ca(e,t,n,r){return De(e).map(i=>t.schemaVersion==="2.1"||t.schemaVersion==="2.5"||t.schemaVersion==="2.6"||t.groups.some(a=>a.id===i)||i.startsWith("wo-")&&i.endsWith("-group")?i:n.groupIds.has(i)?n.groupIds.get(i)??Pe(i):(r.has(i),Pe(i)))}function De(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function la(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function xn(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function ua(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 da(e,t,n,r,i,a,o){let s=Number.POSITIVE_INFINITY,c=Number.POSITIVE_INFINITY,l=Number.NEGATIVE_INFINITY,u=Number.NEGATIVE_INFINITY,d=(p,m)=>{s=Math.min(s,p),c=Math.min(c,m),l=Math.max(l,p),u=Math.max(u,m)};for(let p of r)p.hidden||kn(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||On(p,d);for(let p of a)p.hidden||Sn(p,d,o);return!Number.isFinite(s)||!Number.isFinite(c)?Le(0,0,e,t):Le(s,c,l,u)}function kn(e,t){let n=e.bandThickness!==void 0?e.bandThickness/2+4:e.band?10:3;if(e.kind==="circle"&&e.radius!==void 0){t(e.cx-e.radius-n,e.cy-e.radius-n),t(e.cx+e.radius+n,e.cy+e.radius+n);return}let r=e.rx??e.radius??0,i=e.ry??e.radius??0,a=Dn(e.cx,e.cy,r,i,e.rotationDeg,0,Math.PI*2,bn*2);for(let o of a)t(o.x-n,o.y-n),t(o.x+n,o.y+n)}function Le(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 On(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 Sn(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 Ot(e,t,n,r,i,a,o,s){i.has(e.id)||(i.set(e.id,{object:e,x:t,y:n,radius:Je(e,r,s.scaleModel,s.sceneMetricScale),sortKey:et(t,n,r)}),Xe(e,i,a,o,s,r+1))}function Xe(e,t,n,r,i,a){let o=t.get(e.id);if(!o)return;let s=[...i.orbitChildren.get(e.id)??[]].sort(fa),c=pa(s,o.radius,i.spacingFactor,i.scaleModel,i.sceneMetricScale),l=ya(s,c);s.forEach((d,p)=>{let m=ma(d,p,s.length,o,c,l[p]??c.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}),Ot(d,m.objectX,m.objectY,a,t,n,r,i)});let u=[...i.surfaceChildren.get(e.id)??[]];u.forEach((d,p)=>{let m=Ae(p,u.length,-Math.PI/3),y=28*i.spacingFactor,g=Fe(m,o.radius,i.projection,i.projection==="isometric"?.9:1),h=Fe(m,o.radius+y,i.projection,i.projection==="isometric"?.9:1),k=o.x+g.x,x=o.y+g.y,w=o.x+h.x,O=o.y+h.y;t.set(d.id,{object:d,x:w,y:O,radius:Je(d,a+1,i.scaleModel,i.sceneMetricScale),sortKey:et(w,O,a+1),anchorX:k,anchorY:x}),r.push({object:d,groupId:i.objectMap.has(d.id)?Pe(xa(d,i.objectMap)):null,x1:k,y1:x,x2:w,y2:O,mode:"surface"}),Xe(d,t,n,r,i,a+1)})}function fa(e,t){let n=Ze(e),r=Ze(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 pa(e,t,n,r,i){let a=e.map(m=>Ze(m)),o=a.filter(m=>m!==null),s=r.bodyScaleMode==="strict"?Math.max(2,8*n*r.orbitDistanceMultiplier):(e.length>2?54:64)*n*r.orbitDistanceMultiplier*.42,c=t+Math.max(s*1.2,24*n),l=(e.length>2?54:64)*n*r.orbitDistanceMultiplier;if(o.length===0)return{metrics:a,minMetric:0,maxMetric:0,metricSpread:0,innerPx:c,stepPx:l,pixelSpread:Math.max(l*Math.max(e.length-1,1),l),minimumGapPx:s,pixelsPerMetric:i.pixelsPerMetric};let u=Math.min(...o),d=Math.max(...o),p=d-u;return{metrics:a,minMetric:u,maxMetric:d,metricSpread:p,innerPx:c,stepPx:l,pixelSpread:Math.max(l*Math.max(e.length-1,1),l),minimumGapPx:s,pixelsPerMetric:i.pixelsPerMetric}}function ma(e,t,n,r,i,a,o){let s=e.placement,c=e.type==="belt"||e.type==="ring";if(!s||s.mode!=="orbit"){let le=i.innerPx+t*i.stepPx;return{kind:"circle",cx:r.x,cy:r.y,radius:le,rotationDeg:0,band:c,bandThickness:c?12*o.scaleModel.ringThicknessMultiplier:void 0,objectX:r.x,objectY:r.y-le}}let l=M(typeof s.eccentricity=="number"?s.eccentricity:0,0,.92),u=a,d=Math.max(u*Math.sqrt(1-l*l),u*.18),p=St(s.inclination)??0,m=o.projection==="isometric"?Math.max(ji,Math.cos(tt(p)))*gn:1,y=Math.max(d*m,u*.14),g=St(s.angle)??0,h=u*l,k=An(-h,0,g),x=r.x+k.x,w=r.y+k.y,O=ba(s.phase,t,n),G=Ln(x,w,u,y,g,O),F=o.projection==="topdown"&&l<=1e-4&&Math.abs(g)<=1e-4,ce=c?va(e,u,i,o.scaleModel):void 0;return{kind:F?"circle":"ellipse",cx:F?r.x:x,cy:F?r.y:w,radius:F?u:void 0,rx:F?void 0:u,ry:F?void 0:y,rotationDeg:g,band:c,bandThickness:ce,frontArcPath:o.projection==="isometric"||c?pn(x,w,u,y,g,0,Math.PI):void 0,backArcPath:o.projection==="isometric"||c?pn(x,w,u,y,g,Math.PI,Math.PI*2):void 0,objectX:G.x,objectY:G.y}}function ha(e,t){return t.pixelsPerMetric!==null?e*t.pixelsPerMetric:t.innerPx+t.stepPx*ga(Math.max(e,0)+1)}function ya(e,t){let n=[];return e.forEach((r,i)=>{let a=Ze(r),o=t.innerPx+i*t.stepPx,s=a===null?o:ha(a,t),c=i===0?t.innerPx:(n[i-1]??t.innerPx)+t.minimumGapPx;n.push(Math.max(s,c))}),n}function Ze(e){return!e.placement||e.placement.mode!=="orbit"?null:ie(e.placement.semiMajor??e.placement.distance??null)}function ga(e){return Math.log(e)/Math.log(2)}function ba(e,t,n){let r=e?St(e):null;return r!==null?tt(r-90):Ae(t,n,-Math.PI/2)}function va(e,t,n,r){let i=ie(Qe(e.properties.inner)),a=ie(Qe(e.properties.outer));if(i!==null&&a!==null){let s=Math.abs(a-i);if(n.pixelsPerMetric!==null){let l=s*n.pixelsPerMetric;return r.bodyScaleMode==="strict"?Math.max(l*r.ringThicknessMultiplier,1):M(Math.max(l*r.ringThicknessMultiplier,8),8,54)}if(n.metricSpread>0)return M(s/n.metricSpread*n.pixelSpread*r.ringThicknessMultiplier,8,54);let c=Math.max(Math.max(i,a),1e-4);return M(s/c*t*.75*r.ringThicknessMultiplier,8,48)}return(e.type==="belt"?18:12)*r.ringThicknessMultiplier}function wa(e,t,n,r,i,a,o,s,c){if(e.kind==="lagrange")return Ia(e,t,n,a,o);if(e.kind==="anchor"){let l=t.get(e.objectId);if(l){let u=Ae(r,i,Math.PI/5),d=(l.radius+36)*c.scaleModel.labelMultiplier,p=Fe(u,d,c.projection,c.projection==="isometric"?.92:1);return{x:l.x+p.x,y:l.y+p.y,anchorX:l.x,anchorY:l.y}}}if(e.kind==="named"){let l=t.get(e.name);if(l){let u=Ae(r,i,Math.PI/6),d=(l.radius+36)*c.scaleModel.labelMultiplier,p=Fe(u,d,c.projection,c.projection==="isometric"?.92:1);return{x:l.x+p.x,y:l.y+p.y,anchorX:l.x,anchorY:l.y}}}return{x:a-s-170,y:o-s-86-r*58*c.scaleModel.freePlacementMultiplier}}function Ia(e,t,n,r,i){let a=e.secondary?t.get(e.primary):Oa(e.primary,t,n),o=t.get(e.secondary??e.primary);if(!a||!o)return{x:r*.7,y:i*.25};let s=o.x-a.x,c=o.y-a.y,l=Math.hypot(s,c)||1,u=s/l,d=c/l,p=-d,m=u,y=M(l*.25,24,68);switch(e.point){case"L1":return{x:o.x-u*y,y:o.y-d*y,anchorX:o.x,anchorY:o.y};case"L2":return{x:o.x+u*y,y:o.y+d*y,anchorX:o.x,anchorY:o.y};case"L3":return{x:a.x-u*y,y:a.y-d*y,anchorX:a.x,anchorY:a.y};case"L4":return{x:o.x+(u*.5-p*.8660254)*y,y:o.y+(d*.5-m*.8660254)*y,anchorX:o.x,anchorY:o.y};case"L5":return{x:o.x+(u*.5+p*.8660254)*y,y:o.y+(d*.5+m*.8660254)*y,anchorX:o.x,anchorY:o.y}}}function $a(e,t){let n=new Map,r=new Map;for(let l of e){let u=Mn(l,t);if(n.set(l.id,u),u){let d=r.get(u);d?d.push(l.id):r.set(u,[l.id])}r.has(l.id)||r.set(l.id,[])}let i=new Map,a=new Map,o=new Map,s=l=>{let u=i.get(l);if(u)return u;let d=new Set,p=[],m=n.get(l)??null;for(;m&&!d.has(m);)p.push(m),d.add(m),m=n.get(m)??null;return i.set(l,p),p},c=l=>{let u=o.get(a.get(l)??"");if(u)return u;let d=n.get(l)??null,p=t.get(l),m=l;return p?.placement&&p.placement.mode!=="free"&&d&&(m=c(d)),m};for(let l of e){s(l.id);let u=c(l.id),d=Pe(u);a.set(l.id,d),o.set(d,u)}return{parentIds:n,childIds:r,ancestorIds:i,groupIds:a,groupRoots:o}}function Mn(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 ja(e,t,n,r,i,a){let o=Number.POSITIVE_INFINITY,s=Number.POSITIVE_INFINITY,c=Number.NEGATIVE_INFINITY,l=Number.NEGATIVE_INFINITY,u=(d,p)=>{o=Math.min(o,d),s=Math.min(s,p),c=Math.max(c,d),l=Math.max(l,p)};for(let d of t)!d.hidden&&e.objectIds.includes(d.objectId)&&On(d,u);for(let d of n)!d.hidden&&e.orbitIds.includes(d.objectId)&&kn(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)&&Sn(d,u,a);return!Number.isFinite(o)||!Number.isFinite(s)?Le(0,0,0,0):Le(o,s,c,l)}function xa(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=Mn(n,t);if(!i)break;let a=t.get(i);if(!a)break;n=a}return n.id}function Tn(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,a,o,s){let c=La(a,o,s),l=c*2,u=i==="above"?18:12,d=i==="above"?8:12,p=e-c,m=e+c;return r==="start"?(p=e,m=e+l):r==="end"&&(p=e-l,m=e),{left:p,right:m,top:Math.min(t,n)-u,bottom:Math.max(t,n)+d}}function ka(e,t){return!(e.right<t.left||t.right<e.left||e.bottom<t.top||t.bottom<e.top)}function Oa(e,t,n){let r=n.get(e);return!r?.placement||r.placement.mode!=="orbit"?t.get(e):t.get(r.placement.target)}function Je(e,t,n,r){let i=Ta(e.properties.radius,n,r);if(i!==null)return i;let a=n.bodyRadiusMultiplier;switch(e.type){case"star":return M((t===0?28:20)*a,n.minBodyRadius,n.maxBodyRadius);case"planet":return M(12*a,n.minBodyRadius,n.maxBodyRadius);case"moon":return M(7*a,n.minBodyRadius,n.maxBodyRadius);case"belt":return M(5*a,n.minBodyRadius,n.maxBodyRadius);case"asteroid":return M(5*a,n.minBodyRadius,n.maxBodyRadius);case"comet":return M(6*a,n.minBodyRadius,n.maxBodyRadius);case"ring":return M(5*a,n.minBodyRadius,n.maxBodyRadius);case"craft":return M(5*a,n.minBodyRadius,n.maxBodyRadius);case"structure":return M(6*a,n.minBodyRadius,n.maxBodyRadius);case"phenomenon":return M(8*a,n.minBodyRadius,n.maxBodyRadius)}}function Sa(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 ie(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/Me;case"m":return e.value/1e3/Me;case"ly":return e.value*wi;case"pc":return e.value*Ii;case"kpc":return e.value*$i;case"re":return e.value*gi/Me;case"rj":return e.value*bi/Me;case"sol":return e.value*vi/Me;default:return e.value}}function Ma(e,t,n){let r=ie(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 Ta(e,t,n){let r=Qe(e);if(!r)return null;let i=ie(r);if(n.pixelsPerMetric!==null&&i!==null&&i>0){let o=i*n.pixelsPerMetric*t.bodyRadiusMultiplier;return t.bodyScaleMode==="strict"?Math.max(o,.1):M(Math.max(o,t.minBodyRadius),t.minBodyRadius,t.maxBodyRadius)}let a;switch(r.unit){case"sol":a=M(r.value*22,14,40);break;case"re":a=M(r.value*10,6,18);break;case"km":a=M(Math.log10(Math.max(r.value,1))*2.6,4,16);break;default:a=M(r.value*4,4,20);break}return M(a*t.bodyRadiusMultiplier,t.minBodyRadius,t.maxBodyRadius)}function Pa(e){return ie(Qe(e.properties.radius))}function Qe(e){return!e||typeof e!="object"||!("value"in e)?null:e}function St(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function Ae(e,t,n){return t<=1?n:n+e*Math.PI*2/t}function pn(e,t,n,r,i,a,o){let s=Dn(e,t,n,r,i,a,o,bn);return s.length===0?"":s.map((c,l)=>`${l===0?"M":"L"} ${yn(c.x)} ${yn(c.y)}`).join(" ")}function Dn(e,t,n,r,i,a,o,s){let c=[];for(let l=0;l<=s;l+=1){let u=a+(o-a)*l/s;c.push(Ln(e,t,n,r,i,u))}return c}function Ln(e,t,n,r,i,a){let o=n*Math.cos(a),s=r*Math.sin(a),c=An(o,s,i);return{x:e+c.x,y:t+c.y}}function An(e,t,n){let r=tt(n);return{x:e*Math.cos(r)-t*Math.sin(r),y:e*Math.sin(r)+t*Math.cos(r)}}function Fe(e,t,n,r){let i=n==="isometric"?gn*r:r;return{x:Math.cos(e)*t,y:Math.sin(e)*t*i}}function et(e,t,n){return t*1e3+e+n*.01}function M(e,t,n){return Math.min(Math.max(e,t),n)}function mn(e,t,n){let r=e.get(t);r?r.push(n):e.set(t,[n])}function q(e){return`wo-${e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"object"}`}function Pe(e){return`${q(e)}-group`}function Da(e){return typeof e=="string"&&e.trim()?e:void 0}function La(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 hn(e){return e.length>0?e[0].toUpperCase()+e.slice(1):e}function tt(e){return e*Math.PI/180}function yn(e){return Number.isInteger(e)?String(e):e.toFixed(2)}var Rn=86400,nt=Rn*365.25,rt=18,Fn=180;function _n(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=H(e,n),i=_a(r.layoutPreset,t.spatialScaleModel),a={x:r.contentBounds.centerX,y:r.contentBounds.centerY},o=new Map(r.objects.map(h=>[h.objectId,h])),s=new Map(r.orbitVisuals.map(h=>[h.objectId,h])),c=new Map;for(let h of r.objects){let k=h.object.placement;!k||k.mode!=="orbit"||c.set(h.objectId,Dt(k))}let l=Math.min(...[...c.values()].filter(h=>Number.isFinite(h)&&h>0))||1,u=new Map,d=r.objects.map(h=>Aa(h,r,a,o,s,i,u,l)),p=new Map(d.map(h=>[h.objectId,h])),m=r.orbitVisuals.map(h=>Fa(h,p,l,r.activeEventId!==null)),y=r.trajectories.map(h=>Ea(h,p)),g=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:za(d),semanticGroups:r.semanticGroups,viewpoints:r.viewpoints,activeEventId:r.activeEventId,timeFrozen:r.activeEventId!==null,objects:d,orbits:m,trajectories:y,focusTargets:g}}function Aa(e,t,n,r,i,a,o,s){let c=it(e,t,n,r,i,o),l=Lt(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:c,radius:we(e.radius*a.bodyRadiusMultiplier,a.minBodyRadius,a.maxBodyRadius),visualRadius:we(e.visualRadius*a.bodyRadiusMultiplier,a.minBodyRadius,a.maxBodyRadius+24),label:e.label,secondaryLabel:e.secondaryLabel,fillColor:e.fillColor,imageHref:e.imageHref,hidden:e.hidden,motion:l}}function Fa(e,t,n,r){let i=t.get(e.objectId),a=t.get(e.parentId);return{objectId:e.objectId,object:e.object,parentId:e.parentId,groupId:e.groupId,semanticGroupIds:e.semanticGroupIds.slice(),center:a?.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??at(e.object.placement?.mode==="orbit"?e.object.placement.inclination:void 0)??0,band:e.band,bandThickness:e.bandThickness,hidden:e.hidden,motion:i?.motion??Lt(e.object,e,n,r)}}function Ea(e,t){let n=Va(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 it(e,t,n,r,i,a){let o=a.get(e.objectId);if(o)return o;let s=e.object.placement,c;if(s?.mode==="orbit"&&e.parentId){let l=r.get(e.parentId),u=l?it(l,t,n,r,i,a):{x:0,y:0,z:0},d=i.get(e.objectId),p=Lt(e.object,d,1,t.activeEventId!==null),m=p?zn(p,0):{x:(e.x-n.x)*.8,y:0,z:(e.y-n.y)*.8};c=Cn(u,m)}else if(s?.mode==="surface"&&e.parentId){let l=r.get(e.parentId),u=l?it(l,t,n,r,i,a):{x:0,y:0,z:0},d=l?.visualRadius??16,p=Ca(e.objectId),m=p*Math.PI*2;c={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(s?.mode==="at"&&e.parentId){let l=r.get(e.parentId),u=l?it(l,t,n,r,i,a):{x:0,y:0,z:0},d=e.anchorX??l?.x??n.x,p=e.anchorY??l?.y??n.y;c={x:u.x+(e.x-d),y:u.y,z:u.z+(e.y-p)}}else c={x:(e.x-n.x)*.8,y:0,z:(e.y-n.y)*.8};return a.set(e.objectId,c),c}function Nn(e,t){let n=new Map(e.objects.map(a=>[a.objectId,a])),r=new Map,i=a=>{let o=r.get(a);if(o)return o;let s=n.get(a);if(!s)return{x:0,y:0,z:0};let c={...s.position};if(s.motion&&s.parentId){let l=i(s.parentId),u=zn(s.motion,e.timeFrozen?0:t);c=Cn(l,u)}return r.set(a,c),c};for(let a of e.objects)i(a.objectId);return r}function zn(e,t){let n=e.phase0Deg+e.angularVelocityDegPerSecond*t,r=Pt(n),i=Pt(e.rotationDeg),a=Pt(e.inclinationDeg),o=Math.cos(r)*e.semiMajor,s=Math.sin(r)*e.semiMinor,c=o*Math.cos(i)-s*Math.sin(i),l=o*Math.sin(i)+s*Math.cos(i);return{x:c,y:l*Math.sin(a),z:l*Math.cos(a)}}function Lt(e,t,n,r){let i=e.placement;if(!i||i.mode!=="orbit")return null;let a=t?.radius??t?.rx??we(Dt(i)*48,24,1200),o=t?.radius??t?.ry??a,s=Ra(i.period),c=Dt(i),l=we(c/Math.max(n,1e-4),1,20),u=we(s?rt*l:rt*Math.pow(l,.75),rt,Fn);return{phase0Deg:at(i.phase)??0,rotationDeg:at(i.angle)??t?.rotationDeg??0,inclinationDeg:at(i.inclination)??0,semiMajor:a,semiMinor:o,eccentricity:i.eccentricity??0,periodSeconds:s,angularVelocityDegPerSecond:360/Math.max(u,.001),heuristic:s===null,frozen:r}}function Dt(e){let t=En(e.semiMajor)??En(e.distance)??1;return Math.max(t,.01)}function En(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 Ra(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*Rn;case"y":return e.value*nt;case"ky":return e.value*nt*1e3;case"my":return e.value*nt*1e6;case"gy":return e.value*nt*1e9;default:return null}}function at(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function _a(e,t){return{...Na(e),...t}}function Na(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 za(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,a=Number.NEGATIVE_INFINITY,o=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),a=Math.max(a,s.position.y+s.visualRadius),o=Math.max(o,s.position.z+s.visualRadius);return{minX:t,minY:n,minZ:r,maxX:i,maxY:a,maxZ:o,width:i-t,height:a-n,depth:o-r,center:{x:(t+i)/2,y:(n+a)/2,z:(r+o)/2}}}function Cn(e,t){return{x:e.x+t.x,y:e.y+t.y,z:e.z+t.z}}function Ca(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 we(e,t,n){return Math.min(Math.max(e,t),n)}function Pt(e){return e*Math.PI/180}function Va(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 Vn(e){return{trajectoryId:e.id,craftObjectId:e.craftObjectId,segments:e.segments.map(t=>({segmentId:t.id,kind:t.kind,fromObjectId:t.fromObjectId,toObjectId:t.toObjectId,aroundObjectId:t.aroundObjectId,assistObjectId:t.assist?.objectId??null,duration:t.duration??null,deltaV:t.deltaV??null})),maneuvers:e.segments.flatMap(t=>t.maneuvers.map(n=>Ba(t.id,n)))}}function Ba(e,t){return{segmentId:e,maneuverId:t.id,kind:t.kind,epoch:t.epoch,deltaV:t.deltaV??null,duration:t.duration??null}}function Ee(e,t={}){let n=H(e,t),r=[],i=Ya(e,r),a=qa(e,r),o=Wa(e,n.renderPreset??t.preset??null,n.projection),s=e.system?Ua(e,o,i,a,r,n.renderPreset??t.preset??null):null;return n.viewpoints.some(c=>!c.generated)&&r.push({code:"upgrade.viewpoints.structured",severity:"info",source:"upgrade",message:`Promoted ${n.viewpoints.filter(c=>!c.generated).length} document-defined viewpoint(s) into the 2.0 atlas section.`}),{format:"worldorbit",version:"3.1",schemaVersion:"3.1",sourceVersion:e.version,theme:e.theme??null,system:s,groups:structuredClone(e.groups??[]),relations:structuredClone(e.relations??[]),events:structuredClone(e.events??[]),trajectories:structuredClone(e.trajectories??[]),objects:e.objects.map(Wn).map(Za),diagnostics:r}}function ot(e,t={}){return ao(Ee(e,t))}function Re(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:no(e.system),info:ro(e.system)}:null,r=e.objects.map(Wn);return Ja(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(Ga),trajectories:e.trajectories.map(Xa),objects:r}}function Un(e){return Re(e)}function Ua(e,t,n,r,i,a){let o=H(e,{preset:a??void 0,projection:t.view});return{type:"system",id:e.system?.id??"WorldOrbit",title:e.system?.title??(typeof e.system?.properties.title=="string"?e.system.properties.title:null),description:e.system?.description??null,epoch:e.system?.epoch??null,referencePlane:e.system?.referencePlane??null,defaults:t,atlasMetadata:n,viewpoints:o.viewpoints.map(Ha),annotations:r}}function Wa(e,t,n){let r=typeof e.system?.properties.view=="string"?e.system.properties.view.toLowerCase():null;return{view:r==="topdown"||r==="isometric"||r==="orthographic"||r==="perspective"?r:n,scale:typeof e.system?.properties.scale=="string"?e.system.properties.scale:null,units:typeof e.system?.properties.units=="string"?e.system.properties.units:null,preset:t,theme:typeof e.system?.info["atlas.theme"]=="string"?e.system.info["atlas.theme"]:null}}function Ya(e,t){let n={};for(let[i,a]of Object.entries(e.system?.info??{}))i.startsWith("viewpoint.")||i.startsWith("annotation.")||(n[i]=a);let r=Object.keys(n);return r.length>0&&t.push({code:"upgrade.atlasMetadata.preserved",severity:"warning",source:"upgrade",message:`Preserved ${r.length} system info entr${r.length===1?"y":"ies"} as atlas metadata in the 2.0 atlas document.`}),n}function qa(e,t){let n=new Map;for(let[r,i]of Object.entries(e.system?.info??{})){if(!r.startsWith("annotation."))continue;let[,a,...o]=r.split(".");if(!a||o.length===0)continue;let s=Bn(a);if(!s)continue;let c=n.get(s)??{id:s};switch(o.join(".").toLowerCase()){case"label":c.label=i;break;case"target":case"object":c.targetObjectId=i.trim()||null;break;case"body":case"text":case"description":c.body=i;break;case"tags":c.tags=eo(i);break}n.set(s,c)}for(let r of e.objects){let i=r.info.description;if(!i)continue;let a=Bn(`${r.id}-notes`);n.has(a)||(n.set(a,{id:a,label:`${r.id} Notes`,targetObjectId:r.id,body:i,tags:Array.isArray(r.properties.tags)?r.properties.tags.filter(o=>typeof o=="string"):[]}),t.push({code:"upgrade.annotation.objectDescription",severity:"info",source:"upgrade",message:`Lifted ${r.id}.info.description into structured atlas annotation "${a}".`,objectId:r.id,field:"description"}))}return[...n.values()].filter(r=>r.body||r.label).map(r=>({id:r.id,label:r.label??to(r.id),targetObjectId:r.targetObjectId??null,body:r.body??"",tags:r.tags??[],sourceObjectId:r.targetObjectId??null})).sort((r,i)=>r.label.localeCompare(i.label))}function Ha(e){return{id:e.id,label:e.label,summary:e.summary,focusObjectId:e.objectId,selectedObjectId:e.selectedObjectId,events:[...e.eventIds],projection:e.projection,preset:e.preset,zoom:e.scale,rotationDeg:e.rotationDeg,camera:e.camera?{...e.camera}:null,layers:{...e.layers},filter:e.filter?{query:e.filter.query,objectTypes:[...e.filter.objectTypes],tags:[...e.filter.tags],groupIds:[...e.filter.groupIds]}:null}}function Wn(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:Qa(e.properties),placement:e.placement?structuredClone(e.placement):null,info:{...e.info}}}function Ga(e){return{...e,trajectoryId:e.trajectoryId??null,participantObjectIds:[...e.participantObjectIds],tags:[...e.tags],positions:e.positions.map(Ka)}}function Ka(e){return{objectId:e.objectId,placement:Yn(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 Xa(e){return structuredClone(e)}function Za(e){if(e.type!=="structure")return e;let t=typeof e.properties.kind=="string"?e.properties.kind.toLowerCase():"";return["ship","probe","station"].includes(t)?{...e,type:"craft"}:e}function Yn(e){return e?structuredClone(e):null}function Ja(e,t,n){if(!n)return;let r=t.find(o=>o.id===n);if(!r)return;let i=new Map(e.map(o=>[o.id,o])),a=new Set([...r.targetObjectId?[r.targetObjectId]:[],...r.participantObjectIds,...r.positions.map(o=>o.objectId)]);for(let o of a){let s=i.get(o);s&&(r.epoch&&(s.epoch=r.epoch),r.referencePlane&&(s.referencePlane=r.referencePlane))}for(let o of r.positions){let s=i.get(o.objectId);s&&(o.placement&&(s.placement=Yn(o.placement)),o.inner&&(s.properties.inner={...o.inner}),o.outer&&(s.properties.outer={...o.outer}),o.epoch&&(s.epoch=o.epoch),o.referencePlane&&(s.referencePlane=o.referencePlane))}}function Qa(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 eo(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function Bn(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function to(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function no(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 ro(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=io(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 io(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(" ")}function ao(e){return{...e,version:"2.0-draft",schemaVersion:"2.0-draft"}}var qn=["title","view","scale","units","kind","class","tags","color","image","hidden","orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","radius","mass","density","gravity","temperature","albedo","atmosphere","inner","outer","on","source","cycle"];function ct(e,t={}){let n=t.schema??"auto";if(n==="2.0"||n==="2.1"||n==="2.5"||n==="2.6"||n==="3.0"||n==="3.1"||n==="2.0-draft"||e.version==="2.0"||e.version==="2.1"||e.version==="2.5"||e.version==="3.0"||e.version==="3.1"||e.version==="2.6"||e.version==="2.0-draft"){if(n==="2.0-draft"){let c=e.version==="2.0-draft"?e:e.version==="2.0"||e.version==="2.1"||e.version==="2.5"||e.version==="2.6"?{...e,version:"2.0-draft",schemaVersion:"2.0-draft"}:ot(e);return At(c)}let s=e.version==="2.0"||e.version==="2.1"||e.version==="2.5"||e.version==="2.6"||e.version==="3.0"||e.version==="3.1"?e:e.version==="2.0-draft"?{...e,version:"2.0",schemaVersion:"2.0"}:Ee(e);return(n==="2.0"||n==="2.1"||n==="2.5"||n==="2.6"||n==="3.0"||n==="3.1")&&s.version!==n?st({...s,version:n,schemaVersion:n}):st(s)}let i=[],a=e;a.system&&i.push(...oo(a.system));let o=[...a.objects].sort(Rt);for(let s of o)i.length>0&&i.push(""),i.push(...co(s));return i.join(`
2
+ `)}function st(e){let t=[`schema ${e.version}`,""];e.system&&t.push(...Gn(e.system));for(let r of[...e.groups].sort(Q))t.push(""),t.push(...Jn(r));for(let r of[...e.relations].sort(Q))t.push(""),t.push(...Qn(r));for(let r of[...e.events].sort(Q))t.push(""),t.push(...er(r));for(let r of[...e.trajectories].sort(Q))t.push(""),t.push(...mo(r));let n=[...e.objects].sort(Rt);return n.length>0&&t.at(-1)!==""&&t.push(""),n.forEach((r,i)=>{i>0&&t.push(""),t.push(...Kn(r))}),t.join(`
3
+ `)}function At(e){let t=e.version==="2.0-draft"?e:{...e,version:"2.0-draft",schemaVersion:"2.0-draft"},n=["schema 2.0-draft",""];t.system&&n.push(...Gn(t.system));for(let i of[...t.groups].sort(Q))n.push(""),n.push(...Jn(i));for(let i of[...t.relations].sort(Q))n.push(""),n.push(...Qn(i));for(let i of[...t.events].sort(Q))n.push(""),n.push(...er(i));let r=[...t.objects].sort(Rt);return r.length>0&&n.at(-1)!==""&&n.push(""),r.forEach((i,a)=>{a>0&&n.push(""),n.push(...Kn(i))}),n.join(`
4
+ `)}function oo(e){return so("system",e.id,e.properties,null,e.info)}function so(e,t,n,r,i){let a=[`${e} ${t}`],o=[...Ft(r),...Zn(n)];for(let c of o)a.push(` ${c}`);let s=Object.entries(i).sort(([c],[l])=>c.localeCompare(l));if(s.length>0){o.length>0&&a.push(""),a.push(" info");for(let[c,l]of s)a.push(` ${c} ${b(l)}`)}return a}function Gn(e){let t=[`system ${e.id}`];if(e.title&&t.push(` title ${b(e.title)}`),e.description&&t.push(` description ${b(e.description)}`),e.epoch&&t.push(` epoch ${b(e.epoch)}`),e.referencePlane&&t.push(` referencePlane ${b(e.referencePlane)}`),t.push(""),t.push("defaults"),t.push(` view ${e.defaults.view}`),e.defaults.scale&&t.push(` scale ${b(e.defaults.scale)}`),e.defaults.units&&t.push(` units ${b(e.defaults.units)}`),e.defaults.preset&&t.push(` preset ${e.defaults.preset}`),e.defaults.theme&&t.push(` theme ${b(e.defaults.theme)}`),Object.keys(e.atlasMetadata).length>0){t.push(""),t.push("atlas"),t.push(" metadata");for(let[n,r]of Object.entries(e.atlasMetadata).sort(([i],[a])=>i.localeCompare(a)))t.push(` ${n} ${b(r)}`)}for(let n of e.viewpoints)t.push(""),t.push(...uo(n));for(let n of e.annotations)t.push(""),t.push(...fo(n));return t}function co(e){return Xn(e.type,e.id,e)}function Kn(e){return Xn(`object ${e.type}`,e.id,e)}function Xn(e,t,n){let r=[`${e} ${t}`],i=[...Ft(n.placement),...Zn(n.properties),...lo(n)];for(let o of i)r.push(` ${o}`);let a=Object.entries(n.info).sort(([o],[s])=>o.localeCompare(s));if(a.length>0){i.length>0&&r.push(""),r.push(" info");for(let[o,s]of a)r.push(` ${o} ${b(s)}`)}for(let o of["climate","habitability","settlement"]){let s=Object.entries(n.typedBlocks?.[o]??{}).sort(([c],[l])=>c.localeCompare(l));if(s.length>0){r.push(""),r.push(` ${o}`);for(let[c,l]of s)r.push(` ${c} ${b(l)}`)}}return r}function Ft(e){if(!e)return[];switch(e.mode){case"orbit":return[`orbit ${e.target}`,...D("distance",e.distance),...D("semiMajor",e.semiMajor),...bo("eccentricity",e.eccentricity),...D("period",e.period),...D("angle",e.angle),...D("inclination",e.inclination),...D("phase",e.phase)];case"at":return[`at ${vo(e.reference)}`];case"surface":return[`surface ${e.target}`];case"free":return[`free ${e.distance?Et(e.distance):e.descriptor??""}`.trim()]}}function Zn(e){return Object.keys(e).sort(Io).map(t=>`${t} ${tr(e[t])}`)}function lo(e){let t=[];e.groups?.length&&t.push(`groups ${e.groups.join(" ")}`),e.trajectoryId&&t.push(`trajectory ${e.trajectoryId}`),e.epoch&&t.push(`epoch ${b(e.epoch)}`),e.referencePlane&&t.push(`referencePlane ${b(e.referencePlane)}`),e.tidalLock!==void 0&&t.push(`tidalLock ${e.tidalLock?"true":"false"}`),e.renderHints?.renderLabel!==void 0&&t.push(`renderLabel ${e.renderHints.renderLabel?"true":"false"}`),e.renderHints?.renderOrbit!==void 0&&t.push(`renderOrbit ${e.renderHints.renderOrbit?"true":"false"}`),e.renderHints?.renderPriority!==void 0&&t.push(`renderPriority ${e.renderHints.renderPriority}`),e.resonance&&t.push(`resonance ${e.resonance.targetObjectId} ${e.resonance.ratio}`);for(let n of e.deriveRules??[])t.push(`derive ${n.field} ${n.strategy}`);for(let n of e.validationRules??[])t.push(`validate ${n.rule}`);e.lockedFields?.length&&t.push(`locked ${e.lockedFields.join(" ")}`);for(let n of e.tolerances??[])t.push(`tolerance ${n.field} ${tr(n.value)}`);return t}function uo(e){let t=[`viewpoint ${e.id}`,` label ${b(e.label)}`];e.focusObjectId&&t.push(` focus ${e.focusObjectId}`),e.selectedObjectId&&e.selectedObjectId!==e.focusObjectId&&t.push(` select ${e.selectedObjectId}`),e.summary&&t.push(` summary ${b(e.summary)}`),e.projection&&t.push(` projection ${e.projection}`),e.preset&&t.push(` preset ${e.preset}`),e.zoom!==null&&t.push(` zoom ${e.zoom}`),e.rotationDeg!==0&&t.push(` rotation ${e.rotationDeg}`),e.camera&&go(e.camera)&&(t.push(" camera"),e.camera.azimuth!==null&&t.push(` azimuth ${e.camera.azimuth}`),e.camera.elevation!==null&&t.push(` elevation ${e.camera.elevation}`),e.camera.roll!==null&&t.push(` roll ${e.camera.roll}`),e.camera.distance!==null&&t.push(` distance ${e.camera.distance}`));let n=wo(e.layers);return n.length>0&&t.push(` layers ${n.join(" ")}`),e.events.length>0&&t.push(` events ${e.events.join(" ")}`),e.filter&&(t.push(" filter"),e.filter.query&&t.push(` query ${b(e.filter.query)}`),e.filter.objectTypes.length>0&&t.push(` objectTypes ${e.filter.objectTypes.join(" ")}`),e.filter.tags.length>0&&t.push(` tags ${e.filter.tags.map(b).join(" ")}`),e.filter.groupIds.length>0&&t.push(` groups ${e.filter.groupIds.join(" ")}`)),t}function fo(e){let t=[`annotation ${e.id}`,` label ${b(e.label)}`];return e.targetObjectId&&t.push(` target ${e.targetObjectId}`),t.push(` body ${b(e.body)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(b).join(" ")}`),t}function Jn(e){let t=[`group ${e.id}`,` label ${b(e.label)}`];return e.summary&&t.push(` summary ${b(e.summary)}`),e.color&&t.push(` color ${b(e.color)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(b).join(" ")}`),e.hidden&&t.push(" hidden true"),t}function Qn(e){let t=[`relation ${e.id}`];return e.from&&t.push(` from ${b(e.from)}`),e.to&&t.push(` to ${b(e.to)}`),e.kind&&t.push(` kind ${b(e.kind)}`),e.label&&t.push(` label ${b(e.label)}`),e.summary&&t.push(` summary ${b(e.summary)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(b).join(" ")}`),e.color&&t.push(` color ${b(e.color)}`),e.hidden&&t.push(" hidden true"),t}function er(e){let t=[`event ${e.id}`,` kind ${b(e.kind)}`];if(e.label&&t.push(` label ${b(e.label)}`),e.summary&&t.push(` summary ${b(e.summary)}`),e.trajectoryId&&t.push(` trajectory ${e.trajectoryId}`),e.targetObjectId&&t.push(` target ${e.targetObjectId}`),e.participantObjectIds.length>0&&t.push(` participants ${e.participantObjectIds.join(" ")}`),e.timing&&t.push(` timing ${b(e.timing)}`),e.visibility&&t.push(` visibility ${b(e.visibility)}`),e.epoch&&t.push(` epoch ${b(e.epoch)}`),e.referencePlane&&t.push(` referencePlane ${b(e.referencePlane)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(b).join(" ")}`),e.color&&t.push(` color ${b(e.color)}`),e.hidden&&t.push(" hidden true"),e.positions.length>0){t.push(""),t.push(" positions");for(let n of[...e.positions].sort($o)){t.push(` pose ${n.objectId}`);for(let r of po(n))t.push(` ${r}`)}}return t}function po(e){return[...Ft(e.placement),...e.trajectorySegmentId?[`segment ${e.trajectorySegmentId}`]:[],...e.trajectoryManeuverId?[`maneuver ${e.trajectoryManeuverId}`]:[],...e.epoch?[`epoch ${b(e.epoch)}`]:[],...e.referencePlane?[`referencePlane ${b(e.referencePlane)}`]:[],...D("inner",e.inner),...D("outer",e.outer)]}function mo(e){let t=[`trajectory ${e.id}`];e.label&&t.push(` label ${b(e.label)}`),e.summary&&t.push(` summary ${b(e.summary)}`),e.craftObjectId&&t.push(` craft ${e.craftObjectId}`),e.tags.length>0&&t.push(` tags ${e.tags.map(b).join(" ")}`),e.color&&t.push(` color ${b(e.color)}`),e.renderMode&&t.push(` renderMode ${e.renderMode}`),e.stroke&&t.push(` stroke ${b(e.stroke)}`),e.strokeWidth!==null&&e.strokeWidth!==void 0&&t.push(` strokeWidth ${e.strokeWidth}`),e.marker&&t.push(` marker ${b(e.marker)}`),e.labelMode&&t.push(` labelMode ${b(e.labelMode)}`),e.showWaypoints!==null&&e.showWaypoints!==void 0&&t.push(` showWaypoints ${e.showWaypoints?"true":"false"}`),e.hidden&&t.push(" hidden true");for(let n of[...e.segments].sort(Q)){t.push(""),t.push(` segment ${n.id}`);for(let r of ho(n))t.push(` ${r}`);for(let r of[...n.maneuvers].sort(Q)){t.push(` maneuver ${r.id}`);for(let i of yo(r))t.push(` ${i}`)}}return t}function ho(e){return[`kind ${e.kind}`,...e.label?[`label ${b(e.label)}`]:[],...e.summary?[`summary ${b(e.summary)}`]:[],...e.fromObjectId?[`from ${e.fromObjectId}`]:[],...e.toObjectId?[`to ${e.toObjectId}`]:[],...e.aroundObjectId?[`around ${e.aroundObjectId}`]:[],...e.assist?.objectId?[`assist ${e.assist.objectId}`]:[],...e.epoch?[`epoch ${b(e.epoch)}`]:[],...D("periapsis",e.periapsis),...D("apoapsis",e.apoapsis),...D("inclination",e.inclination),...D("duration",e.duration),...D("deltaV",e.deltaV),...D("phaseAngle",e.phaseAngle),...D("turnAngle",e.turnAngle),...D("energy",e.energy),...e.waypointLabel?[`waypointLabel ${b(e.waypointLabel)}`]:[],...e.waypointDate?[`waypointDate ${b(e.waypointDate)}`]:[],...e.renderHidden!==null&&e.renderHidden!==void 0?[`renderHidden ${e.renderHidden?"true":"false"}`]:[],...e.sampleDensity!==null&&e.sampleDensity!==void 0?[`sampleDensity ${e.sampleDensity}`]:[],...e.notes.length>0?[`notes ${e.notes.map(b).join(" ")}`]:[]]}function yo(e){return[`kind ${b(e.kind)}`,...e.label?[`label ${b(e.label)}`]:[],...e.epoch?[`epoch ${b(e.epoch)}`]:[],...D("deltaV",e.deltaV),...D("duration",e.duration),...e.notes.length>0?[`notes ${e.notes.map(b).join(" ")}`]:[]]}function go(e){return e.azimuth!==null||e.elevation!==null||e.roll!==null||e.distance!==null}function tr(e){return Array.isArray(e)?e.map(t=>b(t)).join(" "):typeof e=="boolean"?e?"true":"false":typeof e=="number"?String(e):typeof e=="string"?b(e):Et(e)}function Et(e){return`${e.value}${e.unit??""}`}function D(e,t){return t?[`${e} ${Et(t)}`]:[]}function bo(e,t){return t===void 0?[]:[`${e} ${t}`]}function vo(e){switch(e.kind){case"lagrange":return e.secondary?`${e.primary}-${e.secondary}:${e.point}`:`${e.primary}:${e.point}`;case"anchor":return`${e.objectId}:${e.anchor}`;case"named":return e.name}}function wo(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}function Io(e,t){let n=qn.indexOf(e),r=qn.indexOf(t);return n===-1&&r===-1?e.localeCompare(t):n===-1?1:r===-1?-1:n-r}function Rt(e,t){let n=Hn(e.type),r=Hn(t.type);return n!==r?n-r:e.id.localeCompare(t.id)}function Q(e,t){return e.id.localeCompare(t.id)}function $o(e,t){return e.objectId.localeCompare(t.objectId)}function Hn(e){switch(e){case"star":return 0;case"planet":return 1;case"moon":return 2;case"belt":return 3;case"asteroid":return 4;case"comet":return 5;case"ring":return 6;case"craft":return 7;case"structure":return 8;case"phenomenon":return 9}}function b(e){return!/\s/.test(e)&&!e.includes('"')?e:`"${e.replaceAll("\\","\\\\").replaceAll('"','\\"')}"`}var nr=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,jo=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),xo=/^[A-Za-z][A-Za-z0-9+.-]*:/;function ee(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function Ie(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function R(e,t,n){let r=e.match(nr);if(!r)throw f.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let a=A(n);if(a?.unitFamily&&!Se(a.unitFamily,i.unit))throw f.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function _t(e){let t=e.match(nr);return t?{value:Number(t[1]),unit:t[2]??null}:null}function lt(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=jo.get(e.toLowerCase());if(r===void 0)throw f.fromLocation(`Invalid boolean value "${e}" for "${t}"`,n);return r}function rr(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 ko(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(xo);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 ir(e,t,n){let r=A(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(_e(t,e,n),e,n);case"number":return lt(_e(t,e,n),e,n);case"unit":return R(_e(t,e,n),n,e);case"string":{let i=t.join(" ").trim();return e==="image"&&ko(i,n),i}}}function Nt(e,t,n){let r=A(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 _e(e,t,n){if(e.length!==1)throw f.fromLocation(`Field "${t}" expects exactly one value`,n);return e[0]}var or=new Set(["star","planet","moon","asteroid","comet"]),Oo=332946.0487,So=1047.3486,ut=1495978707e-1,Mo=6371,To=695700,Po=63241.077,Do=206264.806,Lo=206264806;function Ne(e,t){let n=[],r=new Map(e.objects.map(c=>[c.id,c])),i=new Set(e.groups.map(c=>c.id)),a=new Set(e.events.map(c=>c.id)),o=new Map(e.trajectories.map(c=>[c.id,c]));e.system||n.push(v("validate.system.required","Atlas documents must declare exactly one system."));let s=new Map;for(let[c,l]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 l){let d=s.get(u);d?n.push(v("validate.id.duplicate",`Duplicate ${c} id "${u}" already used by ${d}.`)):s.set(u,c)}for(let c of e.relations)Ao(c,r,n);for(let c of e.system?.viewpoints??[])Fo(c,i,a,t,n,r);for(let c of e.objects)Eo(c,e.system,r,i,o,n);for(let c of e.events)Ro(c,e.system,r,o,n);for(let c of e.trajectories)No(c,r,n);return n}function Ao(e,t,n){e.from?t.has(e.from)||n.push(v("validate.relation.from.unknown",`Unknown relation source "${e.from}" on "${e.id}".`)):n.push(v("validate.relation.from.required",`Relation "${e.id}" is missing a "from" target.`)),e.to?t.has(e.to)||n.push(v("validate.relation.to.unknown",`Unknown relation target "${e.to}" on "${e.id}".`)):n.push(v("validate.relation.to.required",`Relation "${e.id}" is missing a "to" target.`)),e.kind||n.push(v("validate.relation.kind.required",`Relation "${e.id}" is missing a "kind" value.`))}function Fo(e,t,n,r,i,a){let o=e.filter;if(r==="2.1"||r==="2.5"||r==="2.6"){if(o)for(let s of o.groupIds)t.has(s)||i.push(S("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(S("validate.viewpoint.event.unknown",`Unknown event "${s}" in viewpoint "${e.id}".`,void 0,`viewpoint.${e.id}.events`))}Yo(e.projection,i,`viewpoint.${e.id}.projection`,e.id),qo(e.camera,e.projection,e.rotationDeg,i,e.id,e.focusObjectId,e.selectedObjectId,o,a)}function Eo(e,t,n,r,i,a){let o=e.placement,s=o?.mode==="orbit"?o:null,c=o?.mode==="orbit"?n.get(o.target)??null:null;if(e.groups)for(let l of e.groups)r.has(l)||a.push(S("validate.group.unknown",`Unknown group "${l}" on "${e.id}".`,e.id,"groups"));if(typeof e.epoch=="string"&&!e.epoch.trim()&&a.push(S("validate.epoch.empty",`Object "${e.id}" defines an empty epoch string.`,e.id,"epoch")),typeof e.referencePlane=="string"&&!e.referencePlane.trim()&&a.push(S("validate.referencePlane.empty",`Object "${e.id}" defines an empty reference plane string.`,e.id,"referencePlane")),e.trajectoryId&&(i.has(e.trajectoryId)?sr(e)||a.push(v("validate.trajectory.object.invalidType",`Only craft or legacy ship-like structures may reference trajectories; found "${e.type}" on "${e.id}".`,e.id,"trajectory")):a.push(v("validate.trajectory.object.unknown",`Unknown trajectory "${e.trajectoryId}" on "${e.id}".`,e.id,"trajectory"))),s&&(n.has(s.target)||a.push(v("validate.orbit.target.unknown",`Unknown placement target "${s.target}" on "${e.id}".`,e.id,"orbit")),s.distance&&s.semiMajor&&a.push(v("validate.orbit.distanceConflict",`Object "${e.id}" cannot declare both "distance" and "semiMajor".`,e.id,"distance")),s.phase&&!e.epoch&&!t?.epoch&&a.push(S("validate.phase.epochMissing",`Object "${e.id}" sets "phase" without an object or system epoch.`,e.id,"phase")),s.inclination&&!e.referencePlane&&!t?.referencePlane&&a.push(S("validate.inclination.referencePlaneMissing",`Object "${e.id}" sets "inclination" without an object or system reference plane.`,e.id,"inclination")),s.period&&!Ct(c?.properties.mass)&&a.push(S("validate.period.massMissing",`Object "${e.id}" sets "period" but its central mass cannot be derived.`,e.id,"period"))),o?.mode==="surface"){let l=n.get(o.target);l?or.has(l.type)||a.push(v("validate.surface.target.invalid",`Surface target "${o.target}" on "${e.id}" is not surface-capable.`,e.id,"surface")):a.push(v("validate.surface.target.unknown",`Unknown placement target "${o.target}" on "${e.id}".`,e.id,"surface"))}if(o?.mode==="at"&&(e.type!=="craft"&&e.type!=="structure"&&e.type!=="phenomenon"&&a.push(v("validate.at.objectType",`Only craft, structures, and phenomena may use "at" placement; found "${e.type}" on "${e.id}".`,e.id,"at")),Uo(e,n,a)||a.push(v("validate.at.target.unknown",`Unknown at-reference target "${o.target}" on "${e.id}".`,e.id,"at"))),e.resonance){let l=n.get(e.resonance.targetObjectId);l?(e.placement?.mode!=="orbit"||l.placement?.mode!=="orbit"||e.placement.target!==l.placement.target)&&a.push(S("validate.resonance.orbitMismatch",`Resonance target "${e.resonance.targetObjectId}" on "${e.id}" does not share a compatible orbital parent.`,e.id,"resonance")):a.push(v("validate.resonance.target.unknown",`Unknown resonance target "${e.resonance.targetObjectId}" on "${e.id}".`,e.id,"resonance"))}for(let l of e.deriveRules??[]){if(l.field!=="period"||l.strategy!=="kepler"){a.push(S("validate.derive.unsupported",`Unsupported derive rule "${l.field} ${l.strategy}" on "${e.id}".`,e.id,"derive"));continue}let u=ar(e,c);if(u===null){a.push(S("validate.derive.inputsMissing",`Object "${e.id}" requests "derive period kepler" but lacks enough input data.`,e.id,"derive"));continue}s?.period||a.push(zt("validate.derive.period.available",`Object "${e.id}" can derive a Kepler period of ${Xo(u)}.`,e.id,"derive"))}for(let l of e.validationRules??[]){if(l.rule!=="kepler"){a.push(S("validate.rule.unsupported",`Unsupported validation rule "${l.rule}" on "${e.id}".`,e.id,"validate"));continue}let u=cr(s?.period),d=ar(e,c);if(u===null||d===null)continue;let p=Ko(e,"period");Math.abs(u-d)>p&&a.push(v("validate.kepler.mismatch",`Object "${e.id}" fails Kepler validation for "period".`,e.id,"validate"))}}function Ro(e,t,n,r,i){let a=`event.${e.id}`,o=new Set;e.kind.trim()||i.push(v("validate.event.kind.required",`Event "${e.id}" is missing a "kind" value.`,void 0,`${a}.kind`)),typeof e.epoch=="string"&&!e.epoch.trim()&&i.push(S("validate.event.epoch.empty",`Event "${e.id}" defines an empty epoch string.`,void 0,`${a}.epoch`)),typeof e.referencePlane=="string"&&!e.referencePlane.trim()&&i.push(S("validate.event.referencePlane.empty",`Event "${e.id}" defines an empty reference plane string.`,void 0,`${a}.referencePlane`)),e.trajectoryId&&!r.has(e.trajectoryId)&&i.push(v("validate.event.trajectory.unknown",`Unknown trajectory "${e.trajectoryId}" on event "${e.id}".`,void 0,`${a}.trajectory`)),!e.targetObjectId&&e.participantObjectIds.length===0&&i.push(v("validate.event.references.required",`Event "${e.id}" must define a "target" or at least one participant.`,void 0,`${a}.participants`)),e.targetObjectId&&(o.add(e.targetObjectId),n.has(e.targetObjectId)||i.push(v("validate.event.target.unknown",`Unknown event target "${e.targetObjectId}" on "${e.id}".`,void 0,`${a}.target`)));let s=new Set;for(let u of e.participantObjectIds){if(o.add(u),s.has(u)){i.push(S("validate.event.participants.duplicate",`Event "${e.id}" repeats participant "${u}".`,void 0,`${a}.participants`));continue}s.add(u),n.has(u)||i.push(v("validate.event.participants.unknown",`Unknown event participant "${u}" on "${e.id}".`,void 0,`${a}.participants`))}e.targetObjectId&&e.participantObjectIds.length>0&&!e.participantObjectIds.includes(e.targetObjectId)&&i.push(S("validate.event.target.notParticipant",`Event "${e.id}" defines a target outside its participants list.`,void 0,`${a}.target`)),e.positions.length===0&&i.push(S("validate.event.positions.missing",`Event "${e.id}" has no positions block and cannot drive a scene snapshot.`,void 0,`${a}.positions`)),/(?:^|[-_])(solar-eclipse|lunar-eclipse|transit|occultation)(?:$|[-_])/.test(e.kind)&&o.size<3&&i.push(S("validate.event.kind.participants",`Event "${e.id}" looks like an eclipse or transit but references fewer than three bodies.`,void 0,`${a}.participants`));let c=new Set;for(let u of e.positions){let d=`${a}.pose.${u.objectId}`;if(c.has(u.objectId)){i.push(v("validate.event.pose.duplicate",`Event "${e.id}" defines "${u.objectId}" more than once in positions.`,void 0,d));continue}c.add(u.objectId);let p=n.get(u.objectId);if(!p){i.push(v("validate.event.pose.object.unknown",`Unknown event pose object "${u.objectId}" on "${e.id}".`,void 0,d));continue}o.has(u.objectId)||i.push(S("validate.event.pose.unreferenced",`Event pose "${u.objectId}" on "${e.id}" is not listed in target/participants.`,void 0,d)),_o(u,p,e,t,n,r,i,d,e.id)}let l=[...o].filter(u=>!c.has(u));e.positions.length>0&&l.length>0&&i.push(S("validate.event.positions.partial",`Event "${e.id}" leaves ${l.length} referenced object(s) on their base placement.`,void 0,`${a}.positions`))}function _o(e,t,n,r,i,a,o,s,c){let l=e.placement;if(!l){o.push(v("validate.event.pose.placement.required",`Event "${c}" pose "${e.objectId}" is missing a placement mode.`,void 0,s));return}if(e.trajectorySegmentId&&!Vo(a,e.trajectorySegmentId)&&o.push(v("validate.event.pose.segment.unknown",`Unknown trajectory segment "${e.trajectorySegmentId}" on "${c}:${e.objectId}".`,void 0,`${s}.segment`)),e.trajectoryManeuverId&&!Bo(a,e.trajectoryManeuverId)&&o.push(v("validate.event.pose.maneuver.unknown",`Unknown trajectory maneuver "${e.trajectoryManeuverId}" on "${c}:${e.objectId}".`,void 0,`${s}.maneuver`)),l.mode==="orbit"){i.has(l.target)||o.push(v("validate.event.pose.orbit.target.unknown",`Unknown event orbit target "${l.target}" on "${c}:${e.objectId}".`,void 0,`${s}.orbit`)),l.distance&&l.semiMajor&&o.push(v("validate.event.pose.orbit.distanceConflict",`Event "${c}" pose "${e.objectId}" cannot declare both "distance" and "semiMajor".`,void 0,`${s}.distance`)),l.phase&&!Ho(r,t,n,e)&&o.push(S("validate.event.pose.phase.epochMissing",`Event "${c}" pose "${e.objectId}" sets "phase" without an effective epoch.`,void 0,`${s}.phase`)),l.inclination&&!Go(r,t,n,e)&&o.push(S("validate.event.pose.inclination.referencePlaneMissing",`Event "${c}" pose "${e.objectId}" sets "inclination" without an effective reference plane.`,void 0,`${s}.inclination`)),l.period&&!Ct(i.get(l.target)?.properties.mass)&&o.push(S("validate.event.pose.period.massMissing",`Event "${c}" pose "${e.objectId}" sets "period" but its central mass cannot be derived.`,void 0,`${s}.period`));return}if(l.mode==="surface"){let u=i.get(l.target);u?or.has(u.type)||o.push(v("validate.event.pose.surface.target.invalid",`Event surface target "${l.target}" on "${c}:${e.objectId}" is not surface-capable.`,void 0,`${s}.surface`)):o.push(v("validate.event.pose.surface.target.unknown",`Unknown event surface target "${l.target}" on "${c}:${e.objectId}".`,void 0,`${s}.surface`));return}if(l.mode==="at"){t.type!=="craft"&&t.type!=="structure"&&t.type!=="phenomenon"&&o.push(v("validate.event.pose.at.objectType",`Only craft, structures, and phenomena may use "at" placement in events; found "${t.type}" on "${c}:${e.objectId}".`,void 0,`${s}.at`));let u=l.reference;u.kind==="named"&&!i.has(u.name)?o.push(v("validate.event.pose.at.target.unknown",`Unknown event at-reference target "${l.target}" on "${c}:${e.objectId}".`,void 0,`${s}.at`)):u.kind==="anchor"&&!i.has(u.objectId)?o.push(v("validate.event.pose.anchor.target.unknown",`Unknown event anchor target "${u.objectId}" on "${c}:${e.objectId}".`,void 0,`${s}.at`)):u.kind==="lagrange"&&(i.has(u.primary)?u.secondary&&!i.has(u.secondary)&&o.push(v("validate.event.pose.lagrange.secondary.unknown",`Unknown event Lagrange target "${u.secondary}" on "${c}:${e.objectId}".`,void 0,`${s}.at`)):o.push(v("validate.event.pose.lagrange.primary.unknown",`Unknown event Lagrange target "${u.primary}" on "${c}:${e.objectId}".`,void 0,`${s}.at`)))}}function No(e,t,n){if(e.craftObjectId){let r=t.get(e.craftObjectId);r?sr(r)||n.push(v("validate.trajectory.craft.invalidType",`Trajectory "${e.id}" targets "${e.craftObjectId}", which is not craft-like.`,void 0,`trajectory.${e.id}.craft`)):n.push(v("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[a,o]of[["from",t.fromObjectId],["to",t.toObjectId],["around",t.aroundObjectId]])o&&!n.has(o)&&r.push(v(`validate.trajectory.segment.${a}.unknown`,`Unknown ${a} object "${o}" on trajectory "${e}" segment "${t.id}".`,void 0,`${i}.${a}`));t.assist?.objectId&&!n.has(t.assist.objectId)&&r.push(v("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(v("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(v("validate.trajectory.segment.target.required",`Trajectory "${e}" segment "${t.id}" requires a target reference.`,void 0,`${i}.to`));for(let a of t.maneuvers)Co(e,t.id,a,r)}function Co(e,t,n,r){n.kind.trim()||r.push(v("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 sr(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 Vo(e,t){for(let n of e.values()){let r=n.segments.find(i=>i.id===t);if(r)return r}return null}function Bo(e,t){for(let n of e.values())for(let r of n.segments){let i=r.maneuvers.find(a=>a.id===t);if(i)return i}return null}function Uo(e,t,n){let r=e.placement?.mode==="at"?e.placement.reference:null;return r?r.kind==="named"?t.has(r.name):r.kind==="anchor"?t.has(r.objectId)?!0:(n.push(v("validate.anchor.target.unknown",`Unknown anchor target "${r.objectId}" on "${e.id}".`,e.id,"at")),!1):t.has(r.primary)?r.secondary&&!t.has(r.secondary)?(n.push(v("validate.lagrange.secondary.unknown",`Unknown Lagrange reference "${r.secondary}" on "${e.id}".`,e.id,"at")),!1):!0:(n.push(v("validate.lagrange.primary.unknown",`Unknown Lagrange reference "${r.primary}" on "${e.id}".`,e.id,"at")),!1):!0}function ar(e,t){let n=e.placement;if(!n||n.mode!=="orbit")return null;let r=Wo(n.semiMajor??n.distance),i=Ct(t?.properties.mass);return r===null||i===null||i<=0?null:Math.sqrt(r**3/i)*365.25}function Wo(e){if(!e)return null;switch(e.unit){case null:case"au":return e.value;case"km":return e.value/ut;case"m":return e.value/(ut*1e3);case"ly":return e.value*Po;case"pc":return e.value*Do;case"kpc":return e.value*Lo;case"re":return e.value*Mo/ut;case"sol":return e.value*To/ut;default:return null}}function Ct(e){if(!e||typeof e!="object"||!("value"in e))return null;let t=e;switch(t.unit){case null:case"sol":return t.value;case"me":return t.value/Oo;case"mj":return t.value/So;default:return null}}function cr(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 Yo(e,t,n,r){e!=="topdown"&&e!=="isometric"&&e!=="orthographic"&&e!=="perspective"&&t.push(v("validate.viewpoint.projection.invalid",`Unknown projection "${String(e)}" in viewpoint "${r}".`,void 0,n))}function qo(e,t,n,r,i,a,o,s,c){if(!e)return;let l=`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(v("validate.viewpoint.camera.invalid",`Invalid camera ${d} "${String(p)}" in viewpoint "${i}".`,void 0,`${l}.${d}`));e.distance!==null&&t!=="perspective"&&r.push(S("validate.viewpoint.camera.distance.partialEffect",`Camera "distance" only has a semantic effect in perspective viewpoints; "${i}" uses "${t}".`,void 0,`${l}.distance`)),t==="topdown"&&(e.elevation!==null||e.roll!==null)&&r.push(S("validate.viewpoint.camera.topdownPartial",`Camera elevation/roll on topdown viewpoint "${i}" are currently stored for future 3D use and only partially affect 2D rendering.`,void 0,l)),t==="isometric"&&e.elevation!==null&&r.push(zt("validate.viewpoint.camera.isometricStored",`Camera elevation on isometric viewpoint "${i}" is preserved semantically for future 3D rendering.`,void 0,`${l}.elevation`)),e.azimuth!==null&&e.azimuth!==0&&n!==0&&r.push(S("validate.viewpoint.rotation.cameraOverlap",`Viewpoint "${i}" uses camera.azimuth; keep "rotation" only for 2D screen rotation to avoid ambiguity.`,void 0,`${l}.azimuth`)),a!==null&&c.has(a)||o!==null&&c.has(o)||s||r.push(zt("validate.viewpoint.camera.anchorMissing",`Viewpoint "${i}" stores camera settings without a focus object, selection, or filter anchor.`,void 0,l))}function Ho(e,t,n,r){return ae(r?.epoch)??ae(n?.epoch)??ae(t.epoch)??ae(e?.epoch)??null}function Go(e,t,n,r){return ae(r?.referencePlane)??ae(n?.referencePlane)??ae(t.referencePlane)??ae(e?.referencePlane)??null}function ae(e){return typeof e=="string"&&e.trim()?e.trim():null}function Ko(e,t){let n=e.tolerances?.find(r=>r.field===t)?.value;return typeof n=="number"?n:n&&typeof n=="object"&&"value"in n?cr(n)??0:0}function Xo(e){return`${Math.round(e*100)/100}d`}function v(e,t,n,r){return{code:e,severity:"error",source:"validate",message:t,objectId:n,field:r}}function S(e,t,n,r){return{code:e,severity:"warning",source:"validate",message:t,objectId:n,field:r}}function zt(e,t,n,r){return{code:e,severity:"info",source:"validate",message:t,objectId:n,field:r}}var Zo=new Set(["climate","habitability","settlement"]),Jo=new Set(["departure","transfer","flyby","capture","stationkeeping","escape"]),dt=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=A(e);t&&dt.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}])dt.set(e.key,{key:e.key,version:e.key==="trajectory"?"3.0":"2.1",inlineMode:e.inlineMode,allowRepeat:e.allowRepeat});var Qo=new Set(dt.keys()),ur=new Set(["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","inner","outer","epoch","referencePlane","segment","maneuver"]);function ft(e){return fr(e)}function dr(e){return fr(e,"2.0-draft")}function fr(e,t){let n=Us(e),r=n.source.split(/\r?\n/),i=[],a=!1,o="2.0",s=null,c=null,l=[],u=[],d=[],p=[],m=[],y=new Map,g=!1,h=!1,k=new Set,x=new Set,w=new Set,O=new Set,G=new Set,F=new Set;for(let T=0;T<r.length;T++){let de=r[T],K=T+1;if(!de.trim())continue;let L=Ue(de),X=pe(de.slice(L),{line:K,columnOffset:L});if(X.length!==0){if(!a){o=es(X,K),a=!0,n.comments.length>0&&je(o,"2.1")&&i.push({code:"parse.schema21.commentCompatibility",severity:"warning",source:"parse",message:`Comments require schema 2.1; parsed in compatibility mode because the document header is "schema ${o}".`,line:n.comments[0].line,column:n.comments[0].column});continue}if(L===0){c=ts(X,K,o,i,s,l,u,d,p,m,y,k,x,w,O,G,F,{sawDefaults:g,sawAtlas:h}),c.kind==="system"?s=c.system:c.kind==="defaults"?g=!0:c.kind==="atlas"&&(h=!0);continue}if(!c)throw new f("Indented line without parent atlas section",K,L+1);us(c,L,X,K)}}if(!a)throw new f('Missing required atlas schema header "schema 2.0", "schema 3.0", or "schema 3.1"');let ce=l.map(T=>Ls(T,o,i)),le=p.map(T=>As(T,y.get(T.id)??[])),ge=t??(o==="2.0-draft"?"2.0":o),xe={format:"worldorbit",sourceVersion:"1.0",theme:null,system:s,groups:u,relations:d,events:le,trajectories:m,objects:ce,diagnostics:i};if(ge==="2.0-draft"){let T={...xe,version:"2.0-draft",schemaVersion:"2.0-draft"};return T.diagnostics.push(...Ne(T,o)),T}let ue={...xe,version:ge,schemaVersion:ge};return o==="2.0-draft"&&ue.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".'}),ue.diagnostics.push(...Ne(ue,o)),ue}function es(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 ts(e,t,n,r,i,a,o,s,c,l,u,d,p,m,y,g,h,k){switch(e[0]?.value.toLowerCase()){case"system":if(i)throw new f('Atlas section "system" may only appear once',t,e[0].column);return ns(e,t,n,r);case"defaults":if(!i)throw new f('Atlas section "defaults" requires a preceding system declaration',t,e[0].column);if(k.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(k.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 rs(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 is(e,t,i,p);case"group":return V(n,r,"group",{line:t,column:e[0].column}),as(e,t,o,m);case"relation":return V(n,r,"relation",{line:t,column:e[0].column}),os(e,t,s,y);case"event":return V(n,r,"event",{line:t,column:e[0].column}),ss(e,t,c,u,g,n,r);case"trajectory":return $e(n,r,"trajectory",{line:t,column:e[0].column}),cs(e,t,l,h,n,r);case"object":return ls(e,t,n,r,a);default:throw new f(`Unknown atlas section "${e[0]?.value??""}"`,t,e[0]?.column??1)}}function ns(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 rs(e,t,n,r,i,a){if(e.length!==2)throw new f("Invalid viewpoint declaration",t,e[0]?.column??1);let o=ee(e[1].value);if(!o)throw new f("Viewpoint id must not be empty",t,e[1].column);if(r.has(o))throw new f(`Duplicate viewpoint id "${o}"`,t,e[1].column);let s={id:o,label:Ie(o),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(o),{kind:"viewpoint",viewpoint:s,sourceSchemaVersion:i,diagnostics:a,seenFields:new Set,inFilter:!1,filterIndent:null,seenFilterFields:new Set,inCamera:!1,cameraIndent:null,seenCameraFields:new Set}}function is(e,t,n,r){if(e.length!==2)throw new f("Invalid annotation declaration",t,e[0]?.column??1);let i=ee(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 a={id:i,label:Ie(i),targetObjectId:null,body:"",tags:[],sourceObjectId:null};return n.annotations.push(a),r.add(i),{kind:"annotation",annotation:a,seenFields:new Set}}function as(e,t,n,r){if(e.length!==2)throw new f("Invalid group declaration",t,e[0]?.column??1);let i=ee(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 a={id:i,label:Ie(i),summary:"",color:null,tags:[],hidden:!1};return n.push(a),r.add(i),{kind:"group",group:a,seenFields:new Set}}function os(e,t,n,r){if(e.length!==2)throw new f("Invalid relation declaration",t,e[0]?.column??1);let i=ee(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 a={id:i,from:"",to:"",kind:"",label:null,summary:null,tags:[],color:null,hidden:!1};return n.push(a),r.add(i),{kind:"relation",relation:a,seenFields:new Set}}function ss(e,t,n,r,i,a,o){if(e.length!==2)throw new f("Invalid event declaration",t,e[0]?.column??1);let s=ee(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 c={id:s,kind:"",label:Ie(s),summary:null,targetObjectId:null,participantObjectIds:[],timing:null,visibility:null,epoch:null,referencePlane:null,tags:[],color:null,hidden:!1,positions:[]},l=[];return n.push(c),r.set(s,l),i.add(s),{kind:"event",event:c,sourceSchemaVersion:a,diagnostics:o,seenFields:new Set,rawPoses:l,inPositions:!1,positionsIndent:null,activePose:null,poseIndent:null,activePoseSeenFields:new Set}}function cs(e,t,n,r,i,a){if(e.length!==2)throw new f("Invalid trajectory declaration",t,e[0]?.column??1);let o=ee(e[1].value);if(!o)throw new f("Trajectory id must not be empty",t,e[1].column);if(r.has(o))throw new f(`Duplicate trajectory id "${o}"`,t,e[1].column);let s={id:o,label:Ie(o),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(o),{kind:"trajectory",trajectory:s,sourceSchemaVersion:i,diagnostics:a,seenFields:new Set,inSegment:!1,segmentIndent:null,activeSegment:null,activeSegmentSeenFields:new Set,inManeuver:!1,maneuverIndent:null,activeManeuver:null,activeManeuverSeenFields:new Set}}function ls(e,t,n,r,i){if(e.length<3)throw new f("Invalid atlas object declaration",t,e[0]?.column??1);let a=e[1],o=e[2],s=a.value;if(!Oe.has(s)||s==="system")throw new f(`Unknown object type "${a.value}"`,t,a.column);let c={objectType:s,id:o.value,fields:Ps(e.slice(3),t,s,n,r),infoEntries:[],typedBlockEntries:{},location:{line:t,column:a.column}};return i.push(c),{kind:"object",objectNode:c,sourceSchemaVersion:n,diagnostics:r,activeBlock:null,blockIndent:null,seenInfoKeys:new Set,seenTypedBlockKeys:{}}}function us(e,t,n,r){switch(e.kind){case"system":ds(e,n,r);return;case"defaults":fs(e,n,r);return;case"atlas":ps(e,t,n,r);return;case"viewpoint":ms(e,t,n,r);return;case"annotation":gs(e,n,r);return;case"group":bs(e,n,r);return;case"relation":vs(e,n,r);return;case"event":ws(e,t,n,r);return;case"trajectory":Is(e,t,n,r);return;case"object":ks(e,t,n,r);return}}function ds(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":V(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.description=i;return;case"epoch":V(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.epoch=i;return;case"referenceplane":V(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 fs(e,t,n){let r=B(t,e.seenFields,n),i=j(t,n);switch(r){case"view":mr(i)&&he(e.sourceSchemaVersion,e.diagnostics,"defaults.view",{line:n,column:t[0].column}),e.system.defaults.view=pr(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=hr(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 ps(e,t,n,r){if(e.inMetadata&&t<=(e.metadataIndent??0)&&(e.inMetadata=!1,e.metadataIndent=null),e.inMetadata){let i=yr(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 ms(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){hs(e,n,r);return}if(e.inFilter){ys(e,n,r);return}if(n.length===1&&n[0].value.toLowerCase()==="camera"){if(he(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??Vt();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),a=j(n,r);switch(i){case"label":e.viewpoint.label=a;return;case"summary":e.viewpoint.summary=a;return;case"focus":e.viewpoint.focusObjectId=a;return;case"select":e.viewpoint.selectedObjectId=a;return;case"projection":mr(a)&&he(e.sourceSchemaVersion,e.diagnostics,"projection",{line:r,column:n[0].column}),e.viewpoint.projection=pr(a,r,n[0].column);return;case"preset":e.viewpoint.preset=hr(a,r,n[0].column);return;case"zoom":e.viewpoint.zoom=ze(a,r,n[0].column,"zoom");return;case"rotation":e.viewpoint.rotationDeg=se(a,r,n[0].column,"rotation");return;case"camera":he(e.sourceSchemaVersion,e.diagnostics,"viewpoint.camera",{line:r,column:n[0].column}),e.viewpoint.camera=Ts(n.slice(1),r,e.viewpoint.camera);return;case"layers":e.viewpoint.layers=Ss(n.slice(1),r,e.sourceSchemaVersion,e.diagnostics);return;case"events":V(e.sourceSchemaVersion,e.diagnostics,"viewpoint.events",{line:r,column:n[0].column}),e.viewpoint.events=_(n.slice(1),r,"events");return;default:throw new f(`Unknown viewpoint field "${n[0].value}"`,r,n[0].column)}}function hs(e,t,n){let r=B(t,e.seenCameraFields,n),i=j(t,n),a=e.viewpoint.camera??Vt();switch(r){case"azimuth":a.azimuth=se(i,n,t[0].column,"camera.azimuth");break;case"elevation":a.elevation=se(i,n,t[0].column,"camera.elevation");break;case"roll":a.roll=se(i,n,t[0].column,"camera.roll");break;case"distance":a.distance=ze(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=a}function ys(e,t,n){let r=B(t,e.seenFilterFields,n),i=e.viewpoint.filter??Ms();switch(r){case"query":i.query=j(t,n);break;case"objecttypes":i.objectTypes=Os(t.slice(1),n);break;case"tags":i.tags=_(t.slice(1),n,"tags");break;case"groups":i.groupIds=_(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 gs(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=_(t.slice(1),n,"tags");return;default:throw new f(`Unknown annotation field "${t[0].value}"`,n,t[0].column)}}function bs(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=_(t.slice(1),n,"tags");return;case"hidden":e.group.hidden=W(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 vs(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=_(t.slice(1),n,"tags");return;case"color":e.relation.color=j(t,n);return;case"hidden":e.relation.hidden=W(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 ws(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")&&he(e.sourceSchemaVersion,e.diagnostics,`pose.${n[0].value}`,{line:r,column:n[0]?.column??1}),(n[0]?.value==="segment"||n[0]?.value==="maneuver")&&$e(e.sourceSchemaVersion,e.diagnostics,`pose.${n[0].value}`,{line:r,column:n[0]?.column??1}),e.activePose.fields.push(xs(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 a=n[1].value;if(!a.trim())throw new f("Event pose object id must not be empty",r,n[1].column);let o={objectId:a,fields:[],location:{line:r,column:n[0].column}};e.rawPoses.push(o),e.activePose=o,e.poseIndent=t,e.activePoseSeenFields=new Set;return}if(n.length===1&&n[0].value.toLowerCase()==="positions"){if(e.seenFields.has("positions"))throw new 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":$e(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=_(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":he(e.sourceSchemaVersion,e.diagnostics,"event.epoch",{line:r,column:n[0].column}),e.event.epoch=j(n,r);return;case"referenceplane":he(e.sourceSchemaVersion,e.diagnostics,"event.referencePlane",{line:r,column:n[0].column}),e.event.referencePlane=j(n,r);return;case"tags":e.event.tags=_(n.slice(1),r,"tags");return;case"color":e.event.color=j(n,r);return;case"hidden":e.event.hidden=W(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 Is(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){js(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 o=ee(n[1].value);if(!o)throw new f("Trajectory maneuver id must not be empty",r,n[1].column);if(e.activeSegment.maneuvers.some(c=>c.id===o))throw new f(`Duplicate trajectory maneuver id "${o}"`,r,n[1].column);let s={id:o,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}$s(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 o=ee(n[1].value);if(!o)throw new f("Trajectory segment id must not be empty",r,n[1].column);if(e.trajectory.segments.some(c=>c.id===o))throw new f(`Duplicate trajectory segment id "${o}"`,r,n[1].column);let s={id:o,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:o,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=B(n,e.seenFields,r),a=j(n,r);switch(i){case"label":e.trajectory.label=a;return;case"summary":e.trajectory.summary=a;return;case"craft":e.trajectory.craftObjectId=a;return;case"tags":e.trajectory.tags=_(n.slice(1),r,"tags");return;case"color":e.trajectory.color=a;return;case"rendermode":if(C(e.sourceSchemaVersion,e.diagnostics,"trajectory.renderMode",{line:r,column:n[0].column}),a!=="illustrative"&&a!=="solver"&&a!=="auto")throw new f(`Unknown trajectory render mode "${a}"`,r,n[0].column);e.trajectory.renderMode=a;return;case"stroke":C(e.sourceSchemaVersion,e.diagnostics,"trajectory.stroke",{line:r,column:n[0].column}),e.trajectory.stroke=a;return;case"strokewidth":C(e.sourceSchemaVersion,e.diagnostics,"trajectory.strokeWidth",{line:r,column:n[0].column}),e.trajectory.strokeWidth=ze(a,r,n[0].column,"strokeWidth");return;case"marker":C(e.sourceSchemaVersion,e.diagnostics,"trajectory.marker",{line:r,column:n[0].column}),e.trajectory.marker=a;return;case"labelmode":C(e.sourceSchemaVersion,e.diagnostics,"trajectory.labelMode",{line:r,column:n[0].column}),e.trajectory.labelMode=a;return;case"showwaypoints":C(e.sourceSchemaVersion,e.diagnostics,"trajectory.showWaypoints",{line:r,column:n[0].column}),e.trajectory.showWaypoints=W(a,"showWaypoints",{line:r,column:n[0].column});return;case"hidden":e.trajectory.hidden=W(a,"hidden",{line:r,column:n[0].column});return;default:throw new f(`Unknown trajectory field "${n[0].value}"`,r,n[0].column)}}function $s(e,t,n){let r=e.activeSegment;if(!r)return;let i=B(t,e.activeSegmentSeenFields,n),a=j(t,n),o=e.trajectory.segments.find(s=>s.id===r.id);switch(i){case"kind":{let s=a.toLowerCase();if(!Jo.has(s))throw new f(`Unknown trajectory segment kind "${a}"`,n,t[0].column);o.kind=s;return}case"label":o.label=a;return;case"summary":o.summary=a;return;case"from":o.fromObjectId=a;return;case"to":o.toObjectId=a;return;case"around":o.aroundObjectId=a;return;case"assist":o.assist={objectId:a,notes:[]};return;case"epoch":o.epoch=a;return;case"periapsis":o.periapsis=R(a,{line:n,column:t[0].column},"periapsis");return;case"apoapsis":o.apoapsis=R(a,{line:n,column:t[0].column},"apoapsis");return;case"inclination":o.inclination=R(a,{line:n,column:t[0].column},"inclination");return;case"duration":o.duration=R(a,{line:n,column:t[0].column},"duration");return;case"deltav":o.deltaV=R(a,{line:n,column:t[0].column});return;case"phaseangle":o.phaseAngle=R(a,{line:n,column:t[0].column},"phaseAngle");return;case"turnangle":o.turnAngle=R(a,{line:n,column:t[0].column},"turnAngle");return;case"energy":o.energy=R(a,{line:n,column:t[0].column});return;case"waypointlabel":C(e.sourceSchemaVersion,e.diagnostics,"segment.waypointLabel",{line:n,column:t[0].column}),o.waypointLabel=a;return;case"waypointdate":C(e.sourceSchemaVersion,e.diagnostics,"segment.waypointDate",{line:n,column:t[0].column}),o.waypointDate=a;return;case"renderhidden":C(e.sourceSchemaVersion,e.diagnostics,"segment.renderHidden",{line:n,column:t[0].column}),o.renderHidden=W(a,"renderHidden",{line:n,column:t[0].column});return;case"sampledensity":C(e.sourceSchemaVersion,e.diagnostics,"segment.sampleDensity",{line:n,column:t[0].column}),o.sampleDensity=ze(a,n,t[0].column,"sampleDensity");return;case"notes":o.notes=_(t.slice(1),n,"notes");return;default:throw new f(`Unknown trajectory segment field "${t[0].value}"`,n,t[0].column)}}function js(e,t,n){let r=e.activeManeuver;if(!r)return;let i=B(t,e.activeManeuverSeenFields,n),a=j(t,n);switch(i){case"kind":r.kind=a;return;case"label":r.label=a;return;case"epoch":r.epoch=a;return;case"deltav":r.deltaV=R(a,{line:n,column:t[0].column});return;case"duration":r.duration=R(a,{line:n,column:t[0].column},"duration");return;case"notes":r.notes=_(t.slice(1),n,"notes");return;default:throw new f(`Unknown trajectory maneuver field "${t[0].value}"`,n,t[0].column)}}function xs(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(!ur.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 ks(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"||Zo.has(i)){i!=="info"&&V(e.sourceSchemaVersion,e.diagnostics,i,{line:r,column:n[0].column}),e.activeBlock=i,e.blockIndent=t;return}}if(e.activeBlock){let i=yr(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 a=e.activeBlock,o=e.seenTypedBlockKeys[a]??(e.seenTypedBlockKeys[a]=new Set);if(o.has(i.key))throw new f(`Duplicate ${a} key "${i.key}"`,r,n[0].column);o.add(i.key),(e.objectNode.typedBlockEntries[a]??(e.objectNode.typedBlockEntries[a]=[])).push(i);return}e.objectNode.fields.push(Ds(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 Os(e,t){return _(e,t,"objectTypes").filter(n=>n==="star"||n==="planet"||n==="moon"||n==="belt"||n==="asteroid"||n==="comet"||n==="ring"||n==="structure"||n==="phenomenon")}function Ss(e,t,n,r){let i={};for(let a of _(e,t,"layers")){let o=!a.startsWith("-")&&!a.startsWith("!"),s=a.replace(/^[-!]+/,"").toLowerCase();if(s==="orbits"){i["orbits-back"]=o,i["orbits-front"]=o;continue}(s==="background"||s==="guides"||s==="orbits-back"||s==="orbits-front"||s==="relations"||s==="events"||s==="objects"||s==="labels"||s==="metadata"||s==="trajectories")&&(s==="events"&&n&&r&&V(n,r,"layers.events",{line:t,column:e[0]?.column??1}),i[s]=o)}return i}function _(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 pr(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 mr(e){let t=e.toLowerCase();return t==="orthographic"||t==="perspective"}function hr(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 ze(e,t,n,r){let i=se(e,t,n,r);if(i<=0)throw new f(`Field "${r}" must be greater than zero`,t,n);return i}function se(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 Ms(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Vt(){return{azimuth:null,elevation:null,roll:null,distance:null}}function Ts(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}:Vt(),i=new Set;for(let a=0;a<e.length;a+=2){let o=e[a],s=e[a+1],c=o.value.toLowerCase();if(i.has(c))throw new f(`Duplicate viewpoint camera field "${o.value}"`,t,o.column);i.add(c);let l=s.value;switch(c){case"azimuth":r.azimuth=se(l,t,o.column,"camera.azimuth");break;case"elevation":r.elevation=se(l,t,o.column,"camera.elevation");break;case"roll":r.roll=se(l,t,o.column,"camera.roll");break;case"distance":r.distance=ze(l,t,o.column,"camera.distance");break;default:throw new f(`Unknown viewpoint camera field "${o.value}"`,t,o.column)}}return r}function Ps(e,t,n,r,i){let a=[],o=0;for(;o<e.length;){let s=e[o],c=Ce(s.value);if(!c)throw new f(`Unknown field "${s.value}"`,t,s.column);c.version==="2.1"?V(r,i,s.value,{line:t,column:s.column}):c.version==="3.0"?$e(r,i,s.value,{line:t,column:s.column}):c.version==="3.1"&&C(r,i,s.value,{line:t,column:s.column}),o++;let l=[];if(c.inlineMode==="single"){let u=e[o];u&&(l.push(u),o++)}else if(c.inlineMode==="pair")for(let u=0;u<2;u++){let d=e[o];if(!d)break;l.push(d),o++}else for(;o<e.length&&!Qo.has(e[o].value);)l.push(e[o]),o++;if(l.length===0)throw new f(`Missing value for field "${s.value}"`,t,s.column);a.push({type:"field",key:s.value,values:l.map(u=>u.value),location:{line:t,column:s.column}})}return wr(a,n),a}function Ds(e,t,n,r,i){if(e.length<2)throw new f("Invalid field line",t,e[0]?.column??1);let a=Ce(e[0].value);if(!a)throw new f(`Unknown field "${e[0].value}"`,t,e[0].column);a.version==="2.1"?V(r,i,e[0].value,{line:t,column:e[0].column}):a.version==="3.0"?$e(r,i,e[0].value,{line:t,column:e[0].column}):a.version==="3.1"&&C(r,i,e[0].value,{line:t,column:e[0].column});let o={type:"field",key:e[0].value,values:e.slice(1).map(s=>s.value),location:{line:t,column:e[0].column}};return wr([o],n),o}function yr(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 Ls(e,t,n){let r=gr(e.fields),i=br(r),a=Es(e.objectType,r),o=Vs(r.get("groups")?.[0]),s=me(r.get("epoch")?.[0]),c=me(r.get("referencePlane")?.[0]),l=r.has("tidalLock")?W(Y(r.get("tidalLock")[0]),"tidalLock",r.get("tidalLock")[0].location):void 0,u=r.has("resonance")?Ns(r.get("resonance")[0]):void 0,d=_s(r),p=r.get("derive")?.map(O=>zs(O)),m=r.get("validate")?.map(O=>({rule:Y(O)})),y=r.has("locked")?[...new Set(r.get("locked").flatMap(O=>O.values))]:void 0,g=r.get("tolerance")?.map(O=>Cs(O)),h=Rs(e.typedBlockEntries),k=vr(e.infoEntries,"info"),x=me(r.get("trajectory")?.[0]),w={type:e.objectType,id:e.id,properties:a,placement:i,info:k};return o.length>0&&(w.groups=o),s&&(w.epoch=s),c&&(w.referencePlane=c),l!==void 0&&(w.tidalLock=l),u&&(w.resonance=u),d&&(w.renderHints=d),p?.length&&(w.deriveRules=p),m?.length&&(w.validationRules=m),y?.length&&(w.lockedFields=y),g?.length&&(w.tolerances=g),h&&Object.keys(h).length>0&&(w.typedBlocks=h),x&&(w.trajectoryId=x),je(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)&&V(t,n,e.id,e.location),w.trajectoryId&&$e(t,n,`${e.id}.trajectory`,e.location),w}function As(e,t){return{...e,participantObjectIds:[...new Set(e.participantObjectIds)],tags:[...new Set(e.tags)],positions:t.map(n=>Fs(n))}}function Fs(e){let t=gr(e.fields,"event-pose"),n=br(t);return{objectId:e.objectId,placement:n,trajectorySegmentId:me(t.get("segment")?.[0]),trajectoryManeuverId:me(t.get("maneuver")?.[0]),inner:oe(t.get("inner")?.[0],"inner"),outer:oe(t.get("outer")?.[0],"outer"),epoch:me(t.get("epoch")?.[0]),referencePlane:me(t.get("referencePlane")?.[0])}}function gr(e,t="object"){let n=new Map;for(let r of e){let i=Ce(r.key);if(!i&&!ur.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 a=n.get(r.key)??[];a.push(r),n.set(r.key,a)}return n}function br(e){let t=e.get("orbit")?.[0],n=e.get("at")?.[0],r=e.get("surface")?.[0],i=e.get("free")?.[0];if([t,n,r,i].filter(Boolean).length>1){let o=t??n??r??i;throw f.fromLocation("Object has multiple placement modes",o?.location)}if(t)return{mode:"orbit",target:Y(t),distance:oe(e.get("distance")?.[0],"distance"),semiMajor:oe(e.get("semiMajor")?.[0],"semiMajor"),eccentricity:Bs(e.get("eccentricity")?.[0],"eccentricity"),period:oe(e.get("period")?.[0],"period"),angle:oe(e.get("angle")?.[0],"angle"),inclination:oe(e.get("inclination")?.[0],"inclination"),phase:oe(e.get("phase")?.[0],"phase")};if(n){let o=Y(n);return{mode:"at",target:o,reference:rr(o,n.location)}}if(r)return{mode:"surface",target:Y(r)};if(i){let o=Y(i),s=_t(o);return{mode:"free",distance:s??void 0,descriptor:s?void 0:o}}return null}function Es(e,t){let n={};for(let[r,i]of t.entries()){let a=i[0],o=Ce(r);!a||!o?.legacySchema||o.legacySchema.placement||(Nt(r,e,a.location),n[r]=ir(r,a.values,a.location))}return n}function vr(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 Rs(e){let t={};for(let n of Object.keys(e)){let r=e[n];r?.length&&(t[n]=vr(r,n))}return t}function _s(e){let t={},n=e.get("renderLabel")?.[0],r=e.get("renderOrbit")?.[0],i=e.get("renderPriority")?.[0];return n&&(t.renderLabel=W(Y(n),"renderLabel",n.location)),r&&(t.renderOrbit=W(Y(r),"renderOrbit",r.location)),i&&(t.renderPriority=lt(Y(i),"renderPriority",i.location)),Object.keys(t).length>0?t:void 0}function Ns(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 zs(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 Cs(e){if(e.values.length!==2)throw f.fromLocation('Field "tolerance" expects "<field> <value>"',e.location);let t=e.values[1],n=_t(t),r=Number(t);return{field:e.values[0],value:n??(Number.isFinite(r)?r:t)}}function Vs(e){return e?[...new Set(e.values)]:[]}function me(e){return e&&e.values.join(" ").trim()||null}function oe(e,t){return e?R(Y(e),e.location,t):void 0}function Bs(e,t){return e?lt(Y(e),t,e.location):void 0}function Y(e){return _e(e.values,e.key,e.location)}function Ce(e){return dt.get(e)}function wr(e,t){for(let n of e){let r=Ce(n.key);if(!r)throw f.fromLocation(`Unknown field "${n.key}"`,n.location);if(r.legacySchema){Nt(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 V(e,t,n,r){je(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 he(e,t,n,r){je(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 $e(e,t,n,r){je(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 C(e,t,n,r){je(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 je(e,t){return lr(e)<lr(t)}function lr(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 Us(e){let t=[...e],n=[],r=!1,i=!1,a=null,o=1,s=1;for(let c=0;c<t.length;c++){let l=t[c],u=t[c+1];if(i){if(l==="*"&&u==="/"){t[c]=" ",t[c+1]=" ",i=!1,a=null,c++,s+=2;continue}l!==`
5
+ `&&l!=="\r"&&(t[c]=" "),l===`
6
+ `?(o++,s=1):s++;continue}if(!r&&l==="/"&&u==="*"){n.push({kind:"block",line:o,column:s}),t[c]=" ",t[c+1]=" ",i=!0,a={line:o,column:s},c++,s+=2;continue}if(!r&&l==="#"&&!Ws(t,c)){n.push({kind:"line",line:o,column:s}),t[c]=" ";let d=c+1;for(;d<t.length&&t[d]!==`
7
+ `&&t[d]!=="\r";)t[d]=" ",d++;s+=d-c,c=d-1;continue}l==='"'&&t[c-1]!=="\\"&&(r=!r),l===`
8
+ `?(o++,s=1):s++}if(i)throw f.fromLocation("Unclosed block comment",a??void 0);return{source:t.join(""),comments:n}}function Ws(e,t){let n=t+1,r=0;for(;n<e.length&&/[0-9a-f]/i.test(e[n]??"");)n++,r++;if(![3,4,6,8].includes(r))return!1;let i=e[n];return i===void 0||i===" "||i===" "||i==="\r"||i===`
9
+ `}function Bt(e="WorldOrbit",t="3.0"){return{format:"worldorbit",version:t,schemaVersion:t,sourceVersion:"1.0",theme:{preset:"blueprint",styles:{}},system:{type:"system",id:e,title:e,description:null,epoch:null,referencePlane:null,defaults:{view:"topdown",scale:null,units:null,preset:null,theme:null},atlasMetadata:{},viewpoints:[],annotations:[]},groups:[],relations:[],events:[],trajectories:[],objects:[],diagnostics:[]}}function pt(e){return structuredClone(e)}function Ir(e){let t=[{kind:"system"},{kind:"defaults"}];if(e.system){for(let n of Object.keys(e.system.atlasMetadata).sort())t.push({kind:"metadata",key:n});for(let n of[...e.system.viewpoints].sort(U))t.push({kind:"viewpoint",id:n.id});for(let n of[...e.system.annotations].sort(U))t.push({kind:"annotation",id:n.id})}for(let n of[...e.groups].sort(U))t.push({kind:"group",id:n.id});for(let n of[...e.relations].sort(U))t.push({kind:"relation",id:n.id});for(let n of[...e.events].sort(U)){t.push({kind:"event",id:n.id});for(let r of[...n.positions].sort(Lr))t.push({kind:"event-pose",id:n.id,key:r.objectId})}for(let n of[...e.trajectories].sort(U)){t.push({kind:"trajectory",id:n.id});for(let r of[...n.segments].sort(U)){t.push({kind:"trajectory-segment",id:n.id,key:r.id});for(let i of[...r.maneuvers].sort(U))t.push({kind:"trajectory-maneuver",id:n.id,key:`${r.id}:${i.id}`})}}for(let n of[...e.objects].sort(U))t.push({kind:"object",id:n.id});return t}function Ut(e,t){switch(t.kind){case"system":return e.system;case"defaults":return e.system?.defaults??null;case"metadata":return t.key?e.system?.atlasMetadata[t.key]??null:null;case"group":return t.id?Or(e,t.id):null;case"event":return t.id?mt(e,t.id):null;case"event-pose":return t.id&&t.key?Mr(e,t.id,t.key):null;case"trajectory":return t.id?ht(e,t.id):null;case"trajectory-segment":return t.id&&t.key?yt(e,t.id,t.key):null;case"trajectory-maneuver":return t.id&&t.key?Tr(e,t.id,t.key):null;case"object":return t.id?kr(e,t.id):null;case"viewpoint":return t.id?Pr(e.system,t.id):null;case"annotation":return t.id?Dr(e.system,t.id):null;case"relation":return t.id?Sr(e,t.id):null}}function Wt(e,t,n){let r=pt(e),i=Ht(r);switch(t.kind){case"system":return r.system=n,r;case"defaults":return i.defaults={...i.defaults,...n},r;case"metadata":if(!t.key)throw new Error('Metadata updates require a "key" value.');return n==null||n===""?delete i.atlasMetadata[t.key]:i.atlasMetadata[t.key]=String(n),r;case"group":if(!t.id)throw new Error('Group updates require an "id" value.');return ye(r.groups,n),r;case"event":if(!t.id)throw new Error('Event updates require an "id" value.');return ye(r.events,n),r;case"event-pose":if(!t.id||!t.key)throw new Error('Event pose updates require an event "id" and pose "key" value.');return Ys(r.events,t.id,n),r;case"trajectory":if(!t.id)throw new Error('Trajectory updates require an "id" value.');return ye(r.trajectories,n),r;case"trajectory-segment":if(!t.id||!t.key)throw new Error('Trajectory segment updates require a trajectory "id" and segment "key" value.');return qs(r.trajectories,t.id,n),r;case"trajectory-maneuver":if(!t.id||!t.key)throw new Error('Trajectory maneuver updates require a trajectory "id" and maneuver "key" value.');return Hs(r.trajectories,t.id,t.key,n),r;case"object":if(!t.id)throw new Error('Object updates require an "id" value.');return ye(r.objects,n),r;case"viewpoint":if(!t.id)throw new Error('Viewpoint updates require an "id" value.');return ye(i.viewpoints,n),r;case"annotation":if(!t.id)throw new Error('Annotation updates require an "id" value.');return ye(i.annotations,n),r;case"relation":if(!t.id)throw new Error('Relation updates require an "id" value.');return ye(r.relations,n),r}}function $r(e,t,n){return Wt(e,t,n(Ut(e,t)))}function jr(e,t){let n=pt(e),r=Ht(n);switch(t.kind){case"metadata":return t.key&&delete r.atlasMetadata[t.key],n;case"object":return t.id&&(n.objects=n.objects.filter(i=>i.id!==t.id)),n;case"group":return t.id&&(n.groups=n.groups.filter(i=>i.id!==t.id)),n;case"event":return t.id&&(n.events=n.events.filter(i=>i.id!==t.id)),n;case"event-pose":if(t.id&&t.key){let i=mt(n,t.id);i&&(i.positions=i.positions.filter(a=>a.objectId!==t.key))}return n;case"trajectory":return t.id&&(n.trajectories=n.trajectories.filter(i=>i.id!==t.id)),n;case"trajectory-segment":if(t.id&&t.key){let i=ht(n,t.id);i&&(i.segments=i.segments.filter(a=>a.id!==t.key))}return n;case"trajectory-maneuver":if(t.id&&t.key){let i=Gt(t.key);if(i){let a=yt(n,t.id,i.segmentId);a&&(a.maneuvers=a.maneuvers.filter(o=>o.id!==i.maneuverId))}}return n;case"viewpoint":return t.id&&(r.viewpoints=r.viewpoints.filter(i=>i.id!==t.id)),n;case"annotation":return t.id&&(r.annotations=r.annotations.filter(i=>i.id!==t.id)),n;case"relation":return t.id&&(n.relations=n.relations.filter(i=>i.id!==t.id)),n;default:return n}}function Yt(e,t){return t.map(n=>({diagnostic:n,path:qt(e,n)}))}function qt(e,t){if(t.objectId&&kr(e,t.objectId))return{kind:"object",id:t.objectId};if(t.field?.startsWith("group.")){let n=t.field.split(".");if(n[1]&&Or(e,n[1]))return{kind:"group",id:n[1]}}if(t.field?.startsWith("viewpoint.")){let n=t.field.split(".");if(n[1]&&Pr(e.system,n[1]))return{kind:"viewpoint",id:n[1]}}if(t.field?.startsWith("annotation.")){let n=t.field.split(".");if(n[1]&&Dr(e.system,n[1]))return{kind:"annotation",id:n[1]}}if(t.field?.startsWith("relation.")){let n=t.field.split(".");if(n[1]&&Sr(e,n[1]))return{kind:"relation",id:n[1]}}if(t.field?.startsWith("event.")){let n=t.field.split(".");if(n[1]&&mt(e,n[1]))return n[2]==="pose"&&n[3]&&Mr(e,n[1],n[3])?{kind:"event-pose",id:n[1],key:n[3]}:{kind:"event",id:n[1]}}if(t.field?.startsWith("trajectory.")){let n=t.field.split(".");if(n[1]&&ht(e,n[1]))return n[2]==="segment"&&n[3]&&yt(e,n[1],n[3])?n[4]==="maneuver"&&n[5]&&Tr(e,n[1],`${n[3]}:${n[5]}`)?{kind:"trajectory-maneuver",id:n[1],key:`${n[3]}:${n[5]}`}:{kind:"trajectory-segment",id:n[1],key:n[3]}:{kind:"trajectory",id:n[1]}}return t.field&&t.field in Ht(e).atlasMetadata?{kind:"metadata",key:t.field}:null}function xr(e){let t=[...e.diagnostics,...Ne(e,e.version)];return Yt(e,t)}function Ht(e){return e.system||(e.system=Bt().system),e.system}function kr(e,t){return e.objects.find(n=>n.id===t)??null}function Or(e,t){return e.groups.find(n=>n.id===t)??null}function Sr(e,t){return e.relations.find(n=>n.id===t)??null}function mt(e,t){return e.events.find(n=>n.id===t)??null}function Mr(e,t,n){return mt(e,t)?.positions.find(r=>r.objectId===n)??null}function ht(e,t){return e.trajectories.find(n=>n.id===t)??null}function yt(e,t,n){return ht(e,t)?.segments.find(r=>r.id===n)??null}function Tr(e,t,n){let r=Gt(n);return r?yt(e,t,r.segmentId)?.maneuvers.find(i=>i.id===r.maneuverId)??null:null}function Pr(e,t){return e?.viewpoints.find(n=>n.id===t)??null}function Dr(e,t){return e?.annotations.find(n=>n.id===t)??null}function ye(e,t){let n=e.findIndex(r=>r.id===t.id);if(n===-1){e.push(t),e.sort(U);return}e[n]=t}function Ys(e,t,n){let r=e.find(a=>a.id===t);if(!r)throw new Error(`Unknown event "${t}" for pose update.`);let i=r.positions.findIndex(a=>a.objectId===n.objectId);if(i===-1){r.positions.push(n),r.positions.sort(Lr);return}r.positions[i]=n}function qs(e,t,n){let r=e.find(a=>a.id===t);if(!r)throw new Error(`Unknown trajectory "${t}" for segment update.`);let i=r.segments.findIndex(a=>a.id===n.id);if(i===-1){r.segments.push(n),r.segments.sort(U);return}r.segments[i]=n}function Hs(e,t,n,r){let i=Gt(n);if(!i)throw new Error(`Invalid trajectory maneuver key "${n}".`);let a=e.find(c=>c.id===t);if(!a)throw new Error(`Unknown trajectory "${t}" for maneuver update.`);let o=a.segments.find(c=>c.id===i.segmentId);if(!o)throw new Error(`Unknown trajectory segment "${i.segmentId}" on "${t}".`);let s=o.maneuvers.findIndex(c=>c.id===r.id);if(s===-1){o.maneuvers.push(r),o.maneuvers.sort(U);return}o.maneuvers[s]=r}function Gt(e){let t=e.indexOf(":");return t<=0||t>=e.length-1?null:{segmentId:e.slice(0,t),maneuverId:e.slice(t+1)}}function U(e,t){return e.id.localeCompare(t.id)}function Lr(e,t){return e.objectId.localeCompare(t.objectId)}var Gs=/^schema\s+(?:2(?:\.0|\.1|\.5|\.6)?|3(?:\.0|\.1)?)$/i,Ks=/^schema\s+2\.1$/i,Xs=/^schema\s+2\.5$/i,Zs=/^schema\s+2\.6$/i,Js=/^schema\s+3(?:\.0)?$/i,Qs=/^schema\s+3\.1$/i,ec=/^schema\s+2\.0-draft$/i;function Kt(e){for(let t of tc(e).split(/\r?\n/)){let n=t.trim();if(n)return ec.test(n)?"2.0-draft":Ks.test(n)?"2.1":Xs.test(n)?"2.5":Zs.test(n)?"2.6":Js.test(n)?"3.0":Qs.test(n)?"3.1":Gs.test(n)?"2.0":"1.0"}return"1.0"}function tc(e){let t=[...e],n=!1,r=!1;for(let i=0;i<t.length;i++){let a=t[i],o=t[i+1];if(r){if(a==="*"&&o==="/"){t[i]=" ",t[i+1]=" ",r=!1,i++;continue}a!==`
10
+ `&&a!=="\r"&&(t[i]=" ");continue}if(!n&&a==="/"&&o==="*"){t[i]=" ",t[i+1]=" ",r=!0,i++;continue}if(!n&&a==="#"){t[i]=" ";let s=i+1;for(;s<t.length&&t[s]!==`
11
+ `&&t[s]!=="\r";)t[s]=" ",s++;i=s-1;continue}a==='"'&&t[i-1]!=="\\"&&(n=!n)}return t.join("")}function gt(e){let t=Xt(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 Xt(e){let t=Kt(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 nc(e,t);let n;try{n=ne(e)}catch(i){return{ok:!1,value:null,diagnostics:[E(i,"parse")]}}let r;try{r=Z(n)}catch(i){return{ok:!1,value:null,diagnostics:[E(i,"normalize")]}}try{J(r)}catch(i){return{ok:!1,value:null,diagnostics:[E(i,"validate")]}}return{ok:!0,value:{schemaVersion:t,ast:n,document:r,atlasDocument:null,draftDocument:null,diagnostics:[]},diagnostics:[]}}function nc(e,t){let n;try{n=ft(e)}catch(o){return{ok:!1,value:null,diagnostics:[E(o,"parse","load.atlas.failed")]}}let r=[...n.diagnostics];if(r.some(o=>o.severity==="error"))return{ok:!1,value:null,diagnostics:r};let i;try{i=Re(n)}catch(o){return{ok:!1,value:null,diagnostics:[E(o,"normalize","load.atlas.materialize.failed")]}}return{ok:!0,value:{schemaVersion:t,ast:null,document:i,atlasDocument:n,draftDocument:n,diagnostics:r},diagnostics:r}}var rc=/^```worldorbit(?:\s+(.*))?\s*$/;function Ar(e){let t=e.split(/\r?\n/),n=[],r=!1,i=null,a=0,o=[];return t.forEach((s,c)=>{let l=c+1;if(!r){let u=s.match(rc);u&&(r=!0,i=u[1]??null,a=l,o=[]);return}if(s.trim()==="```"){n.push({source:o.join(`
12
+ `),info:i,startLine:a,endLine:l}),r=!1,i=null,a=0,o=[];return}o.push(s)}),n}function Fr(e){let t=ne(e),n=Z(t);return J(n),{ast:t,document:n}}function ic(e){let t=Fr(e);return{...t,scene:H(t.document)}}function ac(e){return gt(e)}function oc(e){return qe(e)}function sc(e,t={}){return ct(e,t)}return Yr(cc);})();