worldorbit 2.6.0 → 3.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 (196) hide show
  1. package/README.md +12 -5
  2. package/dist/browser/core/dist/atlas-edit.d.ts +11 -0
  3. package/dist/browser/core/dist/atlas-edit.js +347 -0
  4. package/dist/browser/core/dist/atlas-utils.d.ts +22 -0
  5. package/dist/browser/core/dist/atlas-utils.js +189 -0
  6. package/dist/browser/core/dist/atlas-validate.d.ts +2 -0
  7. package/dist/browser/core/dist/atlas-validate.js +488 -0
  8. package/dist/browser/core/dist/diagnostics.d.ts +10 -0
  9. package/dist/browser/core/dist/diagnostics.js +109 -0
  10. package/dist/browser/core/dist/draft-parse.d.ts +3 -0
  11. package/dist/browser/core/dist/draft-parse.js +1654 -0
  12. package/dist/browser/core/dist/draft.d.ts +21 -0
  13. package/dist/browser/core/dist/draft.js +482 -0
  14. package/dist/browser/core/dist/errors.d.ts +7 -0
  15. package/dist/browser/core/dist/errors.js +16 -0
  16. package/dist/browser/core/dist/format.d.ts +4 -0
  17. package/dist/browser/core/dist/format.js +613 -0
  18. package/dist/browser/core/dist/index.d.ts +29 -0
  19. package/dist/browser/core/dist/index.js +35 -6542
  20. package/dist/browser/core/dist/load.d.ts +4 -0
  21. package/dist/browser/core/dist/load.js +182 -0
  22. package/dist/browser/core/dist/markdown.d.ts +2 -0
  23. package/dist/browser/core/dist/markdown.js +37 -0
  24. package/dist/browser/core/dist/normalize.d.ts +2 -0
  25. package/dist/browser/core/dist/normalize.js +312 -0
  26. package/dist/browser/core/dist/parse.d.ts +2 -0
  27. package/dist/browser/core/dist/parse.js +133 -0
  28. package/dist/browser/core/dist/scene.d.ts +3 -0
  29. package/dist/browser/core/dist/scene.js +1901 -0
  30. package/dist/browser/core/dist/schema.d.ts +8 -0
  31. package/dist/browser/core/dist/schema.js +298 -0
  32. package/dist/browser/core/dist/spatial-scene.d.ts +3 -0
  33. package/dist/browser/core/dist/spatial-scene.js +420 -0
  34. package/dist/browser/core/dist/tokenize.d.ts +4 -0
  35. package/dist/browser/core/dist/tokenize.js +68 -0
  36. package/dist/browser/core/dist/types.d.ts +637 -0
  37. package/dist/browser/core/dist/types.js +1 -0
  38. package/dist/browser/core/dist/validate.d.ts +2 -0
  39. package/dist/browser/core/dist/validate.js +56 -0
  40. package/dist/browser/editor/dist/editor.d.ts +2 -0
  41. package/dist/browser/editor/dist/editor.js +3700 -0
  42. package/dist/browser/editor/dist/index.d.ts +2 -0
  43. package/dist/browser/editor/dist/index.js +1 -12250
  44. package/dist/browser/editor/dist/types.d.ts +59 -0
  45. package/dist/browser/editor/dist/types.js +1 -0
  46. package/dist/browser/markdown/dist/html.d.ts +3 -0
  47. package/dist/browser/markdown/dist/html.js +64 -0
  48. package/dist/browser/markdown/dist/index.d.ts +4 -0
  49. package/dist/browser/markdown/dist/index.js +3 -6179
  50. package/dist/browser/markdown/dist/rehype.d.ts +10 -0
  51. package/dist/browser/markdown/dist/rehype.js +49 -0
  52. package/dist/browser/markdown/dist/remark.d.ts +9 -0
  53. package/dist/browser/markdown/dist/remark.js +28 -0
  54. package/dist/browser/markdown/dist/types.d.ts +11 -0
  55. package/dist/browser/markdown/dist/types.js +1 -0
  56. package/dist/browser/viewer/dist/atlas-state.d.ts +12 -0
  57. package/dist/browser/viewer/dist/atlas-state.js +269 -0
  58. package/dist/browser/viewer/dist/atlas-viewer.d.ts +2 -0
  59. package/dist/browser/viewer/dist/atlas-viewer.js +495 -0
  60. package/dist/browser/viewer/dist/custom-element.d.ts +1 -0
  61. package/dist/browser/viewer/dist/custom-element.js +78 -0
  62. package/dist/browser/viewer/dist/embed.d.ts +24 -0
  63. package/dist/browser/viewer/dist/embed.js +172 -0
  64. package/dist/browser/viewer/dist/errors.d.ts +6 -0
  65. package/dist/browser/viewer/dist/errors.js +12 -0
  66. package/dist/browser/viewer/dist/index.d.ts +10 -0
  67. package/dist/browser/viewer/dist/index.js +9 -8334
  68. package/dist/browser/viewer/dist/minimap.d.ts +3 -0
  69. package/dist/browser/viewer/dist/minimap.js +63 -0
  70. package/dist/browser/viewer/dist/render.d.ts +6 -0
  71. package/dist/browser/viewer/dist/render.js +670 -0
  72. package/dist/browser/viewer/dist/runtime-3d.d.ts +19 -0
  73. package/dist/browser/viewer/dist/runtime-3d.js +494 -0
  74. package/dist/browser/viewer/dist/theme.d.ts +4 -0
  75. package/dist/browser/viewer/dist/theme.js +103 -0
  76. package/dist/browser/viewer/dist/tooltip.d.ts +3 -0
  77. package/dist/browser/viewer/dist/tooltip.js +198 -0
  78. package/dist/browser/viewer/dist/types.d.ts +292 -0
  79. package/dist/browser/viewer/dist/types.js +1 -0
  80. package/dist/browser/viewer/dist/vendor/three.module.js +53032 -0
  81. package/dist/browser/viewer/dist/viewer-state.d.ts +19 -0
  82. package/dist/browser/viewer/dist/viewer-state.js +162 -0
  83. package/dist/browser/viewer/dist/viewer.d.ts +2 -0
  84. package/dist/browser/viewer/dist/viewer.js +1662 -0
  85. package/dist/unpkg/core/dist/atlas-edit.d.ts +11 -0
  86. package/dist/unpkg/core/dist/atlas-edit.js +347 -0
  87. package/dist/unpkg/core/dist/atlas-utils.d.ts +22 -0
  88. package/dist/unpkg/core/dist/atlas-utils.js +189 -0
  89. package/dist/unpkg/core/dist/atlas-validate.d.ts +2 -0
  90. package/dist/unpkg/core/dist/atlas-validate.js +488 -0
  91. package/dist/unpkg/core/dist/diagnostics.d.ts +10 -0
  92. package/dist/unpkg/core/dist/diagnostics.js +109 -0
  93. package/dist/unpkg/core/dist/draft-parse.d.ts +3 -0
  94. package/dist/unpkg/core/dist/draft-parse.js +1654 -0
  95. package/dist/unpkg/core/dist/draft.d.ts +21 -0
  96. package/dist/unpkg/core/dist/draft.js +482 -0
  97. package/dist/unpkg/core/dist/errors.d.ts +7 -0
  98. package/dist/unpkg/core/dist/errors.js +16 -0
  99. package/dist/unpkg/core/dist/format.d.ts +4 -0
  100. package/dist/unpkg/core/dist/format.js +613 -0
  101. package/dist/unpkg/core/dist/index.d.ts +29 -0
  102. package/dist/unpkg/core/dist/index.js +35 -6614
  103. package/dist/unpkg/core/dist/load.d.ts +4 -0
  104. package/dist/unpkg/core/dist/load.js +182 -0
  105. package/dist/unpkg/core/dist/markdown.d.ts +2 -0
  106. package/dist/unpkg/core/dist/markdown.js +37 -0
  107. package/dist/unpkg/core/dist/normalize.d.ts +2 -0
  108. package/dist/unpkg/core/dist/normalize.js +312 -0
  109. package/dist/unpkg/core/dist/parse.d.ts +2 -0
  110. package/dist/unpkg/core/dist/parse.js +133 -0
  111. package/dist/unpkg/core/dist/scene.d.ts +3 -0
  112. package/dist/unpkg/core/dist/scene.js +1901 -0
  113. package/dist/unpkg/core/dist/schema.d.ts +8 -0
  114. package/dist/unpkg/core/dist/schema.js +298 -0
  115. package/dist/unpkg/core/dist/spatial-scene.d.ts +3 -0
  116. package/dist/unpkg/core/dist/spatial-scene.js +420 -0
  117. package/dist/unpkg/core/dist/tokenize.d.ts +4 -0
  118. package/dist/unpkg/core/dist/tokenize.js +68 -0
  119. package/dist/unpkg/core/dist/types.d.ts +637 -0
  120. package/dist/unpkg/core/dist/types.js +1 -0
  121. package/dist/unpkg/core/dist/validate.d.ts +2 -0
  122. package/dist/unpkg/core/dist/validate.js +56 -0
  123. package/dist/unpkg/editor/dist/editor.d.ts +2 -0
  124. package/dist/unpkg/editor/dist/editor.js +3700 -0
  125. package/dist/unpkg/editor/dist/index.d.ts +2 -0
  126. package/dist/unpkg/editor/dist/index.js +1 -12275
  127. package/dist/unpkg/editor/dist/types.d.ts +59 -0
  128. package/dist/unpkg/editor/dist/types.js +1 -0
  129. package/dist/unpkg/markdown/dist/html.d.ts +3 -0
  130. package/dist/unpkg/markdown/dist/html.js +64 -0
  131. package/dist/unpkg/markdown/dist/index.d.ts +4 -0
  132. package/dist/unpkg/markdown/dist/index.js +3 -6207
  133. package/dist/unpkg/markdown/dist/rehype.d.ts +10 -0
  134. package/dist/unpkg/markdown/dist/rehype.js +49 -0
  135. package/dist/unpkg/markdown/dist/remark.d.ts +9 -0
  136. package/dist/unpkg/markdown/dist/remark.js +28 -0
  137. package/dist/unpkg/markdown/dist/types.d.ts +11 -0
  138. package/dist/unpkg/markdown/dist/types.js +1 -0
  139. package/dist/unpkg/viewer/dist/atlas-state.d.ts +12 -0
  140. package/dist/unpkg/viewer/dist/atlas-state.js +269 -0
  141. package/dist/unpkg/viewer/dist/atlas-viewer.d.ts +2 -0
  142. package/dist/unpkg/viewer/dist/atlas-viewer.js +495 -0
  143. package/dist/unpkg/viewer/dist/custom-element.d.ts +1 -0
  144. package/dist/unpkg/viewer/dist/custom-element.js +78 -0
  145. package/dist/unpkg/viewer/dist/embed.d.ts +24 -0
  146. package/dist/unpkg/viewer/dist/embed.js +172 -0
  147. package/dist/unpkg/viewer/dist/errors.d.ts +6 -0
  148. package/dist/unpkg/viewer/dist/errors.js +12 -0
  149. package/dist/unpkg/viewer/dist/index.d.ts +10 -0
  150. package/dist/unpkg/viewer/dist/index.js +9 -8391
  151. package/dist/unpkg/viewer/dist/minimap.d.ts +3 -0
  152. package/dist/unpkg/viewer/dist/minimap.js +63 -0
  153. package/dist/unpkg/viewer/dist/render.d.ts +6 -0
  154. package/dist/unpkg/viewer/dist/render.js +670 -0
  155. package/dist/unpkg/viewer/dist/runtime-3d.d.ts +19 -0
  156. package/dist/unpkg/viewer/dist/runtime-3d.js +494 -0
  157. package/dist/unpkg/viewer/dist/theme.d.ts +4 -0
  158. package/dist/unpkg/viewer/dist/theme.js +103 -0
  159. package/dist/unpkg/viewer/dist/tooltip.d.ts +3 -0
  160. package/dist/unpkg/viewer/dist/tooltip.js +198 -0
  161. package/dist/unpkg/viewer/dist/types.d.ts +292 -0
  162. package/dist/unpkg/viewer/dist/types.js +1 -0
  163. package/dist/unpkg/viewer/dist/vendor/three.module.js +53032 -0
  164. package/dist/unpkg/viewer/dist/viewer-state.d.ts +19 -0
  165. package/dist/unpkg/viewer/dist/viewer-state.js +162 -0
  166. package/dist/unpkg/viewer/dist/viewer.d.ts +2 -0
  167. package/dist/unpkg/viewer/dist/viewer.js +1662 -0
  168. package/dist/unpkg/worldorbit-core.min.js +1 -12
  169. package/dist/unpkg/worldorbit-editor.min.js +1 -904
  170. package/dist/unpkg/worldorbit-markdown.min.js +1 -103
  171. package/dist/unpkg/worldorbit-viewer.min.js +1 -259
  172. package/dist/unpkg/worldorbit.js +2 -9704
  173. package/dist/unpkg/worldorbit.min.js +2 -263
  174. package/package.json +1 -1
  175. package/packages/core/dist/index.d.ts +1 -0
  176. package/packages/core/dist/index.js +1 -0
  177. package/packages/core/dist/spatial-scene.d.ts +3 -0
  178. package/packages/core/dist/spatial-scene.js +420 -0
  179. package/packages/core/dist/types.d.ts +105 -0
  180. package/packages/editor/dist/editor.js +25 -4
  181. package/packages/editor/dist/types.d.ts +4 -0
  182. package/packages/markdown/dist/html.js +10 -3
  183. package/packages/viewer/dist/atlas-state.js +3 -0
  184. package/packages/viewer/dist/atlas-viewer.js +1 -0
  185. package/packages/viewer/dist/custom-element.js +18 -4
  186. package/packages/viewer/dist/embed.d.ts +5 -1
  187. package/packages/viewer/dist/embed.js +58 -24
  188. package/packages/viewer/dist/errors.d.ts +6 -0
  189. package/packages/viewer/dist/errors.js +12 -0
  190. package/packages/viewer/dist/index.d.ts +1 -0
  191. package/packages/viewer/dist/index.js +1 -0
  192. package/packages/viewer/dist/runtime-3d.d.ts +19 -0
  193. package/packages/viewer/dist/runtime-3d.js +494 -0
  194. package/packages/viewer/dist/types.d.ts +21 -2
  195. package/packages/viewer/dist/vendor/three.module.js +53032 -0
  196. package/packages/viewer/dist/viewer.js +501 -41
@@ -1,12 +1 @@
1
- "use strict";var WorldOrbitCore=(()=>{var it=Object.defineProperty;var cr=Object.getOwnPropertyDescriptor;var lr=Object.getOwnPropertyNames;var ur=Object.prototype.hasOwnProperty;var dr=(e,t)=>{for(var n in t)it(e,n,{get:t[n],enumerable:!0})},fr=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of lr(t))!ur.call(e,i)&&i!==n&&it(e,i,{get:()=>t[i],enumerable:!(r=cr(t,i))||r.enumerable});return e};var pr=e=>fr(it({},"__esModule",{value:!0}),e);var Ya={};dr(Ya,{WORLDORBIT_FIELD_KEYS:()=>Rt,WORLDORBIT_FIELD_SCHEMAS:()=>ot,WORLDORBIT_OBJECT_TYPES:()=>he,WorldOrbitError:()=>u,cloneAtlasDocument:()=>et,createDiagnostic:()=>Vt,createEmptyAtlasDocument:()=>Ot,detectWorldOrbitSchemaVersion:()=>Dt,diagnosticFromError:()=>T,extractWorldOrbitBlocks:()=>tr,formatAtlasDocument:()=>qe,formatDocument:()=>He,formatDraftDocument:()=>mt,getAtlasDocumentNode:()=>xt,getFieldSchema:()=>A,isKnownFieldKey:()=>at,listAtlasDocumentPaths:()=>Wn,load:()=>Ba,loadWorldOrbitSource:()=>nt,loadWorldOrbitSourceWithDiagnostics:()=>Tt,materializeAtlasDocument:()=>Oe,materializeDraftDocument:()=>pn,normalizeDocument:()=>W,normalizeWithDiagnostics:()=>Bt,parse:()=>nr,parseSafe:()=>Ua,parseWithDiagnostics:()=>Re,parseWorldOrbit:()=>Z,parseWorldOrbitAtlas:()=>Je,parseWorldOrbitDraft:()=>En,removeAtlasDocumentNode:()=>qn,render:()=>Va,renderDocumentToScene:()=>oe,resolveAtlasDiagnosticPath:()=>Lt,resolveAtlasDiagnostics:()=>St,rotatePoint:()=>Jt,stringify:()=>Wa,supportsObjectType:()=>st,tokenizeLine:()=>_t,tokenizeLineDetailed:()=>ie,unitFamilyAllowsUnit:()=>ye,updateAtlasDocumentNode:()=>Yn,upgradeDocumentToDraftV2:()=>Ye,upgradeDocumentToV2:()=>je,upsertAtlasDocumentNode:()=>Pt,validateAtlasDocumentWithDiagnostics:()=>Hn,validateDocument:()=>Y,validateDocumentWithDiagnostics:()=>Ut});var u=class e extends Error{line;column;constructor(t,n,r){let i=n===void 0?"":` (line ${n}${r===void 0?"":`, column ${r}`})`;super(`${t}${i}`),this.name="WorldOrbitError",this.line=n,this.column=r}static fromLocation(t,n){return new e(t,n?.line,n?.column)}};var me=["system","star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],R=me.filter(e=>e!=="system"),mr=["star","planet","moon","asteroid","comet","structure","phenomenon"],Mt=["structure","phenomenon"],K=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"],hr=["star","planet","moon","belt","asteroid","comet","ring","structure","phenomenon"];function w(e,t){return{key:e,...t}}var he=new Set(me),ot=new Map([w("orbit",{kind:"string",placement:!0,arity:"single",objectTypes:K}),w("distance",{kind:"unit",placement:!0,arity:"single",objectTypes:K,unitFamily:"distance"}),w("semiMajor",{kind:"unit",placement:!0,arity:"single",objectTypes:K,unitFamily:"distance"}),w("eccentricity",{kind:"number",placement:!0,arity:"single",objectTypes:K}),w("period",{kind:"unit",placement:!0,arity:"single",objectTypes:K,unitFamily:"duration"}),w("angle",{kind:"unit",placement:!0,arity:"single",objectTypes:K,unitFamily:"angle"}),w("inclination",{kind:"unit",placement:!0,arity:"single",objectTypes:K,unitFamily:"angle"}),w("phase",{kind:"unit",placement:!0,arity:"single",objectTypes:K,unitFamily:"angle"}),w("at",{kind:"string",placement:!0,arity:"single",objectTypes:Mt}),w("surface",{kind:"string",placement:!0,arity:"single",objectTypes:Mt}),w("free",{kind:"string",placement:!0,arity:"single",objectTypes:hr}),w("kind",{kind:"string",placement:!1,arity:"single",objectTypes:R}),w("class",{kind:"string",placement:!1,arity:"single",objectTypes:R}),w("culture",{kind:"string",placement:!1,arity:"single",objectTypes:R}),w("tags",{kind:"list",placement:!1,arity:"multiple",objectTypes:me}),w("color",{kind:"string",placement:!1,arity:"single",objectTypes:me}),w("image",{kind:"string",placement:!1,arity:"single",objectTypes:mr}),w("hidden",{kind:"boolean",placement:!1,arity:"single",objectTypes:me}),w("radius",{kind:"unit",placement:!1,arity:"single",objectTypes:R,unitFamily:"radius"}),w("mass",{kind:"unit",placement:!1,arity:"single",objectTypes:R,unitFamily:"mass"}),w("density",{kind:"unit",placement:!1,arity:"single",objectTypes:R,unitFamily:"generic"}),w("gravity",{kind:"unit",placement:!1,arity:"single",objectTypes:R,unitFamily:"generic"}),w("temperature",{kind:"unit",placement:!1,arity:"single",objectTypes:R,unitFamily:"generic"}),w("albedo",{kind:"number",placement:!1,arity:"single",objectTypes:R}),w("atmosphere",{kind:"string",placement:!1,arity:"single",objectTypes:["planet","moon","asteroid","comet","phenomenon"]}),w("inner",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),w("outer",{kind:"unit",placement:!1,arity:"single",objectTypes:["belt","ring","phenomenon"],unitFamily:"distance"}),w("view",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),w("scale",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),w("units",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),w("title",{kind:"string",placement:!1,arity:"single",objectTypes:["system"]}),w("on",{kind:"string",placement:!1,arity:"single",objectTypes:R}),w("source",{kind:"string",placement:!1,arity:"single",objectTypes:R}),w("cycle",{kind:"unit",placement:!1,arity:"single",objectTypes:R,unitFamily:"duration"})].map(e=>[e.key,e])),Rt=new Set(ot.keys());function A(e){return ot.get(e)}function at(e){return Rt.has(e)}function st(e,t){return e.objectTypes.includes(t)}function ye(e,t){switch(e){case"distance":return t===null||["au","km","m","ly","pc","kpc","re","sol"].includes(t);case"radius":return t===null||["km","m","re","rj","sol"].includes(t);case"mass":return t===null||["me","mj","sol"].includes(t);case"duration":return t===null||["s","min","h","d","y","ky","my","gy"].includes(t);case"angle":return t===null||t==="deg";case"generic":return!0}}function _t(e){return ie(e).map(t=>t.value)}function ie(e,t={}){let n=[],r=t.columnOffset??0,i="",s=null,a=!1,c=!1,o=null,l=()=>{s!==null&&(n.push({value:i,column:s,quoted:a}),i="",s=null,a=!1)};for(let d=0;d<e.length;d++){let f=e[d],p=r+d+1;if(c&&f==="\\"){let m=e[d+1];if(m==='"'||m==="\\"){i+=m,d++;continue}}if(f==='"'){c?c=!1:(s===null&&(s=p),a=!0,o=p,c=!0);continue}if(!c&&/\s/.test(f)){l();continue}s===null&&(s=p),i+=f}if(c)throw new u("Unclosed quote in line",t.line,o??r+e.length);return l(),n}function Fe(e){return e.match(/^\s*/)?.[0].length??0}function Z(e){let t=e.split(/\r?\n/),n=[],r=null,i=!1,s=null;for(let a=0;a<t.length;a++){let c=t[a],o=a+1;if(!c.trim())continue;let l=Fe(c),d=ie(c.slice(l),{line:o,columnOffset:l});if(d.length!==0){if(l===0){i=!1,s=null;let f=yr(d,o);n.push(f),r=f;continue}if(!r)throw new u("Indented line without parent object",o,l+1);if(d.length===1&&d[0].value==="info"){i=!0,s=l;continue}i&&l<=(s??0)&&(i=!1),i?r.infoEntries.push(vr(d,o)):r.blockFields.push(br(d,o))}}return{type:"document",objects:n}}function yr(e,t){if(e.length<2)throw new u("Invalid object declaration",t,e[0]?.column??1);let[n,r,...i]=e;if(!he.has(n.value))throw new u(`Unknown object type "${n.value}"`,t,n.column);return{type:"object",objectType:n.value,name:r.value,inlineFields:gr(i,t),blockFields:[],infoEntries:[],location:{line:t,column:n.column}}}function gr(e,t){let n=[],r=0;for(;r<e.length;){let i=e[r],s=A(i.value);if(!s)throw new u(`Unknown field "${i.value}"`,t,i.column);r++;let a=[];if(s.arity==="multiple")for(;r<e.length&&!at(e[r].value);)a.push(e[r]),r++;else{let c=e[r];c&&(a.push(c),r++)}if(a.length===0)throw new u(`Missing value for field "${i.value}"`,t,i.column);n.push({type:"field",key:i.value,values:a.map(c=>c.value),location:{line:t,column:i.column}})}return n}function br(e,t){if(e.length<2)throw new u("Invalid field line",t,e[0]?.column??1);if(!A(e[0].value))throw new u(`Unknown field "${e[0].value}"`,t,e[0].column);return{type:"field",key:e[0].value,values:e.slice(1).map(n=>n.value),location:{line:t,column:e[0].column}}}function vr(e,t){if(e.length<2)throw new u("Invalid info entry",t,e[0]?.column??1);return{type:"info-entry",key:e[0].value,value:e.slice(1).map(n=>n.value).join(" "),location:{line:t,column:e[0].column}}}var zt=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,wr=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),$r=/^[A-Za-z][A-Za-z0-9+.-]*:/;function W(e){let t=null,n=[];for(let r of e.objects){let i=Ir(r);if(r.objectType==="system"){if(t)throw u.fromLocation("Only one system object is allowed",r.location);t=i}else n.push(i)}return{format:"worldorbit",version:"1.0",schemaVersion:"1.0",system:t,groups:[],relations:[],events:[],objects:n}}function Ir(e){let t=[...e.inlineFields,...e.blockFields];kr(e.objectType,t);let n=jr(t),r=Or(e.objectType,n),i=xr(n),s=Lr(e.infoEntries);return e.objectType==="system"?{type:"system",id:e.name,title:typeof i.title=="string"?i.title:null,description:null,epoch:null,referencePlane:null,properties:i,info:s}:{type:e.objectType,id:e.name,properties:i,placement:r,info:s}}function kr(e,t){for(let n of t){let r=A(n.key);if(!r)throw u.fromLocation(`Unknown field "${n.key}"`,n.location);if(!st(r,e))throw u.fromLocation(`Field "${n.key}" is not valid on "${e}"`,n.location);if(r.arity==="single"&&n.values.length!==1)throw u.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function jr(e){let t=new Map;for(let n of e){if(t.has(n.key))throw u.fromLocation(`Duplicate field "${n.key}"`,n.location);t.set(n.key,n)}return t}function Or(e,t){let n=t.has("orbit"),r=t.has("at"),i=t.has("surface"),s=t.has("free"),a=[n,r,i,s].filter(Boolean).length;if(a>1){let c=t.get("orbit")??t.get("at")??t.get("surface")??t.get("free");throw u.fromLocation("Object has multiple placement modes",c?.location)}if(e==="system"&&a>0)throw u.fromLocation("System objects cannot declare placement",[...t.values()][0]?.location);if(n)return{mode:"orbit",target:Ee(t,"orbit"),distance:ce(t,"distance"),semiMajor:ce(t,"semiMajor"),eccentricity:Tr(t,"eccentricity"),period:ce(t,"period"),angle:ce(t,"angle"),inclination:ce(t,"inclination"),phase:ce(t,"phase")};if(r){let c=Me(t,"at"),o=Ee(t,"at");return{mode:"at",target:o,reference:Ar(o,c.location)}}if(i)return{mode:"surface",target:Ee(t,"surface")};if(s){let c=Ee(t,"free"),o=Dr(c);return{mode:"free",distance:o??void 0,descriptor:o?void 0:c}}return null}function xr(e){let t={};for(let[n,r]of e.entries()){let i=A(n);if(!(!i||i.placement))switch(i.kind){case"list":t[n]=r.values;break;case"boolean":t[n]=Fr(r);break;case"number":t[n]=Nt(le(r),n,r.location);break;case"unit":t[n]=Ct(le(r),r.location,n);break;case"string":t[n]=Pr(n,r);break}}return t}function Pr(e,t){let n=t.values.join(" ").trim();return e==="image"&&Sr(n,t.location),n}function Sr(e,t){if(!e)throw u.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw u.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match($r);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw u.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function Lr(e){let t={};for(let n of e){if(n.key in t)throw u.fromLocation(`Duplicate info key "${n.key}"`,n.location);t[n.key]=n.value}return t}function Ar(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw u.fromLocation(`Invalid special position "${e}"`,t);let n=e.match(/^([A-Za-z0-9._-]+)-([A-Za-z0-9._-]+):(L[1-5])$/);if(n)return{kind:"lagrange",primary:n[1],secondary:n[2],point:n[3]};let r=e.match(/^([A-Za-z0-9._-]+):(L[1-5])$/);if(r)return{kind:"lagrange",primary:r[1],secondary:null,point:r[2]};if(/^[A-Za-z0-9._-]+:L\d+$/i.test(e))throw u.fromLocation(`Invalid special position "${e}"`,t);let i=e.match(/^([A-Za-z0-9._-]+):([A-Za-z0-9._-]+)$/);return i?{kind:"anchor",objectId:i[1],anchor:i[2]}:{kind:"named",name:e}}function Ct(e,t,n){let r=e.match(zt);if(!r)throw u.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let s=A(n);if(s?.unitFamily&&!ye(s.unitFamily,i.unit))throw u.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function Dr(e){let t=e.match(zt);return t?{value:Number(t[1]),unit:t[2]??null}:null}function ce(e,t){if(!e.has(t))return;let n=Me(e,t);return Ct(le(n),n.location,t)}function Tr(e,t){if(!e.has(t))return;let n=Me(e,t);return Nt(le(n),t,n.location)}function Nt(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw u.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function Fr(e){let t=le(e).toLowerCase(),n=wr.get(t);if(n===void 0)throw u.fromLocation(`Invalid boolean value "${t}" for "${e.key}"`,e.location);return n}function Me(e,t){let n=e.get(t);if(!n)throw new u(`Missing value for key "${t}"`);return n}function Ee(e,t){return le(Me(e,t))}function le(e){if(e.values.length!==1)throw u.fromLocation(`Field "${e.key}" expects exactly one value`,e.location);return e.values[0]}var Er=new Set(["star","planet","moon","asteroid","comet"]);function Y(e){let t=new Set,n=new Map;for(let r of e.objects){if(t.has(r.id))throw new u(`Duplicate object id "${r.id}"`);t.add(r.id),n.set(r.id,r)}for(let r of e.objects)if(r.placement){if((r.placement.mode==="orbit"||r.placement.mode==="surface")&&!t.has(r.placement.target))throw new u(`Unknown placement target "${r.placement.target}" on "${r.id}"`);if(r.placement.mode==="surface"){let i=n.get(r.placement.target);if(!i||!Er.has(i.type))throw new u(`Surface target "${r.placement.target}" on "${r.id}" is not surface-capable`)}r.placement.mode==="at"&&(r.placement.reference.kind==="lagrange"&&Mr(r,r.placement.reference,t),r.placement.reference.kind==="anchor"&&Rr(r,r.placement.reference,t))}}function Mr(e,t,n){if(!n.has(t.primary))throw new u(`Unknown Lagrange reference "${t.primary}" on "${e.id}"`);if(t.secondary&&!n.has(t.secondary))throw new u(`Unknown Lagrange reference "${t.secondary}" on "${e.id}"`)}function Rr(e,t,n){if(!n.has(t.objectId))throw new u(`Unknown anchor target "${t.objectId}" on "${e.id}"`)}function Vt(e){return{...e}}function T(e,t,n=`${t}.failed`){return e instanceof u?{code:n,severity:"error",source:t,message:e.message,line:e.line,column:e.column}:e instanceof Error?{code:n,severity:"error",source:t,message:e.message}:{code:n,severity:"error",source:t,message:String(e)}}function Re(e){let t;try{t=Z(e)}catch(r){return{ok:!1,value:null,diagnostics:[T(r,"parse")]}}let n;try{n=W(t)}catch(r){return{ok:!1,value:null,diagnostics:[T(r,"normalize")]}}try{Y(n)}catch(r){return{ok:!1,value:null,diagnostics:[T(r,"validate")]}}return{ok:!0,value:{ast:t,document:n},diagnostics:[]}}function Bt(e){try{return{ok:!0,value:W(e),diagnostics:[]}}catch(t){return{ok:!1,value:null,diagnostics:[T(t,"normalize")]}}}function Ut(e){try{return Y(e),{ok:!0,value:e,diagnostics:[]}}catch(t){return{ok:!1,value:null,diagnostics:[T(t,"validate")]}}}var ge=1495978707e-1,_r=6371,zr=71492,Cr=695700,Nr=63241.077,Vr=206264.806,Br=206264806,Zt=.68,Ur=.2,Xt=28;function oe(e,t={}){let n=qr(t),r=n.width,i=n.height,s=n.padding,a=Yr(e),c=Gr(e,t.projection),o=pt(t.camera??null),l=ft(c,o),d=Xr(a,t.scaleModel),f=Qr(a),p=e.system?.id??null,m=t.activeEventId??null,v=Wr(e.objects,e.events??[],m),j=new Map(v.map(y=>[y.id,y])),O=Ri(v,j),x=new Map,g=[],I=[],F=[],N=[],E=[],H=new Map,G=new Map;for(let y of v){let M=y.placement;if(!M){F.push(y);continue}if(M.mode==="orbit"){Ht(G,M.target,y);continue}if(M.mode==="surface"){Ht(H,M.target,y);continue}if(M.mode==="at"){E.push(y);continue}N.push(y)}let ne=N.length>0?r*.42:r/2,L=i/2,V={orbitChildren:G,surfaceChildren:H,objectMap:j,spacingFactor:f,projection:l,scaleModel:d},B=F.find(y=>y.type==="star")??F[0]??null;B&&lt(B,ne,L,0,x,g,I,V);let U=F.filter(y=>y.id!==B?.id);if(U.length>0){let y=Math.min(r,i)*.28*f*d.orbitDistanceMultiplier;U.forEach((M,P)=>{let rt=Ie(P,U.length,-Math.PI/2),re=ke(rt,y,l,1);lt(M,ne+re.x,L+re.y,0,x,g,I,V)})}N.forEach((y,M)=>{let P=r-s-140-Bi(y.placement?.mode==="free"?y.placement.distance:void 0,d),rt=Math.max(76,(i-s*2-180)/Math.max(1,N.length)*f)*d.freePlacementMultiplier,re=s+92+M*rt;x.set(y.id,{object:y,x:P,y:re,radius:Ve(y,0,d),sortKey:Ue(P,re,0)}),I.push({object:y,groupId:O.groupIds.get(y.id)??null,x1:P-60,y1:re,x2:P-18,y2:re,mode:"free"}),Ce(y,x,g,I,V,1)}),E.forEach((y,M)=>{if(x.has(y.id)||!y.placement||y.placement.mode!=="at")return;let P=Ei(y.placement.reference,x,j,M,E.length,r,i,s,V);x.set(y.id,{object:y,x:P.x,y:P.y,radius:Ve(y,2,d),sortKey:Ue(P.x,P.y,2),anchorX:P.anchorX,anchorY:P.anchorY}),P.anchorX!==void 0&&P.anchorY!==void 0&&I.push({object:y,groupId:O.groupIds.get(y.id)??null,x1:P.anchorX,y1:P.anchorY,x2:P.x,y2:P.y,mode:"at"}),Ce(y,x,g,I,V,2)});let D=[...x.values()].map(y=>ei(y,d,O)),Ae=g.map(y=>ti(y,O.groupIds.get(y.object.id)??null)),De=I.map(y=>ni(y)),Te=ri(D,r,i,d.labelMultiplier),Ft=di(e,D),Et=fi(e.events??[],D,m),rr=ci(Ae,Ft,Et,De,D,Te),ir=li(D,Ae,De,Te,O,d.labelMultiplier),or=ui(e,D),ar=pi(e,c,n.preset,O,j),sr=Oi(r,i,D,Ae,De,Te,d.labelMultiplier);return{width:r,height:i,padding:s,renderPreset:n.preset,projection:c,renderProjection:l,camera:o,scaleModel:d,title:String(e.system?.title??e.system?.properties.title??e.system?.id??"WorldOrbit")||"WorldOrbit",subtitle:Zr(c,l,a,o),systemId:p,viewMode:c,layoutPreset:a,metadata:{format:e.format,version:e.version,view:c,renderProjection:l,scale:String(e.system?.properties.scale??a),units:String(e.system?.properties.units??"mixed"),preset:n.preset??"custom",...o?.azimuth!==null?{"camera.azimuth":String(o?.azimuth)}:{},...o?.elevation!==null?{"camera.elevation":String(o?.elevation)}:{},...o?.roll!==null?{"camera.roll":String(o?.roll)}:{},...o?.distance!==null?{"camera.distance":String(o?.distance)}:{}},contentBounds:sr,layers:rr,groups:ir,semanticGroups:or,viewpoints:ar,events:Et,activeEventId:m,objects:D,orbitVisuals:Ae,relations:Ft,leaders:De,labels:Te}}function Jt(e,t,n){let r=We(n),i=Math.cos(r),s=Math.sin(r),a=e.x-t.x,c=e.y-t.y;return{x:t.x+a*i-c*s,y:t.y+a*s+c*i}}function Wr(e,t,n){let r=e.map(c=>structuredClone(c));if(!n)return r;let i=t.find(c=>c.id===n);if(!i)return r;let s=new Map(r.map(c=>[c.id,c])),a=new Set([...i.targetObjectId?[i.targetObjectId]:[],...i.participantObjectIds,...i.positions.map(c=>c.objectId)]);for(let c of a){let o=s.get(c);o&&(i.epoch&&(o.epoch=i.epoch),i.referencePlane&&(o.referencePlane=i.referencePlane))}for(let c of i.positions){let o=s.get(c.objectId);o&&(c.placement&&(o.placement=structuredClone(c.placement)),c.inner&&(o.properties.inner={...c.inner}),c.outer&&(o.properties.outer={...c.outer}),c.epoch&&(o.epoch=c.epoch),c.referencePlane&&(o.referencePlane=c.referencePlane))}return r}function Yr(e){switch(String(e.system?.properties.scale??"balanced").toLowerCase()){case"compressed":case"compact":return"compact";case"expanded":case"presentation":return"presentation";default:return"balanced"}}function qr(e){let t=Hr(e.preset);return{width:e.width??t.width,height:e.height??t.height,padding:e.padding??t.padding,preset:e.preset??null}}function Hr(e){switch(e){case"presentation":return{width:1440,height:900,padding:88};case"atlas-card":return{width:960,height:560,padding:56};case"markdown":return{width:920,height:540,padding:48};default:return{width:1200,height:780,padding:72}}}function Gr(e,t){if(t==="topdown"||t==="isometric"||t==="orthographic"||t==="perspective")return t;let n=String(e.system?.properties.view??"topdown").toLowerCase();return tn(n)??"topdown"}function ft(e,t){switch(e){case"topdown":return"topdown";case"isometric":return"isometric";case"orthographic":return t&&(t.azimuth!==null||t.elevation!==null||t.roll!==null)?"isometric":"topdown";case"perspective":return"isometric"}}function pt(e){if(!e)return null;let t={azimuth:ct(e.azimuth),elevation:ct(e.elevation),roll:ct(e.roll),distance:Kr(e.distance)};return t.azimuth!==null||t.elevation!==null||t.roll!==null||t.distance!==null?t:null}function ct(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function Kr(e){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:null}function Zr(e,t,n,r){let i=[`${Gt(e)} view`,`${Gt(n)} layout`];if(e!==t&&i.push(`2D ${t} fallback`),r){let s=[r.azimuth!==null?`az ${r.azimuth}`:null,r.elevation!==null?`el ${r.elevation}`:null,r.roll!==null?`roll ${r.roll}`:null,r.distance!==null?`dist ${r.distance}`:null].filter(Boolean);s.length>0&&i.push(`camera ${s.join(" / ")}`)}return i.join(" - ")}function Xr(e,t){return{...Jr(e),...t}}function Jr(e){switch(e){case"compact":return{orbitDistanceMultiplier:.84,bodyRadiusMultiplier:.92,labelMultiplier:.9,freePlacementMultiplier:.9,ringThicknessMultiplier:.92,minBodyRadius:4,maxBodyRadius:36};case"presentation":return{orbitDistanceMultiplier:1.2,bodyRadiusMultiplier:1.18,labelMultiplier:1.08,freePlacementMultiplier:1.05,ringThicknessMultiplier:1.16,minBodyRadius:5,maxBodyRadius:48};default:return{orbitDistanceMultiplier:1,bodyRadiusMultiplier:1,labelMultiplier:1,freePlacementMultiplier:1,ringThicknessMultiplier:1,minBodyRadius:4,maxBodyRadius:40}}}function Qr(e){switch(e){case"compact":return .84;case"presentation":return 1.2;default:return 1}}function ei(e,t,n){let{object:r,x:i,y:s,radius:a,sortKey:c,anchorX:o,anchorY:l}=e,d=r.renderHints?.renderPriority??0;return{renderId:ue(r.id),objectId:r.id,object:r,parentId:n.parentIds.get(r.id)??null,ancestorIds:n.ancestorIds.get(r.id)??[],childIds:n.childIds.get(r.id)??[],groupId:n.groupIds.get(r.id)??null,semanticGroupIds:[...r.groups??[]],x:i,y:s,radius:a,visualRadius:Vi(r,a,t),sortKey:c+d*.001,anchorX:o,anchorY:l,label:r.id,secondaryLabel:r.type==="structure"?String(r.properties.kind??r.type):r.type,fillColor:Wi(r.properties.color),imageHref:typeof r.properties.image=="string"&&r.properties.image.trim()?r.properties.image:void 0,hidden:r.properties.hidden===!0}}function ti(e,t){return{renderId:`${ue(e.object.id)}-orbit`,objectId:e.object.id,object:e.object,parentId:e.parentId,groupId:t,semanticGroupIds:[...e.object.groups??[]],kind:e.kind,cx:e.cx,cy:e.cy,radius:e.radius,rx:e.rx,ry:e.ry,rotationDeg:e.rotationDeg,band:e.band,bandThickness:e.bandThickness,frontArcPath:e.frontArcPath,backArcPath:e.backArcPath,hidden:e.object.properties.hidden===!0||e.object.renderHints?.renderOrbit===!1}}function ni(e){return{renderId:`${ue(e.object.id)}-leader-${e.mode}`,objectId:e.object.id,object:e.object,groupId:e.groupId,semanticGroupIds:[...e.object.groups??[]],x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,mode:e.mode,hidden:e.object.properties.hidden===!0}}function ri(e,t,n,r){let i=[],s=[],a=new Map(e.map(o=>[o.objectId,o])),c=[...e].filter(o=>!o.hidden&&o.object.renderHints?.renderLabel!==!1).sort(ii);for(let o of c){let l=oi(o,a,s,t,n,r)??en(o,Qt(o,a.get(o.parentId??"")??null,n),0,r);s.push(sn(o,l,r)),i.push({renderId:`${o.renderId}-label`,objectId:o.objectId,object:o.object,groupId:o.groupId,semanticGroupIds:[...o.semanticGroupIds],label:o.label,secondaryLabel:o.secondaryLabel,x:l.x,y:l.labelY,secondaryY:l.secondaryY,textAnchor:l.textAnchor,direction:l.direction,hidden:o.hidden})}return i}function ii(e,t){let n=Wt(e)-Wt(t);if(n!==0)return n;let r=(t.object.renderHints?.renderPriority??0)-(e.object.renderHints?.renderPriority??0);return r!==0?r:e.sortKey-t.sortKey}function Wt(e){switch(e.object.type){case"star":return 0;case"planet":return 1;case"moon":return 2;case"belt":case"ring":return 3;case"asteroid":case"comet":return 4;case"structure":case"phenomenon":return 5}}function oi(e,t,n,r,i,s){for(let a of ai(e,t,r,i)){let c=a==="left"||a==="right"?4:6;for(let o=0;o<=c;o+=1){let l=en(e,a,o,s),d=sn(e,l,s);if(!n.some(f=>Ci(f,d)))return l}}return null}function ai(e,t,n,r){let i=e.parentId?t.get(e.parentId)??null:null,s=Qt(e,i,r),a=s==="below"?"above":"below",c=si(e,i,n),o=c==="right"?"left":"right";return e.object.type==="structure"||e.object.type==="phenomenon"||e.object.placement?.mode==="at"||e.object.placement?.mode==="surface"||e.object.placement?.mode==="free"?[c,s,o,a]:[s,c,a,o]}function Qt(e,t,n){return t&&Math.abs(e.y-t.y)>6?e.y>=t.y?"below":"above":e.y>n*.62?"above":"below"}function si(e,t,n){return t&&Math.abs(e.x-t.x)>6?e.x>=t.x?"right":"left":e.x>=n/2?"right":"left"}function en(e,t,n,r){let i=14*r;switch(t){case"above":{let s=e.y-(e.radius+18*r+n*i);return{x:e.x,labelY:s,secondaryY:s-16*r,textAnchor:"middle",direction:t}}case"below":{let s=e.y+e.radius+18*r+n*i;return{x:e.x,labelY:s,secondaryY:s+16*r,textAnchor:"middle",direction:t}}case"left":{let s=e.x-(e.visualRadius+16*r+n*i),a=e.y-4*r;return{x:s,labelY:a,secondaryY:a+16*r,textAnchor:"end",direction:t}}case"right":{let s=e.x+e.visualRadius+16*r+n*i,a=e.y-4*r;return{x:s,labelY:a,secondaryY:a+16*r,textAnchor:"start",direction:t}}}}function ci(e,t,n,r,i,s){let a=e.filter(o=>!o.hidden&&!!o.backArcPath).map(o=>o.renderId),c=e.filter(o=>!o.hidden).map(o=>o.renderId);return[{id:"background",renderIds:["wo-bg","wo-bg-glow","wo-grid"]},{id:"guides",renderIds:r.filter(o=>!o.hidden).map(o=>o.renderId)},{id:"orbits-back",renderIds:a},{id:"orbits-front",renderIds:c},{id:"relations",renderIds:t.filter(o=>!o.hidden).map(o=>o.renderId)},{id:"events",renderIds:n.filter(o=>!o.hidden).map(o=>o.renderId)},{id:"objects",renderIds:i.filter(o=>!o.hidden).map(o=>o.renderId)},{id:"labels",renderIds:s.filter(o=>!o.hidden).map(o=>o.renderId)},{id:"metadata",renderIds:["wo-title","wo-subtitle","wo-meta"]}]}function li(e,t,n,r,i,s){let a=new Map,c=o=>{if(!o)return null;let l=a.get(o);if(l)return l;let d=i.groupRoots.get(o)??null,f={renderId:o,rootObjectId:d,label:d??o,objectIds:[],orbitIds:[],labelIds:[],leaderIds:[],contentBounds:$e(0,0,0,0)};return a.set(o,f),f};for(let o of e){let l=c(o.groupId);l&&!o.hidden&&l.objectIds.push(o.objectId)}for(let o of t){let l=c(o.groupId);l&&!o.hidden&&l.orbitIds.push(o.objectId)}for(let o of n){let l=c(o.groupId);l&&!o.hidden&&l.leaderIds.push(o.objectId)}for(let o of r){let l=c(o.groupId);l&&!o.hidden&&l.labelIds.push(o.objectId)}for(let o of a.values())o.contentBounds=_i(o,e,t,n,r,s);return[...a.values()].sort((o,l)=>o.label.localeCompare(l.label))}function ui(e,t){return[...e.groups].map(n=>({id:n.id,label:n.label,summary:n.summary,color:n.color,tags:[...n.tags],hidden:n.hidden,objectIds:t.filter(r=>!r.hidden&&r.semanticGroupIds.includes(n.id)).map(r=>r.objectId)})).sort((n,r)=>n.label.localeCompare(r.label))}function di(e,t){let n=new Map(t.map(r=>[r.objectId,r]));return e.relations.map(r=>{let i=n.get(r.from),s=n.get(r.to);return{renderId:`${ue(r.id)}-relation`,relationId:r.id,relation:r,fromObjectId:r.from,toObjectId:r.to,x1:i?.x??0,y1:i?.y??0,x2:s?.x??0,y2:s?.y??0,hidden:r.hidden||!i||!s||i.hidden||s.hidden}}).sort((r,i)=>r.relation.id.localeCompare(i.relation.id))}function fi(e,t,n){let r=new Map(t.map(i=>[i.objectId,i]));return e.map(i=>{let s=[...new Set([...i.targetObjectId?[i.targetObjectId]:[],...i.participantObjectIds])],a=s.map(l=>r.get(l)).filter(Boolean),c=a.length>0?a.reduce((l,d)=>l+d.x,0)/a.length:0,o=a.length>0?a.reduce((l,d)=>l+d.y,0)/a.length:0;return{renderId:`${ue(i.id)}-event`,eventId:i.id,event:i,objectIds:s,participantIds:[...i.participantObjectIds],targetObjectId:i.targetObjectId,x:c,y:o,hidden:i.hidden||a.length===0||a.every(l=>l.hidden)||n!==null&&i.id!==n}}).sort((i,s)=>i.event.id.localeCompare(s.event.id))}function pi(e,t,n,r,i){let s=mi(e,t,n),a=new Map;for(let[l,d]of Object.entries(e.system?.info??{})){if(!l.startsWith("viewpoint."))continue;let[f,p,...m]=l.split(".");if(f!=="viewpoint"||!p||m.length===0)continue;let v=Ii(p);if(!v)continue;let j=m.join(".").toLowerCase(),O=a.get(v)??{id:v};hi(O,j,d,e,t,n,r,i),a.set(v,O)}let c=[...a.values()].map(l=>yi(l,t,n,i)).filter(Boolean),o=c.findIndex(l=>l.id===s.id);return o>=0?c.splice(o,1,{...s,...c[o],layers:{...s.layers,...c[o].layers},filter:c[o].filter??s.filter,generated:!1}):c.unshift(s),c.sort((l,d)=>l.id==="overview"?-1:d.id==="overview"?1:l.label.localeCompare(d.label))}function mi(e,t,n){let r=e.system?.title??e.system?.properties.title,i=r?`${String(r)} Overview`:"Overview",s=pt(null),a=ft(t,s);return{id:"overview",label:i,summary:"Fit the whole system with the current atlas defaults.",objectId:null,selectedObjectId:null,eventIds:[],projection:t,renderProjection:a,camera:s,preset:n,rotationDeg:0,scale:null,layers:{},filter:null,generated:!0}}function hi(e,t,n,r,i,s,a,c){let o=n.trim();switch(t){case"label":case"title":o&&(e.label=o);return;case"summary":case"description":o&&(e.summary=o);return;case"focus":case"object":o&&(e.focus=o);return;case"select":case"selection":o&&(e.select=o);return;case"events":e.eventIds=we(o);return;case"projection":case"view":e.projection=tn(o)??i;return;case"preset":e.preset=bi(o)??s;return;case"rotation":case"angle":e.rotationDeg=be(o)??e.rotationDeg??0;return;case"camera.azimuth":e.camera={...e.camera??ze(),azimuth:be(o)};return;case"camera.elevation":e.camera={...e.camera??ze(),elevation:be(o)};return;case"camera.roll":e.camera={...e.camera??ze(),roll:be(o)};return;case"camera.distance":e.camera={...e.camera??ze(),distance:Yt(o)};return;case"zoom":case"scale":e.scale=Yt(o);return;case"layers":e.layers=vi(o);return;case"query":e.filter={...e.filter??_e(),query:o||null};return;case"types":case"objecttypes":e.filter={...e.filter??_e(),objectTypes:wi(o)};return;case"tags":e.filter={...e.filter??_e(),tags:we(o)};return;case"groups":e.filter={...e.filter??_e(),groupIds:$i(o,r,a,c)};return}}function yi(e,t,n,r){let i=e.focus&&r.has(e.focus)?e.focus:null,s=e.select&&r.has(e.select)?e.select:i,a=gi(e.filter),c=e.label?.trim()||ki(e.id),o=e.projection??t,l=pt(e.camera??null),d=ft(o,l);return{id:e.id,label:c,summary:e.summary?.trim()||ji(c,i,a),objectId:i,selectedObjectId:s,eventIds:[...new Set(e.eventIds??[])],projection:o,renderProjection:d,camera:l,preset:e.preset??n,rotationDeg:e.rotationDeg??0,scale:e.scale??null,layers:e.layers??{},filter:a,generated:!1}}function _e(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function ze(){return{azimuth:null,elevation:null,roll:null,distance:null}}function gi(e){if(!e)return null;let t={query:e.query?.trim()||null,objectTypes:[...new Set(e.objectTypes)],tags:[...new Set(e.tags)],groupIds:[...new Set(e.groupIds)]};return t.query||t.objectTypes.length>0||t.tags.length>0||t.groupIds.length>0?t:null}function tn(e){switch(e.toLowerCase()){case"topdown":return"topdown";case"isometric":return"isometric";case"orthographic":return"orthographic";case"perspective":return"perspective";default:return null}}function bi(e){let t=e.toLowerCase();return t==="diagram"||t==="presentation"||t==="atlas-card"||t==="markdown"?t:null}function be(e){let t=Number(e);return Number.isFinite(t)?t:null}function Yt(e){let t=be(e);return t!==null&&t>0?t:null}function vi(e){let t={};for(let n of we(e)){let r=!n.startsWith("-")&&!n.startsWith("!"),i=n.replace(/^[-!]+/,"").toLowerCase();if(i==="orbits"){t["orbits-back"]=r,t["orbits-front"]=r;continue}(i==="background"||i==="guides"||i==="orbits-back"||i==="orbits-front"||i==="relations"||i==="events"||i==="objects"||i==="labels"||i==="metadata")&&(t[i]=r)}return t}function wi(e){return we(e).filter(t=>t==="star"||t==="planet"||t==="moon"||t==="belt"||t==="asteroid"||t==="comet"||t==="ring"||t==="structure"||t==="phenomenon")}function $i(e,t,n,r){return we(e).map(i=>t.schemaVersion==="2.1"||t.schemaVersion==="2.5"||t.groups.some(s=>s.id===i)||i.startsWith("wo-")&&i.endsWith("-group")?i:n.groupIds.has(i)?n.groupIds.get(i)??ve(i):(r.has(i),ve(i)))}function we(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function Ii(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function ki(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function ji(e,t,n){let r=[e];return t&&r.push(`focus ${t}`),n?.objectTypes.length&&r.push(n.objectTypes.join("/")),n?.tags.length&&r.push(`tags ${n.tags.join(", ")}`),n?.query&&r.push(`query "${n.query}"`),r.join(" - ")}function Oi(e,t,n,r,i,s,a){let c=Number.POSITIVE_INFINITY,o=Number.POSITIVE_INFINITY,l=Number.NEGATIVE_INFINITY,d=Number.NEGATIVE_INFINITY,f=(p,m)=>{c=Math.min(c,p),o=Math.min(o,m),l=Math.max(l,p),d=Math.max(d,m)};for(let p of r)p.hidden||nn(p,f);for(let p of i)p.hidden||(f(p.x1,p.y1),f(p.x2,p.y2));for(let p of n)p.hidden||rn(p,f);for(let p of s)p.hidden||on(p,f,a);return!Number.isFinite(c)||!Number.isFinite(o)?$e(0,0,e,t):$e(c,o,l,d)}function nn(e,t){let n=e.bandThickness!==void 0?e.bandThickness/2+4:e.band?10:3;if(e.kind==="circle"&&e.radius!==void 0){t(e.cx-e.radius-n,e.cy-e.radius-n),t(e.cx+e.radius+n,e.cy+e.radius+n);return}let r=e.rx??e.radius??0,i=e.ry??e.radius??0,s=ln(e.cx,e.cy,r,i,e.rotationDeg,0,Math.PI*2,Xt*2);for(let a of s)t(a.x-n,a.y-n),t(a.x+n,a.y+n)}function $e(e,t,n,r){return{minX:e,minY:t,maxX:n,maxY:r,width:n-e,height:r-t,centerX:e+(n-e)/2,centerY:t+(r-t)/2}}function rn(e,t){t(e.x-e.visualRadius-24,e.y-e.visualRadius-16),t(e.x+e.visualRadius+24,e.y+e.visualRadius+36)}function on(e,t,n){let r=cn(e.x,e.y,e.secondaryY,e.textAnchor,e.direction,e.label,e.secondaryLabel,n);t(r.left,r.top),t(r.right,r.bottom)}function lt(e,t,n,r,i,s,a,c){i.has(e.id)||(i.set(e.id,{object:e,x:t,y:n,radius:Ve(e,r,c.scaleModel),sortKey:Ue(t,n,r)}),Ce(e,i,s,a,c,r+1))}function Ce(e,t,n,r,i,s){let a=t.get(e.id);if(!a)return;let c=[...i.orbitChildren.get(e.id)??[]].sort(xi),o=Pi(c,a.radius,i.spacingFactor,i.scaleModel),l=Ai(c,o);c.forEach((f,p)=>{let m=Si(f,p,c.length,a,o,l[p]??o.innerPx,i);n.push({object:f,parentId:e.id,kind:m.kind,cx:m.cx,cy:m.cy,radius:m.radius,rx:m.rx,ry:m.ry,rotationDeg:m.rotationDeg,band:m.band,bandThickness:m.bandThickness,frontArcPath:m.frontArcPath,backArcPath:m.backArcPath}),lt(f,m.objectX,m.objectY,s,t,n,r,i)});let d=[...i.surfaceChildren.get(e.id)??[]];d.forEach((f,p)=>{let m=Ie(p,d.length,-Math.PI/3),v=28*i.spacingFactor,j=ke(m,a.radius,i.projection,i.projection==="isometric"?.9:1),O=ke(m,a.radius+v,i.projection,i.projection==="isometric"?.9:1),x=a.x+j.x,g=a.y+j.y,I=a.x+O.x,F=a.y+O.y;t.set(f.id,{object:f,x:I,y:F,radius:Ve(f,s+1,i.scaleModel),sortKey:Ue(I,F,s+1),anchorX:x,anchorY:g}),r.push({object:f,groupId:i.objectMap.has(f.id)?ve(zi(f,i.objectMap)):null,x1:x,y1:g,x2:I,y2:F,mode:"surface"}),Ce(f,t,n,r,i,s+1)})}function xi(e,t){let n=Ne(e),r=Ne(t);return n!==null&&r!==null&&n!==r?n-r:n!==null&&r===null?-1:n===null&&r!==null?1:e.id.localeCompare(t.id)}function Pi(e,t,n,r){let i=e.map(f=>Ne(f)),s=i.filter(f=>f!==null),a=t+56*n*r.orbitDistanceMultiplier,c=(e.length>2?54:64)*n*r.orbitDistanceMultiplier;if(s.length===0)return{metrics:i,minMetric:0,maxMetric:0,metricSpread:0,innerPx:a,stepPx:c,pixelSpread:Math.max(c*Math.max(e.length-1,1),c),minimumGapPx:c*.42};let o=Math.min(...s),l=Math.max(...s),d=l-o;return{metrics:i,minMetric:o,maxMetric:l,metricSpread:d,innerPx:a,stepPx:c,pixelSpread:Math.max(c*Math.max(e.length-1,1),c),minimumGapPx:c*.42}}function Si(e,t,n,r,i,s,a){let c=e.placement,o=e.type==="belt"||e.type==="ring";if(!c||c.mode!=="orbit"){let G=i.innerPx+t*i.stepPx;return{kind:"circle",cx:r.x,cy:r.y,radius:G,rotationDeg:0,band:o,bandThickness:o?12*a.scaleModel.ringThicknessMultiplier:void 0,objectX:r.x,objectY:r.y-G}}let l=S(typeof c.eccentricity=="number"?c.eccentricity:0,0,.92),d=s,f=Math.max(d*Math.sqrt(1-l*l),d*.18),p=dt(c.inclination)??0,m=a.projection==="isometric"?Math.max(Ur,Math.cos(We(p)))*Zt:1,v=Math.max(f*m,d*.14),j=dt(c.angle)??0,O=d*l,x=dn(-O,0,j),g=r.x+x.x,I=r.y+x.y,F=Ti(c.phase,t,n),N=un(g,I,d,v,j,F),E=a.projection==="topdown"&&l<=1e-4&&Math.abs(j)<=1e-4,H=o?Fi(e,d,i,a.scaleModel):void 0;return{kind:E?"circle":"ellipse",cx:E?r.x:g,cy:E?r.y:I,radius:E?d:void 0,rx:E?void 0:d,ry:E?void 0:v,rotationDeg:j,band:o,bandThickness:H,frontArcPath:a.projection==="isometric"||o?qt(g,I,d,v,j,0,Math.PI):void 0,backArcPath:a.projection==="isometric"||o?qt(g,I,d,v,j,Math.PI,Math.PI*2):void 0,objectX:N.x,objectY:N.y}}function Li(e,t){return t.innerPx+t.stepPx*Di(Math.max(e,0)+1)}function Ai(e,t){let n=[];return e.forEach((r,i)=>{let s=Ne(r),a=t.innerPx+i*t.stepPx,c=s===null?a:Li(s,t),o=i===0?t.innerPx:(n[i-1]??t.innerPx)+t.minimumGapPx;n.push(Math.max(c,o))}),n}function Ne(e){return!e.placement||e.placement.mode!=="orbit"?null:Be(e.placement.semiMajor??e.placement.distance??null)}function Di(e){return Math.log(e)/Math.log(2)}function Ti(e,t,n){let r=e?dt(e):null;return r!==null?We(r-90):Ie(t,n,-Math.PI/2)}function Fi(e,t,n,r){let i=Be(ut(e.properties.inner)),s=Be(ut(e.properties.outer));if(i!==null&&s!==null){let c=Math.abs(s-i);if(n.metricSpread>0)return S(c/n.metricSpread*n.pixelSpread*r.ringThicknessMultiplier,8,54);let o=Math.max(Math.max(i,s),1e-4);return S(c/o*t*.75*r.ringThicknessMultiplier,8,48)}return(e.type==="belt"?18:12)*r.ringThicknessMultiplier}function Ei(e,t,n,r,i,s,a,c,o){if(e.kind==="lagrange")return Mi(e,t,n,s,a);if(e.kind==="anchor"){let l=t.get(e.objectId);if(l){let d=Ie(r,i,Math.PI/5),f=(l.radius+36)*o.scaleModel.labelMultiplier,p=ke(d,f,o.projection,o.projection==="isometric"?.92:1);return{x:l.x+p.x,y:l.y+p.y,anchorX:l.x,anchorY:l.y}}}if(e.kind==="named"){let l=t.get(e.name);if(l){let d=Ie(r,i,Math.PI/6),f=(l.radius+36)*o.scaleModel.labelMultiplier,p=ke(d,f,o.projection,o.projection==="isometric"?.92:1);return{x:l.x+p.x,y:l.y+p.y,anchorX:l.x,anchorY:l.y}}}return{x:s-c-170,y:a-c-86-r*58*o.scaleModel.freePlacementMultiplier}}function Mi(e,t,n,r,i){let s=e.secondary?t.get(e.primary):Ni(e.primary,t,n),a=t.get(e.secondary??e.primary);if(!s||!a)return{x:r*.7,y:i*.25};let c=a.x-s.x,o=a.y-s.y,l=Math.hypot(c,o)||1,d=c/l,f=o/l,p=-f,m=d,v=S(l*.25,24,68);switch(e.point){case"L1":return{x:a.x-d*v,y:a.y-f*v,anchorX:a.x,anchorY:a.y};case"L2":return{x:a.x+d*v,y:a.y+f*v,anchorX:a.x,anchorY:a.y};case"L3":return{x:s.x-d*v,y:s.y-f*v,anchorX:s.x,anchorY:s.y};case"L4":return{x:a.x+(d*.5-p*.8660254)*v,y:a.y+(f*.5-m*.8660254)*v,anchorX:a.x,anchorY:a.y};case"L5":return{x:a.x+(d*.5+p*.8660254)*v,y:a.y+(f*.5+m*.8660254)*v,anchorX:a.x,anchorY:a.y}}}function Ri(e,t){let n=new Map,r=new Map;for(let l of e){let d=an(l,t);if(n.set(l.id,d),d){let f=r.get(d);f?f.push(l.id):r.set(d,[l.id])}r.has(l.id)||r.set(l.id,[])}let i=new Map,s=new Map,a=new Map,c=l=>{let d=i.get(l);if(d)return d;let f=new Set,p=[],m=n.get(l)??null;for(;m&&!f.has(m);)p.push(m),f.add(m),m=n.get(m)??null;return i.set(l,p),p},o=l=>{let d=a.get(s.get(l)??"");if(d)return d;let f=n.get(l)??null,p=t.get(l),m=l;return p?.placement&&p.placement.mode!=="free"&&f&&(m=o(f)),m};for(let l of e){c(l.id);let d=o(l.id),f=ve(d);s.set(l.id,f),a.set(f,d)}return{parentIds:n,childIds:r,ancestorIds:i,groupIds:s,groupRoots:a}}function an(e,t){let n=e.placement;if(!n)return null;switch(n.mode){case"orbit":case"surface":return t.has(n.target)?n.target:null;case"at":switch(n.reference.kind){case"anchor":return t.has(n.reference.objectId)?n.reference.objectId:null;case"named":return t.has(n.reference.name)?n.reference.name:null;case"lagrange":return n.reference.secondary&&t.has(n.reference.secondary)?n.reference.secondary:t.has(n.reference.primary)?n.reference.primary:null}case"free":return null}}function _i(e,t,n,r,i,s){let a=Number.POSITIVE_INFINITY,c=Number.POSITIVE_INFINITY,o=Number.NEGATIVE_INFINITY,l=Number.NEGATIVE_INFINITY,d=(f,p)=>{a=Math.min(a,f),c=Math.min(c,p),o=Math.max(o,f),l=Math.max(l,p)};for(let f of t)!f.hidden&&e.objectIds.includes(f.objectId)&&rn(f,d);for(let f of n)!f.hidden&&e.orbitIds.includes(f.objectId)&&nn(f,d);for(let f of r)!f.hidden&&e.leaderIds.includes(f.objectId)&&(d(f.x1,f.y1),d(f.x2,f.y2));for(let f of i)!f.hidden&&e.labelIds.includes(f.objectId)&&on(f,d,s);return!Number.isFinite(a)||!Number.isFinite(c)?$e(0,0,0,0):$e(a,c,o,l)}function zi(e,t){let n=e,r=new Set;for(;n.placement&&n.placement.mode!=="free"&&!r.has(n.id);){r.add(n.id);let i=an(n,t);if(!i)break;let s=t.get(i);if(!s)break;n=s}return n.id}function sn(e,t,n){return cn(t.x,t.labelY,t.secondaryY,t.textAnchor,t.direction,e.label,e.secondaryLabel,n)}function cn(e,t,n,r,i,s,a,c){let o=Yi(s,a,c),l=o*2,d=i==="above"?18:12,f=i==="above"?8:12,p=e-o,m=e+o;return r==="start"?(p=e,m=e+l):r==="end"&&(p=e-l,m=e),{left:p,right:m,top:Math.min(t,n)-d,bottom:Math.max(t,n)+f}}function Ci(e,t){return!(e.right<t.left||t.right<e.left||e.bottom<t.top||t.bottom<e.top)}function Ni(e,t,n){let r=n.get(e);return!r?.placement||r.placement.mode!=="orbit"?t.get(e):t.get(r.placement.target)}function Ve(e,t,n){let r=Ui(e.properties.radius,n);if(r!==null)return r;let i=n.bodyRadiusMultiplier;switch(e.type){case"star":return S((t===0?28:20)*i,n.minBodyRadius,n.maxBodyRadius);case"planet":return S(12*i,n.minBodyRadius,n.maxBodyRadius);case"moon":return S(7*i,n.minBodyRadius,n.maxBodyRadius);case"belt":return S(5*i,n.minBodyRadius,n.maxBodyRadius);case"asteroid":return S(5*i,n.minBodyRadius,n.maxBodyRadius);case"comet":return S(6*i,n.minBodyRadius,n.maxBodyRadius);case"ring":return S(5*i,n.minBodyRadius,n.maxBodyRadius);case"structure":return S(6*i,n.minBodyRadius,n.maxBodyRadius);case"phenomenon":return S(8*i,n.minBodyRadius,n.maxBodyRadius)}}function Vi(e,t,n){let r=typeof e.properties.atmosphere=="string"?4:0;switch(e.type){case"star":return t*2.4;case"phenomenon":return t*1.25;case"structure":return t+2;default:return Math.min(t+r,n.maxBodyRadius+10)}}function Be(e){if(!e)return null;switch(e.unit){case"au":return e.value;case"km":return e.value/ge;case"m":return e.value/1e3/ge;case"ly":return e.value*Nr;case"pc":return e.value*Vr;case"kpc":return e.value*Br;case"re":return e.value*_r/ge;case"rj":return e.value*zr/ge;case"sol":return e.value*Cr/ge;default:return e.value}}function Bi(e,t){let n=Be(e??null);return n===null||n<=0?0:S(n*96*t.freePlacementMultiplier,0,420)}function Ui(e,t){let n=ut(e);if(!n)return null;let r;switch(n.unit){case"sol":r=S(n.value*22,14,40);break;case"re":r=S(n.value*10,6,18);break;case"km":r=S(Math.log10(Math.max(n.value,1))*2.6,4,16);break;default:r=S(n.value*4,4,20);break}return S(r*t.bodyRadiusMultiplier,t.minBodyRadius,t.maxBodyRadius)}function ut(e){return!e||typeof e!="object"||!("value"in e)?null:e}function dt(e){return e&&(e.unit==="deg"||e.unit===null)?e.value:null}function Ie(e,t,n){return t<=1?n:n+e*Math.PI*2/t}function qt(e,t,n,r,i,s,a){let c=ln(e,t,n,r,i,s,a,Xt);return c.length===0?"":c.map((o,l)=>`${l===0?"M":"L"} ${Kt(o.x)} ${Kt(o.y)}`).join(" ")}function ln(e,t,n,r,i,s,a,c){let o=[];for(let l=0;l<=c;l+=1){let d=s+(a-s)*l/c;o.push(un(e,t,n,r,i,d))}return o}function un(e,t,n,r,i,s){let a=n*Math.cos(s),c=r*Math.sin(s),o=dn(a,c,i);return{x:e+o.x,y:t+o.y}}function dn(e,t,n){let r=We(n);return{x:e*Math.cos(r)-t*Math.sin(r),y:e*Math.sin(r)+t*Math.cos(r)}}function ke(e,t,n,r){let i=n==="isometric"?Zt*r:r;return{x:Math.cos(e)*t,y:Math.sin(e)*t*i}}function Ue(e,t,n){return t*1e3+e+n*.01}function S(e,t,n){return Math.min(Math.max(e,t),n)}function Ht(e,t,n){let r=e.get(t);r?r.push(n):e.set(t,[n])}function ue(e){return`wo-${e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"object"}`}function ve(e){return`${ue(e)}-group`}function Wi(e){return typeof e=="string"&&e.trim()?e:void 0}function Yi(e,t,n){let r=e.length*4.6*n+18,i=t.length*3.9*n+18;return Math.max(r,i,24)}function Gt(e){return e.length>0?e[0].toUpperCase()+e.slice(1):e}function We(e){return e*Math.PI/180}function Kt(e){return Number.isInteger(e)?String(e):e.toFixed(2)}function je(e,t={}){let n=oe(e,t),r=[],i=Gi(e,r),s=Ki(e,r),a=Hi(e,n.renderPreset??t.preset??null,n.projection),c=e.system?qi(e,a,i,s,r,n.renderPreset??t.preset??null):null;return n.viewpoints.some(o=>!o.generated)&&r.push({code:"upgrade.viewpoints.structured",severity:"info",source:"upgrade",message:`Promoted ${n.viewpoints.filter(o=>!o.generated).length} document-defined viewpoint(s) into the 2.0 atlas section.`}),{format:"worldorbit",version:"2.5",schemaVersion:"2.5",sourceVersion:e.version,system:c,groups:structuredClone(e.groups??[]),relations:structuredClone(e.relations??[]),events:structuredClone(e.events??[]),objects:e.objects.map(mn),diagnostics:r}}function Ye(e,t={}){return ao(je(e,t))}function Oe(e,t={}){let n=e.system?{type:"system",id:e.system.id,title:e.system.title,description:e.system.description,epoch:e.system.epoch,referencePlane:e.system.referencePlane,properties:ro(e.system),info:io(e.system)}:null,r=e.objects.map(mn);return Qi(r,e.events??[],t.activeEventId??null),{format:"worldorbit",version:"1.0",schemaVersion:e.version,system:n,groups:structuredClone(e.groups??[]),relations:structuredClone(e.relations??[]),events:e.events.map(Xi),objects:r}}function pn(e){return Oe(e)}function qi(e,t,n,r,i,s){let a=oe(e,{preset:s??void 0,projection:t.view});return{type:"system",id:e.system?.id??"WorldOrbit",title:e.system?.title??(typeof e.system?.properties.title=="string"?e.system.properties.title:null),description:e.system?.description??null,epoch:e.system?.epoch??null,referencePlane:e.system?.referencePlane??null,defaults:t,atlasMetadata:n,viewpoints:a.viewpoints.map(Zi),annotations:r}}function Hi(e,t,n){let r=typeof e.system?.properties.view=="string"?e.system.properties.view.toLowerCase():null;return{view:r==="topdown"||r==="isometric"||r==="orthographic"||r==="perspective"?r:n,scale:typeof e.system?.properties.scale=="string"?e.system.properties.scale:null,units:typeof e.system?.properties.units=="string"?e.system.properties.units:null,preset:t,theme:typeof e.system?.info["atlas.theme"]=="string"?e.system.info["atlas.theme"]:null}}function Gi(e,t){let n={};for(let[i,s]of Object.entries(e.system?.info??{}))i.startsWith("viewpoint.")||i.startsWith("annotation.")||(n[i]=s);let r=Object.keys(n);return r.length>0&&t.push({code:"upgrade.atlasMetadata.preserved",severity:"warning",source:"upgrade",message:`Preserved ${r.length} system info entr${r.length===1?"y":"ies"} as atlas metadata in the 2.0 atlas document.`}),n}function Ki(e,t){let n=new Map;for(let[r,i]of Object.entries(e.system?.info??{})){if(!r.startsWith("annotation."))continue;let[,s,...a]=r.split(".");if(!s||a.length===0)continue;let c=fn(s);if(!c)continue;let o=n.get(c)??{id:c};switch(a.join(".").toLowerCase()){case"label":o.label=i;break;case"target":case"object":o.targetObjectId=i.trim()||null;break;case"body":case"text":case"description":o.body=i;break;case"tags":o.tags=to(i);break}n.set(c,o)}for(let r of e.objects){let i=r.info.description;if(!i)continue;let s=fn(`${r.id}-notes`);n.has(s)||(n.set(s,{id:s,label:`${r.id} Notes`,targetObjectId:r.id,body:i,tags:Array.isArray(r.properties.tags)?r.properties.tags.filter(a=>typeof a=="string"):[]}),t.push({code:"upgrade.annotation.objectDescription",severity:"info",source:"upgrade",message:`Lifted ${r.id}.info.description into structured atlas annotation "${s}".`,objectId:r.id,field:"description"}))}return[...n.values()].filter(r=>r.body||r.label).map(r=>({id:r.id,label:r.label??no(r.id),targetObjectId:r.targetObjectId??null,body:r.body??"",tags:r.tags??[],sourceObjectId:r.targetObjectId??null})).sort((r,i)=>r.label.localeCompare(i.label))}function Zi(e){return{id:e.id,label:e.label,summary:e.summary,focusObjectId:e.objectId,selectedObjectId:e.selectedObjectId,events:[...e.eventIds],projection:e.projection,preset:e.preset,zoom:e.scale,rotationDeg:e.rotationDeg,camera:e.camera?{...e.camera}:null,layers:{...e.layers},filter:e.filter?{query:e.filter.query,objectTypes:[...e.filter.objectTypes],tags:[...e.filter.tags],groupIds:[...e.filter.groupIds]}:null}}function mn(e){return{...e,groups:e.groups?[...e.groups]:void 0,resonance:e.resonance?{...e.resonance}:e.resonance,renderHints:e.renderHints?{...e.renderHints}:e.renderHints,deriveRules:e.deriveRules?e.deriveRules.map(t=>({...t})):void 0,validationRules:e.validationRules?e.validationRules.map(t=>({...t})):void 0,lockedFields:e.lockedFields?[...e.lockedFields]:void 0,tolerances:e.tolerances?e.tolerances.map(t=>({field:t.field,value:t.value&&typeof t.value=="object"&&"value"in t.value?{value:t.value.value,unit:t.value.unit}:Array.isArray(t.value)?[...t.value]:t.value})):void 0,typedBlocks:e.typedBlocks?Object.fromEntries(Object.entries(e.typedBlocks).map(([t,n])=>[t,{...n??{}}])):void 0,properties:eo(e.properties),placement:e.placement?structuredClone(e.placement):null,info:{...e.info}}}function Xi(e){return{...e,participantObjectIds:[...e.participantObjectIds],tags:[...e.tags],positions:e.positions.map(Ji)}}function Ji(e){return{objectId:e.objectId,placement:hn(e.placement),inner:e.inner?{...e.inner}:void 0,outer:e.outer?{...e.outer}:void 0,epoch:e.epoch??null,referencePlane:e.referencePlane??null}}function hn(e){return e?structuredClone(e):null}function Qi(e,t,n){if(!n)return;let r=t.find(a=>a.id===n);if(!r)return;let i=new Map(e.map(a=>[a.id,a])),s=new Set([...r.targetObjectId?[r.targetObjectId]:[],...r.participantObjectIds,...r.positions.map(a=>a.objectId)]);for(let a of s){let c=i.get(a);c&&(r.epoch&&(c.epoch=r.epoch),r.referencePlane&&(c.referencePlane=r.referencePlane))}for(let a of r.positions){let c=i.get(a.objectId);c&&(a.placement&&(c.placement=hn(a.placement)),a.inner&&(c.properties.inner={...a.inner}),a.outer&&(c.properties.outer={...a.outer}),a.epoch&&(c.epoch=a.epoch),a.referencePlane&&(c.referencePlane=a.referencePlane))}}function eo(e){let t={};for(let[n,r]of Object.entries(e)){if(Array.isArray(r)){t[n]=[...r];continue}if(r&&typeof r=="object"&&"value"in r){t[n]={value:r.value,unit:r.unit};continue}t[n]=r}return t}function to(e){return e.split(/[\s,]+/).map(t=>t.trim()).filter(Boolean)}function fn(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function no(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function ro(e){let t={};return e.title&&(t.title=e.title),t.view=e.defaults.view,e.defaults.scale&&(t.scale=e.defaults.scale),e.defaults.units&&(t.units=e.defaults.units),e.description&&(t.description=e.description),e.epoch&&(t.epoch=e.epoch),e.referencePlane&&(t.referencePlane=e.referencePlane),t}function io(e){let t={...e.atlasMetadata};e.defaults.theme&&(t["atlas.theme"]=e.defaults.theme);for(let n of e.viewpoints){let r=`viewpoint.${n.id}`;t[`${r}.label`]=n.label,n.summary&&(t[`${r}.summary`]=n.summary),n.focusObjectId&&(t[`${r}.focus`]=n.focusObjectId),n.selectedObjectId&&(t[`${r}.select`]=n.selectedObjectId),n.projection&&(t[`${r}.projection`]=n.projection),n.preset&&(t[`${r}.preset`]=n.preset),n.zoom!==null&&(t[`${r}.zoom`]=String(n.zoom)),n.rotationDeg!==0&&(t[`${r}.rotation`]=String(n.rotationDeg)),n.camera?.azimuth!==null&&(t[`${r}.camera.azimuth`]=String(n.camera?.azimuth)),n.camera?.elevation!==null&&(t[`${r}.camera.elevation`]=String(n.camera?.elevation)),n.camera?.roll!==null&&(t[`${r}.camera.roll`]=String(n.camera?.roll)),n.camera?.distance!==null&&(t[`${r}.camera.distance`]=String(n.camera?.distance));let i=oo(n.layers);i&&(t[`${r}.layers`]=i),n.filter?.query&&(t[`${r}.query`]=n.filter.query),(n.filter?.objectTypes.length??0)>0&&(t[`${r}.types`]=n.filter?.objectTypes.join(" ")??""),(n.filter?.tags.length??0)>0&&(t[`${r}.tags`]=n.filter?.tags.join(" ")??""),(n.filter?.groupIds.length??0)>0&&(t[`${r}.groups`]=n.filter?.groupIds.join(" ")??""),n.events.length>0&&(t[`${r}.events`]=n.events.join(" "))}for(let n of e.annotations){let r=`annotation.${n.id}`;t[`${r}.label`]=n.label,n.targetObjectId&&(t[`${r}.target`]=n.targetObjectId),t[`${r}.body`]=n.body,n.tags.length>0&&(t[`${r}.tags`]=n.tags.join(" ")),n.sourceObjectId&&(t[`${r}.source`]=n.sourceObjectId)}return t}function oo(e){let t=[],n=e["orbits-front"],r=e["orbits-back"];(n!==void 0||r!==void 0)&&t.push(n!==!1||r!==!1?"orbits":"-orbits");for(let i of["background","guides","relations","events","objects","labels","metadata"])e[i]!==void 0&&t.push(e[i]?i:`-${i}`);return t.join(" ")}function ao(e){return{...e,version:"2.0-draft",schemaVersion:"2.0-draft"}}var yn=["title","view","scale","units","kind","class","tags","color","image","hidden","orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","radius","mass","density","gravity","temperature","albedo","atmosphere","inner","outer","on","source","cycle"];function He(e,t={}){let n=t.schema??"auto";if(n==="2.0"||n==="2.1"||n==="2.5"||n==="2.0-draft"||e.version==="2.0"||e.version==="2.1"||e.version==="2.5"||e.version==="2.0-draft"){if(n==="2.0-draft"){let o=e.version==="2.0-draft"?e:e.version==="2.0"||e.version==="2.1"||e.version==="2.5"?{...e,version:"2.0-draft",schemaVersion:"2.0-draft"}:Ye(e);return mt(o)}let c=e.version==="2.0"||e.version==="2.1"||e.version==="2.5"?e:e.version==="2.0-draft"?{...e,version:"2.0",schemaVersion:"2.0"}:je(e);return(n==="2.0"||n==="2.1"||n==="2.5")&&c.version!==n?qe({...c,version:n,schemaVersion:n}):qe(c)}let i=[],s=e;s.system&&i.push(...so(s.system));let a=[...s.objects].sort(gt);for(let c of a)i.length>0&&i.push(""),i.push(...lo(c));return i.join(`
2
- `)}function qe(e){let t=[`schema ${e.version}`,""];e.system&&t.push(...bn(e.system));for(let r of[...e.groups].sort(de))t.push(""),t.push(...In(r));for(let r of[...e.relations].sort(de))t.push(""),t.push(...kn(r));for(let r of[...e.events].sort(de))t.push(""),t.push(...jn(r));let n=[...e.objects].sort(gt);return n.length>0&&t.at(-1)!==""&&t.push(""),n.forEach((r,i)=>{i>0&&t.push(""),t.push(...vn(r))}),t.join(`
3
- `)}function mt(e){let t=e.version==="2.0-draft"?e:{...e,version:"2.0-draft",schemaVersion:"2.0-draft"},n=["schema 2.0-draft",""];t.system&&n.push(...bn(t.system));for(let i of[...t.groups].sort(de))n.push(""),n.push(...In(i));for(let i of[...t.relations].sort(de))n.push(""),n.push(...kn(i));for(let i of[...t.events].sort(de))n.push(""),n.push(...jn(i));let r=[...t.objects].sort(gt);return r.length>0&&n.at(-1)!==""&&n.push(""),r.forEach((i,s)=>{s>0&&n.push(""),n.push(...vn(i))}),n.join(`
4
- `)}function so(e){return co("system",e.id,e.properties,null,e.info)}function co(e,t,n,r,i){let s=[`${e} ${t}`],a=[...ht(r),...$n(n)];for(let o of a)s.push(` ${o}`);let c=Object.entries(i).sort(([o],[l])=>o.localeCompare(l));if(c.length>0){a.length>0&&s.push(""),s.push(" info");for(let[o,l]of c)s.push(` ${o} ${h(l)}`)}return s}function bn(e){let t=[`system ${e.id}`];if(e.title&&t.push(` title ${h(e.title)}`),e.description&&t.push(` description ${h(e.description)}`),e.epoch&&t.push(` epoch ${h(e.epoch)}`),e.referencePlane&&t.push(` referencePlane ${h(e.referencePlane)}`),t.push(""),t.push("defaults"),t.push(` view ${e.defaults.view}`),e.defaults.scale&&t.push(` scale ${h(e.defaults.scale)}`),e.defaults.units&&t.push(` units ${h(e.defaults.units)}`),e.defaults.preset&&t.push(` preset ${e.defaults.preset}`),e.defaults.theme&&t.push(` theme ${h(e.defaults.theme)}`),Object.keys(e.atlasMetadata).length>0){t.push(""),t.push("atlas"),t.push(" metadata");for(let[n,r]of Object.entries(e.atlasMetadata).sort(([i],[s])=>i.localeCompare(s)))t.push(` ${n} ${h(r)}`)}for(let n of e.viewpoints)t.push(""),t.push(...fo(n));for(let n of e.annotations)t.push(""),t.push(...po(n));return t}function lo(e){return wn(e.type,e.id,e)}function vn(e){return wn(`object ${e.type}`,e.id,e)}function wn(e,t,n){let r=[`${e} ${t}`],i=[...ht(n.placement),...$n(n.properties),...uo(n)];for(let a of i)r.push(` ${a}`);let s=Object.entries(n.info).sort(([a],[c])=>a.localeCompare(c));if(s.length>0){i.length>0&&r.push(""),r.push(" info");for(let[a,c]of s)r.push(` ${a} ${h(c)}`)}for(let a of["climate","habitability","settlement"]){let c=Object.entries(n.typedBlocks?.[a]??{}).sort(([o],[l])=>o.localeCompare(l));if(c.length>0){r.push(""),r.push(` ${a}`);for(let[o,l]of c)r.push(` ${o} ${h(l)}`)}}return r}function ht(e){if(!e)return[];switch(e.mode){case"orbit":return[`orbit ${e.target}`,...X("distance",e.distance),...X("semiMajor",e.semiMajor),...yo("eccentricity",e.eccentricity),...X("period",e.period),...X("angle",e.angle),...X("inclination",e.inclination),...X("phase",e.phase)];case"at":return[`at ${go(e.reference)}`];case"surface":return[`surface ${e.target}`];case"free":return[`free ${e.distance?yt(e.distance):e.descriptor??""}`.trim()]}}function $n(e){return Object.keys(e).sort(vo).map(t=>`${t} ${On(e[t])}`)}function uo(e){let t=[];e.groups?.length&&t.push(`groups ${e.groups.join(" ")}`),e.epoch&&t.push(`epoch ${h(e.epoch)}`),e.referencePlane&&t.push(`referencePlane ${h(e.referencePlane)}`),e.tidalLock!==void 0&&t.push(`tidalLock ${e.tidalLock?"true":"false"}`),e.renderHints?.renderLabel!==void 0&&t.push(`renderLabel ${e.renderHints.renderLabel?"true":"false"}`),e.renderHints?.renderOrbit!==void 0&&t.push(`renderOrbit ${e.renderHints.renderOrbit?"true":"false"}`),e.renderHints?.renderPriority!==void 0&&t.push(`renderPriority ${e.renderHints.renderPriority}`),e.resonance&&t.push(`resonance ${e.resonance.targetObjectId} ${e.resonance.ratio}`);for(let n of e.deriveRules??[])t.push(`derive ${n.field} ${n.strategy}`);for(let n of e.validationRules??[])t.push(`validate ${n.rule}`);e.lockedFields?.length&&t.push(`locked ${e.lockedFields.join(" ")}`);for(let n of e.tolerances??[])t.push(`tolerance ${n.field} ${On(n.value)}`);return t}function fo(e){let t=[`viewpoint ${e.id}`,` label ${h(e.label)}`];e.focusObjectId&&t.push(` focus ${e.focusObjectId}`),e.selectedObjectId&&e.selectedObjectId!==e.focusObjectId&&t.push(` select ${e.selectedObjectId}`),e.summary&&t.push(` summary ${h(e.summary)}`),e.projection&&t.push(` projection ${e.projection}`),e.preset&&t.push(` preset ${e.preset}`),e.zoom!==null&&t.push(` zoom ${e.zoom}`),e.rotationDeg!==0&&t.push(` rotation ${e.rotationDeg}`),e.camera&&ho(e.camera)&&(t.push(" camera"),e.camera.azimuth!==null&&t.push(` azimuth ${e.camera.azimuth}`),e.camera.elevation!==null&&t.push(` elevation ${e.camera.elevation}`),e.camera.roll!==null&&t.push(` roll ${e.camera.roll}`),e.camera.distance!==null&&t.push(` distance ${e.camera.distance}`));let n=bo(e.layers);return n.length>0&&t.push(` layers ${n.join(" ")}`),e.events.length>0&&t.push(` events ${e.events.join(" ")}`),e.filter&&(t.push(" filter"),e.filter.query&&t.push(` query ${h(e.filter.query)}`),e.filter.objectTypes.length>0&&t.push(` objectTypes ${e.filter.objectTypes.join(" ")}`),e.filter.tags.length>0&&t.push(` tags ${e.filter.tags.map(h).join(" ")}`),e.filter.groupIds.length>0&&t.push(` groups ${e.filter.groupIds.join(" ")}`)),t}function po(e){let t=[`annotation ${e.id}`,` label ${h(e.label)}`];return e.targetObjectId&&t.push(` target ${e.targetObjectId}`),t.push(` body ${h(e.body)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(h).join(" ")}`),t}function In(e){let t=[`group ${e.id}`,` label ${h(e.label)}`];return e.summary&&t.push(` summary ${h(e.summary)}`),e.color&&t.push(` color ${h(e.color)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(h).join(" ")}`),e.hidden&&t.push(" hidden true"),t}function kn(e){let t=[`relation ${e.id}`];return e.from&&t.push(` from ${h(e.from)}`),e.to&&t.push(` to ${h(e.to)}`),e.kind&&t.push(` kind ${h(e.kind)}`),e.label&&t.push(` label ${h(e.label)}`),e.summary&&t.push(` summary ${h(e.summary)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(h).join(" ")}`),e.color&&t.push(` color ${h(e.color)}`),e.hidden&&t.push(" hidden true"),t}function jn(e){let t=[`event ${e.id}`,` kind ${h(e.kind)}`];if(e.label&&t.push(` label ${h(e.label)}`),e.summary&&t.push(` summary ${h(e.summary)}`),e.targetObjectId&&t.push(` target ${e.targetObjectId}`),e.participantObjectIds.length>0&&t.push(` participants ${e.participantObjectIds.join(" ")}`),e.timing&&t.push(` timing ${h(e.timing)}`),e.visibility&&t.push(` visibility ${h(e.visibility)}`),e.epoch&&t.push(` epoch ${h(e.epoch)}`),e.referencePlane&&t.push(` referencePlane ${h(e.referencePlane)}`),e.tags.length>0&&t.push(` tags ${e.tags.map(h).join(" ")}`),e.color&&t.push(` color ${h(e.color)}`),e.hidden&&t.push(" hidden true"),e.positions.length>0){t.push(""),t.push(" positions");for(let n of[...e.positions].sort(wo)){t.push(` pose ${n.objectId}`);for(let r of mo(n))t.push(` ${r}`)}}return t}function mo(e){return[...ht(e.placement),...e.epoch?[`epoch ${h(e.epoch)}`]:[],...e.referencePlane?[`referencePlane ${h(e.referencePlane)}`]:[],...X("inner",e.inner),...X("outer",e.outer)]}function ho(e){return e.azimuth!==null||e.elevation!==null||e.roll!==null||e.distance!==null}function On(e){return Array.isArray(e)?e.map(t=>h(t)).join(" "):typeof e=="boolean"?e?"true":"false":typeof e=="number"?String(e):typeof e=="string"?h(e):yt(e)}function yt(e){return`${e.value}${e.unit??""}`}function X(e,t){return t?[`${e} ${yt(t)}`]:[]}function yo(e,t){return t===void 0?[]:[`${e} ${t}`]}function go(e){switch(e.kind){case"lagrange":return e.secondary?`${e.primary}-${e.secondary}:${e.point}`:`${e.primary}:${e.point}`;case"anchor":return`${e.objectId}:${e.anchor}`;case"named":return e.name}}function bo(e){let t=[],n=e["orbits-front"],r=e["orbits-back"];(n!==void 0||r!==void 0)&&t.push(n!==!1||r!==!1?"orbits":"-orbits");for(let i of["background","guides","relations","events","objects","labels","metadata"])e[i]!==void 0&&t.push(e[i]?i:`-${i}`);return t}function vo(e,t){let n=yn.indexOf(e),r=yn.indexOf(t);return n===-1&&r===-1?e.localeCompare(t):n===-1?1:r===-1?-1:n-r}function gt(e,t){let n=gn(e.type),r=gn(t.type);return n!==r?n-r:e.id.localeCompare(t.id)}function de(e,t){return e.id.localeCompare(t.id)}function wo(e,t){return e.objectId.localeCompare(t.objectId)}function gn(e){switch(e){case"star":return 0;case"planet":return 1;case"moon":return 2;case"belt":return 3;case"asteroid":return 4;case"comet":return 5;case"ring":return 6;case"structure":return 7;case"phenomenon":return 8}}function h(e){return!/\s/.test(e)&&!e.includes('"')?e:`"${e.replaceAll("\\","\\\\").replaceAll('"','\\"')}"`}var xn=/^(-?\d+(?:\.\d+)?)(kpc|min|mj|rj|ky|my|gy|au|km|me|re|pc|ly|deg|sol|K|m|s|h|d|y)?$/,$o=new Map([["true",!0],["false",!1],["yes",!0],["no",!1]]),Io=/^[A-Za-z][A-Za-z0-9+.-]*:/;function fe(e){return e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")}function Pe(e){return e.split(/[-_]+/).filter(Boolean).map(t=>t[0].toUpperCase()+t.slice(1)).join(" ")}function bt(e,t,n){let r=e.match(xn);if(!r)throw u.fromLocation(`Invalid unit value "${e}"`,t);let i={value:Number(r[1]),unit:r[2]??null};if(n){let s=A(n);if(s?.unitFamily&&!ye(s.unitFamily,i.unit))throw u.fromLocation(`Unit "${i.unit??"none"}" is not valid for "${n}"`,t)}return i}function vt(e){let t=e.match(xn);return t?{value:Number(t[1]),unit:t[2]??null}:null}function Ge(e,t,n){let r=Number(e);if(!Number.isFinite(r))throw u.fromLocation(`Invalid numeric value "${e}" for "${t}"`,n);return r}function J(e,t,n){let r=$o.get(e.toLowerCase());if(r===void 0)throw u.fromLocation(`Invalid boolean value "${e}" for "${t}"`,n);return r}function Pn(e,t){if(/^[A-Za-z0-9._-]+-[A-Za-z0-9._-]+:L\d+$/i.test(e))throw u.fromLocation(`Invalid special position "${e}"`,t);let n=e.match(/^([A-Za-z0-9._-]+)-([A-Za-z0-9._-]+):(L[1-5])$/);if(n)return{kind:"lagrange",primary:n[1],secondary:n[2],point:n[3]};let r=e.match(/^([A-Za-z0-9._-]+):(L[1-5])$/);if(r)return{kind:"lagrange",primary:r[1],secondary:null,point:r[2]};if(/^[A-Za-z0-9._-]+:L\d+$/i.test(e))throw u.fromLocation(`Invalid special position "${e}"`,t);let i=e.match(/^([A-Za-z0-9._-]+):([A-Za-z0-9._-]+)$/);return i?{kind:"anchor",objectId:i[1],anchor:i[2]}:{kind:"named",name:e}}function ko(e,t){if(!e)throw u.fromLocation('Field "image" must not be empty',t);if(e.startsWith("//"))throw u.fromLocation('Field "image" must use a relative path, root-relative path, or an http/https URL',t);let n=e.match(Io);if(!n)return;let r=n[0].slice(0,-1).toLowerCase();if(r!=="http"&&r!=="https")throw u.fromLocation(`Field "image" does not support the "${r}" scheme`,t)}function Sn(e,t,n){let r=A(e);if(!r)throw u.fromLocation(`Unknown field "${e}"`,n);if(r.arity==="single"&&t.length!==1)throw u.fromLocation(`Field "${e}" expects exactly one value`,n);switch(r.kind){case"list":return t;case"boolean":return J(xe(t,e,n),e,n);case"number":return Ge(xe(t,e,n),e,n);case"unit":return bt(xe(t,e,n),n,e);case"string":{let i=t.join(" ").trim();return e==="image"&&ko(i,n),i}}}function wt(e,t,n){let r=A(e);if(!r)throw u.fromLocation(`Unknown field "${e}"`,n);if(!r.objectTypes.includes(t))throw u.fromLocation(`Field "${e}" is not valid on "${t}"`,n)}function xe(e,t,n){if(e.length!==1)throw u.fromLocation(`Field "${t}" expects exactly one value`,n);return e[0]}var An=new Set(["star","planet","moon","asteroid","comet"]),jo=332946.0487,Oo=1047.3486,Ke=1495978707e-1,xo=6371,Po=695700,So=63241.077,Lo=206264.806,Ao=206264806;function Se(e,t){let n=[],r=new Map(e.objects.map(c=>[c.id,c])),i=new Set(e.groups.map(c=>c.id)),s=new Set(e.events.map(c=>c.id));e.system||n.push(b("validate.system.required","Atlas documents must declare exactly one system."));let a=new Map;for(let[c,o]of[["group",e.groups.map(l=>l.id)],["viewpoint",e.system?.viewpoints.map(l=>l.id)??[]],["annotation",e.system?.annotations.map(l=>l.id)??[]],["relation",e.relations.map(l=>l.id)],["event",e.events.map(l=>l.id)],["object",e.objects.map(l=>l.id)]])for(let l of o){let d=a.get(l);d?n.push(b("validate.id.duplicate",`Duplicate ${c} id "${l}" already used by ${d}.`)):a.set(l,c)}for(let c of e.relations)Do(c,r,n);for(let c of e.system?.viewpoints??[])To(c,i,s,t,n,r);for(let c of e.objects)Fo(c,e.system,r,i,n);for(let c of e.events)Eo(c,e.system,r,n);return n}function Do(e,t,n){e.from?t.has(e.from)||n.push(b("validate.relation.from.unknown",`Unknown relation source "${e.from}" on "${e.id}".`)):n.push(b("validate.relation.from.required",`Relation "${e.id}" is missing a "from" target.`)),e.to?t.has(e.to)||n.push(b("validate.relation.to.unknown",`Unknown relation target "${e.to}" on "${e.id}".`)):n.push(b("validate.relation.to.required",`Relation "${e.id}" is missing a "to" target.`)),e.kind||n.push(b("validate.relation.kind.required",`Relation "${e.id}" is missing a "kind" value.`))}function To(e,t,n,r,i,s){let a=e.filter;if(r==="2.1"||r==="2.5"){if(a)for(let c of a.groupIds)t.has(c)||i.push(k("validate.viewpoint.group.unknown",`Unknown group "${c}" in viewpoint "${e.id}".`,void 0,`viewpoint.${e.id}.groups`));for(let c of e.events??[])n.has(c)||i.push(k("validate.viewpoint.event.unknown",`Unknown event "${c}" in viewpoint "${e.id}".`,void 0,`viewpoint.${e.id}.events`))}zo(e.projection,i,`viewpoint.${e.id}.projection`,e.id),Co(e.camera,e.projection,e.rotationDeg,i,e.id,e.focusObjectId,e.selectedObjectId,a,s)}function Fo(e,t,n,r,i){let s=e.placement,a=s?.mode==="orbit"?s:null,c=s?.mode==="orbit"?n.get(s.target)??null:null;if(e.groups)for(let o of e.groups)r.has(o)||i.push(k("validate.group.unknown",`Unknown group "${o}" on "${e.id}".`,e.id,"groups"));if(typeof e.epoch=="string"&&!e.epoch.trim()&&i.push(k("validate.epoch.empty",`Object "${e.id}" defines an empty epoch string.`,e.id,"epoch")),typeof e.referencePlane=="string"&&!e.referencePlane.trim()&&i.push(k("validate.referencePlane.empty",`Object "${e.id}" defines an empty reference plane string.`,e.id,"referencePlane")),a&&(n.has(a.target)||i.push(b("validate.orbit.target.unknown",`Unknown placement target "${a.target}" on "${e.id}".`,e.id,"orbit")),a.distance&&a.semiMajor&&i.push(b("validate.orbit.distanceConflict",`Object "${e.id}" cannot declare both "distance" and "semiMajor".`,e.id,"distance")),a.phase&&!e.epoch&&!t?.epoch&&i.push(k("validate.phase.epochMissing",`Object "${e.id}" sets "phase" without an object or system epoch.`,e.id,"phase")),a.inclination&&!e.referencePlane&&!t?.referencePlane&&i.push(k("validate.inclination.referencePlaneMissing",`Object "${e.id}" sets "inclination" without an object or system reference plane.`,e.id,"inclination")),a.period&&!It(c?.properties.mass)&&i.push(k("validate.period.massMissing",`Object "${e.id}" sets "period" but its central mass cannot be derived.`,e.id,"period"))),s?.mode==="surface"){let o=n.get(s.target);o?An.has(o.type)||i.push(b("validate.surface.target.invalid",`Surface target "${s.target}" on "${e.id}" is not surface-capable.`,e.id,"surface")):i.push(b("validate.surface.target.unknown",`Unknown placement target "${s.target}" on "${e.id}".`,e.id,"surface"))}if(s?.mode==="at"&&(e.type!=="structure"&&e.type!=="phenomenon"&&i.push(b("validate.at.objectType",`Only structures and phenomena may use "at" placement; found "${e.type}" on "${e.id}".`,e.id,"at")),Ro(e,n,i)||i.push(b("validate.at.target.unknown",`Unknown at-reference target "${s.target}" on "${e.id}".`,e.id,"at"))),e.resonance){let o=n.get(e.resonance.targetObjectId);o?(e.placement?.mode!=="orbit"||o.placement?.mode!=="orbit"||e.placement.target!==o.placement.target)&&i.push(k("validate.resonance.orbitMismatch",`Resonance target "${e.resonance.targetObjectId}" on "${e.id}" does not share a compatible orbital parent.`,e.id,"resonance")):i.push(b("validate.resonance.target.unknown",`Unknown resonance target "${e.resonance.targetObjectId}" on "${e.id}".`,e.id,"resonance"))}for(let o of e.deriveRules??[]){if(o.field!=="period"||o.strategy!=="kepler"){i.push(k("validate.derive.unsupported",`Unsupported derive rule "${o.field} ${o.strategy}" on "${e.id}".`,e.id,"derive"));continue}let l=Ln(e,c);if(l===null){i.push(k("validate.derive.inputsMissing",`Object "${e.id}" requests "derive period kepler" but lacks enough input data.`,e.id,"derive"));continue}a?.period||i.push($t("validate.derive.period.available",`Object "${e.id}" can derive a Kepler period of ${Uo(l)}.`,e.id,"derive"))}for(let o of e.validationRules??[]){if(o.rule!=="kepler"){i.push(k("validate.rule.unsupported",`Unsupported validation rule "${o.rule}" on "${e.id}".`,e.id,"validate"));continue}let l=Dn(a?.period),d=Ln(e,c);if(l===null||d===null)continue;let f=Bo(e,"period");Math.abs(l-d)>f&&i.push(b("validate.kepler.mismatch",`Object "${e.id}" fails Kepler validation for "period".`,e.id,"validate"))}}function Eo(e,t,n,r){let i=`event.${e.id}`,s=new Set;e.kind.trim()||r.push(b("validate.event.kind.required",`Event "${e.id}" is missing a "kind" value.`,void 0,`${i}.kind`)),typeof e.epoch=="string"&&!e.epoch.trim()&&r.push(k("validate.event.epoch.empty",`Event "${e.id}" defines an empty epoch string.`,void 0,`${i}.epoch`)),typeof e.referencePlane=="string"&&!e.referencePlane.trim()&&r.push(k("validate.event.referencePlane.empty",`Event "${e.id}" defines an empty reference plane string.`,void 0,`${i}.referencePlane`)),!e.targetObjectId&&e.participantObjectIds.length===0&&r.push(b("validate.event.references.required",`Event "${e.id}" must define a "target" or at least one participant.`,void 0,`${i}.participants`)),e.targetObjectId&&(s.add(e.targetObjectId),n.has(e.targetObjectId)||r.push(b("validate.event.target.unknown",`Unknown event target "${e.targetObjectId}" on "${e.id}".`,void 0,`${i}.target`)));let a=new Set;for(let l of e.participantObjectIds){if(s.add(l),a.has(l)){r.push(k("validate.event.participants.duplicate",`Event "${e.id}" repeats participant "${l}".`,void 0,`${i}.participants`));continue}a.add(l),n.has(l)||r.push(b("validate.event.participants.unknown",`Unknown event participant "${l}" on "${e.id}".`,void 0,`${i}.participants`))}e.targetObjectId&&e.participantObjectIds.length>0&&!e.participantObjectIds.includes(e.targetObjectId)&&r.push(k("validate.event.target.notParticipant",`Event "${e.id}" defines a target outside its participants list.`,void 0,`${i}.target`)),e.positions.length===0&&r.push(k("validate.event.positions.missing",`Event "${e.id}" has no positions block and cannot drive a scene snapshot.`,void 0,`${i}.positions`)),/(?:^|[-_])(solar-eclipse|lunar-eclipse|transit|occultation)(?:$|[-_])/.test(e.kind)&&s.size<3&&r.push(k("validate.event.kind.participants",`Event "${e.id}" looks like an eclipse or transit but references fewer than three bodies.`,void 0,`${i}.participants`));let c=new Set;for(let l of e.positions){let d=`${i}.pose.${l.objectId}`;if(c.has(l.objectId)){r.push(b("validate.event.pose.duplicate",`Event "${e.id}" defines "${l.objectId}" more than once in positions.`,void 0,d));continue}c.add(l.objectId);let f=n.get(l.objectId);if(!f){r.push(b("validate.event.pose.object.unknown",`Unknown event pose object "${l.objectId}" on "${e.id}".`,void 0,d));continue}s.has(l.objectId)||r.push(k("validate.event.pose.unreferenced",`Event pose "${l.objectId}" on "${e.id}" is not listed in target/participants.`,void 0,d)),Mo(l,f,e,t,n,r,d,e.id)}let o=[...s].filter(l=>!c.has(l));e.positions.length>0&&o.length>0&&r.push(k("validate.event.positions.partial",`Event "${e.id}" leaves ${o.length} referenced object(s) on their base placement.`,void 0,`${i}.positions`))}function Mo(e,t,n,r,i,s,a,c){let o=e.placement;if(!o){s.push(b("validate.event.pose.placement.required",`Event "${c}" pose "${e.objectId}" is missing a placement mode.`,void 0,a));return}if(o.mode==="orbit"){i.has(o.target)||s.push(b("validate.event.pose.orbit.target.unknown",`Unknown event orbit target "${o.target}" on "${c}:${e.objectId}".`,void 0,`${a}.orbit`)),o.distance&&o.semiMajor&&s.push(b("validate.event.pose.orbit.distanceConflict",`Event "${c}" pose "${e.objectId}" cannot declare both "distance" and "semiMajor".`,void 0,`${a}.distance`)),o.phase&&!No(r,t,n,e)&&s.push(k("validate.event.pose.phase.epochMissing",`Event "${c}" pose "${e.objectId}" sets "phase" without an effective epoch.`,void 0,`${a}.phase`)),o.inclination&&!Vo(r,t,n,e)&&s.push(k("validate.event.pose.inclination.referencePlaneMissing",`Event "${c}" pose "${e.objectId}" sets "inclination" without an effective reference plane.`,void 0,`${a}.inclination`)),o.period&&!It(i.get(o.target)?.properties.mass)&&s.push(k("validate.event.pose.period.massMissing",`Event "${c}" pose "${e.objectId}" sets "period" but its central mass cannot be derived.`,void 0,`${a}.period`));return}if(o.mode==="surface"){let l=i.get(o.target);l?An.has(l.type)||s.push(b("validate.event.pose.surface.target.invalid",`Event surface target "${o.target}" on "${c}:${e.objectId}" is not surface-capable.`,void 0,`${a}.surface`)):s.push(b("validate.event.pose.surface.target.unknown",`Unknown event surface target "${o.target}" on "${c}:${e.objectId}".`,void 0,`${a}.surface`));return}if(o.mode==="at"){t.type!=="structure"&&t.type!=="phenomenon"&&s.push(b("validate.event.pose.at.objectType",`Only structures and phenomena may use "at" placement in events; found "${t.type}" on "${c}:${e.objectId}".`,void 0,`${a}.at`));let l=o.reference;l.kind==="named"&&!i.has(l.name)?s.push(b("validate.event.pose.at.target.unknown",`Unknown event at-reference target "${o.target}" on "${c}:${e.objectId}".`,void 0,`${a}.at`)):l.kind==="anchor"&&!i.has(l.objectId)?s.push(b("validate.event.pose.anchor.target.unknown",`Unknown event anchor target "${l.objectId}" on "${c}:${e.objectId}".`,void 0,`${a}.at`)):l.kind==="lagrange"&&(i.has(l.primary)?l.secondary&&!i.has(l.secondary)&&s.push(b("validate.event.pose.lagrange.secondary.unknown",`Unknown event Lagrange target "${l.secondary}" on "${c}:${e.objectId}".`,void 0,`${a}.at`)):s.push(b("validate.event.pose.lagrange.primary.unknown",`Unknown event Lagrange target "${l.primary}" on "${c}:${e.objectId}".`,void 0,`${a}.at`)))}}function Ro(e,t,n){let r=e.placement?.mode==="at"?e.placement.reference:null;return r?r.kind==="named"?t.has(r.name):r.kind==="anchor"?t.has(r.objectId)?!0:(n.push(b("validate.anchor.target.unknown",`Unknown anchor target "${r.objectId}" on "${e.id}".`,e.id,"at")),!1):t.has(r.primary)?r.secondary&&!t.has(r.secondary)?(n.push(b("validate.lagrange.secondary.unknown",`Unknown Lagrange reference "${r.secondary}" on "${e.id}".`,e.id,"at")),!1):!0:(n.push(b("validate.lagrange.primary.unknown",`Unknown Lagrange reference "${r.primary}" on "${e.id}".`,e.id,"at")),!1):!0}function Ln(e,t){let n=e.placement;if(!n||n.mode!=="orbit")return null;let r=_o(n.semiMajor??n.distance),i=It(t?.properties.mass);return r===null||i===null||i<=0?null:Math.sqrt(r**3/i)*365.25}function _o(e){if(!e)return null;switch(e.unit){case null:case"au":return e.value;case"km":return e.value/Ke;case"m":return e.value/(Ke*1e3);case"ly":return e.value*So;case"pc":return e.value*Lo;case"kpc":return e.value*Ao;case"re":return e.value*xo/Ke;case"sol":return e.value*Po/Ke;default:return null}}function It(e){if(!e||typeof e!="object"||!("value"in e))return null;let t=e;switch(t.unit){case null:case"sol":return t.value;case"me":return t.value/jo;case"mj":return t.value/Oo;default:return null}}function Dn(e){if(!e)return null;switch(e.unit){case null:case"d":return e.value;case"s":return e.value/86400;case"min":return e.value/1440;case"h":return e.value/24;case"y":return e.value*365.25;case"ky":return e.value*365250;case"my":return e.value*36525e4;case"gy":return e.value*36525e7;default:return null}}function zo(e,t,n,r){e!=="topdown"&&e!=="isometric"&&e!=="orthographic"&&e!=="perspective"&&t.push(b("validate.viewpoint.projection.invalid",`Unknown projection "${String(e)}" in viewpoint "${r}".`,void 0,n))}function Co(e,t,n,r,i,s,a,c,o){if(!e)return;let l=`viewpoint.${i}.camera`;for(let[f,p]of[["azimuth",e.azimuth],["elevation",e.elevation],["roll",e.roll],["distance",e.distance]])p!==null&&(!Number.isFinite(p)||f==="distance"&&p<=0)&&r.push(b("validate.viewpoint.camera.invalid",`Invalid camera ${f} "${String(p)}" in viewpoint "${i}".`,void 0,`${l}.${f}`));e.distance!==null&&t!=="perspective"&&r.push(k("validate.viewpoint.camera.distance.partialEffect",`Camera "distance" only has a semantic effect in perspective viewpoints; "${i}" uses "${t}".`,void 0,`${l}.distance`)),t==="topdown"&&(e.elevation!==null||e.roll!==null)&&r.push(k("validate.viewpoint.camera.topdownPartial",`Camera elevation/roll on topdown viewpoint "${i}" are currently stored for future 3D use and only partially affect 2D rendering.`,void 0,l)),t==="isometric"&&e.elevation!==null&&r.push($t("validate.viewpoint.camera.isometricStored",`Camera elevation on isometric viewpoint "${i}" is preserved semantically for future 3D rendering.`,void 0,`${l}.elevation`)),e.azimuth!==null&&e.azimuth!==0&&n!==0&&r.push(k("validate.viewpoint.rotation.cameraOverlap",`Viewpoint "${i}" uses camera.azimuth; keep "rotation" only for 2D screen rotation to avoid ambiguity.`,void 0,`${l}.azimuth`)),s!==null&&o.has(s)||a!==null&&o.has(a)||c||r.push($t("validate.viewpoint.camera.anchorMissing",`Viewpoint "${i}" stores camera settings without a focus object, selection, or filter anchor.`,void 0,l))}function No(e,t,n,r){return Q(r?.epoch)??Q(n?.epoch)??Q(t.epoch)??Q(e?.epoch)??null}function Vo(e,t,n,r){return Q(r?.referencePlane)??Q(n?.referencePlane)??Q(t.referencePlane)??Q(e?.referencePlane)??null}function Q(e){return typeof e=="string"&&e.trim()?e.trim():null}function Bo(e,t){let n=e.tolerances?.find(r=>r.field===t)?.value;return typeof n=="number"?n:n&&typeof n=="object"&&"value"in n?Dn(n)??0:0}function Uo(e){return`${Math.round(e*100)/100}d`}function b(e,t,n,r){return{code:e,severity:"error",source:"validate",message:t,objectId:n,field:r}}function k(e,t,n,r){return{code:e,severity:"warning",source:"validate",message:t,objectId:n,field:r}}function $t(e,t,n,r){return{code:e,severity:"info",source:"validate",message:t,objectId:n,field:r}}var Wo=new Set(["climate","habitability","settlement"]),Xe=new Map;for(let e of["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","kind","class","culture","tags","color","image","hidden","radius","mass","density","gravity","temperature","albedo","atmosphere","inner","outer","on","source","cycle"]){let t=A(e);t&&Xe.set(e,{key:e,version:"2.0",inlineMode:t.arity==="multiple"?"multiple":"single",allowRepeat:!1,legacySchema:t})}for(let e of[{key:"groups",inlineMode:"multiple",allowRepeat:!1},{key:"epoch",inlineMode:"single",allowRepeat:!1},{key:"referencePlane",inlineMode:"single",allowRepeat:!1},{key:"tidalLock",inlineMode:"single",allowRepeat:!1},{key:"renderLabel",inlineMode:"single",allowRepeat:!1},{key:"renderOrbit",inlineMode:"single",allowRepeat:!1},{key:"renderPriority",inlineMode:"single",allowRepeat:!1},{key:"resonance",inlineMode:"pair",allowRepeat:!1},{key:"derive",inlineMode:"pair",allowRepeat:!0},{key:"validate",inlineMode:"single",allowRepeat:!0},{key:"locked",inlineMode:"multiple",allowRepeat:!1},{key:"tolerance",inlineMode:"pair",allowRepeat:!0}])Xe.set(e.key,{key:e.key,version:"2.1",inlineMode:e.inlineMode,allowRepeat:e.allowRepeat});var Yo=new Set(Xe.keys()),Fn=new Set(["orbit","distance","semiMajor","eccentricity","period","angle","inclination","phase","at","surface","free","inner","outer","epoch","referencePlane"]);function Je(e){return Mn(e)}function En(e){return Mn(e,"2.0-draft")}function Mn(e,t){let n=Da(e),r=n.source.split(/\r?\n/),i=[],s=!1,a="2.0",c=null,o=null,l=[],d=[],f=[],p=[],m=new Map,v=!1,j=!1,O=new Set,x=new Set,g=new Set,I=new Set,F=new Set;for(let L=0;L<r.length;L++){let V=r[L],B=L+1;if(!V.trim())continue;let U=Fe(V),D=ie(V.slice(U),{line:B,columnOffset:U});if(D.length!==0){if(!s){a=qo(D,B),s=!0,n.comments.length>0&&Qe(a,"2.1")&&i.push({code:"parse.schema21.commentCompatibility",severity:"warning",source:"parse",message:`Comments require schema 2.1; parsed in compatibility mode because the document header is "schema ${a}".`,line:n.comments[0].line,column:n.comments[0].column});continue}if(U===0){o=Ho(D,B,a,i,c,l,d,f,p,m,O,x,g,I,F,{sawDefaults:v,sawAtlas:j}),o.kind==="system"?c=o.system:o.kind==="defaults"?v=!0:o.kind==="atlas"&&(j=!0);continue}if(!o)throw new u("Indented line without parent atlas section",B,U+1);ta(o,U,D,B)}}if(!s)throw new u('Missing required atlas schema header "schema 2.0"');let N=l.map(L=>wa(L,a,i)),E=p.map(L=>$a(L,m.get(L.id)??[])),H=t??(a==="2.0-draft"?"2.0":a),G={format:"worldorbit",sourceVersion:"1.0",system:c,groups:d,relations:f,events:E,objects:N,diagnostics:i};if(H==="2.0-draft"){let L={...G,version:"2.0-draft",schemaVersion:"2.0-draft"};return L.diagnostics.push(...Se(L,a)),L}let ne={...G,version:H,schemaVersion:H};return a==="2.0-draft"&&ne.diagnostics.push({code:"load.schema.deprecatedDraft",severity:"warning",source:"upgrade",message:'Source header "schema 2.0-draft" is deprecated; canonical v2 documents now use "schema 2.0".'}),ne.diagnostics.push(...Se(ne,a)),ne}function qo(e,t){if(e.length!==2||e[0].value.toLowerCase()!=="schema"||!["2.0-draft","2.0","2.1","2.5"].includes(e[1].value.toLowerCase()))throw new u('Expected atlas header "schema 2.0", "schema 2.1", "schema 2.5", or legacy "schema 2.0-draft"',t,e[0]?.column??1);let n=e[1].value.toLowerCase();return n==="2.5"?"2.5":n==="2.1"?"2.1":n==="2.0-draft"?"2.0-draft":"2.0"}function Ho(e,t,n,r,i,s,a,c,o,l,d,f,p,m,v,j){switch(e[0]?.value.toLowerCase()){case"system":if(i)throw new u('Atlas section "system" may only appear once',t,e[0].column);return Go(e,t,n,r);case"defaults":if(!i)throw new u('Atlas section "defaults" requires a preceding system declaration',t,e[0].column);if(j.sawDefaults)throw new u('Atlas section "defaults" may only appear once',t,e[0].column);return{kind:"defaults",system:i,sourceSchemaVersion:n,diagnostics:r,seenFields:new Set};case"atlas":if(!i)throw new u('Atlas section "atlas" requires a preceding system declaration',t,e[0].column);if(j.sawAtlas)throw new u('Atlas section "atlas" may only appear once',t,e[0].column);return{kind:"atlas",system:i,inMetadata:!1,metadataIndent:null};case"viewpoint":if(!i)throw new u('Atlas section "viewpoint" requires a preceding system declaration',t,e[0].column);return Ko(e,t,i,d,n,r);case"annotation":if(!i)throw new u('Atlas section "annotation" requires a preceding system declaration',t,e[0].column);return Zo(e,t,i,f);case"group":return _(n,r,"group",{line:t,column:e[0].column}),Xo(e,t,a,p);case"relation":return _(n,r,"relation",{line:t,column:e[0].column}),Jo(e,t,c,m);case"event":return _(n,r,"event",{line:t,column:e[0].column}),Qo(e,t,o,l,v,n,r);case"object":return ea(e,t,n,r,s);default:throw new u(`Unknown atlas section "${e[0]?.value??""}"`,t,e[0]?.column??1)}}function Go(e,t,n,r){if(e.length!==2)throw new u("Invalid atlas system declaration",t,e[0]?.column??1);return{kind:"system",system:{type:"system",id:e[1].value,title:null,description:null,epoch:null,referencePlane:null,defaults:{view:"topdown",scale:null,units:null,preset:null,theme:null},atlasMetadata:{},viewpoints:[],annotations:[]},sourceSchemaVersion:n,diagnostics:r,seenFields:new Set}}function Ko(e,t,n,r,i,s){if(e.length!==2)throw new u("Invalid viewpoint declaration",t,e[0]?.column??1);let a=fe(e[1].value);if(!a)throw new u("Viewpoint id must not be empty",t,e[1].column);if(r.has(a))throw new u(`Duplicate viewpoint id "${a}"`,t,e[1].column);let c={id:a,label:Pe(a),summary:"",focusObjectId:null,selectedObjectId:null,events:[],projection:n.defaults.view,preset:n.defaults.preset,zoom:null,rotationDeg:0,camera:null,layers:{},filter:null};return n.viewpoints.push(c),r.add(a),{kind:"viewpoint",viewpoint:c,sourceSchemaVersion:i,diagnostics:s,seenFields:new Set,inFilter:!1,filterIndent:null,seenFilterFields:new Set,inCamera:!1,cameraIndent:null,seenCameraFields:new Set}}function Zo(e,t,n,r){if(e.length!==2)throw new u("Invalid annotation declaration",t,e[0]?.column??1);let i=fe(e[1].value);if(!i)throw new u("Annotation id must not be empty",t,e[1].column);if(r.has(i))throw new u(`Duplicate annotation id "${i}"`,t,e[1].column);let s={id:i,label:Pe(i),targetObjectId:null,body:"",tags:[],sourceObjectId:null};return n.annotations.push(s),r.add(i),{kind:"annotation",annotation:s,seenFields:new Set}}function Xo(e,t,n,r){if(e.length!==2)throw new u("Invalid group declaration",t,e[0]?.column??1);let i=fe(e[1].value);if(!i)throw new u("Group id must not be empty",t,e[1].column);if(r.has(i))throw new u(`Duplicate group id "${i}"`,t,e[1].column);let s={id:i,label:Pe(i),summary:"",color:null,tags:[],hidden:!1};return n.push(s),r.add(i),{kind:"group",group:s,seenFields:new Set}}function Jo(e,t,n,r){if(e.length!==2)throw new u("Invalid relation declaration",t,e[0]?.column??1);let i=fe(e[1].value);if(!i)throw new u("Relation id must not be empty",t,e[1].column);if(r.has(i))throw new u(`Duplicate relation id "${i}"`,t,e[1].column);let s={id:i,from:"",to:"",kind:"",label:null,summary:null,tags:[],color:null,hidden:!1};return n.push(s),r.add(i),{kind:"relation",relation:s,seenFields:new Set}}function Qo(e,t,n,r,i,s,a){if(e.length!==2)throw new u("Invalid event declaration",t,e[0]?.column??1);let c=fe(e[1].value);if(!c)throw new u("Event id must not be empty",t,e[1].column);if(i.has(c))throw new u(`Duplicate event id "${c}"`,t,e[1].column);let o={id:c,kind:"",label:Pe(c),summary:null,targetObjectId:null,participantObjectIds:[],timing:null,visibility:null,epoch:null,referencePlane:null,tags:[],color:null,hidden:!1,positions:[]},l=[];return n.push(o),r.set(c,l),i.add(c),{kind:"event",event:o,sourceSchemaVersion:s,diagnostics:a,seenFields:new Set,rawPoses:l,inPositions:!1,positionsIndent:null,activePose:null,poseIndent:null,activePoseSeenFields:new Set}}function ea(e,t,n,r,i){if(e.length<3)throw new u("Invalid atlas object declaration",t,e[0]?.column??1);let s=e[1],a=e[2],c=s.value;if(!he.has(c)||c==="system")throw new u(`Unknown object type "${s.value}"`,t,s.column);let o={objectType:c,id:a.value,fields:ba(e.slice(3),t,c,n,r),infoEntries:[],typedBlockEntries:{},location:{line:t,column:s.column}};return i.push(o),{kind:"object",objectNode:o,sourceSchemaVersion:n,diagnostics:r,activeBlock:null,blockIndent:null,seenInfoKeys:new Set,seenTypedBlockKeys:{}}}function ta(e,t,n,r){switch(e.kind){case"system":na(e,n,r);return;case"defaults":ra(e,n,r);return;case"atlas":ia(e,t,n,r);return;case"viewpoint":oa(e,t,n,r);return;case"annotation":ca(e,n,r);return;case"group":la(e,n,r);return;case"relation":ua(e,n,r);return;case"event":da(e,t,n,r);return;case"object":pa(e,t,n,r);return}}function na(e,t,n){let r=q(t,e.seenFields,n),i=$(t,n);switch(r){case"title":e.system.title=i;return;case"description":_(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.description=i;return;case"epoch":_(e.sourceSchemaVersion,e.diagnostics,r,{line:n,column:t[0].column}),e.system.epoch=i;return;case"referenceplane":_(e.sourceSchemaVersion,e.diagnostics,"referencePlane",{line:n,column:t[0].column}),e.system.referencePlane=i;return;default:throw new u(`Unknown system atlas field "${t[0].value}"`,n,t[0].column)}}function ra(e,t,n){let r=q(t,e.seenFields,n),i=$(t,n);switch(r){case"view":_n(i)&&ae(e.sourceSchemaVersion,e.diagnostics,"defaults.view",{line:n,column:t[0].column}),e.system.defaults.view=Rn(i,n,t[0].column);return;case"scale":e.system.defaults.scale=i;return;case"units":e.system.defaults.units=i;return;case"preset":e.system.defaults.preset=zn(i,n,t[0].column);return;case"theme":e.system.defaults.theme=i;return;default:throw new u(`Unknown defaults field "${t[0].value}"`,n,t[0].column)}}function ia(e,t,n,r){if(e.inMetadata&&t<=(e.metadataIndent??0)&&(e.inMetadata=!1,e.metadataIndent=null),e.inMetadata){let i=Cn(n,r,"Invalid atlas metadata entry");if(i.key in e.system.atlasMetadata)throw new u(`Duplicate atlas metadata key "${i.key}"`,r,n[0].column);e.system.atlasMetadata[i.key]=i.value;return}if(n.length===1&&n[0].value.toLowerCase()==="metadata"){e.inMetadata=!0,e.metadataIndent=t;return}throw new u(`Unknown atlas field "${n[0].value}"`,r,n[0].column)}function oa(e,t,n,r){if(e.inCamera&&t<=(e.cameraIndent??0)&&(e.inCamera=!1,e.cameraIndent=null),e.inFilter&&t<=(e.filterIndent??0)&&(e.inFilter=!1,e.filterIndent=null),e.inCamera){aa(e,n,r);return}if(e.inFilter){sa(e,n,r);return}if(n.length===1&&n[0].value.toLowerCase()==="camera"){if(ae(e.sourceSchemaVersion,e.diagnostics,"viewpoint.camera",{line:r,column:n[0].column}),e.seenFields.has("camera"))throw new u('Duplicate viewpoint field "camera"',r,n[0].column);e.seenFields.add("camera"),e.inCamera=!0,e.cameraIndent=t,e.viewpoint.camera=e.viewpoint.camera??jt();return}if(n.length===1&&n[0].value.toLowerCase()==="filter"){if(e.seenFields.has("filter"))throw new u('Duplicate viewpoint field "filter"',r,n[0].column);e.seenFields.add("filter"),e.inFilter=!0,e.filterIndent=t;return}let i=q(n,e.seenFields,r),s=$(n,r);switch(i){case"label":e.viewpoint.label=s;return;case"summary":e.viewpoint.summary=s;return;case"focus":e.viewpoint.focusObjectId=s;return;case"select":e.viewpoint.selectedObjectId=s;return;case"projection":_n(s)&&ae(e.sourceSchemaVersion,e.diagnostics,"projection",{line:r,column:n[0].column}),e.viewpoint.projection=Rn(s,r,n[0].column);return;case"preset":e.viewpoint.preset=zn(s,r,n[0].column);return;case"zoom":e.viewpoint.zoom=kt(s,r,n[0].column,"zoom");return;case"rotation":e.viewpoint.rotationDeg=te(s,r,n[0].column,"rotation");return;case"camera":ae(e.sourceSchemaVersion,e.diagnostics,"viewpoint.camera",{line:r,column:n[0].column}),e.viewpoint.camera=ga(n.slice(1),r,e.viewpoint.camera);return;case"layers":e.viewpoint.layers=ha(n.slice(1),r,e.sourceSchemaVersion,e.diagnostics);return;case"events":_(e.sourceSchemaVersion,e.diagnostics,"viewpoint.events",{line:r,column:n[0].column}),e.viewpoint.events=C(n.slice(1),r,"events");return;default:throw new u(`Unknown viewpoint field "${n[0].value}"`,r,n[0].column)}}function aa(e,t,n){let r=q(t,e.seenCameraFields,n),i=$(t,n),s=e.viewpoint.camera??jt();switch(r){case"azimuth":s.azimuth=te(i,n,t[0].column,"camera.azimuth");break;case"elevation":s.elevation=te(i,n,t[0].column,"camera.elevation");break;case"roll":s.roll=te(i,n,t[0].column,"camera.roll");break;case"distance":s.distance=kt(i,n,t[0].column,"camera.distance");break;default:throw new u(`Unknown viewpoint camera field "${t[0].value}"`,n,t[0].column)}e.viewpoint.camera=s}function sa(e,t,n){let r=q(t,e.seenFilterFields,n),i=e.viewpoint.filter??ya();switch(r){case"query":i.query=$(t,n);break;case"objecttypes":i.objectTypes=ma(t.slice(1),n);break;case"tags":i.tags=C(t.slice(1),n,"tags");break;case"groups":i.groupIds=C(t.slice(1),n,"groups");break;default:throw new u(`Unknown viewpoint filter field "${t[0].value}"`,n,t[0].column)}e.viewpoint.filter=i}function ca(e,t,n){switch(q(t,e.seenFields,n)){case"label":e.annotation.label=$(t,n);return;case"target":e.annotation.targetObjectId=$(t,n);return;case"body":e.annotation.body=$(t,n);return;case"tags":e.annotation.tags=C(t.slice(1),n,"tags");return;default:throw new u(`Unknown annotation field "${t[0].value}"`,n,t[0].column)}}function la(e,t,n){switch(q(t,e.seenFields,n)){case"label":e.group.label=$(t,n);return;case"summary":e.group.summary=$(t,n);return;case"color":e.group.color=$(t,n);return;case"tags":e.group.tags=C(t.slice(1),n,"tags");return;case"hidden":e.group.hidden=J($(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new u(`Unknown group field "${t[0].value}"`,n,t[0].column)}}function ua(e,t,n){switch(q(t,e.seenFields,n)){case"from":e.relation.from=$(t,n);return;case"to":e.relation.to=$(t,n);return;case"kind":e.relation.kind=$(t,n);return;case"label":e.relation.label=$(t,n);return;case"summary":e.relation.summary=$(t,n);return;case"tags":e.relation.tags=C(t.slice(1),n,"tags");return;case"color":e.relation.color=$(t,n);return;case"hidden":e.relation.hidden=J($(t,n),"hidden",{line:n,column:t[0].column});return;default:throw new u(`Unknown relation field "${t[0].value}"`,n,t[0].column)}}function da(e,t,n,r){if(e.activePose&&t<=(e.poseIndent??0)&&(e.activePose=null,e.poseIndent=null,e.activePoseSeenFields.clear()),!e.activePose&&e.inPositions&&t<=(e.positionsIndent??0)&&(e.inPositions=!1,e.positionsIndent=null),e.activePose){(n[0]?.value==="epoch"||n[0]?.value==="referencePlane")&&ae(e.sourceSchemaVersion,e.diagnostics,`pose.${n[0].value}`,{line:r,column:n[0]?.column??1}),e.activePose.fields.push(fa(n,r,e.activePoseSeenFields));return}if(e.inPositions){if(n.length!==2||n[0].value.toLowerCase()!=="pose")throw new u(`Unknown event positions field "${n[0].value}"`,r,n[0]?.column??1);let s=n[1].value;if(!s.trim())throw new u("Event pose object id must not be empty",r,n[1].column);let a={objectId:s,fields:[],location:{line:r,column:n[0].column}};e.rawPoses.push(a),e.activePose=a,e.poseIndent=t,e.activePoseSeenFields=new Set;return}if(n.length===1&&n[0].value.toLowerCase()==="positions"){if(e.seenFields.has("positions"))throw new u('Duplicate event field "positions"',r,n[0].column);e.seenFields.add("positions"),e.inPositions=!0,e.positionsIndent=t;return}switch(q(n,e.seenFields,r)){case"kind":e.event.kind=$(n,r);return;case"label":e.event.label=$(n,r);return;case"summary":e.event.summary=$(n,r);return;case"target":e.event.targetObjectId=$(n,r);return;case"participants":e.event.participantObjectIds=C(n.slice(1),r,"participants");return;case"timing":e.event.timing=$(n,r);return;case"visibility":e.event.visibility=$(n,r);return;case"epoch":ae(e.sourceSchemaVersion,e.diagnostics,"event.epoch",{line:r,column:n[0].column}),e.event.epoch=$(n,r);return;case"referenceplane":ae(e.sourceSchemaVersion,e.diagnostics,"event.referencePlane",{line:r,column:n[0].column}),e.event.referencePlane=$(n,r);return;case"tags":e.event.tags=C(n.slice(1),r,"tags");return;case"color":e.event.color=$(n,r);return;case"hidden":e.event.hidden=J($(n,r),"hidden",{line:r,column:n[0].column});return;default:throw new u(`Unknown event field "${n[0].value}"`,r,n[0].column)}}function fa(e,t,n){if(e.length<2)throw new u("Invalid event pose field line",t,e[0]?.column??1);let r=e[0].value;if(!Fn.has(r))throw new u(`Unknown event pose field "${r}"`,t,e[0].column);if(n.has(r))throw new u(`Duplicate event pose field "${r}"`,t,e[0].column);return n.add(r),{type:"field",key:r,values:e.slice(1).map(i=>i.value),location:{line:t,column:e[0].column}}}function pa(e,t,n,r){if(e.activeBlock&&t<=(e.blockIndent??0)&&(e.activeBlock=null,e.blockIndent=null),n.length===1){let i=n[0].value.toLowerCase();if(i==="info"||Wo.has(i)){i!=="info"&&_(e.sourceSchemaVersion,e.diagnostics,i,{line:r,column:n[0].column}),e.activeBlock=i,e.blockIndent=t;return}}if(e.activeBlock){let i=Cn(n,r,`Invalid ${e.activeBlock} entry`);if(e.activeBlock==="info"){if(e.seenInfoKeys.has(i.key))throw new u(`Duplicate info key "${i.key}"`,r,n[0].column);e.seenInfoKeys.add(i.key),e.objectNode.infoEntries.push(i);return}let s=e.activeBlock,a=e.seenTypedBlockKeys[s]??(e.seenTypedBlockKeys[s]=new Set);if(a.has(i.key))throw new u(`Duplicate ${s} key "${i.key}"`,r,n[0].column);a.add(i.key),(e.objectNode.typedBlockEntries[s]??(e.objectNode.typedBlockEntries[s]=[])).push(i);return}e.objectNode.fields.push(va(n,r,e.objectNode.objectType,e.sourceSchemaVersion,e.diagnostics))}function q(e,t,n){if(e.length<2)throw new u("Invalid atlas field line",n,e[0]?.column??1);let r=e[0].value.toLowerCase();if(t.has(r))throw new u(`Duplicate atlas field "${e[0].value}"`,n,e[0].column);return t.add(r),r}function $(e,t){if(e.length<2)throw new u("Missing value for atlas field",t,e[0]?.column??1);return e.slice(1).map(n=>n.value).join(" ").trim()}function ma(e,t){return C(e,t,"objectTypes").filter(n=>n==="star"||n==="planet"||n==="moon"||n==="belt"||n==="asteroid"||n==="comet"||n==="ring"||n==="structure"||n==="phenomenon")}function ha(e,t,n,r){let i={};for(let s of C(e,t,"layers")){let a=!s.startsWith("-")&&!s.startsWith("!"),c=s.replace(/^[-!]+/,"").toLowerCase();if(c==="orbits"){i["orbits-back"]=a,i["orbits-front"]=a;continue}(c==="background"||c==="guides"||c==="orbits-back"||c==="orbits-front"||c==="relations"||c==="events"||c==="objects"||c==="labels"||c==="metadata")&&(c==="events"&&n&&r&&_(n,r,"layers.events",{line:t,column:e[0]?.column??1}),i[c]=a)}return i}function C(e,t,n){if(e.length===0)throw new u(`Missing value for atlas field "${n}"`,t,1);let r=e.map(i=>i.value).filter(Boolean);if(r.length===0)throw new u(`Missing value for atlas field "${n}"`,t,e[0]?.column??1);return r}function Rn(e,t,n){let r=e.toLowerCase();if(r!=="topdown"&&r!=="isometric"&&r!=="orthographic"&&r!=="perspective")throw new u(`Unknown projection "${e}"`,t,n);return r}function _n(e){let t=e.toLowerCase();return t==="orthographic"||t==="perspective"}function zn(e,t,n){let r=e.toLowerCase();if(r==="diagram"||r==="presentation"||r==="atlas-card"||r==="markdown")return r;throw new u(`Unknown render preset "${e}"`,t,n)}function kt(e,t,n,r){let i=te(e,t,n,r);if(i<=0)throw new u(`Field "${r}" must be greater than zero`,t,n);return i}function te(e,t,n,r){let i=Number(e);if(!Number.isFinite(i))throw new u(`Invalid numeric value "${e}" for "${r}"`,t,n);return i}function ya(){return{query:null,objectTypes:[],tags:[],groupIds:[]}}function jt(){return{azimuth:null,elevation:null,roll:null,distance:null}}function ga(e,t,n){if(e.length===0||e.length%2!==0)throw new u('Field "camera" expects "<field> <value>" pairs',t,e[0]?.column??1);let r=n?{...n}:jt(),i=new Set;for(let s=0;s<e.length;s+=2){let a=e[s],c=e[s+1],o=a.value.toLowerCase();if(i.has(o))throw new u(`Duplicate viewpoint camera field "${a.value}"`,t,a.column);i.add(o);let l=c.value;switch(o){case"azimuth":r.azimuth=te(l,t,a.column,"camera.azimuth");break;case"elevation":r.elevation=te(l,t,a.column,"camera.elevation");break;case"roll":r.roll=te(l,t,a.column,"camera.roll");break;case"distance":r.distance=kt(l,t,a.column,"camera.distance");break;default:throw new u(`Unknown viewpoint camera field "${a.value}"`,t,a.column)}}return r}function ba(e,t,n,r,i){let s=[],a=0;for(;a<e.length;){let c=e[a],o=Le(c.value);if(!o)throw new u(`Unknown field "${c.value}"`,t,c.column);o.version==="2.1"&&_(r,i,c.value,{line:t,column:c.column}),a++;let l=[];if(o.inlineMode==="single"){let d=e[a];d&&(l.push(d),a++)}else if(o.inlineMode==="pair")for(let d=0;d<2;d++){let f=e[a];if(!f)break;l.push(f),a++}else for(;a<e.length&&!Yo.has(e[a].value);)l.push(e[a]),a++;if(l.length===0)throw new u(`Missing value for field "${c.value}"`,t,c.column);s.push({type:"field",key:c.value,values:l.map(d=>d.value),location:{line:t,column:c.column}})}return Un(s,n),s}function va(e,t,n,r,i){if(e.length<2)throw new u("Invalid field line",t,e[0]?.column??1);let s=Le(e[0].value);if(!s)throw new u(`Unknown field "${e[0].value}"`,t,e[0].column);s.version==="2.1"&&_(r,i,e[0].value,{line:t,column:e[0].column});let a={type:"field",key:e[0].value,values:e.slice(1).map(c=>c.value),location:{line:t,column:e[0].column}};return Un([a],n),a}function Cn(e,t,n){if(e.length<2)throw new u(n,t,e[0]?.column??1);return{type:"info-entry",key:e[0].value,value:e.slice(1).map(r=>r.value).join(" "),location:{line:t,column:e[0].column}}}function wa(e,t,n){let r=Nn(e.fields),i=Vn(r),s=ka(e.objectType,r),a=La(r.get("groups")?.[0]),c=Ze(r.get("epoch")?.[0]),o=Ze(r.get("referencePlane")?.[0]),l=r.has("tidalLock")?J(z(r.get("tidalLock")[0]),"tidalLock",r.get("tidalLock")[0].location):void 0,d=r.has("resonance")?xa(r.get("resonance")[0]):void 0,f=Oa(r),p=r.get("derive")?.map(I=>Pa(I)),m=r.get("validate")?.map(I=>({rule:z(I)})),v=r.has("locked")?[...new Set(r.get("locked").flatMap(I=>I.values))]:void 0,j=r.get("tolerance")?.map(I=>Sa(I)),O=ja(e.typedBlockEntries),x=Bn(e.infoEntries,"info"),g={type:e.objectType,id:e.id,properties:s,placement:i,info:x};return a.length>0&&(g.groups=a),c&&(g.epoch=c),o&&(g.referencePlane=o),l!==void 0&&(g.tidalLock=l),d&&(g.resonance=d),f&&(g.renderHints=f),p?.length&&(g.deriveRules=p),m?.length&&(g.validationRules=m),v?.length&&(g.lockedFields=v),j?.length&&(g.tolerances=j),O&&Object.keys(O).length>0&&(g.typedBlocks=O),Qe(t,"2.1")&&(g.groups||g.epoch||g.referencePlane||g.tidalLock!==void 0||g.resonance||g.renderHints||g.deriveRules?.length||g.validationRules?.length||g.lockedFields?.length||g.tolerances?.length||g.typedBlocks)&&_(t,n,e.id,e.location),g}function $a(e,t){return{...e,participantObjectIds:[...new Set(e.participantObjectIds)],tags:[...new Set(e.tags)],positions:t.map(n=>Ia(n))}}function Ia(e){let t=Nn(e.fields,"event-pose"),n=Vn(t);return{objectId:e.objectId,placement:n,inner:ee(t.get("inner")?.[0],"inner"),outer:ee(t.get("outer")?.[0],"outer"),epoch:Ze(t.get("epoch")?.[0]),referencePlane:Ze(t.get("referencePlane")?.[0])}}function Nn(e,t="object"){let n=new Map;for(let r of e){let i=Le(r.key);if(!i&&!Fn.has(r.key))throw u.fromLocation(`Unknown field "${r.key}"`,r.location);if(!i?.allowRepeat&&n.has(r.key))throw u.fromLocation(`Duplicate field "${r.key}"`,r.location);let s=n.get(r.key)??[];s.push(r),n.set(r.key,s)}return n}function Vn(e){let t=e.get("orbit")?.[0],n=e.get("at")?.[0],r=e.get("surface")?.[0],i=e.get("free")?.[0];if([t,n,r,i].filter(Boolean).length>1){let a=t??n??r??i;throw u.fromLocation("Object has multiple placement modes",a?.location)}if(t)return{mode:"orbit",target:z(t),distance:ee(e.get("distance")?.[0],"distance"),semiMajor:ee(e.get("semiMajor")?.[0],"semiMajor"),eccentricity:Aa(e.get("eccentricity")?.[0],"eccentricity"),period:ee(e.get("period")?.[0],"period"),angle:ee(e.get("angle")?.[0],"angle"),inclination:ee(e.get("inclination")?.[0],"inclination"),phase:ee(e.get("phase")?.[0],"phase")};if(n){let a=z(n);return{mode:"at",target:a,reference:Pn(a,n.location)}}if(r)return{mode:"surface",target:z(r)};if(i){let a=z(i),c=vt(a);return{mode:"free",distance:c??void 0,descriptor:c?void 0:a}}return null}function ka(e,t){let n={};for(let[r,i]of t.entries()){let s=i[0],a=Le(r);!s||!a?.legacySchema||a.legacySchema.placement||(wt(r,e,s.location),n[r]=Sn(r,s.values,s.location))}return n}function Bn(e,t){let n={};for(let r of e){if(r.key in n)throw u.fromLocation(`Duplicate ${t} key "${r.key}"`,r.location);n[r.key]=r.value}return n}function ja(e){let t={};for(let n of Object.keys(e)){let r=e[n];r?.length&&(t[n]=Bn(r,n))}return t}function Oa(e){let t={},n=e.get("renderLabel")?.[0],r=e.get("renderOrbit")?.[0],i=e.get("renderPriority")?.[0];return n&&(t.renderLabel=J(z(n),"renderLabel",n.location)),r&&(t.renderOrbit=J(z(r),"renderOrbit",r.location)),i&&(t.renderPriority=Ge(z(i),"renderPriority",i.location)),Object.keys(t).length>0?t:void 0}function xa(e){if(e.values.length!==2)throw u.fromLocation('Field "resonance" expects "<targetObjectId> <ratio>"',e.location);let t=e.values[1];if(!/^\d+:\d+$/.test(t))throw u.fromLocation(`Invalid resonance ratio "${t}"`,e.location);return{targetObjectId:e.values[0],ratio:t}}function Pa(e){if(e.values.length!==2)throw u.fromLocation('Field "derive" expects "<field> <strategy>"',e.location);return{field:e.values[0],strategy:e.values[1]}}function Sa(e){if(e.values.length!==2)throw u.fromLocation('Field "tolerance" expects "<field> <value>"',e.location);let t=e.values[1],n=vt(t),r=Number(t);return{field:e.values[0],value:n??(Number.isFinite(r)?r:t)}}function La(e){return e?[...new Set(e.values)]:[]}function Ze(e){return e&&e.values.join(" ").trim()||null}function ee(e,t){return e?bt(z(e),e.location,t):void 0}function Aa(e,t){return e?Ge(z(e),t,e.location):void 0}function z(e){return xe(e.values,e.key,e.location)}function Le(e){return Xe.get(e)}function Un(e,t){for(let n of e){let r=Le(n.key);if(!r)throw u.fromLocation(`Unknown field "${n.key}"`,n.location);if(r.legacySchema){wt(n.key,t,n.location);continue}if((n.key==="renderLabel"||n.key==="renderOrbit"||n.key==="tidalLock")&&n.values.length!==1)throw u.fromLocation(`Field "${n.key}" expects exactly one value`,n.location)}}function _(e,t,n,r){Qe(e,"2.1")&&t.push({code:"parse.schema21.featureCompatibility",severity:"warning",source:"parse",message:`Feature "${n}" requires schema 2.1; parsed in compatibility mode because the document header is "schema ${e}".`,line:r.line,column:r.column})}function ae(e,t,n,r){Qe(e,"2.5")&&t.push({code:"parse.schema25.featureCompatibility",severity:"warning",source:"parse",message:`Feature "${n}" requires schema 2.5; parsed in compatibility mode because the document header is "schema ${e}".`,line:r.line,column:r.column})}function Qe(e,t){return Tn(e)<Tn(t)}function Tn(e){switch(e){case"2.0-draft":return 0;case"2.0":return 1;case"2.1":return 2;case"2.5":return 3}}function Da(e){let t=[...e],n=[],r=!1,i=!1,s=null,a=1,c=1;for(let o=0;o<t.length;o++){let l=t[o],d=t[o+1];if(i){if(l==="*"&&d==="/"){t[o]=" ",t[o+1]=" ",i=!1,s=null,o++,c+=2;continue}l!==`
5
- `&&l!=="\r"&&(t[o]=" "),l===`
6
- `?(a++,c=1):c++;continue}if(!r&&l==="/"&&d==="*"){n.push({kind:"block",line:a,column:c}),t[o]=" ",t[o+1]=" ",i=!0,s={line:a,column:c},o++,c+=2;continue}if(!r&&l==="#"&&!Ta(t,o)){n.push({kind:"line",line:a,column:c}),t[o]=" ";let f=o+1;for(;f<t.length&&t[f]!==`
7
- `&&t[f]!=="\r";)t[f]=" ",f++;c+=f-o,o=f-1;continue}l==='"'&&t[o-1]!=="\\"&&(r=!r),l===`
8
- `?(a++,c=1):c++}if(i)throw u.fromLocation("Unclosed block comment",s??void 0);return{source:t.join(""),comments:n}}function Ta(e,t){let n=t+1,r=0;for(;n<e.length&&/[0-9a-f]/i.test(e[n]??"");)n++,r++;if(![3,4,6,8].includes(r))return!1;let i=e[n];return i===void 0||i===" "||i===" "||i==="\r"||i===`
9
- `}function Ot(e="WorldOrbit",t="2.5"){return{format:"worldorbit",version:t,schemaVersion:t,sourceVersion:"1.0",system:{type:"system",id:e,title:e,description:null,epoch:null,referencePlane:null,defaults:{view:"topdown",scale:null,units:null,preset:null,theme:null},atlasMetadata:{},viewpoints:[],annotations:[]},groups:[],relations:[],events:[],objects:[],diagnostics:[]}}function et(e){return structuredClone(e)}function Wn(e){let t=[{kind:"system"},{kind:"defaults"}];if(e.system){for(let n of Object.keys(e.system.atlasMetadata).sort())t.push({kind:"metadata",key:n});for(let n of[...e.system.viewpoints].sort(se))t.push({kind:"viewpoint",id:n.id});for(let n of[...e.system.annotations].sort(se))t.push({kind:"annotation",id:n.id})}for(let n of[...e.groups].sort(se))t.push({kind:"group",id:n.id});for(let n of[...e.relations].sort(se))t.push({kind:"relation",id:n.id});for(let n of[...e.events].sort(se)){t.push({kind:"event",id:n.id});for(let r of[...n.positions].sort(er))t.push({kind:"event-pose",id:n.id,key:r.objectId})}for(let n of[...e.objects].sort(se))t.push({kind:"object",id:n.id});return t}function xt(e,t){switch(t.kind){case"system":return e.system;case"defaults":return e.system?.defaults??null;case"metadata":return t.key?e.system?.atlasMetadata[t.key]??null:null;case"group":return t.id?Kn(e,t.id):null;case"event":return t.id?tt(e,t.id):null;case"event-pose":return t.id&&t.key?Xn(e,t.id,t.key):null;case"object":return t.id?Gn(e,t.id):null;case"viewpoint":return t.id?Jn(e.system,t.id):null;case"annotation":return t.id?Qn(e.system,t.id):null;case"relation":return t.id?Zn(e,t.id):null}}function Pt(e,t,n){let r=et(e),i=At(r);switch(t.kind){case"system":return r.system=n,r;case"defaults":return i.defaults={...i.defaults,...n},r;case"metadata":if(!t.key)throw new Error('Metadata updates require a "key" value.');return n==null||n===""?delete i.atlasMetadata[t.key]:i.atlasMetadata[t.key]=String(n),r;case"group":if(!t.id)throw new Error('Group updates require an "id" value.');return pe(r.groups,n),r;case"event":if(!t.id)throw new Error('Event updates require an "id" value.');return pe(r.events,n),r;case"event-pose":if(!t.id||!t.key)throw new Error('Event pose updates require an event "id" and pose "key" value.');return Fa(r.events,t.id,n),r;case"object":if(!t.id)throw new Error('Object updates require an "id" value.');return pe(r.objects,n),r;case"viewpoint":if(!t.id)throw new Error('Viewpoint updates require an "id" value.');return pe(i.viewpoints,n),r;case"annotation":if(!t.id)throw new Error('Annotation updates require an "id" value.');return pe(i.annotations,n),r;case"relation":if(!t.id)throw new Error('Relation updates require an "id" value.');return pe(r.relations,n),r}}function Yn(e,t,n){return Pt(e,t,n(xt(e,t)))}function qn(e,t){let n=et(e),r=At(n);switch(t.kind){case"metadata":return t.key&&delete r.atlasMetadata[t.key],n;case"object":return t.id&&(n.objects=n.objects.filter(i=>i.id!==t.id)),n;case"group":return t.id&&(n.groups=n.groups.filter(i=>i.id!==t.id)),n;case"event":return t.id&&(n.events=n.events.filter(i=>i.id!==t.id)),n;case"event-pose":if(t.id&&t.key){let i=tt(n,t.id);i&&(i.positions=i.positions.filter(s=>s.objectId!==t.key))}return n;case"viewpoint":return t.id&&(r.viewpoints=r.viewpoints.filter(i=>i.id!==t.id)),n;case"annotation":return t.id&&(r.annotations=r.annotations.filter(i=>i.id!==t.id)),n;case"relation":return t.id&&(n.relations=n.relations.filter(i=>i.id!==t.id)),n;default:return n}}function St(e,t){return t.map(n=>({diagnostic:n,path:Lt(e,n)}))}function Lt(e,t){if(t.objectId&&Gn(e,t.objectId))return{kind:"object",id:t.objectId};if(t.field?.startsWith("group.")){let n=t.field.split(".");if(n[1]&&Kn(e,n[1]))return{kind:"group",id:n[1]}}if(t.field?.startsWith("viewpoint.")){let n=t.field.split(".");if(n[1]&&Jn(e.system,n[1]))return{kind:"viewpoint",id:n[1]}}if(t.field?.startsWith("annotation.")){let n=t.field.split(".");if(n[1]&&Qn(e.system,n[1]))return{kind:"annotation",id:n[1]}}if(t.field?.startsWith("relation.")){let n=t.field.split(".");if(n[1]&&Zn(e,n[1]))return{kind:"relation",id:n[1]}}if(t.field?.startsWith("event.")){let n=t.field.split(".");if(n[1]&&tt(e,n[1]))return n[2]==="pose"&&n[3]&&Xn(e,n[1],n[3])?{kind:"event-pose",id:n[1],key:n[3]}:{kind:"event",id:n[1]}}return t.field&&t.field in At(e).atlasMetadata?{kind:"metadata",key:t.field}:null}function Hn(e){let t=[...e.diagnostics,...Se(e,e.version)];return St(e,t)}function At(e){return e.system||(e.system=Ot().system),e.system}function Gn(e,t){return e.objects.find(n=>n.id===t)??null}function Kn(e,t){return e.groups.find(n=>n.id===t)??null}function Zn(e,t){return e.relations.find(n=>n.id===t)??null}function tt(e,t){return e.events.find(n=>n.id===t)??null}function Xn(e,t,n){return tt(e,t)?.positions.find(r=>r.objectId===n)??null}function Jn(e,t){return e?.viewpoints.find(n=>n.id===t)??null}function Qn(e,t){return e?.annotations.find(n=>n.id===t)??null}function pe(e,t){let n=e.findIndex(r=>r.id===t.id);if(n===-1){e.push(t),e.sort(se);return}e[n]=t}function Fa(e,t,n){let r=e.find(s=>s.id===t);if(!r)throw new Error(`Unknown event "${t}" for pose update.`);let i=r.positions.findIndex(s=>s.objectId===n.objectId);if(i===-1){r.positions.push(n),r.positions.sort(er);return}r.positions[i]=n}function se(e,t){return e.id.localeCompare(t.id)}function er(e,t){return e.objectId.localeCompare(t.objectId)}var Ea=/^schema\s+2(?:\.0|\.1|\.5)?$/i,Ma=/^schema\s+2\.1$/i,Ra=/^schema\s+2\.5$/i,_a=/^schema\s+2\.0-draft$/i;function Dt(e){for(let t of za(e).split(/\r?\n/)){let n=t.trim();if(n)return _a.test(n)?"2.0-draft":Ma.test(n)?"2.1":Ra.test(n)?"2.5":Ea.test(n)?"2.0":"1.0"}return"1.0"}function za(e){let t=[...e],n=!1,r=!1;for(let i=0;i<t.length;i++){let s=t[i],a=t[i+1];if(r){if(s==="*"&&a==="/"){t[i]=" ",t[i+1]=" ",r=!1,i++;continue}s!==`
10
- `&&s!=="\r"&&(t[i]=" ");continue}if(!n&&s==="/"&&a==="*"){t[i]=" ",t[i+1]=" ",r=!0,i++;continue}if(!n&&s==="#"){t[i]=" ";let c=i+1;for(;c<t.length&&t[c]!==`
11
- `&&t[c]!=="\r";)t[c]=" ",c++;i=c-1;continue}s==='"'&&t[i-1]!=="\\"&&(n=!n)}return t.join("")}function nt(e){let t=Tt(e);if(!t.ok||!t.value){let n=t.diagnostics[0];throw new u(n?.message??"Failed to load WorldOrbit source",n?.line,n?.column)}return t.value}function Tt(e){let t=Dt(e);if(t==="2.0"||t==="2.0-draft"||t==="2.1"||t==="2.5")return Ca(e,t);let n;try{n=Z(e)}catch(i){return{ok:!1,value:null,diagnostics:[T(i,"parse")]}}let r;try{r=W(n)}catch(i){return{ok:!1,value:null,diagnostics:[T(i,"normalize")]}}try{Y(r)}catch(i){return{ok:!1,value:null,diagnostics:[T(i,"validate")]}}return{ok:!0,value:{schemaVersion:t,ast:n,document:r,atlasDocument:null,draftDocument:null,diagnostics:[]},diagnostics:[]}}function Ca(e,t){let n;try{n=Je(e)}catch(a){return{ok:!1,value:null,diagnostics:[T(a,"parse","load.atlas.failed")]}}let r=[...n.diagnostics];if(r.some(a=>a.severity==="error"))return{ok:!1,value:null,diagnostics:r};let i;try{i=Oe(n)}catch(a){return{ok:!1,value:null,diagnostics:[T(a,"normalize","load.atlas.materialize.failed")]}}return{ok:!0,value:{schemaVersion:t,ast:null,document:i,atlasDocument:n,draftDocument:n,diagnostics:r},diagnostics:r}}var Na=/^```worldorbit(?:\s+(.*))?\s*$/;function tr(e){let t=e.split(/\r?\n/),n=[],r=!1,i=null,s=0,a=[];return t.forEach((c,o)=>{let l=o+1;if(!r){let d=c.match(Na);d&&(r=!0,i=d[1]??null,s=l,a=[]);return}if(c.trim()==="```"){n.push({source:a.join(`
12
- `),info:i,startLine:s,endLine:l}),r=!1,i=null,s=0,a=[];return}a.push(c)}),n}function nr(e){let t=Z(e),n=W(t);return Y(n),{ast:t,document:n}}function Va(e){let t=nr(e);return{...t,scene:oe(t.document)}}function Ba(e){return nt(e)}function Ua(e){return Re(e)}function Wa(e,t={}){return He(e,t)}return pr(Ya);})();
1
+ export * from "./core/dist/index.js";