@essrt/physics 3.0.0 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@essrt/physics",
3
- "version": "3.0.0",
3
+ "version": "3.2.0",
4
4
  "description": "ESSRT (Expanding Solar System Resonance Theory) physics core \u2014 pure, injectable-constants, no I/O, no globals, no DOM. The complete model incl. fitted coefficients; every published version immutably ships one recorded model identity.",
5
5
  "essrt": {
6
6
  "modelVersion": "v13.0",
@@ -45,6 +45,7 @@
45
45
  "./planets/asc-node-integrator": "./src/planets/asc-node-integrator.cjs",
46
46
  "./planets/orbit-chain": "./src/planets/orbit-chain.cjs",
47
47
  "./planets/corrections": "./src/planets/corrections.cjs",
48
+ "./planets/keplerian-chain": "./src/planets/keplerian-chain.cjs",
48
49
  "./planets/predict": "./src/planets/predict.cjs",
49
50
  "./planets/model": "./src/planets/model.cjs",
50
51
  "./deltat/cycles": "./src/deltat/cycles.cjs",
package/src/index.js CHANGED
@@ -118,6 +118,10 @@ export * as planetOrientation from './planets/orientation.cjs';
118
118
  export { integrateAscendingNode } from './planets/asc-node-integrator.cjs';
119
119
  export * as planetOrbitChain from './planets/orbit-chain.cjs';
120
120
  export { evaluateParallaxBasis, gravitationTermDeltasDeg, evaluateElongationBasis } from './planets/corrections.cjs';
121
+ // P5/K4.6c — the engine-D Keplerian chain (pure evaluator + the embedded
122
+ // governed artifact; the browser flag path consumes exactly these).
123
+ export { buildPlanetChainsFromArtifactData, computePlanetElementsAtYear, computeHeliocentricEclipticFromElements, computePoissonArgRad, computeOsculatingElements, solveKeplerRad, ANCHOR_EPOCH_YEAR, ANCHOR_EPOCH_JD } from './planets/keplerian-chain.cjs';
124
+ export { CHAIN_ARTIFACT, CHAIN_ARTIFACT_HASH } from './planets/chain-artifact.js';
121
125
  export { createPredictivePrecession, calcPlanetPerihelionLongDeg } from './planets/predict.cjs';
122
126
  // L10 — the composition front door: one law set, N body records. Thin by
123
127
  // design; engines keep their direct call sites (see planets/model.cjs).
@@ -0,0 +1,17 @@
1
+ /**
2
+ * GENERATED — do not edit. Regenerate:
3
+ * node tools/constants/generate.mjs --write
4
+ *
5
+ * Source: data/nbody-secular-frequencies.json (the governed engine-D
6
+ * artifact), emitted VERBATIM. Two gates guard the two legs of the causal
7
+ * chain: check:artifacts pins artifact ↔ engine (input hashes name the
8
+ * regeneration command), this module's staleness check pins embed ↔ artifact.
9
+ * A changed planet mass therefore propagates engine → artifact → here → the
10
+ * browser scene, or a gate goes red.
11
+ */
12
+
13
+ /** @type {string} */
14
+ export const CHAIN_ARTIFACT_HASH = "beeee5a94a026a13";
15
+
16
+ /** @type {Readonly<Record<string, unknown>>} */
17
+ export const CHAIN_ARTIFACT = Object.freeze({"_description":"Engine-D secular frequencies from the model’s own N-body pipeline (WH 1-Myr, 1PN on, NAFF), the 1800–2100 window rates (B), the Keplerian chain’s governed inputs (K2.1/P5: windowElementRates + j2000AnchorElements — era-typed window values and the t=0 anchor, the chain’s ONE home), the derived instantaneous 1PN apsidal supplement, and the K4.5/K4.7b derived periodic-term layer (periodicTerms: λ̄/a/z/ζ lines + era window affine, engine-measured — tools/explore/k45e-amplitude-solve.mjs). Frames: g ecliptic-J2000 z-modes, s INVARIABLE-plane ζ-modes. Laskar 2004 values are external reference labels (theory), never inputs. See tools/verify/nbody-secular.js for the assertions carried.","meta":{"integrator":"wh","order":2,"dtDays":2,"spanYears":1000000,"sampleDays":1000,"gr":true,"seed":"JPL Horizons J2000 heliocentric state vectors (tools/explore/j2000-state.mjs, the one home)","masses":"DE440 mass ratios (astro-reference physicalConstants)","naffTerms":8,"windowYears":[1800,2100],"laskarRef":"Laskar, J. et al. (2004), A&A 428, 261–285, Table 3","conservationMaxDE":1.1113907520896154e-8,"note1PN":"Mercury eigen-level 1PN shift ≈ +0.473 ″/yr (cycle-average of 1/(1−e²)) vs +0.430 instantaneous — not a discrepancy; only the instantaneous value is asserted (P8b).","periodicTermsMethod":"k45e era-centered LSQ (self-seeded prewhitening, golden-refined frequencies; K4.7b)","periodicTermsSpanYr":2500,"periodicTermsCadenceYr":0.1},"g":{"mercury":{"arcsecPerYr":5.575712797823945,"amplitude":0.17545096694269685,"nearestLaskar":{"mode":"g1","arcsecPerYr":5.5965}},"venus":{"arcsecPerYr":7.405845742227483,"amplitude":0.022570769830788477,"nearestLaskar":{"mode":"g2","arcsecPerYr":7.4555}},"earth":{"arcsecPerYr":4.346410041032439,"amplitude":0.019341964493845513,"nearestLaskar":{"mode":"g5","arcsecPerYr":4.2575}},"mars":{"arcsecPerYr":17.916696630844026,"amplitude":0.08882914197372903,"nearestLaskar":{"mode":"g4","arcsecPerYr":17.9159}},"jupiter":{"arcsecPerYr":4.256769523195223,"amplitude":0.044182672664934045,"nearestLaskar":{"mode":"g5","arcsecPerYr":4.2575}},"saturn":{"arcsecPerYr":28.245581358956457,"amplitude":0.04819349426795283,"nearestLaskar":{"mode":"g6","arcsecPerYr":28.2455}},"uranus":{"arcsecPerYr":3.921148698318919,"amplitude":0.0332189082697614,"nearestLaskar":{"mode":"g5","arcsecPerYr":4.2575}},"neptune":{"arcsecPerYr":0.6065154396549126,"amplitude":0.009569000717364112,"nearestLaskar":{"mode":"g8","arcsecPerYr":0.673}}},"s":{"mercury":{"arcsecPerYr":-5.586173808637174,"amplitude":0.059409340430501154,"nearestLaskar":{"mode":"s1","arcsecPerYr":-5.6197}},"venus":{"arcsecPerYr":-18.3363903851603,"amplitude":0.013576723462640201,"nearestLaskar":{"mode":"s3","arcsecPerYr":-18.8506}},"earth":{"arcsecPerYr":-18.39611848918824,"amplitude":0.01184463735421656,"nearestLaskar":{"mode":"s3","arcsecPerYr":-18.8506}},"mars":{"arcsecPerYr":-17.545402434182556,"amplitude":0.021473581268835227,"nearestLaskar":{"mode":"s4","arcsecPerYr":-17.7553}},"jupiter":{"arcsecPerYr":-26.347747510182444,"amplitude":0.0031511446932465333,"nearestLaskar":{"mode":"s6","arcsecPerYr":-26.3475}},"saturn":{"arcsecPerYr":-26.34770515585438,"amplitude":0.007853480398801458,"nearestLaskar":{"mode":"s6","arcsecPerYr":-26.3475}},"uranus":{"arcsecPerYr":-2.999782557988895,"amplitude":0.008744980387074497,"nearestLaskar":{"mode":"s7","arcsecPerYr":-2.9927}},"neptune":{"arcsecPerYr":-0.7119237190344891,"amplitude":0.005960579851589255,"nearestLaskar":{"mode":"s8","arcsecPerYr":-0.6919}}},"secularModes":{"mercury":{"z":[{"omegaRadPerYr":0.000027031818463225768,"re":0.0061578259451980115,"im":0.17534287262605214},{"omegaRadPerYr":0.00003762575562965475,"re":0.022801391439964295,"im":0.008306970885650663},{"omegaRadPerYr":0.00001819756010161927,"re":0.019634392385947316,"im":0.014089365629220058},{"omegaRadPerYr":0.000011448057114609211,"re":-0.005593515523159691,"im":-0.0029052231145468826},{"omegaRadPerYr":0.00004414416237516322,"re":-0.0058059195322990535,"im":-0.0014204432190273834}],"zeta":[{"omegaRadPerYr":-0.000027080770518521117,"re":0.058209232182515294,"im":0.011937299831838749},{"omegaRadPerYr":-0.00003532228218977498,"re":0.004745715778503308,"im":0.009067515752921801},{"omegaRadPerYr":6.775714890718091e-8,"re":-0.0039039071253357234,"im":0.013489752627573397},{"omegaRadPerYr":-0.000014531803306709756,"re":-0.0027805829079540424,"im":0.001873307195814228},{"omegaRadPerYr":-0.00008871641521465394,"re":-0.00011206141890946473,"im":-0.0024785290535285108},{"omegaRadPerYr":-0.00004086484773308675,"re":-0.0009298161832617493,"im":0.0013601243172003264},{"omegaRadPerYr":-0.0000320673476361423,"re":-0.013260807519741909,"im":0.010385681846746578}]},"venus":{"z":[{"omegaRadPerYr":0.000035904553360186896,"re":-0.0211984643558249,"im":-0.007750145786322514},{"omegaRadPerYr":0.000021373474422862907,"re":0.016886761236088624,"im":0.011238461694226397},{"omegaRadPerYr":0.0000891126674473552,"re":0.0050874946506860065,"im":-0.005109367673184332},{"omegaRadPerYr":0.00002871637284884016,"re":-0.0017393876896891237,"im":0.005587660035943027},{"omegaRadPerYr":0.0000799342923050964,"re":-0.0044448366327981305,"im":-0.0000503440797393948},{"omegaRadPerYr":0.000012541690188563,"re":0.0004535723363856848,"im":0.0009117376424311817}],"zeta":[{"omegaRadPerYr":-0.00008889595040236661,"re":0.0014429354865157266,"im":0.013492668736937167},{"omegaRadPerYr":-2.9208356071391507e-8,"re":-0.0038419612953034085,"im":0.01343833962446885},{"omegaRadPerYr":-0.000027486544944080902,"re":0.008423422326469315,"im":0.0009256786850090009},{"omegaRadPerYr":-0.000035402171418589797,"re":0.0007435050926828158,"im":-0.0028971907452019956},{"omegaRadPerYr":-0.0000816605133107709,"re":-0.0010567171844393416,"im":0.0017536585345055515},{"omegaRadPerYr":-0.00009527377513796924,"re":0.001562527173160095,"im":0.00142794192883987},{"omegaRadPerYr":-0.000022714283438616226,"re":0.0006900663832152563,"im":0.0009409483713469917},{"omegaRadPerYr":-0.000012901293108561725,"re":-0.0007909153616483306,"im":0.0007730683997926797}]},"earth":{"z":[{"omegaRadPerYr":0.000021071990516043863,"re":0.016301183796398024,"im":0.010410715504576574},{"omegaRadPerYr":0.000035854880135688966,"re":-0.016689300824841616,"im":-0.00587694407980285},{"omegaRadPerYr":0.00008867935711133655,"re":-0.006205359589321793,"im":0.0059045379227095785},{"omegaRadPerYr":0.00007976873965068339,"re":0.003442662776173624,"im":0.00018161801434096533},{"omegaRadPerYr":0.000028440629463153055,"re":-0.0007693818323351555,"im":0.0036759836693912766},{"omegaRadPerYr":0.0001368996733554364,"re":-0.0008112549290125483,"im":0.0011800841029160098}],"zeta":[{"omegaRadPerYr":-2.789132719584616e-8,"re":-0.003980175066603849,"im":0.01346535718722163},{"omegaRadPerYr":-0.00008918684866422754,"re":-0.0017818272301117842,"im":-0.01171473788270621},{"omegaRadPerYr":-0.000027565953011645597,"re":0.005837345967007995,"im":0.0005767264828698533},{"omegaRadPerYr":-0.000035436881992393566,"re":0.0005316599469742484,"im":-0.002298310523068399},{"omegaRadPerYr":-0.00012766579969759884,"re":-0.0006080730450000734,"im":0.0011811620431347754},{"omegaRadPerYr":-0.00008175633290332968,"re":0.0008468767179477169,"im":-0.0014453751935461902},{"omegaRadPerYr":-0.00009544829395201416,"re":-0.0013543922729998166,"im":-0.0011678254911581005},{"omegaRadPerYr":-0.000022618656478089485,"re":0.0008212474154199974,"im":0.0007376186464093101}]},"mars":{"z":[{"omegaRadPerYr":0.00008686259646922313,"re":0.06413361286031954,"im":-0.061461338785219796},{"omegaRadPerYr":0.000020710599293705756,"re":0.0168815770314768,"im":0.010181016750981363},{"omegaRadPerYr":0.00013701274439308748,"re":-0.004154546031788784,"im":0.0052484404204072264},{"omegaRadPerYr":0.00007830364627518509,"re":0.006610030627920962,"im":0.00716773876788036},{"omegaRadPerYr":0.0000967464223286991,"re":0.00669811842776162,"im":-0.0005917424234258758},{"omegaRadPerYr":0.00003622387429863297,"re":-0.0037118530783633074,"im":-0.001197130016454561},{"omegaRadPerYr":0.00007107828755070232,"re":-0.0030272556571569256,"im":-0.0021089438693236047}],"zeta":[{"omegaRadPerYr":-0.00008506290699879281,"re":0.007775523866870005,"im":-0.02001096343618598},{"omegaRadPerYr":-0.00009339911610380382,"re":0.009574153430346467,"im":0.01499249567600023},{"omegaRadPerYr":-2.1361701870262538e-8,"re":-0.003652982290513836,"im":0.013619195708169822},{"omegaRadPerYr":-0.00012775359218502626,"re":-0.0023045039444621073,"im":0.0035319422124707343},{"omegaRadPerYr":-0.00007647491607131078,"re":0.0003559447186960134,"im":0.00225681738420922},{"omegaRadPerYr":-0.00009952035224595763,"re":-0.002686141523001369,"im":-0.0032247663817401412}]},"jupiter":{"z":[{"omegaRadPerYr":0.000020637401021751606,"re":0.03775130376392058,"im":0.022955339856793808},{"omegaRadPerYr":0.0001369384796979771,"re":0.009695326488717567,"im":-0.012378818304894155},{"omegaRadPerYr":0.00001285183951543766,"re":-0.0008196553575553386,"im":0.0013298147968340598},{"omegaRadPerYr":0.0002532450446505381,"re":0.00041541273181667615,"im":0.0003999550758746959},{"omegaRadPerYr":0.000006063027991986138,"re":0.00018743032373578906,"im":-0.0002594778854773961},{"omegaRadPerYr":0.000031414566802098374,"re":-0.00014101517848288215,"im":0.00024144519615503003}],"zeta":[{"omegaRadPerYr":-2.1490404832806168e-8,"re":-0.0036895385366188783,"im":0.013265898846260308},{"omegaRadPerYr":-0.0001277374796658874,"re":0.0018884354550522274,"im":-0.00251606466916287},{"omegaRadPerYr":-0.000015175434386812629,"re":-0.0004021019571492075,"im":0.0003117907932519991},{"omegaRadPerYr":-0.000006632717903107953,"re":0.0003009472423168709,"im":0.0001317099906824581},{"omegaRadPerYr":0.000003955724900485721,"re":-0.0002689226108809528,"im":2.564175400368284e-7},{"omegaRadPerYr":-0.000020525770532327617,"re":0.00010370417805463956,"im":-0.000024424616444032364}]},"saturn":{"z":[{"omegaRadPerYr":0.0001369384427371457,"re":-0.02960653952726686,"im":0.03802717064120847},{"omegaRadPerYr":0.00002063674100262723,"re":0.028150073232470787,"im":0.01709774750149962},{"omegaRadPerYr":0.00025324837081694125,"re":-0.0013606989653353102,"im":-0.0013821126035298548},{"omegaRadPerYr":0.000012847385779998076,"re":-0.0006853047928644228,"im":0.0011218181664192914},{"omegaRadPerYr":0.00012770394549879298,"re":0.00030532747308216533,"im":0.00020649598646880408},{"omegaRadPerYr":0.00014631533310756968,"re":0.0002679684896809784,"im":0.00022796694930874033},{"omegaRadPerYr":-0.00009568507237176567,"re":-0.000049572612945519304,"im":0.00011688249888045971}],"zeta":[{"omegaRadPerYr":-1.9284984538258004e-8,"re":-0.003708721248959303,"im":0.013267262775914458},{"omegaRadPerYr":-0.0001277372896899594,"re":-0.00473585842558015,"im":0.006270978893125488},{"omegaRadPerYr":-0.000015325638313367067,"re":-0.000342091983477944,"im":0.0002459194020261331},{"omegaRadPerYr":-0.0000065831107802777746,"re":0.0002849200201049732,"im":0.00012107400921002766},{"omegaRadPerYr":0.000003999922886015977,"re":-0.00025809587923422754,"im":-0.000010818807501830861},{"omegaRadPerYr":-0.000020373996231109695,"re":0.00011127740663504409,"im":-0.00002191187386888525}]},"uranus":{"z":[{"omegaRadPerYr":0.000019010265346098605,"re":-0.033200286080063916,"im":0.0011121469492544251},{"omegaRadPerYr":0.000012033775574177009,"re":-0.008077561115556027,"im":0.02293125999571007},{"omegaRadPerYr":0.000023775733149813484,"re":-0.008710621833115826,"im":-0.016095355591969604},{"omegaRadPerYr":0.000007822007075432675,"re":0.0016021840612059168,"im":-0.009621969113692156},{"omegaRadPerYr":0.00002952547228417886,"re":0.0016566445996550965,"im":0.006018707505057967},{"omegaRadPerYr":0.00013694007244464723,"re":0.0009292339240691288,"im":-0.0016372467645427197}],"zeta":[{"omegaRadPerYr":7.599421366412143e-8,"re":-0.004660490353585718,"im":0.01324646340758287},{"omegaRadPerYr":-0.000014567449496838837,"re":0.006613328514408994,"im":-0.005878235417711313},{"omegaRadPerYr":-0.000007051181231496491,"re":-0.0004558064482609971,"im":-0.00031393562385899923},{"omegaRadPerYr":0.000003329914022932244,"re":0.0003411959761619822,"im":-0.0003305440071371085},{"omegaRadPerYr":-0.0001277295137673612,"re":0.00021735572403603482,"im":-0.00029463734768672754},{"omegaRadPerYr":-0.00002335403426632458,"re":-0.00006477073255467024,"im":-0.00008547519620498973}]},"neptune":{"z":[{"omegaRadPerYr":0.0000029404698294886683,"re":0.002583276204603991,"im":0.009213710369858697},{"omegaRadPerYr":0.000015819958189246093,"re":0.002410719467240076,"im":-0.0028958675920111618},{"omegaRadPerYr":0.00002325097119532629,"re":0.001159396623354508,"im":0.001106111966705049},{"omegaRadPerYr":-0.0000035890886114523422,"re":-0.00020879605377416773,"im":-0.0006167290950842672},{"omegaRadPerYr":0.000030374670292163826,"re":-0.0002774301776095828,"im":-0.0002388641303570229}],"zeta":[{"omegaRadPerYr":-3.301733513849372e-7,"re":-0.008762838168102518,"im":0.010494876534409803},{"omegaRadPerYr":-0.000007353421929989998,"re":-0.0024807316856027294,"im":-0.0014503561615380218},{"omegaRadPerYr":0.000004080233598697059,"re":0.0018281727993976064,"im":0.002054509738245118},{"omegaRadPerYr":-0.000014881778065736648,"re":-0.00013356695251210882,"im":0.0011500105634289276},{"omegaRadPerYr":0.00001160480877156738,"re":-0.0005630431963197903,"im":-0.0005345014452666219},{"omegaRadPerYr":-0.000020788597979173094,"re":-0.0005111003177756488,"im":-0.00044451839396914716}]}},"windowRatesArcsecCy":{"gr":{"mercury":572.0163954148283,"venus":22.72580010599836,"earth":1154.4288756665303,"mars":1597.8081246982024,"jupiter":488.52901897634354,"saturn":-1576.6419790262526,"uranus":806.6031271547791,"neptune":9101.672820143169},"newton":{"mercury":529.0318184207404,"venus":14.090631090521121,"earth":1150.5947011086469,"mars":1596.4568002639046,"jupiter":488.4665375503103,"saturn":-1576.655982201358,"uranus":806.6007460587327,"neptune":9101.678202054029}},"windowElementRates":{"mercury":{"meanMotionDegPerYr":1494.7257434850626,"nodeRateArcsecCy":-451.23114506979533,"eccDotPerCy":0.000020426777739608027,"inclDotArcsecCy":-21.43063243338586},"venus":{"meanMotionDegPerYr":585.1779096296486,"nodeRateArcsecCy":-1000.3062148126329,"eccDotPerCy":-0.00004798428729899649,"inclDotArcsecCy":-2.9741785335138227},"earth":{"meanMotionDegPerYr":359.9936510408777,"nodeRateArcsecCy":287648.7600662079,"eccDotPerCy":-0.00004200482595462892,"inclDotArcsecCy":-22.64742397865307},"mars":{"meanMotionDegPerYr":191.40299923220516,"nodeRateArcsecCy":-1059.1798892427676,"eccDotPerCy":0.0000917178876575738,"inclDotArcsecCy":-29.268508116285304},"jupiter":{"meanMotionDegPerYr":30.347302970895168,"nodeRateArcsecCy":724.7057759408735,"eccDotPerCy":-0.0000876138498378255,"inclDotArcsecCy":-7.070016683580993},"saturn":{"meanMotionDegPerYr":12.225441692771112,"nodeRateArcsecCy":-1041.0659036365291,"eccDotPerCy":-0.00027446940576446793,"inclDotArcsecCy":8.397686122084723},"uranus":{"meanMotionDegPerYr":4.284939547595869,"nodeRateArcsecCy":114.5093750648986,"eccDotPerCy":-0.00009620843043291943,"inclDotArcsecCy":-8.163218561711115},"neptune":{"meanMotionDegPerYr":2.184556718701332,"nodeRateArcsecCy":-12.96633501054956,"eccDotPerCy":0.00038317519496411644,"inclDotArcsecCy":1.294056435039746}},"j2000AnchorElements":{"mercury":{"aAU":0.3870982306507114,"e":0.20563023607048908,"inclEclipticDeg":7.005014303274938,"ascNodeEclipticDeg":48.33053855197437,"lonPeriEclipticDeg":77.45482144099158,"meanLonEclipticDeg":252.25070308850388},"venus":{"aAU":0.723326980236553,"e":0.006755832524369414,"inclEclipticDeg":3.3945896490801655,"ascNodeEclipticDeg":76.67837411646671,"lonPeriEclipticDeg":131.86481574575365,"meanLonEclipticDeg":181.97911300917644},"earth":{"aAU":0.9999965019964896,"e":0.016702435651957018,"inclEclipticDeg":0.00010345820355474172,"ascNodeEclipticDeg":140.29217988414328,"lonPeriEclipticDeg":462.9179213996577,"meanLonEclipticDeg":100.46313620647612},"mars":{"aAU":1.5236791234560592,"e":0.09331517469683501,"inclEclipticDeg":1.8498764556630205,"ascNodeEclipticDeg":49.56200645402683,"lonPeriEclipticDeg":336.0994054433697,"meanLonEclipticDeg":355.4558712806536},"jupiter":{"aAU":5.204267043121455,"e":0.04877494875045604,"inclEclipticDeg":1.304625372772227,"ascNodeEclipticDeg":100.49162135259076,"lonPeriEclipticDeg":375.5576634246116,"meanLonEclipticDeg":34.37610122976946},"saturn":{"aAU":9.582017927199528,"e":0.05572345073837687,"inclEclipticDeg":2.4852504409844323,"ascNodeEclipticDeg":113.64296212519966,"lonPeriEclipticDeg":449.65653541437854,"meanLonEclipticDeg":50.00443784290724},"uranus":{"aAU":19.22941789809548,"e":0.04440546894120367,"inclEclipticDeg":0.7725675263742898,"ascNodeEclipticDeg":73.98941630128037,"lonPeriEclipticDeg":170.53113765495846,"meanLonEclipticDeg":313.4868371274142},"neptune":{"aAU":30.103641823294048,"e":0.01121513931197063,"inclEclipticDeg":1.7679863485740834,"ascNodeEclipticDeg":131.79386605766496,"lonPeriEclipticDeg":397.44244290669224,"meanLonEclipticDeg":305.20853660850446}},"invariablePlane":{"inclEclipticDeg":1.5785089212841052,"ascNodeEclipticDeg":107.5823599360674},"relativisticSupplementArcsecCy":{"mercury":42.98142753750674,"venus":8.624988679409013,"earth":3.838964853078437,"mars":1.3510691613456707,"jupiter":0.06243854269534776,"saturn":0.013727538363259385,"uranus":0.0023997870642552053,"neptune":0.0007833188044413818},"checks":{"mercuryClosureArcsecCy":{"measuredWindowDelta":42.98457699408789,"derivedInstantaneous":42.98142753750674,"diff":0.003149456581148513,"tolerance":0.1},"earthMeanMotionVsSiderealAnchor":{"engineDegPerYr":359.9936510408777,"modelSiderealDegPerYr":359.9937285652708,"diffArcsecPerYr":-0.279087815283674,"tolerance":2},"saturnG6":{"measured":28.245581358956457,"laskar":28.2455},"jupiterG5":{"measured":4.256769523195223,"laskar":4.2575}},"inputs":{"generator":"node tools/verify/nbody-secular.js --write","files":{"packages/physics/src/planets/keplerian-chain.cjs":"sha256:ac48a70bef8668b8cde7e2ef28f398d96cf03cf46bc4ba742f60c315c5cbeb52","public/input/astro-reference.json":"sha256:0e61f5bec0ee3c44016781599498db75067070e74aeddc89b2f5bd6bc2782918","tools/explore/j2000-state.mjs":"sha256:ef15efde06948b36b589e3f790e6c5ccda64b8c1e1899cb4ff1e5f1571149611","tools/explore/k45-residual-naff.mjs":"sha256:228eb4874adca9171d61c1697ffbbaac3ce82891476a34762bf882840ccae406","tools/explore/k45e-amplitude-solve.mjs":"sha256:d5ce9f8d3e38d49988b089542882833dd4c631125b5b4e21eff13b119eee45e8","tools/explore/lattice-long-window-test.mjs":"sha256:d45dea6a754b8ab6502432ecb0cd463ef2d5780418b0fecd694ac1d5c1bed11f","tools/explore/naff-frequencies.mjs":"sha256:85178139faf0894c8cf62a7aa0a92395dab7afa6ab33efee93b63712ef257ed2","tools/explore/nbody-wh.mjs":"sha256:42947b7492e81dd412a97e0a794412706d16d6a42f2fde38310877fd1051c777","tools/lib/keplerian-chain.js":"sha256:7be1a96b20174d8c2726ec984250646093a847a5cf7e06d8e1e2ffae926ff5c9","tools/verify/nbody-secular.js":"sha256:95873972aab80bc156ec4c709e6a4e197699a7c0d2f4db1159a08178ffc3e3d8"}},"periodicTerms":{"mercury":{"mlonArcsec":[{"omegaRadPerYr":1.1094782578638633,"cos":0.4283393261961084,"sin":-7.326527509234423},{"omegaRadPerYr":5.661360380927949,"cos":-2.042649039570386,"sin":2.931772290428614}],"aPpm":[],"z":[],"zeta":[],"windowAffine":{"mlon":{"off":-3.0393736875871302,"slope":2.841277225316435},"a":{"off":0.2758746522782975,"slope":-7.212979068927238e-8},"k":{"off":-0.000010308133413000659,"slope":-3.078102566616934e-7},"h":{"off":-0.000016422197583177168,"slope":3.7560192853821967e-7},"q":{"off":0.000010395164103761334,"slope":-1.838228216218485e-7},"p":{"off":-0.0000045514783478873524,"slope":-4.54454512200622e-8}}},"venus":{"mlonArcsec":[],"aPpm":[],"z":[{"omegaRadPerYr":1.5773449192709434,"re":5.7688362360462365e-8,"im":5.534221828564653e-8},{"omegaRadPerYr":-1.5773449192709434,"re":0.000010314865584099027,"im":-0.0000198748787238016}],"zeta":[],"windowAffine":{"mlon":{"off":3.5948127312304887,"slope":0.5465947510597761},"a":{"off":4.008943004747135,"slope":7.075860643009611e-7},"k":{"off":0.00001907619455854608,"slope":-1.3082845363477187e-8},"h":{"off":0.00003129559857960834,"slope":-1.441522288917906e-8},"q":{"off":0.00000369074550376789,"slope":-5.1716895028481445e-8},"p":{"off":0.000005182645310723055,"slope":4.982987600455474e-8}}},"mars":{"mlonArcsec":[{"omegaRadPerYr":0.003412137087635026,"cos":53.66134652943842,"sin":17.0702224095311},{"omegaRadPerYr":0.19158768233986423,"cos":4.119097641894965,"sin":-4.748875287824893},{"omegaRadPerYr":0.39807082074986866,"cos":12.712294840261926,"sin":-4.8937042567324385},{"omegaRadPerYr":0.7961398668364265,"cos":1.4218153844689059,"sin":4.144231910196455}],"aPpm":[],"z":[{"omegaRadPerYr":0.3981475229837692,"re":-0.000006022352586612927,"im":-0.000016334865019193796},{"omegaRadPerYr":-0.3981475229837692,"re":-1.906831770330436e-7,"im":-4.274257222159089e-7},{"omegaRadPerYr":0.5296892164591163,"re":-0.00003701074387998172,"im":-0.000026873075674723054},{"omegaRadPerYr":-0.5296892164591163,"re":-4.860521864995133e-7,"im":3.4682346833132817e-7}],"zeta":[],"windowAffine":{"mlon":{"off":-83.40368679689061,"slope":-0.1308571754299822},"a":{"off":0.22572896074793633,"slope":0.00002462826981976612},"k":{"off":0.000055581565502195474,"slope":-3.330033606281005e-7},"h":{"off":-0.00011828467060704684,"slope":8.036921269251493e-8},"q":{"off":-0.000004188215333238016,"slope":1.6809402416370802e-7},"p":{"off":-0.000015868506481068194,"slope":-5.921860993754493e-8}}},"jupiter":{"mlonArcsec":[{"omegaRadPerYr":0.0006208681133576669,"cos":193.3832216620771,"sin":380.597621447694},{"omegaRadPerYr":0.0012063073379189023,"cos":-3.9274841583289564,"sin":-80.09301290875467},{"omegaRadPerYr":0.004160979269962051,"cos":-1.69943829568573,"sin":10.726068111658648},{"omegaRadPerYr":0.005711423877210773,"cos":58.571129321431584,"sin":-126.86137607602102},{"omegaRadPerYr":0.0060611490662863445,"cos":-197.7236817832274,"sin":527.5745834567023},{"omegaRadPerYr":0.006400320486794552,"cos":379.14030538693584,"sin":-996.4275081012628},{"omegaRadPerYr":0.006927123132186677,"cos":-96.86651973973018,"sin":-625.8640378432207},{"omegaRadPerYr":0.00734753548346981,"cos":8.43825109969694,"sin":46.700085406090466},{"omegaRadPerYr":0.013416263751242975,"cos":2.917377177432902,"sin":-10.573630606149845},{"omegaRadPerYr":0.10286332259410932,"cos":-55.41328203440606,"sin":28.51871156692714},{"omegaRadPerYr":0.10341539484729162,"cos":-77.12097788008923,"sin":9.202995253429414},{"omegaRadPerYr":0.1100425288520466,"cos":3.899298688610127,"sin":-10.215251943431543},{"omegaRadPerYr":0.20645396403363098,"cos":-12.573442445414853,"sin":6.295822342082753},{"omegaRadPerYr":0.21316426593910423,"cos":10.054032585538861,"sin":-1.4152085169745214},{"omegaRadPerYr":0.3163921030750765,"cos":14.356082594113289,"sin":-47.02291299274492},{"omegaRadPerYr":0.4196206573492547,"cos":-18.86823087866421,"sin":-20.24646022413696},{"omegaRadPerYr":0.5228460556683714,"cos":-3.4375496090271564,"sin":0.6151505966978332},{"omegaRadPerYr":0.5295794256693848,"cos":3.217907378493207,"sin":1.975307816916936},{"omegaRadPerYr":0.6327839673705462,"cos":35.3349228950653,"sin":-56.4049785284849},{"omegaRadPerYr":0.7360122252144383,"cos":-4.7168510713684295,"sin":-9.5724698724},{"omegaRadPerYr":0.949175502963057,"cos":17.822449799701438,"sin":-16.382728937959474},{"omegaRadPerYr":1.2655672106357103,"cos":8.87498412842184,"sin":-4.569657084971597}],"aPpm":[{"omegaRadPerYr":0.006719118472690749,"cos":48.57374276056867,"sin":5.718778591306203},{"omegaRadPerYr":0.10316587166928487,"cos":-20.64279315909391,"sin":-58.4592094563138},{"omegaRadPerYr":0.31639212053382026,"cos":37.85268365288874,"sin":11.814375674076771},{"omegaRadPerYr":0.4196197886355212,"cos":32.19572358006155,"sin":-26.99428023819792},{"omegaRadPerYr":0.6327837640748681,"cos":112.58712391466997,"sin":70.37241144145064},{"omegaRadPerYr":0.7360111762024295,"cos":20.869632878207252,"sin":-9.118091922845995},{"omegaRadPerYr":0.9491754071485186,"cos":40.75667943910494,"sin":43.811460605574815}],"z":[{"omegaRadPerYr":-0.0006207787083493434,"re":-0.000007760801206480335,"im":0.0000016579719102905573},{"omegaRadPerYr":0.0006207787083493449,"re":-0.000008695682534227633,"im":-0.000006359405183752185},{"omegaRadPerYr":-0.004432186705238992,"re":3.2207615300300247e-7,"im":-6.196347944817902e-7},{"omegaRadPerYr":0.006185044486880686,"re":-0.000004731941541673283,"im":-0.0000017729858354297809},{"omegaRadPerYr":0.006526633569639799,"re":0.00004150382284636084,"im":0.000017534400952133703},{"omegaRadPerYr":0.006841730692169909,"re":-0.0002026998234541423,"im":0.0003233646880686746},{"omegaRadPerYr":0.007470533994347621,"re":-0.0000049281296015436406,"im":-0.0000012002820271097082},{"omegaRadPerYr":0.013548716908851125,"re":-0.000002377738793176193,"im":0.000006656435245445941},{"omegaRadPerYr":-0.0963835641459155,"re":0.000004243818371947522,"im":0.000006318732294994447},{"omegaRadPerYr":-0.10309304895354462,"re":0.0002599772038145943,"im":0.0005935193398974658},{"omegaRadPerYr":0.10334256718399279,"re":0.00001068106998793681,"im":-7.548205310553664e-7},{"omegaRadPerYr":-0.10355795380749366,"re":-2.1154636946827e-7,"im":-5.390710095107589e-8},{"omegaRadPerYr":0.10974751126305515,"re":0.0000011302669198675927,"im":0.000006702466721595302},{"omegaRadPerYr":-0.10980538631044515,"re":-0.000002866815045583102,"im":-0.000009885070817152992},{"omegaRadPerYr":0.11007006680531065,"re":-0.00013061727670124666,"im":0.000009881348055011194},{"omegaRadPerYr":0.20631979856483246,"re":5.04298118741976e-7,"im":2.480806224515503e-7},{"omegaRadPerYr":-0.20631979856483246,"re":0.00006341492203955716,"im":0.000011273250168154838},{"omegaRadPerYr":0.2132961022923942,"re":-0.00005065824330209699,"im":-0.00006271190037317963},{"omegaRadPerYr":-0.2132961022923942,"re":-0.000004406921581341513,"im":-0.0000016060783929656262},{"omegaRadPerYr":-0.30955001412647276,"re":0.0000056019124603202195,"im":-0.000005441874625394522},{"omegaRadPerYr":0.41948265838592674,"re":-9.509570952152945e-8,"im":-0.0000012590269907950825},{"omegaRadPerYr":-0.41948265838592674,"re":0.000014641220619062486,"im":0.00010495558350565439},{"omegaRadPerYr":0.426466505091871,"re":-0.0000064497978114164694,"im":0.000013430976495086736},{"omegaRadPerYr":-0.426466505091871,"re":-1.7392937473622375e-8,"im":-0.000002543548554022179},{"omegaRadPerYr":0.5227123063902634,"re":-6.493200167943617e-8,"im":-1.9428718738465597e-7},{"omegaRadPerYr":-0.5227123063902634,"re":0.00001824269392489439,"im":0.00000906975764089715},{"omegaRadPerYr":0.5296909646421464,"re":-0.000023988048624019953,"im":-0.000016305548718652476},{"omegaRadPerYr":0.7358764924026054,"re":-5.772321676657591e-7,"im":-9.031194308086103e-8},{"omegaRadPerYr":-0.7358764924026054,"re":-0.000004926448326111552,"im":0.00003725847350296657}],"zeta":[{"omegaRadPerYr":-0.0006207787083493432,"re":0.0000017148670408172224,"im":-1.1979774717324106e-7},{"omegaRadPerYr":0.0006207787083493434,"re":0.0000073648358837529556,"im":-0.000001424067731329963},{"omegaRadPerYr":0.0011047092477748065,"re":-7.000878721120519e-7,"im":-2.3731715104835338e-7},{"omegaRadPerYr":0.0071090112684356,"re":-0.000003975092067696403,"im":0.0000075798744823925934}],"windowAffine":{"mlon":{"off":-276.6789283580293,"slope":6.146016597905851},"a":{"off":-319.6050905273606,"slope":0.0007796076926885039},"k":{"off":0.000014289210688706095,"slope":2.880479286878237e-8},"h":{"off":-0.001073832363366988,"slope":-2.534500776380545e-8},"q":{"off":-0.0000010335341247600158,"slope":1.4914208056557646e-9},"p":{"off":-0.000008818002194016852,"slope":3.0856264717746908e-9}}},"saturn":{"mlonArcsec":[{"omegaRadPerYr":0.0006208681133576669,"cos":-451.253615891754,"sin":145.98152908438132},{"omegaRadPerYr":0.004165525534002769,"cos":5.787274939055933,"sin":-12.703810065013153},{"omegaRadPerYr":0.005711612505032101,"cos":-189.54704549967167,"sin":-160.138901914935},{"omegaRadPerYr":0.006061128582866573,"cos":603.7466010253094,"sin":-8.700856030526818},{"omegaRadPerYr":0.0064003167157022246,"cos":-1037.3698907699634,"sin":1226.0959465379547},{"omegaRadPerYr":0.006927098454757736,"cos":279.6703017478956,"sin":2098.4367623243365},{"omegaRadPerYr":0.007347527790309774,"cos":-31.43305366096744,"sin":-283.15643985756446},{"omegaRadPerYr":0.009480611716879448,"cos":-0.4507335945350436,"sin":4.79424382361373},{"omegaRadPerYr":0.010945707057204556,"cos":25.998025191315012,"sin":6.51039808953889},{"omegaRadPerYr":0.01341613162135763,"cos":-7.425964486999675,"sin":26.129189937928867},{"omegaRadPerYr":0.06380203049325128,"cos":-4.956781443209341,"sin":-5.857273277892975},{"omegaRadPerYr":0.09641501836240508,"cos":1.093655918412904,"sin":-3.2100722037931555},{"omegaRadPerYr":0.10286386181613702,"cos":99.08099439180381,"sin":-63.162454954986316},{"omegaRadPerYr":0.10333438844615983,"cos":212.53124729979737,"sin":-24.123206548331538},{"omegaRadPerYr":0.11004419279928404,"cos":-8.76642821816064,"sin":25.14155702073091},{"omegaRadPerYr":0.1384221456508977,"cos":-4.142308935304489,"sin":0.3359277714106255},{"omegaRadPerYr":0.2064531916682817,"cos":30.963724773182314,"sin":-15.259788419608947},{"omegaRadPerYr":0.2131887934790523,"cos":-24.29491341571394,"sin":-6.982168144064149},{"omegaRadPerYr":0.2770241887124282,"cos":1.4543542593835515,"sin":6.3793376087284965},{"omegaRadPerYr":0.31639189446899674,"cos":-148.12974553923905,"sin":514.8691214437579},{"omegaRadPerYr":0.3231050733335511,"cos":2.178111128712694,"sin":-4.849441591870168},{"omegaRadPerYr":0.41962101131042784,"cos":43.79639605758242,"sin":47.62049382853528},{"omegaRadPerYr":0.4263384811647367,"cos":-1.9599761156575544,"sin":-4.910375543643042},{"omegaRadPerYr":0.5228461938866507,"cos":7.6492352759963484,"sin":-1.4042408711820147},{"omegaRadPerYr":0.5296206925660197,"cos":20.82311358880523,"sin":-21.723522060178187},{"omegaRadPerYr":0.6327839463508664,"cos":-77.8067933782241,"sin":124.58143011814512},{"omegaRadPerYr":0.7360122996869195,"cos":11.252910261739688,"sin":22.663624511588285},{"omegaRadPerYr":0.8460438288764272,"cos":1.8113799261773025,"sin":20.756673170052206},{"omegaRadPerYr":0.9491754962353995,"cos":-40.339539075190224,"sin":37.047932328557295},{"omegaRadPerYr":1.2655672066097283,"cos":-20.25042369756606,"sin":10.420773654426046}],"aPpm":[{"omegaRadPerYr":0.006719059935042215,"cos":-298.1739213236028,"sin":-35.65492072514902},{"omegaRadPerYr":0.10311278023647517,"cos":329.05242810267646,"sin":168.2053446152665},{"omegaRadPerYr":0.1099870935042278,"cos":-80.20082859738086,"sin":25.677992848453474},{"omegaRadPerYr":0.20645076221400505,"cos":22.365346624696144,"sin":52.11596047023494},{"omegaRadPerYr":0.21316470395286807,"cos":22.417376358933,"sin":148.19540823121667},{"omegaRadPerYr":0.3096741611131529,"cos":40.76320120805859,"sin":6.028630477781981},{"omegaRadPerYr":0.31639181272876266,"cos":3380.8172681042483,"sin":952.19154868527},{"omegaRadPerYr":0.41962072059820554,"cos":-117.61845886216751,"sin":102.62640456035058},{"omegaRadPerYr":0.522848349625552,"cos":2.3692526123597575,"sin":25.55482510964822},{"omegaRadPerYr":0.6327843055552796,"cos":-267.8385275274031,"sin":-178.81334724872872},{"omegaRadPerYr":0.7360113200820578,"cos":-70.20882189811421,"sin":30.840529284060356},{"omegaRadPerYr":0.8460447241275829,"cos":152.71397931748962,"sin":-11.548664498369881},{"omegaRadPerYr":0.9491754312473957,"cos":-100.97703552341146,"sin":-108.78710325854236},{"omegaRadPerYr":1.265567050136826,"cos":-32.69042937836259,"sin":-61.98759537925285}],"z":[{"omegaRadPerYr":-0.004358110846151278,"re":-0.000002445279424852449,"im":0.0000017621954362468656},{"omegaRadPerYr":0.006181644107420951,"re":0.000019239809643427013,"im":0.000026302645815428275},{"omegaRadPerYr":0.006525673611358515,"re":-0.00017162207988757243,"im":-0.00012381490122963492},{"omegaRadPerYr":0.006842443147971666,"re":0.0008160379290510822,"im":-0.0012855611879206686},{"omegaRadPerYr":0.007464263599308896,"re":0.000012700556847236648,"im":-0.000011961876101686816},{"omegaRadPerYr":0.011038687923256879,"re":-0.000039869855044714435,"im":0.00003195328235370556},{"omegaRadPerYr":0.013549298871283269,"re":0.000009801001526091865,"im":-0.000026447688535276757},{"omegaRadPerYr":-0.06373626925966255,"re":-0.00003596115998384089,"im":-0.000028529187552461677},{"omegaRadPerYr":-0.09638538445927783,"re":0.000015535362203103386,"im":0.000026853064771238423},{"omegaRadPerYr":-0.10309247938025248,"re":0.0002905044325100417,"im":0.0006021956537131266},{"omegaRadPerYr":0.10334344954127525,"re":-0.000019533843400768672,"im":0.000010878621921404595},{"omegaRadPerYr":0.10921440834492788,"re":-0.00003560780226338562,"im":0.000008050131621592458},{"omegaRadPerYr":-0.10921440834492788,"re":0.0000017934499315039944,"im":0.00000405315797293809},{"omegaRadPerYr":0.10975358535397606,"re":0.00017369831673455462,"im":-0.00007535465148308143},{"omegaRadPerYr":-0.10975358535397606,"re":-0.000004563988896924535,"im":-0.0000154375327254865},{"omegaRadPerYr":0.11042109885467918,"re":0.00018688710085717507,"im":-0.00012925303231366497},{"omegaRadPerYr":0.1107948956846119,"re":-0.00005742819467953064,"im":0.00002446019747635651},{"omegaRadPerYr":-0.1107948956846119,"re":3.2507064761096937e-7,"im":0.0000014893262878712717},{"omegaRadPerYr":0.2063193110741841,"re":-0.000012094578924974436,"im":-0.000015066272817853064},{"omegaRadPerYr":-0.2063193110741841,"re":-0.0002645706853712598,"im":-0.000043660297027029056},{"omegaRadPerYr":0.2130228704680447,"re":0.0007392110656689748,"im":0.0008891228393192088},{"omegaRadPerYr":-0.2130228704680447,"re":0.000018380819773470427,"im":0.000004389860388892079},{"omegaRadPerYr":-0.30955014898803845,"re":-0.000024631815470831895,"im":0.00002635073382218204},{"omegaRadPerYr":0.3161372566474592,"re":0.000010638067732514132,"im":0.00002903644464320735},{"omegaRadPerYr":-0.3161372566474592,"re":0.000044785364090127505,"im":-0.00007235123203278041},{"omegaRadPerYr":0.3232395099583198,"re":-0.0000030767740423315698,"im":-0.00002580327386509728},{"omegaRadPerYr":-0.3232395099583198,"re":-8.037783708694097e-7,"im":0.0000013792616646490144},{"omegaRadPerYr":0.41948429875117665,"re":-0.0000024400754535557023,"im":8.894450263194997e-7},{"omegaRadPerYr":-0.41948429875117665,"re":-0.00005542845317142494,"im":-0.00044582635037752926},{"omegaRadPerYr":0.42644865463819764,"re":0.00007629843791169079,"im":-0.00004431512896241777},{"omegaRadPerYr":-0.42644865463819764,"re":-3.142917811194328e-7,"im":0.000010823856186704562},{"omegaRadPerYr":0.5227089862323508,"re":0.000003410979417831606,"im":0.0000030363670326161395},{"omegaRadPerYr":-0.5227089862323508,"re":-0.00007781393434095757,"im":-0.000038627649196321925},{"omegaRadPerYr":0.5296908859098071,"re":0.0016272720362705665,"im":0.0011111321002679347},{"omegaRadPerYr":-0.6327562885720048,"re":0.000029869908761550486,"im":0.00004153187994553486},{"omegaRadPerYr":0.7358761721222311,"re":0.000002104902323996618,"im":-5.169275046806296e-7},{"omegaRadPerYr":-0.7358761721222311,"re":0.00002159732009990703,"im":-0.00016115133722286416},{"omegaRadPerYr":0.8391031676474132,"re":-3.2200579003446994e-7,"im":-1.921602155098948e-7},{"omegaRadPerYr":-0.8391031676474132,"re":-0.000029573064620902294,"im":-0.00002687687857849615},{"omegaRadPerYr":0.8460633253903981,"re":-0.0000182912621724972,"im":-0.000004960467884280318},{"omegaRadPerYr":-0.8460633253903981,"re":0.000002270968484351811,"im":-4.1450617474219755e-7},{"omegaRadPerYr":1.0522678070946976,"re":0.000002112495108837071,"im":-6.772836661571395e-7},{"omegaRadPerYr":-1.0522678070946976,"re":0.000026798123887720964,"im":-0.00006313630230370938},{"omegaRadPerYr":1.0593357383703628,"re":0.000055178325520269776,"im":0.00007541106198902492},{"omegaRadPerYr":-1.0593357383703628,"re":-0.0000011488133127119404,"im":0.0000024971143397116498}],"zeta":[{"omegaRadPerYr":-0.0006207787083493432,"re":-8.436595912367323e-7,"im":0.000001633263627834134},{"omegaRadPerYr":0.0006207787083493434,"re":-0.000021424440269056364,"im":0.00000406741893133285},{"omegaRadPerYr":0.0011035308302650994,"re":0.0000028014305555000514,"im":3.03429131598728e-7},{"omegaRadPerYr":0.007110979736486372,"re":0.000009782653039468542,"im":-0.000018356544025335236},{"omegaRadPerYr":0.11036111149309716,"re":0.0000053050503083409155,"im":-7.394158520138554e-7},{"omegaRadPerYr":-0.11036111149309716,"re":-1.2281150228540698e-7,"im":-3.07875979063758e-7},{"omegaRadPerYr":0.31648864888649864,"re":5.930263050595727e-7,"im":-0.0000017212036515675988},{"omegaRadPerYr":-0.31648864888649864,"re":0.000006094478957977664,"im":-0.0000045938972600486}],"windowAffine":{"mlon":{"off":709.9722654779956,"slope":-15.579934294638058},"a":{"off":-2829.2103263877525,"slope":-0.004510524074380032},"k":{"off":-0.0032950974609698065,"slope":-2.0051399643096954e-8},"h":{"off":-0.0002907698308219252,"slope":-1.3596818437416563e-8},"q":{"off":-0.0000010497861227947909,"slope":-1.844836227990879e-9},"p":{"off":0.00001949409542224931,"slope":-8.310665514904321e-10}}},"uranus":{"mlonArcsec":[{"omegaRadPerYr":0.0006208681133576669,"cos":1801.9688215276547,"sin":3696.0402015231675},{"omegaRadPerYr":0.0011579316488608284,"cos":-2487.6534406001147,"sin":-459.55088689711397},{"omegaRadPerYr":0.0016224830408352498,"cos":-1220.2966969515146,"sin":1099.2432996165028},{"omegaRadPerYr":0.002935118567074053,"cos":-86.83674347331831,"sin":-108.24685231024809},{"omegaRadPerYr":0.004155546482813653,"cos":7.118744517059694,"sin":23.57760406645599},{"omegaRadPerYr":0.009315002243089728,"cos":3.7516023313568363,"sin":7.101267898351473},{"omegaRadPerYr":0.010640504204457963,"cos":-45.57910944323328,"sin":-40.20883229440988},{"omegaRadPerYr":0.01119673478710359,"cos":-81.22235365041975,"sin":1.901281748995162},{"omegaRadPerYr":0.012145759710583907,"cos":6.889745560125585,"sin":0.1337542919867262},{"omegaRadPerYr":0.03510485087576988,"cos":-13.688922570681836,"sin":-0.13357807007057396},{"omegaRadPerYr":0.036426329598293165,"cos":-5.668712161443024,"sin":-24.347642616449427},{"omegaRadPerYr":0.03764711514559774,"cos":1.138953309753275,"sin":-6.871151194186152},{"omegaRadPerYr":0.06379838901039833,"cos":20.403291982312666,"sin":27.239956687524646},{"omegaRadPerYr":0.07318148932273885,"cos":-9.790209397106063,"sin":-27.80021241193281},{"omegaRadPerYr":0.07471215976498653,"cos":7.902379642110793,"sin":-0.774442117625175},{"omegaRadPerYr":0.10992640338436127,"cos":-5.939904215836388,"sin":-10.882753324742827},{"omegaRadPerYr":0.1385175392010205,"cos":155.21118912477402,"sin":-15.812055598809634},{"omegaRadPerYr":0.14663782569970274,"cos":-3.7488763779317598,"sin":-4.791075382227249},{"omegaRadPerYr":0.18317858258233016,"cos":-2.2663688645635784,"sin":-2.0807781596480717},{"omegaRadPerYr":0.20224498577277328,"cos":8.906763705097376,"sin":0.1380298652243485},{"omegaRadPerYr":0.21324964619950887,"cos":7.79719866947626,"sin":3.241509288620873},{"omegaRadPerYr":0.2770253845805853,"cos":-5.372427211086557,"sin":-26.160552277645316},{"omegaRadPerYr":0.34075769983231263,"cos":-0.34413062425412416,"sin":-3.4023598781892685},{"omegaRadPerYr":0.35171296920155715,"cos":6.530654205490572,"sin":4.862791616448076},{"omegaRadPerYr":0.3801532980579145,"cos":-10.061663279866217,"sin":6.615060134886086},{"omegaRadPerYr":0.4155393874689375,"cos":-8.765446247114845,"sin":2.7918680516072425},{"omegaRadPerYr":0.4549044622840928,"cos":693.1080948896936,"sin":120.18474838738872},{"omegaRadPerYr":0.45610432617458596,"cos":1.4784723033153024,"sin":-4.600733971723476},{"omegaRadPerYr":0.5296580495362411,"cos":25.53148607890865,"sin":29.126214483562098},{"omegaRadPerYr":0.9098120073368585,"cos":1.5179157507850387,"sin":-4.917034352655555},{"omegaRadPerYr":0.9845575209673397,"cos":34.71485095170867,"sin":-6.198872286264103}],"aPpm":[{"omegaRadPerYr":0.0015195464620650877,"cos":-97.92780120015847,"sin":-170.5428140152202},{"omegaRadPerYr":0.010971188991961797,"cos":15.922068967567228,"sin":-63.432796546205935},{"omegaRadPerYr":0.036210324842414696,"cos":16.212587942173556,"sin":-6.129790120421755},{"omegaRadPerYr":0.0638251399824393,"cos":10.100213421265115,"sin":75.06714450826473},{"omegaRadPerYr":0.0733720075467266,"cos":42.98239259300776,"sin":-17.9418140413923},{"omegaRadPerYr":0.07480628721946354,"cos":-98.25061077714025,"sin":-132.202002201576},{"omegaRadPerYr":0.10992773337349732,"cos":23.527834427275085,"sin":-13.195939312161588},{"omegaRadPerYr":0.13851260798083515,"cos":-111.93654476921755,"sin":-1070.016527121048},{"omegaRadPerYr":0.20224432811824086,"cos":-1.6198240173862555,"sin":23.993058869923644},{"omegaRadPerYr":0.2770277343049128,"cos":61.913236841972406,"sin":-9.835654134674343},{"omegaRadPerYr":0.35171020655145807,"cos":33.74734368162499,"sin":-41.87577534787228},{"omegaRadPerYr":0.38014999979161623,"cos":101.22109160185427,"sin":184.81826525347103},{"omegaRadPerYr":0.4155326059030616,"cos":-8.50929116085849,"sin":-24.32921998914257},{"omegaRadPerYr":0.45490446743623597,"cos":713.139927237936,"sin":-4114.6325172160405},{"omegaRadPerYr":0.4561160600364418,"cos":-27.913180144325082,"sin":-8.624546428335371},{"omegaRadPerYr":0.984557509897134,"cos":-33.18844015424147,"sin":-186.75405236611599}],"z":[{"omegaRadPerYr":-0.0006207787083493432,"re":-0.0010010271541711772,"im":0.0018777044315025746},{"omegaRadPerYr":0.0006207787083493464,"re":0.004669404370945987,"im":-0.009340747389266558},{"omegaRadPerYr":0.0009435296146423852,"re":-0.002693731244410169,"im":0.005515123870617622},{"omegaRadPerYr":-0.0011535901883012222,"re":0.00014035425010575732,"im":-0.00024989373718838423},{"omegaRadPerYr":0.0014837575606668784,"re":-0.00045779885526748995,"im":0.001029220718337651},{"omegaRadPerYr":0.0029527987688873665,"re":0.00009183113654454647,"im":0.00014226780874768813},{"omegaRadPerYr":0.004292938112541269,"re":0.00002604331453241119,"im":-0.0000026087586213451956},{"omegaRadPerYr":0.009597120283040226,"re":-0.000007669844938360622,"im":0.000021294192837364352},{"omegaRadPerYr":-0.009597120283040226,"re":-3.9726713006760554e-7,"im":6.855988059585005e-7},{"omegaRadPerYr":0.010674384178493406,"re":-0.000010533262678437352,"im":-0.0001455148230309594},{"omegaRadPerYr":0.011227739550618343,"re":0.00006715354281438808,"im":-0.00012622016168569206},{"omegaRadPerYr":0.03372910794138875,"re":-5.792844472104949e-7,"im":2.4314285495180073e-7},{"omegaRadPerYr":-0.03372910794138875,"re":-0.00000880378752168949,"im":-0.000006800427022328312},{"omegaRadPerYr":-0.03516446737018353,"re":0.000017036805195683028,"im":-0.00006576383803542369},{"omegaRadPerYr":0.03813277064323463,"re":-0.000014411793574417915,"im":0.000021543930065801352},{"omegaRadPerYr":0.03956799170730824,"re":0.0000060071290961077885,"im":0.000009377006777274802},{"omegaRadPerYr":-0.03956799170730824,"re":2.6935210872742854e-7,"im":-4.916863023382216e-8},{"omegaRadPerYr":0.05268030494966354,"re":-4.237037805796693e-8,"im":-2.2749652861175358e-7},{"omegaRadPerYr":-0.05268030494966354,"re":-0.00001162431242526334,"im":0.000006194880630876984},{"omegaRadPerYr":-0.06373512207652907,"re":-0.00022367795746631777,"im":-0.00017316839062164822},{"omegaRadPerYr":0.07165168074871991,"re":0.0000017015187480928225,"im":7.242338771966972e-7},{"omegaRadPerYr":-0.07165168074871991,"re":0.0000022253065719657005,"im":-0.0000239819546465497},{"omegaRadPerYr":0.07478159870524997,"re":0.0009483157794586808,"im":-0.0009764231771624703},{"omegaRadPerYr":0.10845808945136469,"re":-3.004883965295506e-7,"im":1.7055087357327652e-7},{"omegaRadPerYr":-0.10845808945136469,"re":-9.064387638229779e-7,"im":-0.000011385527941028099},{"omegaRadPerYr":-0.12747767226472656,"re":0.000021699265157246156,"im":0.00002376114754738344},{"omegaRadPerYr":0.13850950308176996,"re":-0.0000010910229098697519,"im":-0.000007886168725902355},{"omegaRadPerYr":-0.13850950308176996,"re":-0.000001434320086571384,"im":-0.00001963808508671571},{"omegaRadPerYr":0.1495497617854712,"re":0.000014732954282267382,"im":0.00008515250779883778},{"omegaRadPerYr":0.20222937823935716,"re":-1.1385591675988417e-7,"im":7.147831866493965e-7},{"omegaRadPerYr":-0.20222937823935716,"re":0.00004353415832027236,"im":-0.00006511784459661798},{"omegaRadPerYr":0.21329897373317086,"re":0.0003933511417178107,"im":0.00047058009044412887},{"omegaRadPerYr":-0.21329897373317086,"re":2.8327811431341513e-7,"im":-3.560359246154832e-7},{"omegaRadPerYr":0.2769038067800174,"re":-6.922779079018568e-7,"im":-0.0000013818132165140064},{"omegaRadPerYr":-0.2769038067800174,"re":-2.3494785512648875e-7,"im":-0.000016621555907303974},{"omegaRadPerYr":0.3053633220183532,"re":-3.828674197691803e-8,"im":-3.0064823844297327e-8},{"omegaRadPerYr":-0.3053633220183532,"re":0.00007882762566993446,"im":0.0000236123586415603},{"omegaRadPerYr":0.3407483470470682,"re":-1.3758316558774432e-7,"im":-2.4367154579582864e-7},{"omegaRadPerYr":-0.3407483470470682,"re":-0.000024185839542396282,"im":-0.000011566031399227259},{"omegaRadPerYr":0.38011803010191847,"re":-5.112230464978982e-8,"im":3.5576083426589514e-7},{"omegaRadPerYr":-0.38011803010191847,"re":-0.000683808108807156,"im":-0.0009409743748576826},{"omegaRadPerYr":0.38132830185858746,"re":-5.8177806967052385e-8,"im":1.6800244502590846e-7},{"omegaRadPerYr":-0.38132830185858746,"re":-0.000014034035119495699,"im":0.000007393494708343985},{"omegaRadPerYr":0.4264958876223484,"re":0.000033536519266374154,"im":0.0000032361816570982316},{"omegaRadPerYr":-0.4264958876223484,"re":2.1135509106302237e-9,"im":-2.2152515698741622e-7},{"omegaRadPerYr":0.4548421909364264,"re":-0.000006897616144456808,"im":-0.00002246641860475243},{"omegaRadPerYr":-0.4548421909364264,"re":0.00000407137788831569,"im":-0.00007288075699841603},{"omegaRadPerYr":0.5296909155630158,"re":0.0022676944652803236,"im":0.0015486566265643551},{"omegaRadPerYr":0.6044398037682881,"re":0.00001772821682494471,"im":-0.000001325745633927324},{"omegaRadPerYr":-0.6044398037682881,"re":1.8671243007549463e-7,"im":5.135484152882108e-9},{"omegaRadPerYr":0.8350185854831645,"re":1.3389962716219148e-7,"im":4.84551878795857e-8},{"omegaRadPerYr":-0.8350185854831645,"re":0.000018812120588273927,"im":-0.000007750077895326201},{"omegaRadPerYr":0.9097702890415831,"re":-5.782380719892394e-7,"im":1.9729873306333605e-7},{"omegaRadPerYr":-0.9097702890415831,"re":-0.00004113467597080967,"im":-0.000028046600646821318},{"omegaRadPerYr":1.0593442234385404,"re":0.00007767832087815946,"im":0.00010783753098964789},{"omegaRadPerYr":-1.0593442234385404,"re":-1.3556647669744362e-9,"im":3.814197973272324e-8}],"zeta":[{"omegaRadPerYr":-0.0006207787083493432,"re":0.000009629466068512008,"im":-0.00002700542307681737},{"omegaRadPerYr":0.0006207787083493434,"re":-0.000049798841708766556,"im":0.00013244063973719405},{"omegaRadPerYr":0.0009514858307923093,"re":0.000026789231695805917,"im":-0.00007644359257728086},{"omegaRadPerYr":0.0014527887892821479,"re":-0.0000023897704328165434,"im":0.000013648719577168508},{"omegaRadPerYr":-0.0014792753244575146,"re":0.000002151034415423666,"im":0.000005190682098271777},{"omegaRadPerYr":0.0029820480249223872,"re":-0.0000013160358614767749,"im":-0.000005115909165770176},{"omegaRadPerYr":0.00445001839713232,"re":-6.717165830591991e-7,"im":9.251686604741414e-9},{"omegaRadPerYr":0.011102305337337318,"re":-0.000004628968123150622,"im":-0.0000046908160229297634},{"omegaRadPerYr":0.03663431002433444,"re":-6.097607617781723e-7,"im":9.248254018616485e-8},{"omegaRadPerYr":-0.036662600049736954,"re":4.790966947907778e-7,"im":-2.7030397322901033e-7},{"omegaRadPerYr":-0.1385862814842433,"re":0.0000034400542443838532,"im":0.0000021585069767270156},{"omegaRadPerYr":0.1496020811421664,"re":8.15990123336191e-7,"im":-7.942505016386517e-7},{"omegaRadPerYr":0.2881502651212958,"re":-0.0000010962716988804577,"im":-0.0000016121125699103533},{"omegaRadPerYr":0.45486894002023015,"re":-2.2992966985781707e-8,"im":-9.354657471556091e-9},{"omegaRadPerYr":-0.45486894002023015,"re":0.0000041579007491430415,"im":0.000004891978906915924},{"omegaRadPerYr":0.6044418164850311,"re":-0.0000037738318413916955,"im":-0.0000030151035436098662},{"omegaRadPerYr":-0.6044418164850311,"re":-7.35866162994619e-11,"im":-1.0864146466816922e-9}],"windowAffine":{"mlon":{"off":1210.0916981086646,"slope":-2.356561618102263},"a":{"off":-570.5850928990467,"slope":-0.008328826998351968},"k":{"off":-0.00366228365357873,"slope":-0.000002706626332717455},"h":{"off":0.0013833912074699532,"slope":-0.0000013941565327430463},"q":{"off":0.000017812451313420837,"slope":4.3356058040235435e-8},"p":{"off":-0.00003762382414202915,"slope":1.7014936480391533e-8}}},"neptune":{"mlonArcsec":[{"omegaRadPerYr":0.0006208681133576669,"cos":1064.212149451297,"sin":-18540.652753959734},{"omegaRadPerYr":0.0010884207287489497,"cos":-924.0362482426459,"sin":8383.82201986771},{"omegaRadPerYr":0.0014542551964391568,"cos":2226.955694353464,"sin":-3270.274366253071},{"omegaRadPerYr":0.0029389628530379795,"cos":48.078439095229676,"sin":94.12365761816456},{"omegaRadPerYr":0.035319889560920095,"cos":9.257473045853379,"sin":2.0734856552080676},{"omegaRadPerYr":0.03664876565539879,"cos":4.7094553822663965,"sin":32.60593260837659},{"omegaRadPerYr":0.0379634784712963,"cos":2.9744193339631977,"sin":2.513917234979188},{"omegaRadPerYr":0.07185421776935363,"cos":2.8052710744993297,"sin":0.02846273088874038},{"omegaRadPerYr":0.0732973641270625,"cos":6.1965389050552835,"sin":17.0773714633508},{"omegaRadPerYr":0.10987969317187546,"cos":3.60363735367916,"sin":6.863360280812679},{"omegaRadPerYr":0.1465411070471313,"cos":2.3029358223686502,"sin":2.954488343602723},{"omegaRadPerYr":0.17516600735395105,"cos":184.4413301288469,"sin":-52.32109605114765},{"omegaRadPerYr":0.35033794653247485,"cos":-1.7861093063080808,"sin":-2.9405528996126975},{"omegaRadPerYr":0.38836651611040063,"cos":9.70081182993168,"sin":5.3192582532981545},{"omegaRadPerYr":0.4915611841446312,"cos":911.0889137852095,"sin":-1.0510799754510758},{"omegaRadPerYr":0.49279773384983616,"cos":-0.5592399822047331,"sin":3.9702700781104827},{"omegaRadPerYr":0.5297024373268707,"cos":2.40320968051373,"sin":-9.399068768105197},{"omegaRadPerYr":1.021214758421749,"cos":42.2020577057518,"sin":-15.309967518050174}],"aPpm":[{"omegaRadPerYr":0.0015262400589186877,"cos":128.59464307443753,"sin":231.15748494462574},{"omegaRadPerYr":0.0028522808070564833,"cos":-21.37258121508621,"sin":10.41064755989285},{"omegaRadPerYr":0.03669498740393444,"cos":151.68816464488373,"sin":-28.109847919847983},{"omegaRadPerYr":0.0732428963963061,"cos":-33.097418893495544,"sin":11.320551289859745},{"omegaRadPerYr":0.11007776654950899,"cos":-15.641429019477593,"sin":8.577259144710313},{"omegaRadPerYr":0.17516937472508654,"cos":-326.96669731853905,"sin":-1149.3821777931403},{"omegaRadPerYr":0.38836651718787407,"cos":29.53675612865252,"sin":-54.13457963760843},{"omegaRadPerYr":0.4534159750526987,"cos":-46.68270557697238,"sin":11.759966469069417},{"omegaRadPerYr":0.49156118009313077,"cos":-5.290056175958509,"sin":-4922.302879177644},{"omegaRadPerYr":0.4928261722960873,"cos":22.10668376967481,"sin":2.1304175891318873},{"omegaRadPerYr":1.0212147268897795,"cos":-78.57315117147935,"sin":-216.34180136813907}],"z":[{"omegaRadPerYr":-0.0006207787083493432,"re":0.00000822910599695662,"im":0.00000566645788782689},{"omegaRadPerYr":0.0006207787083493453,"re":-0.0000033482623738817215,"im":-0.000011998582333036538},{"omegaRadPerYr":0.0014837734825010177,"re":0.0002465285902965811,"im":-0.000542946526804817},{"omegaRadPerYr":0.002952491806788975,"re":-0.00011247629571556469,"im":-0.00011171907883842821},{"omegaRadPerYr":-0.004414051602461347,"re":-1.1949180023376013e-8,"im":-5.895393912563796e-8},{"omegaRadPerYr":0.00441745151969733,"re":-0.000011139829747812603,"im":0.000005957961387581304},{"omegaRadPerYr":-0.0336947851363493,"re":0.000008788563557474915,"im":0.0000066100893572258815},{"omegaRadPerYr":-0.03516438841507151,"re":-0.000016831823497116864,"im":0.00006611363801678594},{"omegaRadPerYr":0.03666424259143439,"re":0.0000067161349630566706,"im":8.5863061450533e-7},{"omegaRadPerYr":0.03813296419381759,"re":0.0007689836932573089,"im":-0.0011245762260255845},{"omegaRadPerYr":-0.07181296843697238,"re":-0.0000023474904524169503,"im":0.000024443385640750307},{"omegaRadPerYr":0.07478167259300009,"re":0.00006051155974368794,"im":-0.00006241188917030075},{"omegaRadPerYr":0.08068029609791652,"re":-2.1385174933710793e-7,"im":9.47807650713311e-8},{"omegaRadPerYr":0.10840999361006448,"re":-2.1894562976651773e-8,"im":-1.842804538376415e-8},{"omegaRadPerYr":-0.10840999361006448,"re":5.153826226655718e-7,"im":0.000011407506356300657},{"omegaRadPerYr":-0.13703303990304816,"re":-0.0003233037620025506,"im":-0.00010732690949601281},{"omegaRadPerYr":0.21329898735568126,"re":0.00048778689719744165,"im":0.0005843247148884207},{"omegaRadPerYr":-0.3121996849254518,"re":2.6584347616665e-7,"im":-0.000009497238475246992},{"omegaRadPerYr":0.3502350293271937,"re":4.843040927610671e-8,"im":-1.0702237146150716e-7},{"omegaRadPerYr":-0.3502350293271937,"re":-0.000007616440459433557,"im":-0.000014833156682859016},{"omegaRadPerYr":0.41529137321236287,"re":1.442005878816463e-7,"im":-3.484512197119509e-7},{"omegaRadPerYr":-0.41529137321236287,"re":-0.00000707795193580432,"im":0.00001836075632727175},{"omegaRadPerYr":0.42649606358473324,"re":0.00004218844308149576,"im":0.000004227571689777453},{"omegaRadPerYr":-0.42649606358473324,"re":-5.658292052953387e-8,"im":-6.845099901226937e-8},{"omegaRadPerYr":0.45343148629777286,"re":-5.680507946629673e-8,"im":-9.841661999629342e-8},{"omegaRadPerYr":-0.45343148629777286,"re":-0.0010841004899122212,"im":-0.000736390221813403},{"omegaRadPerYr":0.4546133901012304,"re":6.67914668314911e-8,"im":6.897609009672202e-8},{"omegaRadPerYr":-0.4546133901012304,"re":0.00000818929299076697,"im":-0.000008038397570237945},{"omegaRadPerYr":0.4915675955310438,"re":-0.000004083522353726188,"im":0.000003744270434963885},{"omegaRadPerYr":-0.4915675955310438,"re":-0.000012301739812453286,"im":0.000010686366413055363},{"omegaRadPerYr":0.5296909041466622,"re":0.002839613383622111,"im":0.0019403577470709873},{"omegaRadPerYr":0.9830852238230905,"re":-6.720721583920492e-8,"im":3.425816645371005e-8},{"omegaRadPerYr":-0.9830852238230905,"re":-0.00005758151994324185,"im":-0.000014754794069635932},{"omegaRadPerYr":1.0593442030083966,"re":0.00009721226174654751,"im":0.0001350049744357107},{"omegaRadPerYr":-1.0593442030083966,"re":-4.1559879847366785e-8,"im":9.802298292992387e-9}],"zeta":[{"omegaRadPerYr":-0.0006207787083493432,"re":-5.057373983794714e-7,"im":0.0000031433152031555667},{"omegaRadPerYr":0.0006207787083493438,"re":0.0000029115733404898485,"im":-0.000004309627443672908},{"omegaRadPerYr":0.0014366584800648346,"re":-0.0000013572071156821169,"im":-0.000001020104238423996},{"omegaRadPerYr":-0.001480323771534016,"re":-0.0000011783259528824155,"im":-0.0000018211874549353222},{"omegaRadPerYr":0.002982469348844243,"re":9.458475398560309e-7,"im":0.000003122123819843002},{"omegaRadPerYr":0.0044510414024656955,"re":3.971188256100343e-7,"im":2.94455272695886e-8},{"omegaRadPerYr":0.03663380433896722,"re":3.593149192869475e-7,"im":-5.5827146617815774e-8},{"omegaRadPerYr":-0.17494555869955136,"re":9.099409535530744e-7,"im":-9.024205485759674e-7},{"omegaRadPerYr":-0.17549754071699553,"re":0.000001505121306046405,"im":-3.070442234723798e-7},{"omegaRadPerYr":0.49159407636236985,"re":4.796686684990757e-9,"im":3.358344123813994e-10},{"omegaRadPerYr":-0.49159407636236985,"re":-3.98804489842816e-7,"im":-0.00001005615352417885},{"omegaRadPerYr":0.5676217845108422,"re":0.000004880876845321145,"im":-0.0000023244672855910403},{"omegaRadPerYr":0.5681730424584401,"re":0.000003985093304959338,"im":-7.238476904721648e-7}],"windowAffine":{"mlon":{"off":-3600.978375847875,"slope":6.706848240846746},"a":{"off":228.34220468445073,"slope":0.013417433557641792},"k":{"off":-0.0029101681444154044,"slope":2.5117803834315305e-9},"h":{"off":-0.00012102457242531213,"slope":1.8162297961597065e-8},"q":{"off":-0.000011703165443191566,"slope":-2.5174396402677695e-9},"p":{"off":0.00001578707593265369,"slope":-1.0378417602521395e-8}}}}});
@@ -0,0 +1,332 @@
1
+ /**
2
+ * The Keplerian planet chain — THE shared implementation (P5/K2 → K4.7b).
3
+ * Engine-D-driven elements → heliocentric positions; lives ONCE here, consumed
4
+ * by tools/lib/keplerian-chain.js (Node binding: fs artifact loader + the
5
+ * model's AU) and by the browser scene (src/script.js) through the embedded
6
+ * chain artifact.
7
+ *
8
+ * SOURCE-OF-TRUTH DOCTRINE (plan 02 §P5): engine D is the truth because it is
9
+ * causally ours. The ONLY inputs are (1) the J2000 Horizons state vectors —
10
+ * the anchor, the numbers left to nature — and (2) element evolution measured
11
+ * by the model's own N-body pipeline (the governed artifact
12
+ * data/nbody-secular-frequencies.json: era-typed window rates, the K4.7
13
+ * multi-mode secular tables, the K4.5/K4.7b derived periodic layer;
14
+ * regenerated from the constants whenever they change, so a changed planet
15
+ * mass propagates engine → artifact → here). No Meeus/JPL/Laskar series or
16
+ * rates enter this module, ever; external ephemerides are anchors and
17
+ * comparison surfaces only. The model's planet positions MAY DIFFER from
18
+ * JPL — that difference is published model content, not a defect.
19
+ *
20
+ * PURITY: every function is pure; the artifact object and the model's AU are
21
+ * passed in by the caller (the two engines bind their own single homes).
22
+ * Units/frames: AU and years internally where named; ecliptic-J2000 frame
23
+ * throughout (the HZ seed frame); angles degrees in the public API.
24
+ * MATCHED PAIR: this file is hashed as an input of the governed artifact —
25
+ * terms and evaluation form ship together (the ~1162-minute-class rule).
26
+ */
27
+
28
+ 'use strict';
29
+
30
+ /** @typedef {{aAU:number,e:number,inclEclipticDeg:number,ascNodeEclipticDeg:number,
31
+ * lonPeriEclipticDeg:number,meanLonEclipticDeg:number,
32
+ * meanMotionDegPerYr?:number,argPeriDeg?:number,meanAnomalyDeg?:number,
33
+ * inclInvPlaneDeg?:number,ascNodeInvPlaneDeg?:number}} KcElements */
34
+ /** @typedef {{inclEclipticDeg:number,ascNodeEclipticDeg:number}} KcInvariablePlane */
35
+ /** @typedef {{omegaRadPerYr:number,cos:number,sin:number}} KcCosSinTerm */
36
+ /** @typedef {{omegaRadPerYr:number,re:number,im:number}} KcComplexTerm */
37
+ /** @typedef {{comps:Array<{planet:string,sLam?:number,sPom?:number}>,cos:number,sin:number}} KcPoissonCosSinTerm */
38
+ /** @typedef {{comps:Array<{planet:string,sLam?:number,sPom?:number}>,re:number,im:number}} KcPoissonComplexTerm */
39
+ /** @typedef {{off:number,slope?:number}} KcAffine */
40
+ /** @typedef {{windowAffine?:Object<string,KcAffine>,mlonArcsec?:KcCosSinTerm[],aPpm?:KcCosSinTerm[],
41
+ * z?:KcComplexTerm[],zeta?:KcComplexTerm[],
42
+ * poissonMlonArcsec?:KcPoissonCosSinTerm[],poissonZ?:KcPoissonComplexTerm[]}} KcPeriodicTerms */
43
+ /** @typedef {{anchor:KcElements,periRateArcsecCy:number,meanMotionDegPerYr:(number|null),
44
+ * windowRates?:{meanMotionDegPerYr?:number,nodeRateArcsecCy?:number,eccDotPerCy?:number,inclDotArcsecCy?:number},
45
+ * secularModes?:({z:KcComplexTerm[],zeta:KcComplexTerm[]}|null),
46
+ * periodicTerms?:(KcPeriodicTerms|undefined),
47
+ * invariablePlane?:(KcInvariablePlane|undefined)}} KcPlanetChain */
48
+
49
+ const D2R = Math.PI / 180;
50
+
51
+ // The anchor epoch of the HZ state vectors: J2000.0 (JD 2451545.0), carried
52
+ // in this module's `year` coordinate as 2000.0 by convention. PRECISION NOTE
53
+ // (K3): JD 2451545.0 is Jan 1, 12:00 TT — when the chain meets a scene
54
+ // calendar, the epoch maps through the model's OWN JD→year machinery (the
55
+ // linear-vs-calendar JD→year trap), never a hand-made offset; a half-day
56
+ // slip is 2° of Mercury mean longitude.
57
+ const ANCHOR_EPOCH_YEAR = 2000;
58
+ const ANCHOR_EPOCH_JD = 2451545.0;
59
+
60
+ /** Full osculating elements from a heliocentric ecliptic-J2000 state vector.
61
+ * @param {number[]} rKm heliocentric position, km
62
+ * @param {number[]} vKmS heliocentric velocity, km/s
63
+ * @param {number} muKm3S2 GM_Sun + GM_planet
64
+ * @param {number} auKm the model's AU in km (caller's single home)
65
+ * @returns {{aAU:number,e:number,inclEclipticDeg:number,ascNodeEclipticDeg:number,
66
+ * argPeriDeg:number,lonPeriEclipticDeg:number,meanAnomalyDeg:number,
67
+ * meanLonEclipticDeg:number,meanMotionDegPerYr:number}} */
68
+ function computeOsculatingElements(rKm, vKmS, muKm3S2, auKm) {
69
+ const r = rKm, v = vKmS, mu = muKm3S2;
70
+ const rn = Math.hypot(r[0], r[1], r[2]);
71
+ const v2 = v[0] * v[0] + v[1] * v[1] + v[2] * v[2];
72
+ const h = [r[1] * v[2] - r[2] * v[1], r[2] * v[0] - r[0] * v[2], r[0] * v[1] - r[1] * v[0]];
73
+ const hn = Math.hypot(h[0], h[1], h[2]);
74
+ const ev = [0, 1, 2].map((c) =>
75
+ (v[(c + 1) % 3] * h[(c + 2) % 3] - v[(c + 2) % 3] * h[(c + 1) % 3]) / mu - r[c] / rn);
76
+ const e = Math.hypot(ev[0], ev[1], ev[2]);
77
+ const aKm = 1 / (2 / rn - v2 / mu);
78
+ const incl = Math.acos(h[2] / hn);
79
+ const Om = Math.atan2(h[0], -h[1]); // ascending node
80
+ // argument of perihelion
81
+ const nodeU = [Math.cos(Om), Math.sin(Om), 0];
82
+ let argw = Math.acos(Math.max(-1, Math.min(1, (nodeU[0] * ev[0] + nodeU[1] * ev[1]) / e)));
83
+ if (ev[2] < 0) argw = 2 * Math.PI - argw;
84
+ // true anomaly → eccentric → mean
85
+ let nu = Math.acos(Math.max(-1, Math.min(1, (ev[0] * r[0] + ev[1] * r[1] + ev[2] * r[2]) / (e * rn))));
86
+ const rv = r[0] * v[0] + r[1] * v[1] + r[2] * v[2];
87
+ if (rv < 0) nu = 2 * Math.PI - nu;
88
+ const E = Math.atan2(Math.sqrt(1 - e * e) * Math.sin(nu), e + Math.cos(nu));
89
+ const M = E - e * Math.sin(E);
90
+ const nRadS = Math.sqrt(mu / (aKm * aKm * aKm)); // rad/s
91
+ const meanMotionDegPerYr = nRadS * 86400 * 365.25 / D2R;
92
+ const wrap = (/** @type {number} */ x) => ((x % 360) + 360) % 360;
93
+ const lonPeri = wrap((Om + argw) / D2R);
94
+ return {
95
+ aAU: aKm / auKm,
96
+ e,
97
+ inclEclipticDeg: incl / D2R,
98
+ ascNodeEclipticDeg: wrap(Om / D2R),
99
+ argPeriDeg: wrap(argw / D2R),
100
+ lonPeriEclipticDeg: lonPeri,
101
+ meanAnomalyDeg: wrap(M / D2R),
102
+ meanLonEclipticDeg: wrap(lonPeri + M / D2R),
103
+ meanMotionDegPerYr,
104
+ };
105
+ }
106
+
107
+ /** Solve Kepler's equation E − e·sinE = M (radians), Newton iteration.
108
+ * @param {number} meanAnomalyRad @param {number} e @returns {number} */
109
+ function solveKeplerRad(meanAnomalyRad, e) {
110
+ let E = e < 0.8 ? meanAnomalyRad : Math.PI;
111
+ for (let i = 0; i < 30; i++) {
112
+ const d = (E - e * Math.sin(E) - meanAnomalyRad) / (1 - e * Math.cos(E));
113
+ E -= d;
114
+ if (Math.abs(d) < 1e-14) break;
115
+ }
116
+ return E;
117
+ }
118
+
119
+ /** Heliocentric ecliptic-J2000 position from elements-of-date.
120
+ * @param {{aAU:number,e:number,inclEclipticDeg:number,ascNodeEclipticDeg:number,
121
+ * lonPeriEclipticDeg:number,meanLonEclipticDeg:number}} el
122
+ * @returns {{xAU:number,yAU:number,zAU:number,rAU:number}} */
123
+ function computeHeliocentricEclipticFromElements(el) {
124
+ const Mdeg = el.meanLonEclipticDeg - el.lonPeriEclipticDeg;
125
+ const E = solveKeplerRad(((Mdeg % 360) + 360) % 360 * D2R, el.e);
126
+ const xp = el.aAU * (Math.cos(E) - el.e);
127
+ const yp = el.aAU * Math.sqrt(1 - el.e * el.e) * Math.sin(E);
128
+ const w = (el.lonPeriEclipticDeg - el.ascNodeEclipticDeg) * D2R;
129
+ const Om = el.ascNodeEclipticDeg * D2R;
130
+ const inc = el.inclEclipticDeg * D2R;
131
+ const cw = Math.cos(w), sw = Math.sin(w), cO = Math.cos(Om), sO = Math.sin(Om), ci = Math.cos(inc), si = Math.sin(inc);
132
+ const xAU = (cw * cO - sw * sO * ci) * xp + (-sw * cO - cw * sO * ci) * yp;
133
+ const yAU = (cw * sO + sw * cO * ci) * xp + (-sw * sO + cw * cO * ci) * yp;
134
+ const zAU = (sw * si) * xp + (cw * si) * yp;
135
+ return { xAU, yAU, zAU, rAU: Math.hypot(xAU, yAU, zAU) };
136
+ }
137
+
138
+ /** Poisson argument θ (radians) at `year`: Σ comps of s_lam·λ̄ + s_pom·ϖ over
139
+ * the referenced planets — λ̄ from the linear skeleton, ϖ(t) from the
140
+ * multi-mode secular sum (d'Alembert-complete arguments; K4.7b — RECORD
141
+ * ONLY: the era solve measured Poisson columns negative, no terms are
142
+ * exported; the machinery stands as the campaign record).
143
+ * @param {number} year @param {Object<string,KcPlanetChain>} allChains
144
+ * @param {Array<{planet:string,sLam?:number,sPom?:number}>} comps
145
+ * @returns {number} */
146
+ function computePoissonArgRad(year, allChains, comps) {
147
+ let th = 0;
148
+ for (const c of comps) {
149
+ const ch = allChains[c.planet], a = ch.anchor;
150
+ if (c.sLam) th += c.sLam * (a.meanLonEclipticDeg + (ch.meanMotionDegPerYr ?? a.meanMotionDegPerYr ?? 0) * (year - ANCHOR_EPOCH_YEAR)) * D2R;
151
+ if (c.sPom) {
152
+ // secular-only ϖ(t): the periodic terms are stripped BY CONSTRUCTION —
153
+ // a runtime chain carrying poissonZ terms would otherwise recurse
154
+ // through this very argument.
155
+ const el = computePlanetElementsAtYear(year, { ...ch, periodicTerms: undefined });
156
+ th += c.sPom * el.lonPeriEclipticDeg * D2R;
157
+ }
158
+ }
159
+ return th;
160
+ }
161
+
162
+ /** Elements-of-date for one planet.
163
+ * @param {number} year decimal year (epoch parameter first, per naming rule)
164
+ * @param {KcPlanetChain} planetChain
165
+ * @param {Object<string,KcPlanetChain>=} allChains full chain set — required
166
+ * only when planetChain.periodicTerms carries Poisson-argument terms
167
+ * @returns {KcElements} elements at `year` */
168
+ function computePlanetElementsAtYear(year, planetChain, allChains) {
169
+ const dt = year - ANCHOR_EPOCH_YEAR;
170
+ const a = planetChain.anchor;
171
+ const n = planetChain.meanMotionDegPerYr ?? a.meanMotionDegPerYr ?? 0;
172
+ const r = planetChain.windowRates || {}; // K2.1 era-typed drifts (legacy linear path)
173
+ const wrap = (/** @type {number} */ x) => ((x % 360) + 360) % 360;
174
+ /** @type {KcElements} */
175
+ const out = {
176
+ aAU: a.aAU,
177
+ meanLonEclipticDeg: wrap(a.meanLonEclipticDeg + n * dt),
178
+ e: 0, inclEclipticDeg: 0, ascNodeEclipticDeg: 0, lonPeriEclipticDeg: 0,
179
+ };
180
+ const SM = planetChain.secularModes;
181
+ if (SM) {
182
+ // K4.7 — THE MULTI-MODE SECULAR SKELETON (same physics for all planets):
183
+ // z(t) = Σ modes + constant remainder; the linear-drift tangent was
184
+ // measured leaving the eigenmode-rotation curvature as an unfixable
185
+ // residual (Saturn ~700µ sagitta over ±2.5 kyr). The constant remainder
186
+ // z₀ − Σmodes(0) is the content a 1-Myr NAFF cannot resolve
187
+ // (ultra-long modes + short-period at the anchor) — itself physical.
188
+ const sum = (/** @type {KcComplexTerm[]} */ modes, /** @type {number} */ t2) => {
189
+ let re = 0, im = 0;
190
+ for (const m of modes) { const c = Math.cos(m.omegaRadPerYr * t2), s = Math.sin(m.omegaRadPerYr * t2); re += m.re * c - m.im * s; im += m.re * s + m.im * c; }
191
+ return [re, im];
192
+ };
193
+ const [zk, zh] = sum(SM.z, dt), [zk0, zh0] = sum(SM.z, 0);
194
+ const k0 = zk + (a.e * Math.cos(a.lonPeriEclipticDeg * D2R) - zk0);
195
+ const h0 = zh + (a.e * Math.sin(a.lonPeriEclipticDeg * D2R) - zh0);
196
+ out.e = Math.hypot(k0, h0);
197
+ out.lonPeriEclipticDeg = wrap(Math.atan2(h0, k0) / D2R);
198
+ const [zq, zp] = sum(SM.zeta, dt), [zq0, zp0] = sum(SM.zeta, 0);
199
+ const s2a = Math.sin(a.inclEclipticDeg / 2 * D2R);
200
+ const q0 = zq + (s2a * Math.cos(a.ascNodeEclipticDeg * D2R) - zq0);
201
+ const p0 = zp + (s2a * Math.sin(a.ascNodeEclipticDeg * D2R) - zp0);
202
+ out.inclEclipticDeg = 2 * Math.asin(Math.hypot(q0, p0)) / D2R;
203
+ out.ascNodeEclipticDeg = wrap(Math.atan2(p0, q0) / D2R);
204
+ } else {
205
+ // legacy linear path (frozen-element gating; pre-K4.7 artifacts)
206
+ out.e = a.e + ((r.eccDotPerCy || 0) / 100) * dt;
207
+ out.inclEclipticDeg = a.inclEclipticDeg + ((r.inclDotArcsecCy || 0) / 3600 / 100) * dt;
208
+ out.ascNodeEclipticDeg = wrap(a.ascNodeEclipticDeg + ((r.nodeRateArcsecCy || 0) / 3600 / 100) * dt);
209
+ out.lonPeriEclipticDeg = wrap(a.lonPeriEclipticDeg + (planetChain.periRateArcsecCy / 3600 / 100) * dt);
210
+ }
211
+ // K4.5 — the DERIVED periodic layer: engine-extracted/era-solved terms in
212
+ // the mean longitude, the semi-major axis, and the nonsingular z-vector
213
+ // (z = k + i·h = e·e^{iϖ}), plus the era-typed in-window affine (anchor-
214
+ // snapshot vs window content). All quantities measured from the model's
215
+ // own N-body runs (k45-residual-naff / k45e-amplitude-solve are the
216
+ // record) — nothing observation-fitted.
217
+ const P = planetChain.periodicTerms;
218
+ if (P) {
219
+ const w = P.windowAffine || {};
220
+ // K4.7b — the semi-major-axis channel: heliocentric osculating elements
221
+ // slosh TOGETHER at the synodic periods (largely the Sun's giant-planet
222
+ // reflex, physical on both sides of any comparison); fitting λ̄/z wobbles
223
+ // while freezing a at the anchor leaves an element-INCONSISTENT set — the
224
+ // reconstructed position needs all channels or none (measured: U/N δa/a
225
+ // residual 3000–3800 ppm at the J/S synodics, k47b spectrum).
226
+ if (P.aPpm || w.a) {
227
+ let dA = w.a ? w.a.off + (w.a.slope || 0) * dt : 0;
228
+ for (const tm of P.aPpm || []) dA += tm.cos * Math.cos(tm.omegaRadPerYr * dt) + tm.sin * Math.sin(tm.omegaRadPerYr * dt);
229
+ out.aAU = a.aAU * (1 + dA * 1e-6);
230
+ }
231
+ let dMlon = w.mlon ? w.mlon.off + (w.mlon.slope || 0) * dt : 0;
232
+ for (const tm of P.mlonArcsec || []) dMlon += tm.cos * Math.cos(tm.omegaRadPerYr * dt) + tm.sin * Math.sin(tm.omegaRadPerYr * dt);
233
+ // K4.7b — Poisson-argument terms (record only; none currently exported)
234
+ for (const tm of P.poissonMlonArcsec || []) {
235
+ const th = computePoissonArgRad(year, allChains || {}, tm.comps);
236
+ dMlon += tm.cos * Math.cos(th) + tm.sin * Math.sin(th);
237
+ }
238
+ out.meanLonEclipticDeg = wrap(out.meanLonEclipticDeg + dMlon / 3600);
239
+ let k0 = out.e * Math.cos(out.lonPeriEclipticDeg * D2R) + (w.k ? w.k.off + (w.k.slope || 0) * dt : 0);
240
+ let h0 = out.e * Math.sin(out.lonPeriEclipticDeg * D2R) + (w.h ? w.h.off + (w.h.slope || 0) * dt : 0);
241
+ for (const tm of P.z || []) {
242
+ const c = Math.cos(tm.omegaRadPerYr * dt), s = Math.sin(tm.omegaRadPerYr * dt);
243
+ k0 += tm.re * c - tm.im * s; h0 += tm.re * s + tm.im * c;
244
+ }
245
+ for (const tm of P.poissonZ || []) {
246
+ const th = computePoissonArgRad(year, allChains || {}, tm.comps);
247
+ const c = Math.cos(th), s = Math.sin(th);
248
+ k0 += tm.re * c - tm.im * s; h0 += tm.re * s + tm.im * c;
249
+ }
250
+ out.e = Math.hypot(k0, h0);
251
+ out.lonPeriEclipticDeg = wrap(Math.atan2(h0, k0) / D2R);
252
+ // K4.5c — the out-of-plane channel: ζ = q + i·p = sin(i/2)·e^{iΩ}
253
+ if (P.zeta || w.q || w.p) {
254
+ let q0 = Math.sin(out.inclEclipticDeg / 2 * D2R) * Math.cos(out.ascNodeEclipticDeg * D2R) + (w.q ? w.q.off + (w.q.slope || 0) * dt : 0);
255
+ let p0 = Math.sin(out.inclEclipticDeg / 2 * D2R) * Math.sin(out.ascNodeEclipticDeg * D2R) + (w.p ? w.p.off + (w.p.slope || 0) * dt : 0);
256
+ for (const tm of P.zeta || []) {
257
+ const c = Math.cos(tm.omegaRadPerYr * dt), s = Math.sin(tm.omegaRadPerYr * dt);
258
+ q0 += tm.re * c - tm.im * s; p0 += tm.re * s + tm.im * c;
259
+ }
260
+ out.inclEclipticDeg = 2 * Math.asin(Math.hypot(q0, p0)) / D2R;
261
+ out.ascNodeEclipticDeg = wrap(Math.atan2(p0, q0) / D2R);
262
+ }
263
+ }
264
+ // K5c — the INVARIABLE-plane inclination/node of date: rotate the ecliptic
265
+ // elements into the engine's own invariable plane (the artifact-banked
266
+ // orientation — pole from the J2000 seed's total angular momentum), EXACT
267
+ // orbit-normal rotation, no small-angle shortcuts. Frame convention: the
268
+ // s-frame x-axis is ecliptic-X projected into the plane (the extraction
269
+ // convention of the dump script); node longitudes are measured from it.
270
+ const IP = planetChain.invariablePlane;
271
+ if (IP) {
272
+ const fi = IP.inclEclipticDeg * D2R, fO = IP.ascNodeEclipticDeg * D2R;
273
+ const zf = [Math.sin(fi) * Math.sin(fO), -Math.sin(fi) * Math.cos(fO), Math.cos(fi)];
274
+ let xf = [1 - zf[0] * zf[0], -zf[0] * zf[1], -zf[0] * zf[2]];
275
+ const xn = Math.hypot(xf[0], xf[1], xf[2]); xf = [xf[0] / xn, xf[1] / xn, xf[2] / xn];
276
+ const yf = [zf[1] * xf[2] - zf[2] * xf[1], zf[2] * xf[0] - zf[0] * xf[2], zf[0] * xf[1] - zf[1] * xf[0]];
277
+ const oi = out.inclEclipticDeg * D2R, oO = out.ascNodeEclipticDeg * D2R;
278
+ const nO = [Math.sin(oi) * Math.sin(oO), -Math.sin(oi) * Math.cos(oO), Math.cos(oi)]; // orbit normal, ecliptic coords
279
+ const nz = nO[0] * zf[0] + nO[1] * zf[1] + nO[2] * zf[2];
280
+ out.inclInvPlaneDeg = Math.acos(Math.min(1, Math.max(-1, nz))) / D2R;
281
+ // ascending node direction in the inv frame: ẑ_inv × n̂, expressed on (x̂,ŷ)
282
+ const c = [zf[1] * nO[2] - zf[2] * nO[1], zf[2] * nO[0] - zf[0] * nO[2], zf[0] * nO[1] - zf[1] * nO[0]];
283
+ const cx = c[0] * xf[0] + c[1] * xf[1] + c[2] * xf[2];
284
+ const cy = c[0] * yf[0] + c[1] * yf[1] + c[2] * yf[2];
285
+ out.ascNodeInvPlaneDeg = wrap(Math.atan2(cy, cx) / D2R);
286
+ }
287
+ return out;
288
+ }
289
+
290
+ /** The chain's canonical constructor from a PARSED governed artifact (K2.1 →
291
+ * K4.6c): anchors (the engine-extracted t=0 elements), era-typed window
292
+ * rates, the K4.7 secular mode tables, and the K4.5/K4.7b periodic layer.
293
+ * @param {*} art the governed engine-D artifact, parsed (deep JSON —
294
+ * shape enforced by the generator's assertions, not retyped here)
295
+ * @param {{skeletonOnly?:boolean}=} opts skeletonOnly omits the periodic
296
+ * layer — REQUIRED by the extraction/solve instruments, which
297
+ * measure the residual AGAINST the skeleton; a terms-bearing chain
298
+ * there would extract its own output.
299
+ * @returns {Object<string,KcPlanetChain>} */
300
+ function buildPlanetChainsFromArtifactData(art, opts = {}) {
301
+ if (!art.windowElementRates || !art.j2000AnchorElements) {
302
+ throw new Error('artifact predates K2.1 — regenerate: node tools/verify/nbody-secular.js --write');
303
+ }
304
+ /** @type {Object<string,KcPlanetChain>} */
305
+ const chains = {};
306
+ for (const key of Object.keys(art.j2000AnchorElements)) {
307
+ const n = art.windowElementRates[key].meanMotionDegPerYr;
308
+ chains[key] = {
309
+ anchor: { ...art.j2000AnchorElements[key], meanMotionDegPerYr: n },
310
+ periRateArcsecCy: art.windowRatesArcsecCy.gr[key],
311
+ meanMotionDegPerYr: n,
312
+ windowRates: art.windowElementRates[key],
313
+ secularModes: art.secularModes ? art.secularModes[key] : null, // K4.7 multi-mode skeleton
314
+ invariablePlane: art.invariablePlane || undefined, // K5c s-frame definition (shared)
315
+ };
316
+ if (!opts.skeletonOnly && art.periodicTerms && art.periodicTerms[key]) {
317
+ chains[key].periodicTerms = art.periodicTerms[key];
318
+ }
319
+ }
320
+ return chains;
321
+ }
322
+
323
+ module.exports = {
324
+ ANCHOR_EPOCH_YEAR,
325
+ ANCHOR_EPOCH_JD,
326
+ computeOsculatingElements,
327
+ solveKeplerRad,
328
+ computeHeliocentricEclipticFromElements,
329
+ computePoissonArgRad,
330
+ computePlanetElementsAtYear,
331
+ buildPlanetChainsFromArtifactData,
332
+ };