worldorbit 3.2.2 → 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 (82) hide show
  1. package/README.md +543 -543
  2. package/dist/browser/core/dist/atlas-edit.js +146 -1
  3. package/dist/browser/core/dist/atlas-validate.js +105 -10
  4. package/dist/browser/core/dist/draft-parse.js +461 -17
  5. package/dist/browser/core/dist/draft.d.ts +2 -1
  6. package/dist/browser/core/dist/draft.js +26 -4
  7. package/dist/browser/core/dist/format.js +126 -5
  8. package/dist/browser/core/dist/index.d.ts +1 -0
  9. package/dist/browser/core/dist/index.js +1 -0
  10. package/dist/browser/core/dist/load.js +12 -2
  11. package/dist/browser/core/dist/normalize.js +1 -0
  12. package/dist/browser/core/dist/scene.js +226 -5
  13. package/dist/browser/core/dist/schema.js +11 -1
  14. package/dist/browser/core/dist/solver.d.ts +33 -0
  15. package/dist/browser/core/dist/solver.js +99 -0
  16. package/dist/browser/core/dist/spatial-scene.js +56 -0
  17. package/dist/browser/core/dist/types.d.ts +130 -4
  18. package/dist/browser/editor/dist/editor.js +844 -719
  19. package/dist/browser/editor/dist/types.d.ts +2 -1
  20. package/dist/browser/viewer/dist/minimap.js +9 -7
  21. package/dist/browser/viewer/dist/render.js +78 -18
  22. package/dist/browser/viewer/dist/runtime-3d.js +2 -0
  23. package/dist/browser/viewer/dist/theme.js +1 -0
  24. package/dist/browser/viewer/dist/types.d.ts +7 -0
  25. package/dist/browser/viewer/dist/viewer.js +34 -3
  26. package/dist/obsidian-plugin/README.md +141 -124
  27. package/dist/obsidian-plugin/main.js +82 -68
  28. package/dist/unpkg/core/dist/atlas-edit.js +146 -1
  29. package/dist/unpkg/core/dist/atlas-validate.js +105 -10
  30. package/dist/unpkg/core/dist/draft-parse.js +461 -17
  31. package/dist/unpkg/core/dist/draft.d.ts +2 -1
  32. package/dist/unpkg/core/dist/draft.js +26 -4
  33. package/dist/unpkg/core/dist/format.js +126 -5
  34. package/dist/unpkg/core/dist/index.d.ts +1 -0
  35. package/dist/unpkg/core/dist/index.js +1 -0
  36. package/dist/unpkg/core/dist/load.js +12 -2
  37. package/dist/unpkg/core/dist/normalize.js +1 -0
  38. package/dist/unpkg/core/dist/scene.js +226 -5
  39. package/dist/unpkg/core/dist/schema.js +11 -1
  40. package/dist/unpkg/core/dist/solver.d.ts +33 -0
  41. package/dist/unpkg/core/dist/solver.js +99 -0
  42. package/dist/unpkg/core/dist/spatial-scene.js +56 -0
  43. package/dist/unpkg/core/dist/types.d.ts +130 -4
  44. package/dist/unpkg/editor/dist/editor.js +844 -719
  45. package/dist/unpkg/editor/dist/types.d.ts +2 -1
  46. package/dist/unpkg/viewer/dist/minimap.js +9 -7
  47. package/dist/unpkg/viewer/dist/render.js +78 -18
  48. package/dist/unpkg/viewer/dist/runtime-3d.js +2 -0
  49. package/dist/unpkg/viewer/dist/theme.js +1 -0
  50. package/dist/unpkg/viewer/dist/types.d.ts +7 -0
  51. package/dist/unpkg/viewer/dist/viewer.js +34 -3
  52. package/dist/unpkg/worldorbit-core.min.js +12 -12
  53. package/dist/unpkg/worldorbit-editor.min.js +381 -340
  54. package/dist/unpkg/worldorbit-markdown.min.js +47 -33
  55. package/dist/unpkg/worldorbit-viewer.min.js +238 -224
  56. package/dist/unpkg/worldorbit.js +1218 -46
  57. package/dist/unpkg/worldorbit.min.js +242 -228
  58. package/package.json +5 -1
  59. package/packages/core/dist/atlas-edit.js +146 -1
  60. package/packages/core/dist/atlas-validate.js +105 -10
  61. package/packages/core/dist/draft-parse.js +461 -17
  62. package/packages/core/dist/draft.d.ts +2 -1
  63. package/packages/core/dist/draft.js +26 -4
  64. package/packages/core/dist/format.js +126 -5
  65. package/packages/core/dist/index.d.ts +1 -0
  66. package/packages/core/dist/index.js +1 -0
  67. package/packages/core/dist/load.js +12 -2
  68. package/packages/core/dist/normalize.js +1 -0
  69. package/packages/core/dist/scene.js +226 -5
  70. package/packages/core/dist/schema.js +11 -1
  71. package/packages/core/dist/solver.d.ts +33 -0
  72. package/packages/core/dist/solver.js +99 -0
  73. package/packages/core/dist/spatial-scene.js +56 -0
  74. package/packages/core/dist/types.d.ts +130 -4
  75. package/packages/editor/dist/editor.js +844 -719
  76. package/packages/editor/dist/types.d.ts +2 -1
  77. package/packages/viewer/dist/minimap.js +9 -7
  78. package/packages/viewer/dist/render.js +78 -18
  79. package/packages/viewer/dist/runtime-3d.js +2 -0
  80. package/packages/viewer/dist/theme.js +1 -0
  81. package/packages/viewer/dist/types.d.ts +7 -0
  82. package/packages/viewer/dist/viewer.js +34 -3
@@ -1,12 +1,12 @@
1
- "use strict";var WorldOrbitCore=(()=>{var dt=Object.defineProperty;var kr=Object.getOwnPropertyDescriptor;var Or=Object.getOwnPropertyNames;var Sr=Object.prototype.hasOwnProperty;var Pr=(e,t)=>{for(var n in t)dt(e,n,{get:t[n],enumerable:!0})},Mr=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Or(t))!Sr.call(e,i)&&i!==n&&dt(e,i,{get:()=>t[i],enumerable:!(r=kr(t,i))||r.enumerable});return e};var Tr=e=>Mr(dt({},"__esModule",{value:!0}),e);var ws={};Pr(ws,{WORLDORBIT_FIELD_KEYS:()=>Yt,WORLDORBIT_FIELD_SCHEMAS:()=>ft,WORLDORBIT_OBJECT_TYPES:()=>be,WorldOrbitError:()=>f,cloneAtlasDocument:()=>st,createDiagnostic:()=>Zt,createEmptyAtlasDocument:()=>Et,detectWorldOrbitSchemaVersion:()=>Bt,diagnosticFromError:()=>L,evaluateSpatialSceneAtTime:()=>On,extractWorldOrbitBlocks:()=>br,formatAtlasDocument:()=>Qe,formatDocument:()=>et,formatDraftDocument:()=>xt,getAtlasDocumentNode:()=>Ft,getFieldSchema:()=>D,isKnownFieldKey:()=>pt,listAtlasDocumentPaths:()=>sr,load:()=>ys,loadWorldOrbitSource:()=>lt,loadWorldOrbitSourceWithDiagnostics:()=>Ct,materializeAtlasDocument:()=>Pe,materializeDraftDocument:()=>Tn,normalizeDocument:()=>U,normalizeWithDiagnostics:()=>Jt,parse:()=>vr,parseSafe:()=>bs,parseWithDiagnostics:()=>Ne,parseWorldOrbit:()=>Z,parseWorldOrbitAtlas:()=>at,parseWorldOrbitDraft:()=>Zn,removeAtlasDocumentNode:()=>lr,render:()=>gs,renderDocumentToScene:()=>Y,renderDocumentToSpatialScene:()=>kn,resolveAtlasDiagnosticPath:()=>zt,resolveAtlasDiagnostics:()=>_t,rotatePoint:()=>ln,stringify:()=>vs,supportsObjectType:()=>mt,tokenizeLine:()=>qt,tokenizeLineDetailed:()=>oe,unitFamilyAllowsUnit:()=>ve,updateAtlasDocumentNode:()=>cr,upgradeDocumentToDraftV2:()=>Je,upgradeDocumentToV2:()=>Se,upsertAtlasDocumentNode:()=>Rt,validateAtlasDocumentWithDiagnostics:()=>ur,validateDocument:()=>W,validateDocumentWithDiagnostics:()=>Qt});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 ye=["system","star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],F=ye.filter(e=>e!=="system"),Dr=["star","planet","moon","asteroid","comet","structure","phenomenon"],Wt=["structure","phenomenon"],X=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],Ar=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"];function $(e,t){return{key:e,...t}}var be=new Set(ye),ft=new Map([$("orbit",{kind:"string",placement:!0,arity:"single",objectTypes:X}),$("distance",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"distance"}),$("semiMajor",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"distance"}),$("eccentricity",{kind:"number",placement:!0,arity:"single",objectTypes:X}),$("period",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"duration"}),$("angle",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"angle"}),$("inclination",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"angle"}),$("phase",{kind:"unit",placement:!0,arity:"single",objectTypes:X,unitFamily:"angle"}),$("at",{kind:"string",placement:!0,arity:"single",objectTypes:Wt}),$("surface",{kind:"string",placement:!0,arity:"single",objectTypes:Wt}),$("free",{kind:"string",placement:!0,arity:"single",objectTypes:Ar}),$("kind",{kind:"string",placement:!1,arity:"single",objectTypes:F}),$("class",{kind:"string",placement:!1,arity:"single",objectTypes:F}),$("culture",{kind:"string",placement:!1,arity:"single",objectTypes:F}),$("tags",{kind:"list",placement:!1,arity:"multiple",objectTypes:ye}),$("color",{kind:"string",placement:!1,arity:"single",objectTypes:ye}),$("image",{kind:"string",placement:!1,arity:"single",objectTypes:Dr}),$("hidden",{kind:"boolean",placement:!1,arity:"single",objectTypes:ye}),$("radius",{kind:"unit",placement:!1,arity:"single",objectTypes:F,unitFamily:"radius"}),$("mass",{kind:"unit",placement:!1,arity:"single",objectTypes:F,unitFamily:"mass"}),$("density",{kind:"unit",placement:!1,arity:"single",objectTypes:F,unitFamily:"generic"}),$("gravity",{kind:"unit",placement:!1,arity:"single",objectTypes:F,unitFamily:"generic"}),$("temperature",{kind:"unit",placement:!1,arity:"single",objectTypes:F,unitFamily:"generic"}),$("albedo",{kind:"number",placement:!1,arity:"single",objectTypes:F}),$("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:F}),$("source",{kind:"string",placement:!1,arity:"single",objectTypes:F}),$("cycle",{kind:"unit",placement:!1,arity:"single",objectTypes:F,unitFamily:"duration"})].map(e=>[e.key,e])),Yt=new Set(ft.keys());function D(e){return ft.get(e)}function pt(e){return Yt.has(e)}function mt(e,t){return e.objectTypes.includes(t)}function ve(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 qt(e){return oe(e).map(t=>t.value)}function oe(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 d=e[u],p=r+u+1;if(c&&d==="\\"){let m=e[u+1];if(m==='"'||m==="\\"){i+=m,u++;continue}}if(d==='"'){c?c=!1:(a===null&&(a=p),o=!0,s=p,c=!0);continue}if(!c&&/\s/.test(d)){l();continue}a===null&&(a=p),i+=d}if(c)throw new f("Unclosed quote in line",t.line,s??r+e.length);return l(),n}function Re(e){return e.match(/^\s*/)?.[0].length??0}function Z(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 d=0;d<t.length;d++){let p=t[d],m=d+1;if(!p.trim())continue;let g=Re(p),h=oe(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=Lr(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(Rr(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 f("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(_r(h,m)):i.blockFields.push(Fr(h,m))}}return{type:"document",theme:r,objects:n}}function Lr(e,t){if(e.length<2)throw new f("Invalid object declaration",t,e[0]?.column??1);let[n,r,...i]=e;if(!be.has(n.value))throw new f(`Unknown object type "${n.value}"`,t,n.column);return{type:"object",objectType:n.value,name:r.value,inlineFields:Er(i,t),blockFields:[],infoEntries:[],location:{line:t,column:n.column}}}function Er(e,t){let n=[],r=0;for(;r<e.length;){let i=e[r],a=D(i.value);if(!a)throw new f(`Unknown field "${i.value}"`,t,i.column);r++;let o=[];if(a.arity==="multiple")for(;r<e.length&&!pt(e[r].value);)o.push(e[r]),r++;else{let c=e[r];c&&(o.push(c),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(c=>c.value),location:{line:t,column:i.column}})}return n}function Fr(e,t){if(e.length<2)throw new f("Invalid field line",t,e[0]?.column??1);if(!D(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 Rr(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 _r(e,t){if(e.length<2)throw new f("Invalid info entry",t,e[0]?.column??1);return{type:"info-entry",key:e[0].value,value:e.slice(1).map(n=>n.value).join(" "),location:{line:t,column:e[0].column}}}var Gt=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,zr=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),Nr=/^[A-Za-z][A-Za-z0-9+.-]*:/;function U(e){let t=null,n=[],r=e.theme?Br(e.theme):null;for(let i of e.objects){let a=Vr(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:[],objects:n}}function Br(e){let t={};for(let n of e.blocks){let r=Ht(n.fields);t[n.target]=Cr(r)}return{preset:e.preset,styles:t}}function Cr(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 Vr(e){let t=[...e.inlineFields,...e.blockFields];Ur(e.objectType,t);let n=Ht(t),r=Wr(e.objectType,n),i=Yr(n),a=Hr(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 Ur(e,t){for(let n of t){let r=D(n.key);if(!r)throw f.fromLocation(`Unknown field "${n.key}"`,n.location);if(!mt(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 Ht(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 Wr(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 f.fromLocation("Object has multiple placement modes",c?.location)}if(e==="system"&&o>0)throw f.fromLocation("System objects cannot declare placement",[...t.values()][0]?.location);if(n)return{mode:"orbit",target:_e(t,"orbit"),distance:ue(t,"distance"),semiMajor:ue(t,"semiMajor"),eccentricity:Zr(t,"eccentricity"),period:ue(t,"period"),angle:ue(t,"angle"),inclination:ue(t,"inclination"),phase:ue(t,"phase")};if(r){let c=ze(t,"at"),s=_e(t,"at");return{mode:"at",target:s,reference:Kr(s,c.location)}}if(i)return{mode:"surface",target:_e(t,"surface")};if(a){let c=_e(t,"free"),s=Xr(c);return{mode:"free",distance:s??void 0,descriptor:s?void 0:c}}return null}function Yr(e){let t={};for(let[n,r]of e.entries()){let i=D(n);if(!(!i||i.placement))switch(i.kind){case"list":t[n]=r.values;break;case"boolean":t[n]=Jr(r);break;case"number":t[n]=Xt(de(r),n,r.location);break;case"unit":t[n]=Kt(de(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"&&Gr(n,t.location),n}function Gr(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(Nr);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 Hr(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 Kr(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 Kt(e,t,n){let r=e.match(Gt);if(!r)throw f.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let a=D(n);if(a?.unitFamily&&!ve(a.unitFamily,i.unit))throw f.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function Xr(e){let t=e.match(Gt);return t?{value:Number(t[1]),unit:t[2]??null}:null}function ue(e,t){if(!e.has(t))return;let n=ze(e,t);return Kt(de(n),n.location,t)}function Zr(e,t){if(!e.has(t))return;let n=ze(e,t);return Xt(de(n),t,n.location)}function Xt(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw f.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function Jr(e){let t=de(e).toLowerCase(),n=zr.get(t);if(n===void 0)throw f.fromLocation(`Invalid boolean value "${t}" for "${e.key}"`,e.location);return n}function ze(e,t){let n=e.get(t);if(!n)throw new f(`Missing value for key "${t}"`);return n}function _e(e,t){return de(ze(e,t))}function de(e){if(e.values.length!==1)throw f.fromLocation(`Field "${e.key}" expects exactly one value`,e.location);return e.values[0]}var Qr=new Set(["star","planet","moon","asteroid","comet"]);function W(e){let t=new Set,n=new Map;for(let r of e.objects){if(t.has(r.id))throw new f(`Duplicate object id "${r.id}"`);t.add(r.id),n.set(r.id,r)}for(let r of e.objects)if(r.placement){if((r.placement.mode==="orbit"||r.placement.mode==="surface")&&!t.has(r.placement.target))throw new f(`Unknown placement target "${r.placement.target}" on "${r.id}"`);if(r.placement.mode==="surface"){let i=n.get(r.placement.target);if(!i||!Qr.has(i.type))throw new f(`Surface target "${r.placement.target}" on "${r.id}" is not surface-capable`)}r.placement.mode==="at"&&(r.placement.reference.kind==="lagrange"&&ei(r,r.placement.reference,t),r.placement.reference.kind==="anchor"&&ti(r,r.placement.reference,t))}}function ei(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 ti(e,t,n){if(!n.has(t.objectId))throw new f(`Unknown anchor target "${t.objectId}" on "${e.id}"`)}function Zt(e){return{...e}}function L(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 Ne(e){let t;try{t=Z(e)}catch(r){return{ok:!1,value:null,diagnostics:[L(r,"parse")]}}let n;try{n=U(t)}catch(r){return{ok:!1,value:null,diagnostics:[L(r,"normalize")]}}try{W(n)}catch(r){return{ok:!1,value:null,diagnostics:[L(r,"validate")]}}return{ok:!0,value:{ast:t,document:n},diagnostics:[]}}function Jt(e){try{return{ok:!0,value:U(e),diagnostics:[]}}catch(t){return{ok:!1,value:null,diagnostics:[L(t,"normalize")]}}}function Qt(e){try{return W(e),{ok:!0,value:e,diagnostics:[]}}catch(t){return{ok:!1,value:null,diagnostics:[L(t,"validate")]}}}var we=1495978707e-1,ni=6371,ri=71492,ii=695700,ai=63241.077,oi=206264.806,si=206264806,sn=.68,ci=.2,cn=28;function Y(e,t={}){let n=di(t),r=n.width,i=n.height,a=n.padding,o=ui(e),c=pi(e,t.projection),s=vt(t.camera??null),l=bt(c,s),u=bi(o),d=gi(o,t.scaleModel,t.bodyScaleMode),p=e.system?.id??null,m=t.activeEventId??null,g=li(e.objects,e.events??[],m),h=vi(g,r,i,a,u,d),I=new Map(g.map(v=>[v.id,v])),P=na(g,I),b=new Map,k=[],T=[],B=[],A=[],C=[],G=new Map,ie=new Map;for(let v of g){let E=v.placement;if(!E){B.push(v);continue}if(E.mode==="orbit"){rn(ie,E.target,v);continue}if(E.mode==="surface"){rn(G,E.target,v);continue}if(E.mode==="at"){C.push(v);continue}A.push(v)}let M=A.length>0?r*.42:r/2,le=i/2,_={orbitChildren:ie,surfaceChildren:G,objectMap:I,spacingFactor:u,projection:l,scaleModel:d,sceneMetricScale:h},V=B.find(v=>v.type==="star")??B[0]??null;V&&gt(V,M,le,0,b,k,T,_);let H=B.filter(v=>v.id!==V?.id);if(H.length>0){let v=Math.min(r,i)*.28*u*d.orbitDistanceMultiplier;H.forEach((E,S)=>{let ut=ke(S,H.length,-Math.PI/2),ae=Oe(ut,v,l,1);gt(E,M+ae.x,le+ae.y,0,b,k,T,_)})}A.forEach((v,E)=>{let S=r-a-140-ca(v.placement?.mode==="free"?v.placement.distance:void 0,d,h),ut=Math.max(76,(i-a*2-180)/Math.max(1,A.length)*u)*d.freePlacementMultiplier,ae=a+92+E*ut;b.set(v.id,{object:v,x:S,y:ae,radius:We(v,0,d,h),sortKey:qe(S,ae,0)}),T.push({object:v,groupId:P.groupIds.get(v.id)??null,x1:S-60,y1:ae,x2:S-18,y2:ae,mode:"free"}),Ve(v,b,k,T,_,1)}),C.forEach((v,E)=>{if(b.has(v.id)||!v.placement||v.placement.mode!=="at")return;let S=ea(v.placement.reference,b,I,E,C.length,r,i,a,_);b.set(v.id,{object:v,x:S.x,y:S.y,radius:We(v,2,d,h),sortKey:qe(S.x,S.y,2),anchorX:S.anchorX,anchorY:S.anchorY}),S.anchorX!==void 0&&S.anchorY!==void 0&&T.push({object:v,groupId:P.groupIds.get(v.id)??null,x1:S.anchorX,y1:S.anchorY,x2:S.x,y2:S.y,mode:"at"}),Ve(v,b,k,T,_,2)});let K=[...b.values()].map(v=>wi(v,d,P)),Le=k.map(v=>Ii(v,P.groupIds.get(v.object.id)??null)),Ee=T.map(v=>$i(v)),Fe=xi(K,r,i,d.labelMultiplier),Vt=Di(e,K),Ut=Ai(e.events??[],K,m),wr=Pi(Le,Vt,Ut,Ee,K,Fe),Ir=Mi(K,Le,Ee,Fe,P,d.labelMultiplier),$r=Ti(e,K),xr=Li(e,c,n.preset,P,I),jr=Yi(r,i,K,Le,Ee,Fe,d.labelMultiplier);return{width:r,height:i,padding:a,renderPreset:n.preset,projection:c,renderProjection:l,camera:s,scaleModel:d,title:String(e.system?.title??e.system?.properties.title??e.system?.id??"WorldOrbit")||"WorldOrbit",subtitle:hi(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":d.bodyScaleMode,...s?.azimuth!==null?{"camera.azimuth":String(s?.azimuth)}:{},...s?.elevation!==null?{"camera.elevation":String(s?.elevation)}:{},...s?.roll!==null?{"camera.roll":String(s?.roll)}:{},...s?.distance!==null?{"camera.distance":String(s?.distance)}:{}},contentBounds:jr,layers:wr,groups:Ir,semanticGroups:$r,viewpoints:xr,events:Ut,activeEventId:m,objects:K,orbitVisuals:Le,relations:Vt,leaders:Ee,labels:Fe}}function ln(e,t,n){let r=Ge(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 li(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 ui(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 di(e){let t=fi(e.preset);return{width:e.width??t.width,height:e.height??t.height,padding:e.padding??t.padding,preset:e.preset??null}}function fi(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 pi(e,t){if(t==="topdown"||t==="isometric"||t==="orthographic"||t==="perspective")return t;let n=String(e.system?.properties.view??"topdown").toLowerCase();return fn(n)??"topdown"}function bt(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 vt(e){if(!e)return null;let t={azimuth:ht(e.azimuth),elevation:ht(e.elevation),roll:ht(e.roll),distance:mi(e.distance)};return t.azimuth!==null||t.elevation!==null||t.roll!==null||t.distance!==null?t:null}function ht(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function mi(e){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:null}function hi(e,t,n,r){let i=[`${an(e)} view`,`${an(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 gi(e,t,n){return{...yi(e),...n?{bodyScaleMode:n}:{},...t}}function yi(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 bi(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function vi(e,t,n,r,i,a){let o=[],c=[];for(let m of e){let g=ua(m);g!==null&&g>0&&c.push(g);let h=m.placement;if(h){if(h.mode==="orbit"){let I=J(h.semiMajor??h.distance??null);I!==null&&I>0&&o.push(I);continue}if(h.mode==="free"){let I=J(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),d=u+Math.max(Math.sqrt(u),l*2,s>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 wi(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:fe(r.id),objectId:r.id,object:r,parentId:n.parentIds.get(r.id)??null,ancestorIds:n.ancestorIds.get(r.id)??[],childIds:n.childIds.get(r.id)??[],groupId:n.groupIds.get(r.id)??null,semanticGroupIds:[...r.groups??[]],x:i,y:a,radius:o,visualRadius:sa(r,o,t),sortKey:c+u*.001,anchorX:s,anchorY:l,label:r.id,secondaryLabel:r.type==="structure"?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 Ii(e,t){return{renderId:`${fe(e.object.id)}-orbit`,objectId:e.object.id,object:e.object,parentId:e.parentId,groupId:t,semanticGroupIds:[...e.object.groups??[]],kind:e.kind,cx:e.cx,cy:e.cy,radius:e.radius,rx:e.rx,ry:e.ry,rotationDeg:e.rotationDeg,band:e.band,bandThickness:e.bandThickness,frontArcPath:e.frontArcPath,backArcPath:e.backArcPath,hidden:e.object.properties.hidden===!0||e.object.renderHints?.renderOrbit===!1}}function $i(e){return{renderId:`${fe(e.object.id)}-leader-${e.mode}`,objectId:e.object.id,object:e.object,groupId:e.groupId,semanticGroupIds:[...e.object.groups??[]],x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,mode:e.mode,hidden:e.object.properties.hidden===!0}}function xi(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(ji);for(let s of c){let l=ki(s,o,a,t,n,r)??dn(s,un(s,o.get(s.parentId??"")??null,n),0,r);a.push(yn(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 ji(e,t){let n=en(e)-en(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 en(e){switch(e.object.type){case"star":return 0;case"planet":return 1;case"moon":return 2;case"belt":case"ring":return 3;case"asteroid":case"comet":return 4;case"structure":case"phenomenon":return 5}}function ki(e,t,n,r,i,a){for(let o of Oi(e,t,r,i)){let c=o==="left"||o==="right"?4:6;for(let s=0;s<=c;s+=1){let l=dn(e,o,s,a),u=yn(e,l,a);if(!n.some(d=>aa(d,u)))return l}}return null}function Oi(e,t,n,r){let i=e.parentId?t.get(e.parentId)??null:null,a=un(e,i,r),o=a==="below"?"above":"below",c=Si(e,i,n),s=c==="right"?"left":"right";return e.object.type==="structure"||e.object.type==="phenomenon"||e.object.placement?.mode==="at"||e.object.placement?.mode==="surface"||e.object.placement?.mode==="free"?[c,a,s,o]:[a,c,o,s]}function un(e,t,n){return t&&Math.abs(e.y-t.y)>6?e.y>=t.y?"below":"above":e.y>n*.62?"above":"below"}function Si(e,t,n){return t&&Math.abs(e.x-t.x)>6?e.x>=t.x?"right":"left":e.x>=n/2?"right":"left"}function dn(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 Pi(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 Mi(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,d={renderId:s,rootObjectId:u,label:u??s,objectIds:[],orbitIds:[],labelIds:[],leaderIds:[],contentBounds:je(0,0,0,0)};return o.set(s,d),d};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=ra(s,e,t,n,r,a);return[...o.values()].sort((s,l)=>s.label.localeCompare(l.label))}function Ti(e,t){return[...e.groups].map(n=>({id:n.id,label:n.label,summary:n.summary,color:n.color,tags:[...n.tags],hidden:n.hidden,objectIds:t.filter(r=>!r.hidden&&r.semanticGroupIds.includes(n.id)).map(r=>r.objectId)})).sort((n,r)=>n.label.localeCompare(r.label))}function Di(e,t){let n=new Map(t.map(r=>[r.objectId,r]));return e.relations.map(r=>{let i=n.get(r.from),a=n.get(r.to);return{renderId:`${fe(r.id)}-relation`,relationId:r.id,relation:r,fromObjectId:r.from,toObjectId:r.to,x1:i?.x??0,y1:i?.y??0,x2: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 Ai(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:`${fe(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 Li(e,t,n,r,i){let a=Ei(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 g=Vi(p);if(!g)continue;let h=m.join(".").toLowerCase(),I=o.get(g)??{id:g};Fi(I,h,u,e,t,n,r,i),o.set(g,I)}let c=[...o.values()].map(l=>Ri(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 Ei(e,t,n){let r=e.system?.title??e.system?.properties.title,i=r?`${String(r)} Overview`:"Overview",a=vt(null),o=bt(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 Fi(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=xe(s);return;case"projection":case"view":e.projection=fn(s)??i;return;case"preset":e.preset=zi(s)??a;return;case"rotation":case"angle":e.rotationDeg=Ie(s)??e.rotationDeg??0;return;case"camera.azimuth":e.camera={...e.camera??Ce(),azimuth:Ie(s)};return;case"camera.elevation":e.camera={...e.camera??Ce(),elevation:Ie(s)};return;case"camera.roll":e.camera={...e.camera??Ce(),roll:Ie(s)};return;case"camera.distance":e.camera={...e.camera??Ce(),distance:tn(s)};return;case"zoom":case"scale":e.scale=tn(s);return;case"layers":e.layers=Ni(s);return;case"query":e.filter={...e.filter??Be(),query:s||null};return;case"types":case"objecttypes":e.filter={...e.filter??Be(),objectTypes:Bi(s)};return;case"tags":e.filter={...e.filter??Be(),tags:xe(s)};return;case"groups":e.filter={...e.filter??Be(),groupIds:Ci(s,r,o,c)};return}}function Ri(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=_i(e.filter),c=e.label?.trim()||Ui(e.id),s=e.projection??t,l=vt(e.camera??null),u=bt(s,l);return{id:e.id,label:c,summary:e.summary?.trim()||Wi(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 Be(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Ce(){return{azimuth:null,elevation:null,roll:null,distance:null}}function _i(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 fn(e){switch(e.toLowerCase()){case"topdown":return"topdown";case"isometric":return"isometric";case"orthographic":return"orthographic";case"perspective":return"perspective";default:return null}}function zi(e){let t=e.toLowerCase();return t==="diagram"||t==="presentation"||t==="atlas-card"||t==="markdown"?t:null}function Ie(e){let t=Number(e);return Number.isFinite(t)?t:null}function tn(e){let t=Ie(e);return t!==null&&t>0?t:null}function Ni(e){let t={};for(let n of xe(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 Bi(e){return xe(e).filter(t=>t==="star"||t==="planet"||t==="moon"||t==="belt"||t==="asteroid"||t==="comet"||t==="ring"||t==="structure"||t==="phenomenon")}function Ci(e,t,n,r){return xe(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)??$e(i):(r.has(i),$e(i)))}function xe(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function Vi(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function Ui(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Wi(e,t,n){let r=[e];return t&&r.push(`focus ${t}`),n?.objectTypes.length&&r.push(n.objectTypes.join("/")),n?.tags.length&&r.push(`tags ${n.tags.join(", ")}`),n?.query&&r.push(`query "${n.query}"`),r.join(" - ")}function Yi(e,t,n,r,i,a,o){let c=Number.POSITIVE_INFINITY,s=Number.POSITIVE_INFINITY,l=Number.NEGATIVE_INFINITY,u=Number.NEGATIVE_INFINITY,d=(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||pn(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||mn(p,d);for(let p of a)p.hidden||hn(p,d,o);return!Number.isFinite(c)||!Number.isFinite(s)?je(0,0,e,t):je(c,s,l,u)}function pn(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=vn(e.cx,e.cy,r,i,e.rotationDeg,0,Math.PI*2,cn*2);for(let o of a)t(o.x-n,o.y-n),t(o.x+n,o.y+n)}function je(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 mn(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 hn(e,t,n){let r=bn(e.x,e.y,e.secondaryY,e.textAnchor,e.direction,e.label,e.secondaryLabel,n);t(r.left,r.top),t(r.right,r.bottom)}function gt(e,t,n,r,i,a,o,c){i.has(e.id)||(i.set(e.id,{object:e,x:t,y:n,radius:We(e,r,c.scaleModel,c.sceneMetricScale),sortKey:qe(t,n,r)}),Ve(e,i,a,o,c,r+1))}function Ve(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=Gi(c,o.radius,i.spacingFactor,i.scaleModel,i.sceneMetricScale),l=Xi(c,s);c.forEach((d,p)=>{let m=Hi(d,p,c.length,o,s,l[p]??s.innerPx,i);n.push({object:d,parentId:e.id,kind:m.kind,cx:m.cx,cy:m.cy,radius:m.radius,rx:m.rx,ry:m.ry,rotationDeg:m.rotationDeg,band:m.band,bandThickness:m.bandThickness,frontArcPath:m.frontArcPath,backArcPath:m.backArcPath}),gt(d,m.objectX,m.objectY,a,t,n,r,i)});let u=[...i.surfaceChildren.get(e.id)??[]];u.forEach((d,p)=>{let m=ke(p,u.length,-Math.PI/3),g=28*i.spacingFactor,h=Oe(m,o.radius,i.projection,i.projection==="isometric"?.9:1),I=Oe(m,o.radius+g,i.projection,i.projection==="isometric"?.9:1),P=o.x+h.x,b=o.y+h.y,k=o.x+I.x,T=o.y+I.y;t.set(d.id,{object:d,x:k,y:T,radius:We(d,a+1,i.scaleModel,i.sceneMetricScale),sortKey:qe(k,T,a+1),anchorX:P,anchorY:b}),r.push({object:d,groupId:i.objectMap.has(d.id)?$e(ia(d,i.objectMap)):null,x1:P,y1:b,x2:k,y2:T,mode:"surface"}),Ve(d,t,n,r,i,a+1)})}function qi(e,t){let n=Ue(e),r=Ue(t);return n!==null&&r!==null&&n!==r?n-r:n!==null&&r===null?-1:n===null&&r!==null?1:e.id.localeCompare(t.id)}function Gi(e,t,n,r,i){let a=e.map(m=>Ue(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),d=Math.max(...o),p=d-u;return{metrics:a,minMetric:u,maxMetric:d,metricSpread:p,innerPx:s,stepPx:l,pixelSpread:Math.max(l*Math.max(e.length-1,1),l),minimumGapPx:c,pixelsPerMetric:i.pixelsPerMetric}}function Hi(e,t,n,r,i,a,o){let c=e.placement,s=e.type==="belt"||e.type==="ring";if(!c||c.mode!=="orbit"){let G=i.innerPx+t*i.stepPx;return{kind:"circle",cx:r.x,cy:r.y,radius:G,rotationDeg:0,band:s,bandThickness:s?12*o.scaleModel.ringThicknessMultiplier:void 0,objectX:r.x,objectY:r.y-G}}let l=O(typeof c.eccentricity=="number"?c.eccentricity:0,0,.92),u=a,d=Math.max(u*Math.sqrt(1-l*l),u*.18),p=yt(c.inclination)??0,m=o.projection==="isometric"?Math.max(ci,Math.cos(Ge(p)))*sn:1,g=Math.max(d*m,u*.14),h=yt(c.angle)??0,I=u*l,P=In(-I,0,h),b=r.x+P.x,k=r.y+P.y,T=Ji(c.phase,t,n),B=wn(b,k,u,g,h,T),A=o.projection==="topdown"&&l<=1e-4&&Math.abs(h)<=1e-4,C=s?Qi(e,u,i,o.scaleModel):void 0;return{kind:A?"circle":"ellipse",cx:A?r.x:b,cy:A?r.y:k,radius:A?u:void 0,rx:A?void 0:u,ry:A?void 0:g,rotationDeg:h,band:s,bandThickness:C,frontArcPath:o.projection==="isometric"||s?nn(b,k,u,g,h,0,Math.PI):void 0,backArcPath:o.projection==="isometric"||s?nn(b,k,u,g,h,Math.PI,Math.PI*2):void 0,objectX:B.x,objectY:B.y}}function Ki(e,t){return t.pixelsPerMetric!==null?e*t.pixelsPerMetric:t.innerPx+t.stepPx*Zi(Math.max(e,0)+1)}function Xi(e,t){let n=[];return e.forEach((r,i)=>{let a=Ue(r),o=t.innerPx+i*t.stepPx,c=a===null?o:Ki(a,t),s=i===0?t.innerPx:(n[i-1]??t.innerPx)+t.minimumGapPx;n.push(Math.max(c,s))}),n}function Ue(e){return!e.placement||e.placement.mode!=="orbit"?null:J(e.placement.semiMajor??e.placement.distance??null)}function Zi(e){return Math.log(e)/Math.log(2)}function Ji(e,t,n){let r=e?yt(e):null;return r!==null?Ge(r-90):ke(t,n,-Math.PI/2)}function Qi(e,t,n,r){let i=J(Ye(e.properties.inner)),a=J(Ye(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):O(Math.max(l*r.ringThicknessMultiplier,8),8,54)}if(n.metricSpread>0)return O(c/n.metricSpread*n.pixelSpread*r.ringThicknessMultiplier,8,54);let s=Math.max(Math.max(i,a),1e-4);return O(c/s*t*.75*r.ringThicknessMultiplier,8,48)}return(e.type==="belt"?18:12)*r.ringThicknessMultiplier}function ea(e,t,n,r,i,a,o,c,s){if(e.kind==="lagrange")return ta(e,t,n,a,o);if(e.kind==="anchor"){let l=t.get(e.objectId);if(l){let u=ke(r,i,Math.PI/5),d=(l.radius+36)*s.scaleModel.labelMultiplier,p=Oe(u,d,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=ke(r,i,Math.PI/6),d=(l.radius+36)*s.scaleModel.labelMultiplier,p=Oe(u,d,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 ta(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 c=o.x-a.x,s=o.y-a.y,l=Math.hypot(c,s)||1,u=c/l,d=s/l,p=-d,m=u,g=O(l*.25,24,68);switch(e.point){case"L1":return{x:o.x-u*g,y:o.y-d*g,anchorX:o.x,anchorY:o.y};case"L2":return{x:o.x+u*g,y:o.y+d*g,anchorX:o.x,anchorY:o.y};case"L3":return{x:a.x-u*g,y:a.y-d*g,anchorX:a.x,anchorY:a.y};case"L4":return{x:o.x+(u*.5-p*.8660254)*g,y:o.y+(d*.5-m*.8660254)*g,anchorX:o.x,anchorY:o.y};case"L5":return{x:o.x+(u*.5+p*.8660254)*g,y:o.y+(d*.5+m*.8660254)*g,anchorX:o.x,anchorY:o.y}}}function na(e,t){let n=new Map,r=new Map;for(let l of e){let u=gn(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,c=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},s=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=s(d)),m};for(let l of e){c(l.id);let u=s(l.id),d=$e(u);a.set(l.id,d),o.set(d,u)}return{parentIds:n,childIds:r,ancestorIds:i,groupIds:a,groupRoots:o}}function gn(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 ra(e,t,n,r,i,a){let o=Number.POSITIVE_INFINITY,c=Number.POSITIVE_INFINITY,s=Number.NEGATIVE_INFINITY,l=Number.NEGATIVE_INFINITY,u=(d,p)=>{o=Math.min(o,d),c=Math.min(c,p),s=Math.max(s,d),l=Math.max(l,p)};for(let d of t)!d.hidden&&e.objectIds.includes(d.objectId)&&mn(d,u);for(let d of n)!d.hidden&&e.orbitIds.includes(d.objectId)&&pn(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)&&hn(d,u,a);return!Number.isFinite(o)||!Number.isFinite(c)?je(0,0,0,0):je(o,c,s,l)}function ia(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=gn(n,t);if(!i)break;let a=t.get(i);if(!a)break;n=a}return n.id}function yn(e,t,n){return bn(t.x,t.labelY,t.secondaryY,t.textAnchor,t.direction,e.label,e.secondaryLabel,n)}function bn(e,t,n,r,i,a,o,c){let s=fa(a,o,c),l=s*2,u=i==="above"?18:12,d=i==="above"?8:12,p=e-s,m=e+s;return r==="start"?(p=e,m=e+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 aa(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 We(e,t,n,r){let i=la(e.properties.radius,n,r);if(i!==null)return i;let a=n.bodyRadiusMultiplier;switch(e.type){case"star":return O((t===0?28:20)*a,n.minBodyRadius,n.maxBodyRadius);case"planet":return O(12*a,n.minBodyRadius,n.maxBodyRadius);case"moon":return O(7*a,n.minBodyRadius,n.maxBodyRadius);case"belt":return O(5*a,n.minBodyRadius,n.maxBodyRadius);case"asteroid":return O(5*a,n.minBodyRadius,n.maxBodyRadius);case"comet":return O(6*a,n.minBodyRadius,n.maxBodyRadius);case"ring":return O(5*a,n.minBodyRadius,n.maxBodyRadius);case"structure":return O(6*a,n.minBodyRadius,n.maxBodyRadius);case"phenomenon":return O(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"structure":return t+2;default:return Math.min(t+r,n.maxBodyRadius+10)}}function J(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/we;case"m":return e.value/1e3/we;case"ly":return e.value*ai;case"pc":return e.value*oi;case"kpc":return e.value*si;case"re":return e.value*ni/we;case"rj":return e.value*ri/we;case"sol":return e.value*ii/we;default:return e.value}}function ca(e,t,n){let r=J(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):O(i,0,420)}return O(r*96*t.freePlacementMultiplier,0,420)}function la(e,t,n){let r=Ye(e);if(!r)return null;let i=J(r);if(n.pixelsPerMetric!==null&&i!==null&&i>0){let o=i*n.pixelsPerMetric*t.bodyRadiusMultiplier;return t.bodyScaleMode==="strict"?Math.max(o,.1):O(Math.max(o,t.minBodyRadius),t.minBodyRadius,t.maxBodyRadius)}let a;switch(r.unit){case"sol":a=O(r.value*22,14,40);break;case"re":a=O(r.value*10,6,18);break;case"km":a=O(Math.log10(Math.max(r.value,1))*2.6,4,16);break;default:a=O(r.value*4,4,20);break}return O(a*t.bodyRadiusMultiplier,t.minBodyRadius,t.maxBodyRadius)}function ua(e){return J(Ye(e.properties.radius))}function Ye(e){return!e||typeof e!="object"||!("value"in e)?null:e}function yt(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function ke(e,t,n){return t<=1?n:n+e*Math.PI*2/t}function nn(e,t,n,r,i,a,o){let c=vn(e,t,n,r,i,a,o,cn);return c.length===0?"":c.map((s,l)=>`${l===0?"M":"L"} ${on(s.x)} ${on(s.y)}`).join(" ")}function vn(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(wn(e,t,n,r,i,u))}return s}function wn(e,t,n,r,i,a){let o=n*Math.cos(a),c=r*Math.sin(a),s=In(o,c,i);return{x:e+s.x,y:t+s.y}}function In(e,t,n){let r=Ge(n);return{x:e*Math.cos(r)-t*Math.sin(r),y:e*Math.sin(r)+t*Math.cos(r)}}function Oe(e,t,n,r){let i=n==="isometric"?sn*r:r;return{x:Math.cos(e)*t,y:Math.sin(e)*t*i}}function qe(e,t,n){return t*1e3+e+n*.01}function O(e,t,n){return Math.min(Math.max(e,t),n)}function rn(e,t,n){let r=e.get(t);r?r.push(n):e.set(t,[n])}function fe(e){return`wo-${e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"object"}`}function $e(e){return`${fe(e)}-group`}function da(e){return typeof e=="string"&&e.trim()?e:void 0}function fa(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 an(e){return e.length>0?e[0].toUpperCase()+e.slice(1):e}function Ge(e){return e*Math.PI/180}function on(e){return Number.isInteger(e)?String(e):e.toFixed(2)}var jn=86400,He=jn*365.25,Ke=18,$n=180;function kn(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=Y(e,n),i=ga(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,It(I))}let l=Math.min(...[...s.values()].filter(h=>Number.isFinite(h)&&h>0))||1,u=new Map,d=r.objects.map(h=>pa(h,r,a,o,c,i,u,l)),p=new Map(d.map(h=>[h.objectId,h])),m=r.orbitVisuals.map(h=>ma(h,p,l,r.activeEventId!==null)),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:ba(d),semanticGroups:r.semanticGroups,viewpoints:r.viewpoints,activeEventId:r.activeEventId,timeFrozen:r.activeEventId!==null,objects:d,orbits:m,focusTargets:g}}function pa(e,t,n,r,i,a,o,c){let s=Xe(e,t,n,r,i,o),l=$t(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:pe(e.radius*a.bodyRadiusMultiplier,a.minBodyRadius,a.maxBodyRadius),visualRadius:pe(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 ma(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??Ze(e.object.placement?.mode==="orbit"?e.object.placement.inclination:void 0)??0,band:e.band,bandThickness:e.bandThickness,hidden:e.hidden,motion:i?.motion??$t(e.object,e,n,r)}}function Xe(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?Xe(l,t,n,r,i,a):{x:0,y:0,z:0},d=i.get(e.objectId),p=$t(e.object,d,1,t.activeEventId!==null),m=p?Sn(p,0):{x:(e.x-n.x)*.8,y:0,z:(e.y-n.y)*.8};s=Pn(u,m)}else if(c?.mode==="surface"&&e.parentId){let l=r.get(e.parentId),u=l?Xe(l,t,n,r,i,a):{x:0,y:0,z:0},d=l?.visualRadius??16,p=va(e.objectId),m=p*Math.PI*2;s={x:u.x+Math.cos(m)*(d+e.visualRadius*.9),y:u.y+Math.sin(p*Math.PI)*Math.max(e.visualRadius*.2,2),z:u.z+Math.sin(m)*(d+e.visualRadius*.9)}}else if(c?.mode==="at"&&e.parentId){let l=r.get(e.parentId),u=l?Xe(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;s={x:u.x+(e.x-d),y:u.y,z:u.z+(e.y-p)}}else s={x:(e.x-n.x)*.8,y:0,z:(e.y-n.y)*.8};return a.set(e.objectId,s),s}function On(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=Sn(c.motion,e.timeFrozen?0:t);s=Pn(l,u)}return r.set(a,s),s};for(let a of e.objects)i(a.objectId);return r}function Sn(e,t){let n=e.phase0Deg+e.angularVelocityDegPerSecond*t,r=wt(n),i=wt(e.rotationDeg),a=wt(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 $t(e,t,n,r){let i=e.placement;if(!i||i.mode!=="orbit")return null;let a=t?.radius??t?.rx??pe(It(i)*48,24,1200),o=t?.radius??t?.ry??a,c=ha(i.period),s=It(i),l=pe(s/Math.max(n,1e-4),1,20),u=pe(c?Ke*l:Ke*Math.pow(l,.75),Ke,$n);return{phase0Deg:Ze(i.phase)??0,rotationDeg:Ze(i.angle)??t?.rotationDeg??0,inclinationDeg:Ze(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 It(e){let t=xn(e.semiMajor)??xn(e.distance)??1;return Math.max(t,.01)}function xn(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 ha(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*jn;case"y":return e.value*He;case"ky":return e.value*He*1e3;case"my":return e.value*He*1e6;case"gy":return e.value*He*1e9;default:return null}}function Ze(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function ga(e,t){return{...ya(e),...t}}function ya(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 ba(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 Pn(e,t){return{x:e.x+t.x,y:e.y+t.y,z:e.z+t.z}}function va(e){let t=0;for(let n=0;n<e.length;n+=1)t=t*31+e.charCodeAt(n)>>>0;return t%1e4/1e4}function pe(e,t,n){return Math.min(Math.max(e,t),n)}function wt(e){return e*Math.PI/180}function Se(e,t={}){let n=Y(e,t),r=[],i=$a(e,r),a=xa(e,r),o=Ia(e,n.renderPreset??t.preset??null,n.projection),c=e.system?wa(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:"2.6",schemaVersion:"2.6",sourceVersion:e.version,theme:e.theme??null,system:c,groups:structuredClone(e.groups??[]),relations:structuredClone(e.relations??[]),events:structuredClone(e.events??[]),objects:e.objects.map(Dn),diagnostics:r}}function Je(e,t={}){return Ea(Se(e,t))}function Pe(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:Da(e.system),info:Aa(e.system)}:null,r=e.objects.map(Dn);return Sa(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(ka),objects:r}}function Tn(e){return Pe(e)}function wa(e,t,n,r,i,a){let o=Y(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(ja),annotations:r}}function Ia(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 $a(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 xa(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=Mn(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=Ma(i);break}n.set(c,s)}for(let r of e.objects){let i=r.info.description;if(!i)continue;let a=Mn(`${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??Ta(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 ja(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 Dn(e){return{...e,groups:e.groups?[...e.groups]:void 0,resonance:e.resonance?{...e.resonance}:e.resonance,renderHints:e.renderHints?{...e.renderHints}:e.renderHints,deriveRules:e.deriveRules?e.deriveRules.map(t=>({...t})):void 0,validationRules:e.validationRules?e.validationRules.map(t=>({...t})):void 0,lockedFields:e.lockedFields?[...e.lockedFields]:void 0,tolerances:e.tolerances?e.tolerances.map(t=>({field:t.field,value:t.value&&typeof t.value=="object"&&"value"in t.value?{value:t.value.value,unit:t.value.unit}:Array.isArray(t.value)?[...t.value]:t.value})):void 0,typedBlocks:e.typedBlocks?Object.fromEntries(Object.entries(e.typedBlocks).map(([t,n])=>[t,{...n??{}}])):void 0,properties:Pa(e.properties),placement:e.placement?structuredClone(e.placement):null,info:{...e.info}}}function ka(e){return{...e,participantObjectIds:[...e.participantObjectIds],tags:[...e.tags],positions:e.positions.map(Oa)}}function Oa(e){return{objectId:e.objectId,placement:An(e.placement),inner:e.inner?{...e.inner}:void 0,outer:e.outer?{...e.outer}:void 0,epoch:e.epoch??null,referencePlane:e.referencePlane??null}}function An(e){return e?structuredClone(e):null}function Sa(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=An(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 Pa(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 Ma(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function Mn(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function Ta(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function Da(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 Aa(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=La(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 La(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 Ea(e){return{...e,version:"2.0-draft",schemaVersion:"2.0-draft"}}var Ln=["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 et(e,t={}){let n=t.schema??"auto";if(n==="2.0"||n==="2.1"||n==="2.5"||n==="2.6"||n==="2.0-draft"||e.version==="2.0"||e.version==="2.1"||e.version==="2.5"||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"}:Je(e);return xt(s)}let c=e.version==="2.0"||e.version==="2.1"||e.version==="2.5"||e.version==="2.6"?e:e.version==="2.0-draft"?{...e,version:"2.0",schemaVersion:"2.0"}:Se(e);return(n==="2.0"||n==="2.1"||n==="2.5"||n==="2.6")&&c.version!==n?Qe({...c,version:n,schemaVersion:n}):Qe(c)}let i=[],a=e;a.system&&i.push(...Fa(a.system));let o=[...a.objects].sort(Ot);for(let c of o)i.length>0&&i.push(""),i.push(..._a(c));return i.join(`
2
- `)}function Qe(e){let t=[`schema ${e.version}`,""];e.system&&t.push(...Fn(e.system));for(let r of[...e.groups].sort(me))t.push(""),t.push(...Nn(r));for(let r of[...e.relations].sort(me))t.push(""),t.push(...Bn(r));for(let r of[...e.events].sort(me))t.push(""),t.push(...Cn(r));let n=[...e.objects].sort(Ot);return n.length>0&&t.at(-1)!==""&&t.push(""),n.forEach((r,i)=>{i>0&&t.push(""),t.push(...Rn(r))}),t.join(`
3
- `)}function xt(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(...Fn(t.system));for(let i of[...t.groups].sort(me))n.push(""),n.push(...Nn(i));for(let i of[...t.relations].sort(me))n.push(""),n.push(...Bn(i));for(let i of[...t.events].sort(me))n.push(""),n.push(...Cn(i));let r=[...t.objects].sort(Ot);return r.length>0&&n.at(-1)!==""&&n.push(""),r.forEach((i,a)=>{a>0&&n.push(""),n.push(...Rn(i))}),n.join(`
4
- `)}function Fa(e){return Ra("system",e.id,e.properties,null,e.info)}function Ra(e,t,n,r,i){let a=[`${e} ${t}`],o=[...jt(r),...zn(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 Fn(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(...Na(n));for(let n of e.annotations)t.push(""),t.push(...Ba(n));return t}function _a(e){return _n(e.type,e.id,e)}function Rn(e){return _n(`object ${e.type}`,e.id,e)}function _n(e,t,n){let r=[`${e} ${t}`],i=[...jt(n.placement),...zn(n.properties),...za(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 jt(e){if(!e)return[];switch(e.mode){case"orbit":return[`orbit ${e.target}`,...Q("distance",e.distance),...Q("semiMajor",e.semiMajor),...Ua("eccentricity",e.eccentricity),...Q("period",e.period),...Q("angle",e.angle),...Q("inclination",e.inclination),...Q("phase",e.phase)];case"at":return[`at ${Wa(e.reference)}`];case"surface":return[`surface ${e.target}`];case"free":return[`free ${e.distance?kt(e.distance):e.descriptor??""}`.trim()]}}function zn(e){return Object.keys(e).sort(qa).map(t=>`${t} ${Vn(e[t])}`)}function za(e){let t=[];e.groups?.length&&t.push(`groups ${e.groups.join(" ")}`),e.epoch&&t.push(`epoch ${y(e.epoch)}`),e.referencePlane&&t.push(`referencePlane ${y(e.referencePlane)}`),e.tidalLock!==void 0&&t.push(`tidalLock ${e.tidalLock?"true":"false"}`),e.renderHints?.renderLabel!==void 0&&t.push(`renderLabel ${e.renderHints.renderLabel?"true":"false"}`),e.renderHints?.renderOrbit!==void 0&&t.push(`renderOrbit ${e.renderHints.renderOrbit?"true":"false"}`),e.renderHints?.renderPriority!==void 0&&t.push(`renderPriority ${e.renderHints.renderPriority}`),e.resonance&&t.push(`resonance ${e.resonance.targetObjectId} ${e.resonance.ratio}`);for(let n of e.deriveRules??[])t.push(`derive ${n.field} ${n.strategy}`);for(let n of e.validationRules??[])t.push(`validate ${n.rule}`);e.lockedFields?.length&&t.push(`locked ${e.lockedFields.join(" ")}`);for(let n of e.tolerances??[])t.push(`tolerance ${n.field} ${Vn(n.value)}`);return t}function Na(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&&Va(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=Ya(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 Ba(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 Nn(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 Bn(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 Cn(e){let t=[`event ${e.id}`,` kind ${y(e.kind)}`];if(e.label&&t.push(` label ${y(e.label)}`),e.summary&&t.push(` summary ${y(e.summary)}`),e.targetObjectId&&t.push(` target ${e.targetObjectId}`),e.participantObjectIds.length>0&&t.push(` participants ${e.participantObjectIds.join(" ")}`),e.timing&&t.push(` timing ${y(e.timing)}`),e.visibility&&t.push(` visibility ${y(e.visibility)}`),e.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(Ga)){t.push(` pose ${n.objectId}`);for(let r of Ca(n))t.push(` ${r}`)}}return t}function Ca(e){return[...jt(e.placement),...e.epoch?[`epoch ${y(e.epoch)}`]:[],...e.referencePlane?[`referencePlane ${y(e.referencePlane)}`]:[],...Q("inner",e.inner),...Q("outer",e.outer)]}function Va(e){return e.azimuth!==null||e.elevation!==null||e.roll!==null||e.distance!==null}function Vn(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):kt(e)}function kt(e){return`${e.value}${e.unit??""}`}function Q(e,t){return t?[`${e} ${kt(t)}`]:[]}function Ua(e,t){return t===void 0?[]:[`${e} ${t}`]}function Wa(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 Ya(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 qa(e,t){let n=Ln.indexOf(e),r=Ln.indexOf(t);return n===-1&&r===-1?e.localeCompare(t):n===-1?1:r===-1?-1:n-r}function Ot(e,t){let n=En(e.type),r=En(t.type);return n!==r?n-r:e.id.localeCompare(t.id)}function me(e,t){return e.id.localeCompare(t.id)}function Ga(e,t){return e.objectId.localeCompare(t.objectId)}function En(e){switch(e){case"star":return 0;case"planet":return 1;case"moon":return 2;case"belt":return 3;case"asteroid":return 4;case"comet":return 5;case"ring":return 6;case"structure":return 7;case"phenomenon":return 8}}function y(e){return!/\s/.test(e)&&!e.includes('"')?e:`"${e.replaceAll("\\","\\\\").replaceAll('"','\\"')}"`}var Un=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,Ha=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),Ka=/^[A-Za-z][A-Za-z0-9+.-]*:/;function he(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function Te(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function St(e,t,n){let r=e.match(Un);if(!r)throw f.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let a=D(n);if(a?.unitFamily&&!ve(a.unitFamily,i.unit))throw f.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function Pt(e){let t=e.match(Un);return t?{value:Number(t[1]),unit:t[2]??null}:null}function tt(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw f.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function ee(e,t,n){let r=Ha.get(e.toLowerCase());if(r===void 0)throw f.fromLocation(`Invalid boolean value "${e}" for "${t}"`,n);return r}function Wn(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 Xa(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(Ka);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 Yn(e,t,n){let r=D(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 ee(Me(t,e,n),e,n);case"number":return tt(Me(t,e,n),e,n);case"unit":return St(Me(t,e,n),n,e);case"string":{let i=t.join(" ").trim();return e==="image"&&Xa(i,n),i}}}function Mt(e,t,n){let r=D(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 Me(e,t,n){if(e.length!==1)throw f.fromLocation(`Field "${t}" expects exactly one value`,n);return e[0]}var Gn=new Set(["star","planet","moon","asteroid","comet"]),Za=332946.0487,Ja=1047.3486,nt=1495978707e-1,Qa=6371,eo=695700,to=63241.077,no=206264.806,ro=206264806;function De(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));e.system||n.push(w("validate.system.required","Atlas documents must declare exactly one system."));let o=new Map;for(let[c,s]of[["group",e.groups.map(l=>l.id)],["viewpoint",e.system?.viewpoints.map(l=>l.id)??[]],["annotation",e.system?.annotations.map(l=>l.id)??[]],["relation",e.relations.map(l=>l.id)],["event",e.events.map(l=>l.id)],["object",e.objects.map(l=>l.id)]])for(let l of s){let u=o.get(l);u?n.push(w("validate.id.duplicate",`Duplicate ${c} id "${l}" already used by ${u}.`)):o.set(l,c)}for(let c of e.relations)io(c,r,n);for(let c of e.system?.viewpoints??[])ao(c,i,a,t,n,r);for(let c of e.objects)oo(c,e.system,r,i,n);for(let c of e.events)so(c,e.system,r,n);return n}function io(e,t,n){e.from?t.has(e.from)||n.push(w("validate.relation.from.unknown",`Unknown relation source "${e.from}" on "${e.id}".`)):n.push(w("validate.relation.from.required",`Relation "${e.id}" is missing a "from" target.`)),e.to?t.has(e.to)||n.push(w("validate.relation.to.unknown",`Unknown relation target "${e.to}" on "${e.id}".`)):n.push(w("validate.relation.to.required",`Relation "${e.id}" is missing a "to" target.`)),e.kind||n.push(w("validate.relation.kind.required",`Relation "${e.id}" is missing a "kind" value.`))}function ao(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(j("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(j("validate.viewpoint.event.unknown",`Unknown event "${c}" in viewpoint "${e.id}".`,void 0,`viewpoint.${e.id}.events`))}fo(e.projection,i,`viewpoint.${e.id}.projection`,e.id),po(e.camera,e.projection,e.rotationDeg,i,e.id,e.focusObjectId,e.selectedObjectId,o,a)}function oo(e,t,n,r,i){let a=e.placement,o=a?.mode==="orbit"?a:null,c=a?.mode==="orbit"?n.get(a.target)??null:null;if(e.groups)for(let s of e.groups)r.has(s)||i.push(j("validate.group.unknown",`Unknown group "${s}" on "${e.id}".`,e.id,"groups"));if(typeof e.epoch=="string"&&!e.epoch.trim()&&i.push(j("validate.epoch.empty",`Object "${e.id}" defines an empty epoch string.`,e.id,"epoch")),typeof e.referencePlane=="string"&&!e.referencePlane.trim()&&i.push(j("validate.referencePlane.empty",`Object "${e.id}" defines an empty reference plane string.`,e.id,"referencePlane")),o&&(n.has(o.target)||i.push(w("validate.orbit.target.unknown",`Unknown placement target "${o.target}" on "${e.id}".`,e.id,"orbit")),o.distance&&o.semiMajor&&i.push(w("validate.orbit.distanceConflict",`Object "${e.id}" cannot declare both "distance" and "semiMajor".`,e.id,"distance")),o.phase&&!e.epoch&&!t?.epoch&&i.push(j("validate.phase.epochMissing",`Object "${e.id}" sets "phase" without an object or system epoch.`,e.id,"phase")),o.inclination&&!e.referencePlane&&!t?.referencePlane&&i.push(j("validate.inclination.referencePlaneMissing",`Object "${e.id}" sets "inclination" without an object or system reference plane.`,e.id,"inclination")),o.period&&!Dt(c?.properties.mass)&&i.push(j("validate.period.massMissing",`Object "${e.id}" sets "period" but its central mass cannot be derived.`,e.id,"period"))),a?.mode==="surface"){let s=n.get(a.target);s?Gn.has(s.type)||i.push(w("validate.surface.target.invalid",`Surface target "${a.target}" on "${e.id}" is not surface-capable.`,e.id,"surface")):i.push(w("validate.surface.target.unknown",`Unknown placement target "${a.target}" on "${e.id}".`,e.id,"surface"))}if(a?.mode==="at"&&(e.type!=="structure"&&e.type!=="phenomenon"&&i.push(w("validate.at.objectType",`Only structures and phenomena may use "at" placement; found "${e.type}" on "${e.id}".`,e.id,"at")),lo(e,n,i)||i.push(w("validate.at.target.unknown",`Unknown at-reference target "${a.target}" on "${e.id}".`,e.id,"at"))),e.resonance){let s=n.get(e.resonance.targetObjectId);s?(e.placement?.mode!=="orbit"||s.placement?.mode!=="orbit"||e.placement.target!==s.placement.target)&&i.push(j("validate.resonance.orbitMismatch",`Resonance target "${e.resonance.targetObjectId}" on "${e.id}" does not share a compatible orbital parent.`,e.id,"resonance")):i.push(w("validate.resonance.target.unknown",`Unknown resonance target "${e.resonance.targetObjectId}" on "${e.id}".`,e.id,"resonance"))}for(let s of e.deriveRules??[]){if(s.field!=="period"||s.strategy!=="kepler"){i.push(j("validate.derive.unsupported",`Unsupported derive rule "${s.field} ${s.strategy}" on "${e.id}".`,e.id,"derive"));continue}let l=qn(e,c);if(l===null){i.push(j("validate.derive.inputsMissing",`Object "${e.id}" requests "derive period kepler" but lacks enough input data.`,e.id,"derive"));continue}o?.period||i.push(Tt("validate.derive.period.available",`Object "${e.id}" can derive a Kepler period of ${yo(l)}.`,e.id,"derive"))}for(let s of e.validationRules??[]){if(s.rule!=="kepler"){i.push(j("validate.rule.unsupported",`Unsupported validation rule "${s.rule}" on "${e.id}".`,e.id,"validate"));continue}let l=Hn(o?.period),u=qn(e,c);if(l===null||u===null)continue;let d=go(e,"period");Math.abs(l-u)>d&&i.push(w("validate.kepler.mismatch",`Object "${e.id}" fails Kepler validation for "period".`,e.id,"validate"))}}function so(e,t,n,r){let i=`event.${e.id}`,a=new Set;e.kind.trim()||r.push(w("validate.event.kind.required",`Event "${e.id}" is missing a "kind" value.`,void 0,`${i}.kind`)),typeof e.epoch=="string"&&!e.epoch.trim()&&r.push(j("validate.event.epoch.empty",`Event "${e.id}" defines an empty epoch string.`,void 0,`${i}.epoch`)),typeof e.referencePlane=="string"&&!e.referencePlane.trim()&&r.push(j("validate.event.referencePlane.empty",`Event "${e.id}" defines an empty reference plane string.`,void 0,`${i}.referencePlane`)),!e.targetObjectId&&e.participantObjectIds.length===0&&r.push(w("validate.event.references.required",`Event "${e.id}" must define a "target" or at least one participant.`,void 0,`${i}.participants`)),e.targetObjectId&&(a.add(e.targetObjectId),n.has(e.targetObjectId)||r.push(w("validate.event.target.unknown",`Unknown event target "${e.targetObjectId}" on "${e.id}".`,void 0,`${i}.target`)));let o=new Set;for(let l of e.participantObjectIds){if(a.add(l),o.has(l)){r.push(j("validate.event.participants.duplicate",`Event "${e.id}" repeats participant "${l}".`,void 0,`${i}.participants`));continue}o.add(l),n.has(l)||r.push(w("validate.event.participants.unknown",`Unknown event participant "${l}" on "${e.id}".`,void 0,`${i}.participants`))}e.targetObjectId&&e.participantObjectIds.length>0&&!e.participantObjectIds.includes(e.targetObjectId)&&r.push(j("validate.event.target.notParticipant",`Event "${e.id}" defines a target outside its participants list.`,void 0,`${i}.target`)),e.positions.length===0&&r.push(j("validate.event.positions.missing",`Event "${e.id}" has no positions block and cannot drive a scene snapshot.`,void 0,`${i}.positions`)),/(?:^|[-_])(solar-eclipse|lunar-eclipse|transit|occultation)(?:$|[-_])/.test(e.kind)&&a.size<3&&r.push(j("validate.event.kind.participants",`Event "${e.id}" looks like an eclipse or transit but references fewer than three bodies.`,void 0,`${i}.participants`));let c=new Set;for(let l of e.positions){let u=`${i}.pose.${l.objectId}`;if(c.has(l.objectId)){r.push(w("validate.event.pose.duplicate",`Event "${e.id}" defines "${l.objectId}" more than once in positions.`,void 0,u));continue}c.add(l.objectId);let d=n.get(l.objectId);if(!d){r.push(w("validate.event.pose.object.unknown",`Unknown event pose object "${l.objectId}" on "${e.id}".`,void 0,u));continue}a.has(l.objectId)||r.push(j("validate.event.pose.unreferenced",`Event pose "${l.objectId}" on "${e.id}" is not listed in target/participants.`,void 0,u)),co(l,d,e,t,n,r,u,e.id)}let s=[...a].filter(l=>!c.has(l));e.positions.length>0&&s.length>0&&r.push(j("validate.event.positions.partial",`Event "${e.id}" leaves ${s.length} referenced object(s) on their base placement.`,void 0,`${i}.positions`))}function co(e,t,n,r,i,a,o,c){let s=e.placement;if(!s){a.push(w("validate.event.pose.placement.required",`Event "${c}" pose "${e.objectId}" is missing a placement mode.`,void 0,o));return}if(s.mode==="orbit"){i.has(s.target)||a.push(w("validate.event.pose.orbit.target.unknown",`Unknown event orbit target "${s.target}" on "${c}:${e.objectId}".`,void 0,`${o}.orbit`)),s.distance&&s.semiMajor&&a.push(w("validate.event.pose.orbit.distanceConflict",`Event "${c}" pose "${e.objectId}" cannot declare both "distance" and "semiMajor".`,void 0,`${o}.distance`)),s.phase&&!mo(r,t,n,e)&&a.push(j("validate.event.pose.phase.epochMissing",`Event "${c}" pose "${e.objectId}" sets "phase" without an effective epoch.`,void 0,`${o}.phase`)),s.inclination&&!ho(r,t,n,e)&&a.push(j("validate.event.pose.inclination.referencePlaneMissing",`Event "${c}" pose "${e.objectId}" sets "inclination" without an effective reference plane.`,void 0,`${o}.inclination`)),s.period&&!Dt(i.get(s.target)?.properties.mass)&&a.push(j("validate.event.pose.period.massMissing",`Event "${c}" pose "${e.objectId}" sets "period" but its central mass cannot be derived.`,void 0,`${o}.period`));return}if(s.mode==="surface"){let l=i.get(s.target);l?Gn.has(l.type)||a.push(w("validate.event.pose.surface.target.invalid",`Event surface target "${s.target}" on "${c}:${e.objectId}" is not surface-capable.`,void 0,`${o}.surface`)):a.push(w("validate.event.pose.surface.target.unknown",`Unknown event surface target "${s.target}" on "${c}:${e.objectId}".`,void 0,`${o}.surface`));return}if(s.mode==="at"){t.type!=="structure"&&t.type!=="phenomenon"&&a.push(w("validate.event.pose.at.objectType",`Only structures and phenomena may use "at" placement in events; found "${t.type}" on "${c}:${e.objectId}".`,void 0,`${o}.at`));let l=s.reference;l.kind==="named"&&!i.has(l.name)?a.push(w("validate.event.pose.at.target.unknown",`Unknown event at-reference target "${s.target}" on "${c}:${e.objectId}".`,void 0,`${o}.at`)):l.kind==="anchor"&&!i.has(l.objectId)?a.push(w("validate.event.pose.anchor.target.unknown",`Unknown event anchor target "${l.objectId}" on "${c}:${e.objectId}".`,void 0,`${o}.at`)):l.kind==="lagrange"&&(i.has(l.primary)?l.secondary&&!i.has(l.secondary)&&a.push(w("validate.event.pose.lagrange.secondary.unknown",`Unknown event Lagrange target "${l.secondary}" on "${c}:${e.objectId}".`,void 0,`${o}.at`)):a.push(w("validate.event.pose.lagrange.primary.unknown",`Unknown event Lagrange target "${l.primary}" on "${c}:${e.objectId}".`,void 0,`${o}.at`)))}}function lo(e,t,n){let r=e.placement?.mode==="at"?e.placement.reference:null;return r?r.kind==="named"?t.has(r.name):r.kind==="anchor"?t.has(r.objectId)?!0:(n.push(w("validate.anchor.target.unknown",`Unknown anchor target "${r.objectId}" on "${e.id}".`,e.id,"at")),!1):t.has(r.primary)?r.secondary&&!t.has(r.secondary)?(n.push(w("validate.lagrange.secondary.unknown",`Unknown Lagrange reference "${r.secondary}" on "${e.id}".`,e.id,"at")),!1):!0:(n.push(w("validate.lagrange.primary.unknown",`Unknown Lagrange reference "${r.primary}" on "${e.id}".`,e.id,"at")),!1):!0}function qn(e,t){let n=e.placement;if(!n||n.mode!=="orbit")return null;let r=uo(n.semiMajor??n.distance),i=Dt(t?.properties.mass);return r===null||i===null||i<=0?null:Math.sqrt(r**3/i)*365.25}function uo(e){if(!e)return null;switch(e.unit){case null:case"au":return e.value;case"km":return e.value/nt;case"m":return e.value/(nt*1e3);case"ly":return e.value*to;case"pc":return e.value*no;case"kpc":return e.value*ro;case"re":return e.value*Qa/nt;case"sol":return e.value*eo/nt;default:return null}}function Dt(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/Za;case"mj":return t.value/Ja;default:return null}}function Hn(e){if(!e)return null;switch(e.unit){case null:case"d":return e.value;case"s":return e.value/86400;case"min":return e.value/1440;case"h":return e.value/24;case"y":return e.value*365.25;case"ky":return e.value*365250;case"my":return e.value*36525e4;case"gy":return e.value*36525e7;default:return null}}function fo(e,t,n,r){e!=="topdown"&&e!=="isometric"&&e!=="orthographic"&&e!=="perspective"&&t.push(w("validate.viewpoint.projection.invalid",`Unknown projection "${String(e)}" in viewpoint "${r}".`,void 0,n))}function po(e,t,n,r,i,a,o,c,s){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(w("validate.viewpoint.camera.invalid",`Invalid camera ${d} "${String(p)}" in viewpoint "${i}".`,void 0,`${l}.${d}`));e.distance!==null&&t!=="perspective"&&r.push(j("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(j("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(Tt("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(j("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(Tt("validate.viewpoint.camera.anchorMissing",`Viewpoint "${i}" stores camera settings without a focus object, selection, or filter anchor.`,void 0,l))}function mo(e,t,n,r){return te(r?.epoch)??te(n?.epoch)??te(t.epoch)??te(e?.epoch)??null}function ho(e,t,n,r){return te(r?.referencePlane)??te(n?.referencePlane)??te(t.referencePlane)??te(e?.referencePlane)??null}function te(e){return typeof e=="string"&&e.trim()?e.trim():null}function go(e,t){let n=e.tolerances?.find(r=>r.field===t)?.value;return typeof n=="number"?n:n&&typeof n=="object"&&"value"in n?Hn(n)??0:0}function yo(e){return`${Math.round(e*100)/100}d`}function w(e,t,n,r){return{code:e,severity:"error",source:"validate",message:t,objectId:n,field:r}}function j(e,t,n,r){return{code:e,severity:"warning",source:"validate",message:t,objectId:n,field:r}}function Tt(e,t,n,r){return{code:e,severity:"info",source:"validate",message:t,objectId:n,field:r}}var bo=new Set(["climate","habitability","settlement"]),it=new Map;for(let e of["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","kind","class","culture","tags","color","image","hidden","radius","mass","density","gravity","temperature","albedo","atmosphere","inner","outer","on","source","cycle"]){let t=D(e);t&&it.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}])it.set(e.key,{key:e.key,version:"2.1",inlineMode:e.inlineMode,allowRepeat:e.allowRepeat});var vo=new Set(it.keys()),Xn=new Set(["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","inner","outer","epoch","referencePlane"]);function at(e){return Jn(e)}function Zn(e){return Jn(e,"2.0-draft")}function Jn(e,t){let n=as(e),r=n.source.split(/\r?\n/),i=[],a=!1,o="2.0",c=null,s=null,l=[],u=[],d=[],p=[],m=new Map,g=!1,h=!1,I=new Set,P=new Set,b=new Set,k=new Set,T=new Set;for(let M=0;M<r.length;M++){let le=r[M],_=M+1;if(!le.trim())continue;let V=Re(le),H=oe(le.slice(V),{line:_,columnOffset:V});if(H.length!==0){if(!a){o=wo(H,_),a=!0,n.comments.length>0&&ot(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(V===0){s=Io(H,_,o,i,c,l,u,d,p,m,I,P,b,k,T,{sawDefaults:g,sawAtlas:h}),s.kind==="system"?c=s.system:s.kind==="defaults"?g=!0:s.kind==="atlas"&&(h=!0);continue}if(!s)throw new f("Indented line without parent atlas section",_,V+1);Mo(s,V,H,_)}}if(!a)throw new f('Missing required atlas schema header "schema 2.0"');let B=l.map(M=>Ho(M,o,i)),A=p.map(M=>Ko(M,m.get(M.id)??[])),C=t??(o==="2.0-draft"?"2.0":o),G={format:"worldorbit",sourceVersion:"1.0",theme:null,system:c,groups:u,relations:d,events:A,objects:B,diagnostics:i};if(C==="2.0-draft"){let M={...G,version:"2.0-draft",schemaVersion:"2.0-draft"};return M.diagnostics.push(...De(M,o)),M}let ie={...G,version:C,schemaVersion:C};return o==="2.0-draft"&&ie.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".'}),ie.diagnostics.push(...De(ie,o)),ie}function wo(e,t){if(e.length!==2||e[0].value.toLowerCase()!=="schema"||!["2.0-draft","2.0","2.1","2.5","2.6"].includes(e[1].value.toLowerCase()))throw new f('Expected atlas header "schema 2.0", "schema 2.1", "schema 2.5", "schema 2.6", or legacy "schema 2.0-draft"',t,e[0]?.column??1);let n=e[1].value.toLowerCase();return n==="2.6"?"2.6":n==="2.5"?"2.5":n==="2.1"?"2.1":n==="2.0-draft"?"2.0-draft":"2.0"}function Io(e,t,n,r,i,a,o,c,s,l,u,d,p,m,g,h){switch(e[0]?.value.toLowerCase()){case"system":if(i)throw new f('Atlas section "system" may only appear once',t,e[0].column);return $o(e,t,n,r);case"defaults":if(!i)throw new f('Atlas section "defaults" requires a preceding system declaration',t,e[0].column);if(h.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(h.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 xo(e,t,i,u,n,r);case"annotation":if(!i)throw new f('Atlas section "annotation" requires a preceding system declaration',t,e[0].column);return jo(e,t,i,d);case"group":return R(n,r,"group",{line:t,column:e[0].column}),ko(e,t,o,p);case"relation":return R(n,r,"relation",{line:t,column:e[0].column}),Oo(e,t,c,m);case"event":return R(n,r,"event",{line:t,column:e[0].column}),So(e,t,s,l,g,n,r);case"object":return Po(e,t,n,r,a);default:throw new f(`Unknown atlas section "${e[0]?.value??""}"`,t,e[0]?.column??1)}}function $o(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 xo(e,t,n,r,i,a){if(e.length!==2)throw new f("Invalid viewpoint declaration",t,e[0]?.column??1);let o=he(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 c={id:o,label:Te(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 jo(e,t,n,r){if(e.length!==2)throw new f("Invalid annotation declaration",t,e[0]?.column??1);let i=he(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:Te(i),targetObjectId:null,body:"",tags:[],sourceObjectId:null};return n.annotations.push(a),r.add(i),{kind:"annotation",annotation:a,seenFields:new Set}}function ko(e,t,n,r){if(e.length!==2)throw new f("Invalid group declaration",t,e[0]?.column??1);let i=he(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:Te(i),summary:"",color:null,tags:[],hidden:!1};return n.push(a),r.add(i),{kind:"group",group:a,seenFields:new Set}}function Oo(e,t,n,r){if(e.length!==2)throw new f("Invalid relation declaration",t,e[0]?.column??1);let i=he(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 So(e,t,n,r,i,a,o){if(e.length!==2)throw new f("Invalid event declaration",t,e[0]?.column??1);let c=he(e[1].value);if(!c)throw new f("Event id must not be empty",t,e[1].column);if(i.has(c))throw new f(`Duplicate event id "${c}"`,t,e[1].column);let s={id:c,kind:"",label:Te(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 Po(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],c=a.value;if(!be.has(c)||c==="system")throw new f(`Unknown object type "${a.value}"`,t,a.column);let s={objectType:c,id:o.value,fields:qo(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 Mo(e,t,n,r){switch(e.kind){case"system":To(e,n,r);return;case"defaults":Do(e,n,r);return;case"atlas":Ao(e,t,n,r);return;case"viewpoint":Lo(e,t,n,r);return;case"annotation":Ro(e,n,r);return;case"group":_o(e,n,r);return;case"relation":zo(e,n,r);return;case"event":No(e,t,n,r);return;case"object":Co(e,t,n,r);return}}function To(e,t,n){let r=q(t,e.seenFields,n),i=x(t,n);switch(r){case"title":e.system.title=i;return;case"description":R(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.description=i;return;case"epoch":R(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.epoch=i;return;case"referenceplane":R(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 Do(e,t,n){let r=q(t,e.seenFields,n),i=x(t,n);switch(r){case"view":er(i)&&se(e.sourceSchemaVersion,e.diagnostics,"defaults.view",{line:n,column:t[0].column}),e.system.defaults.view=Qn(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=tr(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 Ao(e,t,n,r){if(e.inMetadata&&t<=(e.metadataIndent??0)&&(e.inMetadata=!1,e.metadataIndent=null),e.inMetadata){let i=nr(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 Lo(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){Eo(e,n,r);return}if(e.inFilter){Fo(e,n,r);return}if(n.length===1&&n[0].value.toLowerCase()==="camera"){if(se(e.sourceSchemaVersion,e.diagnostics,"viewpoint.camera",{line:r,column:n[0].column}),e.seenFields.has("camera"))throw new f('Duplicate viewpoint field "camera"',r,n[0].column);e.seenFields.add("camera"),e.inCamera=!0,e.cameraIndent=t,e.viewpoint.camera=e.viewpoint.camera??Lt();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=q(n,e.seenFields,r),a=x(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":er(a)&&se(e.sourceSchemaVersion,e.diagnostics,"projection",{line:r,column:n[0].column}),e.viewpoint.projection=Qn(a,r,n[0].column);return;case"preset":e.viewpoint.preset=tr(a,r,n[0].column);return;case"zoom":e.viewpoint.zoom=At(a,r,n[0].column,"zoom");return;case"rotation":e.viewpoint.rotationDeg=re(a,r,n[0].column,"rotation");return;case"camera":se(e.sourceSchemaVersion,e.diagnostics,"viewpoint.camera",{line:r,column:n[0].column}),e.viewpoint.camera=Yo(n.slice(1),r,e.viewpoint.camera);return;case"layers":e.viewpoint.layers=Uo(n.slice(1),r,e.sourceSchemaVersion,e.diagnostics);return;case"events":R(e.sourceSchemaVersion,e.diagnostics,"viewpoint.events",{line:r,column:n[0].column}),e.viewpoint.events=N(n.slice(1),r,"events");return;default:throw new f(`Unknown viewpoint field "${n[0].value}"`,r,n[0].column)}}function Eo(e,t,n){let r=q(t,e.seenCameraFields,n),i=x(t,n),a=e.viewpoint.camera??Lt();switch(r){case"azimuth":a.azimuth=re(i,n,t[0].column,"camera.azimuth");break;case"elevation":a.elevation=re(i,n,t[0].column,"camera.elevation");break;case"roll":a.roll=re(i,n,t[0].column,"camera.roll");break;case"distance":a.distance=At(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 Fo(e,t,n){let r=q(t,e.seenFilterFields,n),i=e.viewpoint.filter??Wo();switch(r){case"query":i.query=x(t,n);break;case"objecttypes":i.objectTypes=Vo(t.slice(1),n);break;case"tags":i.tags=N(t.slice(1),n,"tags");break;case"groups":i.groupIds=N(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 Ro(e,t,n){switch(q(t,e.seenFields,n)){case"label":e.annotation.label=x(t,n);return;case"target":e.annotation.targetObjectId=x(t,n);return;case"body":e.annotation.body=x(t,n);return;case"tags":e.annotation.tags=N(t.slice(1),n,"tags");return;default:throw new f(`Unknown annotation field "${t[0].value}"`,n,t[0].column)}}function _o(e,t,n){switch(q(t,e.seenFields,n)){case"label":e.group.label=x(t,n);return;case"summary":e.group.summary=x(t,n);return;case"color":e.group.color=x(t,n);return;case"tags":e.group.tags=N(t.slice(1),n,"tags");return;case"hidden":e.group.hidden=ee(x(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 zo(e,t,n){switch(q(t,e.seenFields,n)){case"from":e.relation.from=x(t,n);return;case"to":e.relation.to=x(t,n);return;case"kind":e.relation.kind=x(t,n);return;case"label":e.relation.label=x(t,n);return;case"summary":e.relation.summary=x(t,n);return;case"tags":e.relation.tags=N(t.slice(1),n,"tags");return;case"color":e.relation.color=x(t,n);return;case"hidden":e.relation.hidden=ee(x(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 No(e,t,n,r){if(e.activePose&&t<=(e.poseIndent??0)&&(e.activePose=null,e.poseIndent=null,e.activePoseSeenFields.clear()),!e.activePose&&e.inPositions&&t<=(e.positionsIndent??0)&&(e.inPositions=!1,e.positionsIndent=null),e.activePose){(n[0]?.value==="epoch"||n[0]?.value==="referencePlane")&&se(e.sourceSchemaVersion,e.diagnostics,`pose.${n[0].value}`,{line:r,column:n[0]?.column??1}),e.activePose.fields.push(Bo(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(q(n,e.seenFields,r)){case"kind":e.event.kind=x(n,r);return;case"label":e.event.label=x(n,r);return;case"summary":e.event.summary=x(n,r);return;case"target":e.event.targetObjectId=x(n,r);return;case"participants":e.event.participantObjectIds=N(n.slice(1),r,"participants");return;case"timing":e.event.timing=x(n,r);return;case"visibility":e.event.visibility=x(n,r);return;case"epoch":se(e.sourceSchemaVersion,e.diagnostics,"event.epoch",{line:r,column:n[0].column}),e.event.epoch=x(n,r);return;case"referenceplane":se(e.sourceSchemaVersion,e.diagnostics,"event.referencePlane",{line:r,column:n[0].column}),e.event.referencePlane=x(n,r);return;case"tags":e.event.tags=N(n.slice(1),r,"tags");return;case"color":e.event.color=x(n,r);return;case"hidden":e.event.hidden=ee(x(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 Bo(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(!Xn.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 Co(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"||bo.has(i)){i!=="info"&&R(e.sourceSchemaVersion,e.diagnostics,i,{line:r,column:n[0].column}),e.activeBlock=i,e.blockIndent=t;return}}if(e.activeBlock){let i=nr(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(Go(n,r,e.objectNode.objectType,e.sourceSchemaVersion,e.diagnostics))}function q(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 x(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 Vo(e,t){return N(e,t,"objectTypes").filter(n=>n==="star"||n==="planet"||n==="moon"||n==="belt"||n==="asteroid"||n==="comet"||n==="ring"||n==="structure"||n==="phenomenon")}function Uo(e,t,n,r){let i={};for(let a of N(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&&R(n,r,"layers.events",{line:t,column:e[0]?.column??1}),i[c]=o)}return i}function N(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 Qn(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 er(e){let t=e.toLowerCase();return t==="orthographic"||t==="perspective"}function tr(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 At(e,t,n,r){let i=re(e,t,n,r);if(i<=0)throw new f(`Field "${r}" must be greater than zero`,t,n);return i}function re(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 Wo(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function Lt(){return{azimuth:null,elevation:null,roll:null,distance:null}}function Yo(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}:Lt(),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 f(`Duplicate viewpoint camera field "${o.value}"`,t,o.column);i.add(s);let l=c.value;switch(s){case"azimuth":r.azimuth=re(l,t,o.column,"camera.azimuth");break;case"elevation":r.elevation=re(l,t,o.column,"camera.elevation");break;case"roll":r.roll=re(l,t,o.column,"camera.roll");break;case"distance":r.distance=At(l,t,o.column,"camera.distance");break;default:throw new f(`Unknown viewpoint camera field "${o.value}"`,t,o.column)}}return r}function qo(e,t,n,r,i){let a=[],o=0;for(;o<e.length;){let c=e[o],s=Ae(c.value);if(!s)throw new f(`Unknown field "${c.value}"`,t,c.column);s.version==="2.1"&&R(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 d=e[o];if(!d)break;l.push(d),o++}else for(;o<e.length&&!vo.has(e[o].value);)l.push(e[o]),o++;if(l.length===0)throw new f(`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 or(a,n),a}function Go(e,t,n,r,i){if(e.length<2)throw new f("Invalid field line",t,e[0]?.column??1);let a=Ae(e[0].value);if(!a)throw new f(`Unknown field "${e[0].value}"`,t,e[0].column);a.version==="2.1"&&R(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 or([o],n),o}function nr(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 Ho(e,t,n){let r=rr(e.fields),i=ir(r),a=Zo(e.objectType,r),o=rs(r.get("groups")?.[0]),c=rt(r.get("epoch")?.[0]),s=rt(r.get("referencePlane")?.[0]),l=r.has("tidalLock")?ee(z(r.get("tidalLock")[0]),"tidalLock",r.get("tidalLock")[0].location):void 0,u=r.has("resonance")?es(r.get("resonance")[0]):void 0,d=Qo(r),p=r.get("derive")?.map(k=>ts(k)),m=r.get("validate")?.map(k=>({rule:z(k)})),g=r.has("locked")?[...new Set(r.get("locked").flatMap(k=>k.values))]:void 0,h=r.get("tolerance")?.map(k=>ns(k)),I=Jo(e.typedBlockEntries),P=ar(e.infoEntries,"info"),b={type:e.objectType,id:e.id,properties:a,placement:i,info:P};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),d&&(b.renderHints=d),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),ot(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)&&R(t,n,e.id,e.location),b}function Ko(e,t){return{...e,participantObjectIds:[...new Set(e.participantObjectIds)],tags:[...new Set(e.tags)],positions:t.map(n=>Xo(n))}}function Xo(e){let t=rr(e.fields,"event-pose"),n=ir(t);return{objectId:e.objectId,placement:n,inner:ne(t.get("inner")?.[0],"inner"),outer:ne(t.get("outer")?.[0],"outer"),epoch:rt(t.get("epoch")?.[0]),referencePlane:rt(t.get("referencePlane")?.[0])}}function rr(e,t="object"){let n=new Map;for(let r of e){let i=Ae(r.key);if(!i&&!Xn.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 ir(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:z(t),distance:ne(e.get("distance")?.[0],"distance"),semiMajor:ne(e.get("semiMajor")?.[0],"semiMajor"),eccentricity:is(e.get("eccentricity")?.[0],"eccentricity"),period:ne(e.get("period")?.[0],"period"),angle:ne(e.get("angle")?.[0],"angle"),inclination:ne(e.get("inclination")?.[0],"inclination"),phase:ne(e.get("phase")?.[0],"phase")};if(n){let o=z(n);return{mode:"at",target:o,reference:Wn(o,n.location)}}if(r)return{mode:"surface",target:z(r)};if(i){let o=z(i),c=Pt(o);return{mode:"free",distance:c??void 0,descriptor:c?void 0:o}}return null}function Zo(e,t){let n={};for(let[r,i]of t.entries()){let a=i[0],o=Ae(r);!a||!o?.legacySchema||o.legacySchema.placement||(Mt(r,e,a.location),n[r]=Yn(r,a.values,a.location))}return n}function ar(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 Jo(e){let t={};for(let n of Object.keys(e)){let r=e[n];r?.length&&(t[n]=ar(r,n))}return t}function Qo(e){let t={},n=e.get("renderLabel")?.[0],r=e.get("renderOrbit")?.[0],i=e.get("renderPriority")?.[0];return n&&(t.renderLabel=ee(z(n),"renderLabel",n.location)),r&&(t.renderOrbit=ee(z(r),"renderOrbit",r.location)),i&&(t.renderPriority=tt(z(i),"renderPriority",i.location)),Object.keys(t).length>0?t:void 0}function es(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 ts(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 ns(e){if(e.values.length!==2)throw f.fromLocation('Field "tolerance" expects "<field> <value>"',e.location);let t=e.values[1],n=Pt(t),r=Number(t);return{field:e.values[0],value:n??(Number.isFinite(r)?r:t)}}function rs(e){return e?[...new Set(e.values)]:[]}function rt(e){return e&&e.values.join(" ").trim()||null}function ne(e,t){return e?St(z(e),e.location,t):void 0}function is(e,t){return e?tt(z(e),t,e.location):void 0}function z(e){return Me(e.values,e.key,e.location)}function Ae(e){return it.get(e)}function or(e,t){for(let n of e){let r=Ae(n.key);if(!r)throw f.fromLocation(`Unknown field "${n.key}"`,n.location);if(r.legacySchema){Mt(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 R(e,t,n,r){ot(e,"2.1")&&t.push({code:"parse.schema21.featureCompatibility",severity:"warning",source:"parse",message:`Feature "${n}" requires schema 2.1; parsed in compatibility mode because the document header is "schema ${e}".`,line:r.line,column:r.column})}function se(e,t,n,r){ot(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 ot(e,t){return Kn(e)<Kn(t)}function Kn(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;default:return 5}}function as(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==="#"&&!os(t,s)){n.push({kind:"line",line:o,column:c}),t[s]=" ";let d=s+1;for(;d<t.length&&t[d]!==`
7
- `&&t[d]!=="\r";)t[d]=" ",d++;c+=d-s,s=d-1;continue}l==='"'&&t[s-1]!=="\\"&&(r=!r),l===`
8
- `?(o++,c=1):c++}if(i)throw f.fromLocation("Unclosed block comment",a??void 0);return{source:t.join(""),comments:n}}function os(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 Et(e="WorldOrbit",t="2.6"){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:[],objects:[],diagnostics:[]}}function st(e){return structuredClone(e)}function sr(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(ce))t.push({kind:"viewpoint",id:n.id});for(let n of[...e.system.annotations].sort(ce))t.push({kind:"annotation",id:n.id})}for(let n of[...e.groups].sort(ce))t.push({kind:"group",id:n.id});for(let n of[...e.relations].sort(ce))t.push({kind:"relation",id:n.id});for(let n of[...e.events].sort(ce)){t.push({kind:"event",id:n.id});for(let r of[...n.positions].sort(yr))t.push({kind:"event-pose",id:n.id,key:r.objectId})}for(let n of[...e.objects].sort(ce))t.push({kind:"object",id:n.id});return t}function Ft(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?fr(e,t.id):null;case"event":return t.id?ct(e,t.id):null;case"event-pose":return t.id&&t.key?mr(e,t.id,t.key):null;case"object":return t.id?dr(e,t.id):null;case"viewpoint":return t.id?hr(e.system,t.id):null;case"annotation":return t.id?gr(e.system,t.id):null;case"relation":return t.id?pr(e,t.id):null}}function Rt(e,t,n){let r=st(e),i=Nt(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 ge(r.groups,n),r;case"event":if(!t.id)throw new Error('Event updates require an "id" value.');return ge(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 ss(r.events,t.id,n),r;case"object":if(!t.id)throw new Error('Object updates require an "id" value.');return ge(r.objects,n),r;case"viewpoint":if(!t.id)throw new Error('Viewpoint updates require an "id" value.');return ge(i.viewpoints,n),r;case"annotation":if(!t.id)throw new Error('Annotation updates require an "id" value.');return ge(i.annotations,n),r;case"relation":if(!t.id)throw new Error('Relation updates require an "id" value.');return ge(r.relations,n),r}}function cr(e,t,n){return Rt(e,t,n(Ft(e,t)))}function lr(e,t){let n=st(e),r=Nt(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=ct(n,t.id);i&&(i.positions=i.positions.filter(a=>a.objectId!==t.key))}return n;case"viewpoint":return t.id&&(r.viewpoints=r.viewpoints.filter(i=>i.id!==t.id)),n;case"annotation":return t.id&&(r.annotations=r.annotations.filter(i=>i.id!==t.id)),n;case"relation":return t.id&&(n.relations=n.relations.filter(i=>i.id!==t.id)),n;default:return n}}function _t(e,t){return t.map(n=>({diagnostic:n,path:zt(e,n)}))}function zt(e,t){if(t.objectId&&dr(e,t.objectId))return{kind:"object",id:t.objectId};if(t.field?.startsWith("group.")){let n=t.field.split(".");if(n[1]&&fr(e,n[1]))return{kind:"group",id:n[1]}}if(t.field?.startsWith("viewpoint.")){let n=t.field.split(".");if(n[1]&&hr(e.system,n[1]))return{kind:"viewpoint",id:n[1]}}if(t.field?.startsWith("annotation.")){let n=t.field.split(".");if(n[1]&&gr(e.system,n[1]))return{kind:"annotation",id:n[1]}}if(t.field?.startsWith("relation.")){let n=t.field.split(".");if(n[1]&&pr(e,n[1]))return{kind:"relation",id:n[1]}}if(t.field?.startsWith("event.")){let n=t.field.split(".");if(n[1]&&ct(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]}}return t.field&&t.field in Nt(e).atlasMetadata?{kind:"metadata",key:t.field}:null}function ur(e){let t=[...e.diagnostics,...De(e,e.version)];return _t(e,t)}function Nt(e){return e.system||(e.system=Et().system),e.system}function dr(e,t){return e.objects.find(n=>n.id===t)??null}function fr(e,t){return e.groups.find(n=>n.id===t)??null}function pr(e,t){return e.relations.find(n=>n.id===t)??null}function ct(e,t){return e.events.find(n=>n.id===t)??null}function mr(e,t,n){return ct(e,t)?.positions.find(r=>r.objectId===n)??null}function hr(e,t){return e?.viewpoints.find(n=>n.id===t)??null}function gr(e,t){return e?.annotations.find(n=>n.id===t)??null}function ge(e,t){let n=e.findIndex(r=>r.id===t.id);if(n===-1){e.push(t),e.sort(ce);return}e[n]=t}function ss(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(yr);return}r.positions[i]=n}function ce(e,t){return e.id.localeCompare(t.id)}function yr(e,t){return e.objectId.localeCompare(t.objectId)}var cs=/^schema\s+2(?:\.0|\.1|\.5|\.6)?$/i,ls=/^schema\s+2\.1$/i,us=/^schema\s+2\.5$/i,ds=/^schema\s+2\.6$/i,fs=/^schema\s+2\.0-draft$/i;function Bt(e){for(let t of ps(e).split(/\r?\n/)){let n=t.trim();if(n)return fs.test(n)?"2.0-draft":ls.test(n)?"2.1":us.test(n)?"2.5":ds.test(n)?"2.6":cs.test(n)?"2.0":"1.0"}return"1.0"}function ps(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 lt(e){let t=Ct(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 Ct(e){let t=Bt(e);if(t==="2.0"||t==="2.0-draft"||t==="2.1"||t==="2.5"||t==="2.6")return ms(e,t);let n;try{n=Z(e)}catch(i){return{ok:!1,value:null,diagnostics:[L(i,"parse")]}}let r;try{r=U(n)}catch(i){return{ok:!1,value:null,diagnostics:[L(i,"normalize")]}}try{W(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 ms(e,t){let n;try{n=at(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=Pe(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 hs=/^```worldorbit(?:\s+(.*))?\s*$/;function br(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(hs);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 vr(e){let t=Z(e),n=U(t);return W(n),{ast:t,document:n}}function gs(e){let t=vr(e);return{...t,scene:Y(t.document)}}function ys(e){return lt(e)}function bs(e){return Ne(e)}function vs(e,t={}){return et(e,t)}return Tr(ws);})();
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);})();