UNPKG

ootk

Version:

Orbital Object Toolkit including Multiple Propagators, Initial Orbit Determination, and Maneuver Calculations.

1,234 lines (1,215 loc) 1.06 MB
'use strict'; // src/errors/index.ts var OotkError = class extends Error { constructor(message) { super(message); this.name = "OotkError"; if (Error.captureStackTrace) { Error.captureStackTrace(this, this.constructor); } } }; var ValidationError = class extends OotkError { /** * Creates a new ValidationError. * @param message - Human-readable error message * @param field - Optional name of the field that failed validation * @param value - Optional value that failed validation */ constructor(message, field, value) { super(message); this.field = field; this.value = value; this.name = "ValidationError"; } }; var ParseError = class extends OotkError { /** * Creates a new ParseError. * @param message - Human-readable error message * @param format - Optional format identifier (e.g., 'TLE', 'OEM', 'HORIZONS') * @param line - Optional line number where the error occurred */ constructor(message, format, line) { super(message); this.format = format; this.line = line; this.name = "ParseError"; } }; var PropagationError = class extends OotkError { /** * Creates a new PropagationError. * @param message - Human-readable error message * @param epoch - Optional epoch at which the propagation failed */ constructor(message, epoch) { super(message); this.epoch = epoch; this.name = "PropagationError"; } }; var OrbitDeterminationError = class extends OotkError { /** * Creates a new OrbitDeterminationError. * @param message - Human-readable error message * @param algorithm - Optional algorithm name (e.g., 'Gauss', 'Gooding', 'Lambert') */ constructor(message, algorithm) { super(message); this.algorithm = algorithm; this.name = "OrbitDeterminationError"; } }; // src/enums/AngularDiameterMethod.ts var AngularDiameterMethod = /* @__PURE__ */ ((AngularDiameterMethod2) => { AngularDiameterMethod2[AngularDiameterMethod2["Circle"] = 0] = "Circle"; AngularDiameterMethod2[AngularDiameterMethod2["Sphere"] = 1] = "Sphere"; return AngularDiameterMethod2; })(AngularDiameterMethod || {}); // src/enums/AngularDistanceMethod.ts var AngularDistanceMethod = /* @__PURE__ */ ((AngularDistanceMethod2) => { AngularDistanceMethod2[AngularDistanceMethod2["Cosine"] = 0] = "Cosine"; AngularDistanceMethod2[AngularDistanceMethod2["Haversine"] = 1] = "Haversine"; return AngularDistanceMethod2; })(AngularDistanceMethod || {}); // src/enums/CatalogSource.ts var CatalogSource = /* @__PURE__ */ ((CatalogSource2) => { CatalogSource2["UNKNOWN"] = "unknown"; CatalogSource2["USSF"] = "spacetrack"; CatalogSource2["CELESTRAK"] = "celestrak"; CatalogSource2["CELESTRAK_SUP"] = "celestrak-sup"; CatalogSource2["UNIV_OF_MICH"] = "univ-of-mich"; CatalogSource2["CALPOLY"] = "calpoly"; CatalogSource2["NUSPACE"] = "nuspace"; CatalogSource2["VIMPEL"] = "vimpel"; CatalogSource2["SATNOGS"] = "satnogs"; CatalogSource2["TLE_TXT"] = "TLE.txt"; CatalogSource2["EXTRA_JSON"] = "extra.json"; return CatalogSource2; })(CatalogSource || {}); // src/enums/CommLink.ts var CommLink = /* @__PURE__ */ ((CommLink2) => { CommLink2["AEHF"] = "AEHF"; CommLink2["GALILEO"] = "Galileo"; CommLink2["IRIDIUM"] = "Iridium"; CommLink2["STARLINK"] = "Starlink"; CommLink2["WGS"] = "WGS"; return CommLink2; })(CommLink || {}); // src/enums/FovFrame.ts var FovFrame = /* @__PURE__ */ ((FovFrame2) => { FovFrame2["TOPOCENTRIC"] = "TOPOCENTRIC"; FovFrame2["BODY"] = "BODY"; return FovFrame2; })(FovFrame || {}); // src/enums/FovShape.ts var FovShape = /* @__PURE__ */ ((FovShape2) => { FovShape2["ELLIPTICAL_CONE"] = "ELLIPTICAL_CONE"; FovShape2["CIRCULAR_CONE"] = "CIRCULAR_CONE"; return FovShape2; })(FovShape || {}); // src/enums/OrbitRegime.ts var OrbitRegime = /* @__PURE__ */ ((OrbitRegime2) => { OrbitRegime2["LEO"] = "Low Earth Orbit"; OrbitRegime2["MEO"] = "Medium Earth Orbit"; OrbitRegime2["HEO"] = "Highly Eccentric Orbit"; OrbitRegime2["GEO"] = "Geosynchronous Orbit"; OrbitRegime2["OTHER"] = "Uncategorized Orbit"; return OrbitRegime2; })(OrbitRegime || {}); // src/enums/PassType.ts var PassType = /* @__PURE__ */ ((PassType2) => { PassType2[PassType2["OUT_OF_VIEW"] = -1] = "OUT_OF_VIEW"; PassType2[PassType2["ENTER"] = 0] = "ENTER"; PassType2[PassType2["IN_VIEW"] = 1] = "IN_VIEW"; PassType2[PassType2["EXIT"] = 2] = "EXIT"; return PassType2; })(PassType || {}); // src/enums/PropagatorType.ts var PropagatorType = /* @__PURE__ */ ((PropagatorType2) => { PropagatorType2["SGP4"] = "SGP4"; PropagatorType2["KEPLER"] = "KEPLER"; PropagatorType2["RK4"] = "RK4"; PropagatorType2["DP54"] = "DP54"; PropagatorType2["DORMAND_PRINCE"] = "DP54"; PropagatorType2["RK89"] = "RK89"; return PropagatorType2; })(PropagatorType || {}); // src/enums/SensorType.ts var SensorType = /* @__PURE__ */ ((SensorType2) => { SensorType2["OPTICAL"] = "OPTICAL"; SensorType2["MECHANICAL_RADAR"] = "MECHANICAL_RADAR"; SensorType2["PHASED_ARRAY_RADAR"] = "PHASED_ARRAY_RADAR"; SensorType2["LASER_RANGING"] = "LASER_RANGING"; SensorType2["PASSIVE_RF"] = "PASSIVE_RF"; SensorType2["BISTATIC_RADIO_TELESCOPE"] = "BISTATIC_RADIO_TELESCOPE"; return SensorType2; })(SensorType || {}); // src/enums/Sgp4OpsMode.ts var Sgp4OpsMode = /* @__PURE__ */ ((Sgp4OpsMode2) => { Sgp4OpsMode2["AFSPC"] = "a"; Sgp4OpsMode2["IMPROVED"] = "i"; return Sgp4OpsMode2; })(Sgp4OpsMode || {}); // src/enums/SunStatus.ts var SunStatus = /* @__PURE__ */ ((SunStatus2) => { SunStatus2[SunStatus2["UNKNOWN"] = -1] = "UNKNOWN"; SunStatus2[SunStatus2["UMBRAL"] = 0] = "UMBRAL"; SunStatus2[SunStatus2["PENUMBRAL"] = 1] = "PENUMBRAL"; SunStatus2[SunStatus2["SUN"] = 2] = "SUN"; return SunStatus2; })(SunStatus || {}); // src/types/PayloadStatus.ts var PayloadStatus = /* @__PURE__ */ ((PayloadStatus2) => { PayloadStatus2["OPERATIONAL"] = "+"; PayloadStatus2["NONOPERATIONAL"] = "-"; PayloadStatus2["PARTIALLY_OPERATIONAL"] = "P"; PayloadStatus2["BACKUP_STANDBY"] = "B"; PayloadStatus2["SPARE"] = "S"; PayloadStatus2["EXTENDED_MISSION"] = "X"; PayloadStatus2["DECAYED"] = "D"; PayloadStatus2["UNKNOWN"] = "?"; return PayloadStatus2; })(PayloadStatus || {}); // src/types/types.ts var SpaceObjectType = /* @__PURE__ */ ((SpaceObjectType2) => { SpaceObjectType2[SpaceObjectType2["UNKNOWN"] = 0] = "UNKNOWN"; SpaceObjectType2[SpaceObjectType2["PAYLOAD"] = 1] = "PAYLOAD"; SpaceObjectType2[SpaceObjectType2["ROCKET_BODY"] = 2] = "ROCKET_BODY"; SpaceObjectType2[SpaceObjectType2["DEBRIS"] = 3] = "DEBRIS"; SpaceObjectType2[SpaceObjectType2["SPECIAL"] = 4] = "SPECIAL"; SpaceObjectType2[SpaceObjectType2["BALLISTIC_MISSILE"] = 8] = "BALLISTIC_MISSILE"; SpaceObjectType2[SpaceObjectType2["STAR"] = 9] = "STAR"; SpaceObjectType2[SpaceObjectType2["INTERGOVERNMENTAL_ORGANIZATION"] = 10] = "INTERGOVERNMENTAL_ORGANIZATION"; SpaceObjectType2[SpaceObjectType2["SUBORBITAL_PAYLOAD_OPERATOR"] = 11] = "SUBORBITAL_PAYLOAD_OPERATOR"; SpaceObjectType2[SpaceObjectType2["PAYLOAD_OWNER"] = 12] = "PAYLOAD_OWNER"; SpaceObjectType2[SpaceObjectType2["METEOROLOGICAL_ROCKET_LAUNCH_AGENCY_OR_MANUFACTURER"] = 13] = "METEOROLOGICAL_ROCKET_LAUNCH_AGENCY_OR_MANUFACTURER"; SpaceObjectType2[SpaceObjectType2["PAYLOAD_MANUFACTURER"] = 14] = "PAYLOAD_MANUFACTURER"; SpaceObjectType2[SpaceObjectType2["LAUNCH_AGENCY"] = 15] = "LAUNCH_AGENCY"; SpaceObjectType2[SpaceObjectType2["LAUNCH_SITE"] = 16] = "LAUNCH_SITE"; SpaceObjectType2[SpaceObjectType2["LAUNCH_POSITION"] = 17] = "LAUNCH_POSITION"; SpaceObjectType2[SpaceObjectType2["LAUNCH_FACILITY"] = 18] = "LAUNCH_FACILITY"; SpaceObjectType2[SpaceObjectType2["CONTROL_FACILITY"] = 19] = "CONTROL_FACILITY"; SpaceObjectType2[SpaceObjectType2["GROUND_SENSOR_STATION"] = 20] = "GROUND_SENSOR_STATION"; SpaceObjectType2[SpaceObjectType2["OPTICAL"] = 21] = "OPTICAL"; SpaceObjectType2[SpaceObjectType2["MECHANICAL"] = 22] = "MECHANICAL"; SpaceObjectType2[SpaceObjectType2["PHASED_ARRAY_RADAR"] = 23] = "PHASED_ARRAY_RADAR"; SpaceObjectType2[SpaceObjectType2["OBSERVER"] = 24] = "OBSERVER"; SpaceObjectType2[SpaceObjectType2["BISTATIC_RADIO_TELESCOPE"] = 25] = "BISTATIC_RADIO_TELESCOPE"; SpaceObjectType2[SpaceObjectType2["COUNTRY"] = 26] = "COUNTRY"; SpaceObjectType2[SpaceObjectType2["LAUNCH_VEHICLE_MANUFACTURER"] = 27] = "LAUNCH_VEHICLE_MANUFACTURER"; SpaceObjectType2[SpaceObjectType2["ENGINE_MANUFACTURER"] = 28] = "ENGINE_MANUFACTURER"; SpaceObjectType2[SpaceObjectType2["NOTIONAL"] = 29] = "NOTIONAL"; SpaceObjectType2[SpaceObjectType2["FRAGMENT"] = 30] = "FRAGMENT"; SpaceObjectType2[SpaceObjectType2["SHORT_TERM_FENCE"] = 31] = "SHORT_TERM_FENCE"; SpaceObjectType2[SpaceObjectType2["EPHEMERIS_SATELLITE"] = 32] = "EPHEMERIS_SATELLITE"; SpaceObjectType2[SpaceObjectType2["TERRESTRIAL_PLANET"] = 33] = "TERRESTRIAL_PLANET"; SpaceObjectType2[SpaceObjectType2["GAS_GIANT"] = 34] = "GAS_GIANT"; SpaceObjectType2[SpaceObjectType2["ICE_GIANT"] = 35] = "ICE_GIANT"; SpaceObjectType2[SpaceObjectType2["DWARF_PLANET"] = 36] = "DWARF_PLANET"; SpaceObjectType2[SpaceObjectType2["MOON"] = 37] = "MOON"; SpaceObjectType2[SpaceObjectType2["DYNAMIC_GROUND_OBJECT"] = 38] = "DYNAMIC_GROUND_OBJECT"; SpaceObjectType2[SpaceObjectType2["MAX_SPACE_OBJECT_TYPE"] = 40] = "MAX_SPACE_OBJECT_TYPE"; return SpaceObjectType2; })(SpaceObjectType || {}); var ZoomValue = /* @__PURE__ */ ((ZoomValue2) => { ZoomValue2[ZoomValue2["LEO"] = 0.45] = "LEO"; ZoomValue2[ZoomValue2["GEO"] = 0.82] = "GEO"; ZoomValue2[ZoomValue2["MAX"] = 1] = "MAX"; return ZoomValue2; })(ZoomValue || {}); // src/utils/constants.ts var TAU = 2 * Math.PI; var halfPi = 0.5 * Math.PI; var DEG2RAD = Math.PI / 180; var RAD2DEG = 180 / Math.PI; var sec2deg = 1 / 60 / 60; var sec2day = sec2deg / 24; var asec2rad = sec2deg * DEG2RAD; var ttasec2rad = asec2rad / 1e4; var masec2rad = asec2rad / 1e3; var angularVelocityOfEarth = 7292115e-11; var KM_PER_AU = 149597870; var msec2sec = 1e-3; var cMPerSec = 299792458; var cKmPerSec = 299792458 / 1e3; var cKmPerMs = 299792458 / 1e3 / 1e3; var MS_PER_DAY = 864e5; var secondsPerDay = 86400; var sec2min = 1 / 60; var secondsPerSiderealDay = 86164.0905; var secondsPerWeek = secondsPerDay * 7; var PI = Math.PI; var x2o3 = 2 / 3; var temp4 = 15e-13; var MINUTES_PER_DAY = 1440; var MILLISECONDS_TO_DAYS = 115741e-13; var MILLISECONDS_PER_DAY = 1e3 * 60 * 60 * 24; var MILLISECONDS_PER_SECOND = 1e3; var RADIUS_OF_EARTH = 6371; var earthGravityParam = 398600.4415; // src/time/Epoch.ts var Epoch = class { /* * Create a new [Epoch] object given the number of seconds elapsed since the * [posix] epoch _(`1970-01-01T00:00:00.000`)_ in the [Epoch] time scale. */ constructor(posix = Date.now() / 1e3) { this.posix = posix; if (Number.isNaN(posix)) { throw new ValidationError("Epoch posix time must be a valid number", "posix", posix); } } toString() { return this.toDateTime().toISOString(); } // / Convert this to an Excel spreadsheet string. toExcelString() { return this.toString().substring(0, 19); } // / Return the difference _(s)_ between this and another [epoch]/ difference(epoch) { return this.posix - epoch.posix; } // / Check if this has the same timestamp as the provided [epoch]. equals(epoch) { return this.posix === epoch.posix; } // / Convert to a [DateTime] object. toDateTime() { return new Date(this.posix * 1e3); } toEpochYearAndDay() { const currentDateObj = this.toDateTime(); const epochYear = currentDateObj.getUTCFullYear().toString().slice(2, 4); const epochDay = this.getDayOfYear_(currentDateObj); const timeOfDay = (currentDateObj.getUTCHours() * 3600 + currentDateObj.getUTCMinutes() * 60 + currentDateObj.getUTCSeconds() + currentDateObj.getUTCMilliseconds() / 1e3) / 86400; const epochDayStr = (epochDay + timeOfDay).toFixed(8).padStart(12, "0"); return { epochYr: epochYear, epochDay: epochDayStr }; } getDayOfYear_(date) { const dayCount = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334]; const mn = date.getUTCMonth(); const dn = date.getUTCDate(); let dayOfYear = dayCount[mn] + dn; if (mn > 1 && this.isLeapYear_(date)) { dayOfYear++; } return dayOfYear; } isLeapYear_(dateIn) { const year = dateIn.getUTCFullYear(); if ((year & 3) !== 0) { return false; } return year % 100 !== 0 || year % 400 === 0; } // / Convert to Julian date. toJulianDate() { return this.posix / secondsPerDay + 24405875e-1; } // / Convert to Julian centuries. toJulianCenturies() { return (this.toJulianDate() - 2451545) / 36525; } // / Check if this is later than the [other] epoch. operatorGreaterThan(other) { return this.posix > other.posix; } // / Check if this is later or the same as the [other] epoch. operatorGreaterThanOrEqual(other) { return this.posix >= other.posix; } // / Check if this is earlier than the [other] epoch. operatorLessThan(other) { return this.posix < other.posix; } // / Check if this is earlier or the same as the [other] epoch. operatorLessThanOrEqual(other) { return this.posix <= other.posix; } }; // src/utils/functions.ts function mag2db(magnitude) { if (magnitude <= 0) { throw new Error("Magnitude must be positive for decibel conversion"); } return 10 * Math.log10(magnitude); } function relativeVelocity(vel1, vel2) { return Math.sqrt((vel1.x - vel2.x) ** 2 + (vel1.y - vel2.y) ** 2 + (vel1.z - vel2.z) ** 2); } function estimateRcs(length, width, height, shape) { const shapeLower = shape.toLowerCase(); if (shapeLower.includes("sphere")) { const rcs2 = Math.PI * (length / 2) ** 2; return Math.sqrt(rcs2) * 3 / 2; } if (shapeLower.includes("cyl")) { const minRcs2 = length * 2 * (width / 2); const maxRcs2 = Math.PI * (length / 2) ** 2; const rcs2 = (minRcs2 + maxRcs2) / 2; return Math.sqrt(rcs2) * 3 / 2; } if (shapeLower.includes("cone")) { const rcs2 = Math.PI * (width / 2) ** 2 / 2; return Math.sqrt(rcs2) * 3 / 2; } if (shapeLower.includes("hex")) { const minLength = Math.min(length * width, length * height, width * height); const minRcs2 = 3 * (Math.sqrt(3) / 2 * minLength ** 2) / 4; const maxLength = Math.max(length * width, length * height, width * height); const maxRcs2 = 3 * (Math.sqrt(3) / 2 * maxLength ** 2) / 2; const rcs2 = (minRcs2 + maxRcs2) / 2; return Math.sqrt(rcs2) * 3 / 2; } const minRcs = Math.min(length * width, length * height, width * height); const maxRcs = Math.max(length * width, length * height, width * height); const rcs = (minRcs + maxRcs) / 2; return Math.sqrt(rcs) * 3 / 2; } function factorial(n) { const nAbs = Math.abs(n); let result = 1; for (let i = 2; i <= nAbs; i++) { result *= i; } return result; } function log10(x) { return Math.log10(x); } function sech(x) { return 1 / Math.cosh(x); } function csch(x) { return 1 / Math.sinh(x); } function acsch(x) { return Math.log(1 / x + Math.sqrt(1 / (x * x) + 1)); } function asech(x) { return Math.log(1 / x + Math.sqrt(1 / (x * x) - 1)); } function acoth(x) { return 0.5 * Math.log((x + 1) / (x - 1)); } function copySign(mag, sgn) { return Math.abs(mag) * Math.sign(sgn); } function evalPoly(x, coeffs) { let result = coeffs[0]; for (let i = 1; i < coeffs.length; i++) { result = result * x + coeffs[i]; } return result; } function concat(a, b) { const result = new Float64Array(a.length + b.length); result.set(a); result.set(b, a.length); return result; } function matchHalfPlane(angle, match) { const a1 = angle; const a2 = 2 * Math.PI - angle; const d1 = Math.atan2(Math.sin(a1 - match), Math.cos(a1 - match)); const d2 = Math.atan2(Math.sin(a2 - match), Math.cos(a2 - match)); return Math.abs(d1) < Math.abs(d2) ? a1 : a2; } function wrapAngle(theta) { const result = (theta + Math.PI) % (2 * Math.PI) - Math.PI; if (result === -Math.PI) { return Math.PI; } return result; } function angularDistanceCosine_(lam1, phi1, lam2, phi2) { const a = Math.sin(phi1) * Math.sin(phi2); const b = Math.cos(phi1) * Math.cos(phi2) * Math.cos(lam2 - lam1); return Math.acos(a + b); } function angularDistanceHaversine_(lam1, phi1, lam2, phi2) { const dlam = lam2 - lam1; const dphi = phi2 - phi1; const sdlam = Math.sin(0.5 * dlam); const sdphi = Math.sin(0.5 * dphi); const a = sdphi * sdphi + Math.cos(phi1) * Math.cos(phi2) * sdlam * sdlam; return 2 * Math.asin(Math.min(1, Math.sqrt(a))); } function angularDistance(lam1, phi1, lam2, phi2, method = 0 /* Cosine */) { switch (method) { case 0 /* Cosine */: return angularDistanceCosine_(lam1, phi1, lam2, phi2); case 1 /* Haversine */: return angularDistanceHaversine_(lam1, phi1, lam2, phi2); default: throw new Error("Invalid angular distance method."); } } function angularDiameter(diameter, distance, method = 1 /* Sphere */) { switch (method) { case 0 /* Circle */: return 2 * Math.atan(diameter / (2 * distance)); case 1 /* Sphere */: return 2 * Math.asin(diameter / (2 * distance)); default: throw new Error("Invalid angular diameter method."); } } function linearInterpolate(x, x0, y0, x1, y1) { return (y0 * (x1 - x) + y1 * (x - x0)) / (x1 - x0); } function mean(values) { const n = values.length; let sum = 0; for (const v of values) { sum += v; } return sum / n; } function std(values, isSample = false) { const mu = mean(values); const n = values.length; let sum = 0; for (const v of values) { const sub = v - mu; sum += sub * sub; } const m = isSample ? 1 : 0; return Math.sqrt(1 / (n - m) * sum); } function covariance(a, b, isSample = false) { const n = a.length; const am = mean(a); const bm = mean(b); let result = 0; for (let i = 0; i < n; i++) { result += (a[i] - am) * (b[i] - bm); } const m = isSample ? 1 : 0; return result / (n - m); } function gamma(n) { return factorial(n - 1); } function newtonM(ecc, m) { const numiter = 50; const small = 1e-8; let e0; let nu; if (ecc > small) { if (m < 0 && m > -Math.PI || m > Math.PI) { e0 = m - ecc; } else { e0 = m + ecc; } let ktr = 1; let e1 = e0 + (m - e0 + ecc * Math.sin(e0)) / (1 - ecc * Math.cos(e0)); while (Math.abs(e1 - e0) > small && ktr <= numiter) { ktr++; e0 = e1; e1 = e0 + (m - e0 + ecc * Math.sin(e0)) / (1 - ecc * Math.cos(e0)); } const sinv = Math.sqrt(1 - ecc * ecc) * Math.sin(e1) / (1 - ecc * Math.cos(e1)); const cosv = (Math.cos(e1) - ecc) / (1 - ecc * Math.cos(e1)); nu = Math.atan2(sinv, cosv); } else { nu = m; e0 = m; } return { e0, nu }; } function newtonNu(ecc, nu) { const small = 1e-8; let e0 = 0; let m = 0; if (Math.abs(ecc) < small) { m = nu; e0 = nu; } else if (ecc < 1 - small) { const sine = Math.sqrt(1 - ecc * ecc) * Math.sin(nu) / (1 + ecc * Math.cos(nu)); const cose = (ecc + Math.cos(nu)) / (1 + ecc * Math.cos(nu)); e0 = Math.atan2(sine, cose); m = e0 - ecc * Math.sin(e0); } if (ecc < 1) { m -= Math.floor(m / (2 * Math.PI)) * (2 * Math.PI); if (m < 0) { m += 2 * Math.PI; } e0 -= Math.floor(e0 / (2 * Math.PI)) * (2 * Math.PI); } return { e0, m }; } function array2d(rows, columns, value) { const output = []; for (let i = 0; i < rows; i++) { output.push(new Array(columns).fill(value)); } return output; } function clamp(x, min, max) { return Math.max(min, Math.min(x, max)); } function isLeapYear(dateIn) { const year = dateIn.getUTCFullYear(); if ((year & 3) !== 0) { return false; } return year % 100 !== 0 || year % 400 === 0; } function getDayOfYear(date = /* @__PURE__ */ new Date()) { const dayCount = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334]; const mn = date.getUTCMonth(); const dn = date.getUTCDate(); let dayOfYear = dayCount[mn] + dn; if (mn > 1 && isLeapYear(date)) { dayOfYear++; } return dayOfYear; } function toPrecision(value, places) { return Number(value.toFixed(places)); } function sign(value) { return value >= 0 ? 1 : -1; } var spaceObjTypeStrMap_ = { [0 /* UNKNOWN */]: "Unknown", [1 /* PAYLOAD */]: "Payload", [2 /* ROCKET_BODY */]: "Rocket Body", [3 /* DEBRIS */]: "Debris", [4 /* SPECIAL */]: "Special", [8 /* BALLISTIC_MISSILE */]: "Ballistic Missile", [9 /* STAR */]: "Star", [10 /* INTERGOVERNMENTAL_ORGANIZATION */]: "Intergovernmental Organization", [11 /* SUBORBITAL_PAYLOAD_OPERATOR */]: "Suborbital Payload Operator", [12 /* PAYLOAD_OWNER */]: "Payload Owner", [13 /* METEOROLOGICAL_ROCKET_LAUNCH_AGENCY_OR_MANUFACTURER */]: "Meteorological Rocket Launch Agency or Manufacturer", [14 /* PAYLOAD_MANUFACTURER */]: "Payload Manufacturer", [15 /* LAUNCH_AGENCY */]: "Launch Agency", [16 /* LAUNCH_SITE */]: "Launch Site", [17 /* LAUNCH_POSITION */]: "Launch Position", [18 /* LAUNCH_FACILITY */]: "Launch Facility", [19 /* CONTROL_FACILITY */]: "Control Facility", [20 /* GROUND_SENSOR_STATION */]: "Ground Sensor Station", [21 /* OPTICAL */]: "Optical", [22 /* MECHANICAL */]: "Mechanical", [23 /* PHASED_ARRAY_RADAR */]: "Phased Array Radar", [24 /* OBSERVER */]: "Observer", [25 /* BISTATIC_RADIO_TELESCOPE */]: "Bi-static Radio Telescope", [26 /* COUNTRY */]: "Country", [27 /* LAUNCH_VEHICLE_MANUFACTURER */]: "Launch Vehicle Manufacturer", [28 /* ENGINE_MANUFACTURER */]: "Engine Manufacturer", [29 /* NOTIONAL */]: "Notional", [30 /* FRAGMENT */]: "Fragment", [31 /* SHORT_TERM_FENCE */]: "Short Term Fence", [32 /* EPHEMERIS_SATELLITE */]: "Ephemeris Satellite", [33 /* TERRESTRIAL_PLANET */]: "Terrestrial Planet", [34 /* GAS_GIANT */]: "Gas Giant", [35 /* ICE_GIANT */]: "Ice Giant", [36 /* DWARF_PLANET */]: "Dwarf Planet", [37 /* MOON */]: "Moon", [38 /* DYNAMIC_GROUND_OBJECT */]: "Dynamic Ground Object", [40 /* MAX_SPACE_OBJECT_TYPE */]: "Max Space Object Type" }; var spaceObjType2Str = (spaceObjType) => spaceObjTypeStrMap_[spaceObjType] || "Unknown"; var dopplerFactor = (location, position, velocity) => { const rangeX = position.x - location.x; const rangeY = position.y - location.y; const rangeZ = position.z - location.z; const distance = Math.sqrt(rangeX * rangeX + rangeY * rangeY + rangeZ * rangeZ); const rangeVelX = velocity.x + angularVelocityOfEarth * location.y; const rangeVelY = velocity.y - angularVelocityOfEarth * location.x; const rangeRate = (rangeX * rangeVelX + rangeY * rangeVelY + rangeZ * velocity.z) / distance; return 1 - rangeRate / cKmPerSec; }; function createVec(start, stop, step) { const array = []; for (let i = start; i <= stop; i += step) { array.push(i); } return array; } function derivative(f, h = 1e-3) { function df(x) { const hh = h * 0.5; return (f(x + hh) - f(x - hh)) / h; } return df; } // src/data/values/egm96.ts var egm96 = [ [2, 0, -484165371736e-15, 0], [2, 1, -186987635955e-21, 119528012031e-20], [2, 2, 243914352398e-17, -140016683654e-17], [3, 0, 957254173792e-18, 0], [3, 1, 202998882184e-17, 248513158716e-18], [3, 2, 904627768605e-18, -6.19025944205e-7], [3, 3, 721072657057e-18, 141435626958e-17], [4, 0, 539873863789e-18, 0], [4, 1, -5.36321616971e-7, -4.73440265853e-7], [4, 2, 350694105785e-18, 66267157254e-17], [4, 3, 990771803829e-18, -2.00928369177e-7], [4, 4, -1.88560802735e-7, 308853169333e-18], [5, 0, 68532347563e-18, 0], [5, 1, -6.21012128528e-8, -9.44226127525e-8], [5, 2, 652438297612e-18, -3.23349612668e-7], [5, 3, -4.51955406071e-7, -2.14847190624e-7], [5, 4, -2.95301647654e-7, 496658876769e-19], [5, 5, 174971983203e-18, -6.69384278219e-7], [6, 0, -1.49957994714e-7, 0], [6, 1, -7.60879384947e-8, 262890545501e-19], [6, 2, 481732442832e-19, -3.73728201347e-7], [6, 3, 571730990516e-19, 902694517163e-20], [6, 4, -8.62142660109e-8, -4.71408154267e-7], [6, 5, -2.6713332549e-7, -5.36488432483e-7], [6, 6, 967616121092e-20, -2.37192006935e-7], [7, 0, 90978937145e-18, 0], [7, 1, 279872910488e-18, 954336911867e-19], [7, 2, 329743816488e-18, 930667596042e-19], [7, 3, 250398657706e-18, -2.17198608738e-7], [7, 4, -2.75114355257e-7, -1.23800392323e-7], [7, 5, 193765507243e-20, 177377719872e-19], [7, 6, -3.58856860645e-7, 151789817739e-18], [7, 7, 109185148045e-20, 244415707993e-19], [8, 0, 496711667324e-19, 0], [8, 1, 233422047893e-19, 590060493411e-19], [8, 2, 802978722615e-19, 654175425859e-19], [8, 3, -1.91877757009e-8, -8.63454445021e-8], [8, 4, -2.44600105471e-7, 700233016934e-19], [8, 5, -2.55352403037e-8, 891462164788e-19], [8, 6, -6.57361610961e-8, 309238461807e-18], [8, 7, 672811580072e-19, 747440473633e-19], [8, 8, -1.24092493016e-7, 120533165603e-18], [9, 0, 276714300853e-19, 0], [9, 1, 143387502749e-18, 216834947618e-19], [9, 2, 222288318564e-19, -3.22196647116e-8], [9, 3, -1.60811502143e-7, -7.42287409462e-8], [9, 4, -9.00179225336e-9, 194666779475e-19], [9, 5, -1.66165092924e-8, -5.41113191483e-8], [9, 6, 626941938248e-19, 222903525945e-18], [9, 7, -1.18366323475e-7, -9.65152667886e-8], [9, 8, 188436022794e-18, -3.08566220421e-9], [9, 9, -4.77475386132e-8, 966412847714e-19], [10, 0, 526222488569e-19, 0], [10, 1, 835115775652e-19, -1.31314331796e-7], [10, 2, -9.42413882081e-8, -5.1579165739e-8], [10, 3, -6.89895048176e-9, -1.53768828694e-7], [10, 4, -8.40764549716e-8, -7.92806255331e-8], [10, 5, -4.93395938185e-8, -5.05370221897e-8], [10, 6, -3.75885236598e-8, -7.95667053872e-8], [10, 7, 811460540925e-20, -3.36629641314e-9], [10, 8, 404927981694e-19, -9.18705975922e-8], [10, 9, 125491334939e-18, -3.76516222392e-8], [10, 10, 100538634409e-18, -2.4014844952e-8], [11, 0, -5.09613707522e-8, 0], [11, 1, 151687209933e-19, -2.68604146166e-8], [11, 2, 186309749878e-19, -9.90693862047e-8], [11, 3, -3.09871239854e-8, -1.4813180426e-7], [11, 4, -3.89580205051e-8, -6.3666651198e-8], [11, 5, 377848029452e-19, 494736238169e-19], [11, 6, -1.18676592395e-9, 344769584593e-19], [11, 7, 411565188074e-20, -8.98252808977e-8], [11, 8, -5.984108413e-9, 243989612237e-19], [11, 9, -3.14231072723e-8, 417731829829e-19], [11, 10, -5.21882681927e-8, -1.83364561788e-8], [11, 11, 460344448746e-19, -6.96662308185e-8], [12, 0, 377252636558e-19, 0], [12, 1, -5.40654977836e-8, -4.35675748979e-8], [12, 2, 142979642253e-19, 320975937619e-19], [12, 3, 393995876403e-19, 244264863505e-19], [12, 4, -6.86908127934e-8, 415081109011e-20], [12, 5, 30941112873e-18, 782536279033e-20], [12, 6, 341523275208e-20, 391765484449e-19], [12, 7, -1.86909958587e-8, 356131849382e-19], [12, 8, -2.53769398865e-8, 169361024629e-19], [12, 9, 422880630662e-19, 252692598301e-19], [12, 10, -6.17619654902e-9, 308375794212e-19], [12, 11, 112502994122e-19, -6.37946501558e-9], [12, 12, -2.4953260739e-9, -1.117806019e-8], [13, 0, 422982206413e-19, 0], [13, 1, -5.13569699124e-8, 390510386685e-19], [13, 2, 559217667099e-19, -6.27337565381e-8], [13, 3, -2.19360927945e-8, 974829362237e-19], [13, 4, -3.13762599666e-9, -1.19627874492e-8], [13, 5, 590049394905e-19, 664975958036e-19], [13, 6, -3.59038073075e-8, -6.57280613686e-9], [13, 7, 253002147087e-20, -6.21470822331e-9], [13, 8, -9.83150822695e-9, -1.04740222825e-8], [13, 9, 247325771791e-19, 452870369936e-19], [13, 10, 41032465393e-18, -3.6812102948e-8], [13, 11, -4.43869677399e-8, -4.76507804288e-9], [13, 12, -3.12622200222e-8, 878405809267e-19], [13, 13, -6.12759553199e-8, 685261488594e-19], [14, 0, -2.42786502921e-8, 0], [14, 1, -1.86968616381e-8, 294747542249e-19], [14, 2, -3.67789379502e-8, -5.16779392055e-9], [14, 3, 358875097333e-19, 204618827833e-19], [14, 4, 183865617792e-20, -2.26780613566e-8], [14, 5, 287344273542e-19, -1.63882249728e-8], [14, 6, -1.94810485574e-8, 247831272781e-20], [14, 7, 375003839415e-19, -4.17291319429e-9], [14, 8, -3.50946485865e-8, -1.53515265203e-8], [14, 9, 320284939341e-19, 288804922064e-19], [14, 10, 390329180008e-19, -1.44308452469e-9], [14, 11, 153970516502e-19, -3.90548173245e-8], [14, 12, 840829163869e-20, -3.11327189117e-8], [14, 13, 322147043964e-19, 45189722496e-18], [14, 14, -5.18980794309e-8, -4.81506636748e-9], [15, 0, 147910068708e-20, 0], [15, 1, 100817268177e-19, 109773066324e-19], [15, 2, -2.13942673775e-8, -3.08914875777e-8], [15, 3, 521392929041e-19, 172892926103e-19], [15, 4, -4.08150084078e-8, 650174707794e-20], [15, 5, 124935723108e-19, 808375563996e-20], [15, 6, 331211643896e-19, -3.68246004304e-8], [15, 7, 596210699259e-19, 531841171879e-20], [15, 8, -3.22428691498e-8, 221523579587e-19], [15, 9, 128788268085e-19, 375629820829e-19], [15, 10, 104688722521e-19, 147222147015e-19], [15, 11, -1.11675061934e-9, 180996198432e-19], [15, 12, -3.23962134415e-8, 155243104746e-19], [15, 13, -2.83933019117e-8, -4.22066791103e-9], [15, 14, 51916885933e-19, -2.43752739666e-8], [15, 15, -1.90930538322e-8, -4.71139421558e-9], [16, 0, -3.15322986722e-9, 0], [16, 1, 258360856231e-19, 325447560859e-19], [16, 2, -2.33671404512e-8, 288799363439e-19], [16, 3, -3.36019429391e-8, -2.2041898801e-8], [16, 4, 402316284314e-19, 483837716909e-19], [16, 5, -1.29501939245e-8, -3.19458578129e-9], [16, 6, 140239252323e-19, -3.50760208303e-8], [16, 7, -7.08412635136e-9, -8.81581561131e-9], [16, 8, -2.09018868094e-8, 50052739053e-19], [16, 9, -2.18588720643e-8, -3.95012419994e-8], [16, 10, -1.17529900814e-8, 114211582961e-19], [16, 11, 187574042592e-19, -3.03161919925e-9], [16, 12, 195400194038e-19, 666983574071e-20], [16, 13, 138196369576e-19, 102778499508e-20], [16, 14, -1.93182168856e-8, -3.86174893776e-8], [16, 15, -1.45149060142e-8, -3.27443078739e-8], [16, 16, -3.79671710746e-8, 302155372655e-20], [17, 0, 197605066395e-19, 0], [17, 1, -2.54177575118e-8, -3.06630529689e-8], [17, 2, -1.95988656721e-8, 64926589341e-19], [17, 3, 564123066224e-20, 678327095529e-20], [17, 4, 707457075637e-20, 249437600834e-19], [17, 5, -1.54987006052e-8, 660021551851e-20], [17, 6, -1.18194012847e-8, -2.89770975177e-8], [17, 7, 242149702381e-19, -4.22222973697e-9], [17, 8, 388442097559e-19, 358904095943e-20], [17, 9, 381356493231e-20, -2.81466943714e-8], [17, 10, -3.88216085542e-9, 181328176508e-19], [17, 11, -1.57356600363e-8, 106560649404e-19], [17, 12, 288013010655e-19, 203450136084e-19], [17, 13, 165503425731e-19, 204667531435e-19], [17, 14, -1.41983872649e-8, 114948025244e-19], [17, 15, 542100361657e-20, 532610369811e-20], [17, 16, -3.01992205043e-8, 365331918531e-20], [17, 17, -3.43086856041e-8, -1.98523455381e-8], [18, 0, 508691038332e-20, 0], [18, 1, 721098449649e-20, -3.88714473013e-8], [18, 2, 140631771205e-19, 100093396253e-19], [18, 3, -5.07232520873e-9, -4.90865931335e-9], [18, 4, 548759308217e-19, -1.3526711772e-9], [18, 5, 548710485555e-20, 264338629459e-19], [18, 6, 146570755271e-19, -1.36438019951e-8], [18, 7, 675812328417e-20, 688577494235e-20], [18, 8, 307619845144e-19, 417827734107e-20], [18, 9, -1.8847060188e-8, 368302736953e-19], [18, 10, 527535358934e-20, -4.66091535881e-9], [18, 11, -7.2962851896e-9, 19521520802e-19], [18, 12, -2.97449412422e-8, -1.64497878395e-8], [18, 13, -6.27919717152e-9, -3.48383939938e-8], [18, 14, -8.1560533641e-9, -1.28636585027e-8], [18, 15, -4.05003412879e-8, -2.02684998021e-8], [18, 16, 104141042028e-19, 661468817624e-20], [18, 17, 358771586841e-20, 448065587564e-20], [18, 18, 312351953717e-20, -1.09906032543e-8], [19, 0, -3.25780965394e-9, 0], [19, 1, -7.59903885319e-9, 126835472605e-20], [19, 2, 353541528655e-19, -1.31346303514e-9], [19, 3, -9.74103607309e-9, 150662259043e-20], [19, 4, 157039009057e-19, -7.61677383811e-9], [19, 5, 109629213379e-19, 283172176438e-19], [19, 6, -4.08745178658e-9, 186219430719e-19], [19, 7, 478275337044e-20, -7.172834559e-9], [19, 8, 29490836428e-18, -9.93037002883e-9], [19, 9, 307961427159e-20, 694110477214e-20], [19, 10, -3.38415069043e-8, -7.37981767136e-9], [19, 11, 160443652916e-19, 996673453483e-20], [19, 12, -2.47106581581e-9, 916852310642e-20], [19, 13, -7.4471737998e-9, -2.82584466742e-8], [19, 14, -4.70502589215e-9, -1.29526697983e-8], [19, 15, -1.76580549771e-8, -1.40350990039e-8], [19, 16, -2.16950096188e-8, -7.24534721567e-9], [19, 17, 290444936079e-19, -1.5345653107e-8], [19, 18, 348382199593e-19, -9.54146344917e-9], [19, 19, -2.5734934943e-9, 483151822363e-20], [20, 0, 222384610651e-19, 0], [20, 1, 516303125218e-20, 669626726966e-20], [20, 2, 198831128238e-19, 175183843257e-19], [20, 3, -3.62601436785e-9, 379590724141e-19], [20, 4, 242238118652e-20, -2.11057611874e-8], [20, 5, -1.07042562564e-8, -7.71860083169e-9], [20, 6, 11047483757e-18, -2.17720365898e-9], [20, 7, -2.10090282728e-8, -223491503969e-22], [20, 8, 442419185637e-20, 183035804593e-20], [20, 9, 178846216942e-19, -6.63940865358e-9], [20, 10, -3.25394919988e-8, -5.12308873621e-9], [20, 11, 138992707697e-19, -1.87706454942e-8], [20, 12, -6.3575060075e-9, 180260853103e-19], [20, 13, 275222725997e-19, 690887077588e-20], [20, 14, 115841169405e-19, -1.43176160143e-8], [20, 15, -2.60130744291e-8, -784379672413e-21], [20, 16, -1.24137147118e-8, -277500443628e-21], [20, 17, 43690966796e-19, -1.37420446198e-8], [20, 18, 151842883022e-19, -808429903142e-21], [20, 19, -3.14942002852e-9, 106505202245e-19], [20, 20, 401448327968e-20, -1.20450644785e-8], [21, 0, 587820252575e-20, 0], [21, 1, -1.61000670141e-8, 284359400791e-19], [21, 2, -6.54460482558e-9, 378474868508e-20], [21, 3, 19549199526e-18, 226286963716e-19], [21, 4, -5.76604339239e-9, 194493782631e-19], [21, 5, 258856303016e-20, 170850368669e-20], [21, 6, -1.40168810589e-8, -273814826381e-23], [21, 7, -8.64357168475e-9, 442612277119e-20], [21, 8, -1.70477278237e-8, 15071119263e-19], [21, 9, 164489062394e-19, 830113196365e-20], [21, 10, -1.09928976409e-8, -1.46913794684e-9], [21, 11, 699300364214e-20, -3.53590565124e-8], [21, 12, -3.19300109594e-9, 145786917947e-19], [21, 13, -1.8985452459e-8, 140514791436e-19], [21, 14, 203580785674e-19, 75577246284e-19], [21, 15, 175530220278e-19, 104533886832e-19], [21, 16, 786969109367e-20, -6.56089715279e-9], [21, 17, -6.99484489981e-9, -7.36064901147e-9], [21, 18, 259643291521e-19, -1.1156080613e-8], [21, 19, -2.7374163641e-8, 163958190052e-19], [21, 20, -2.68682473584e-8, 162086057168e-19], [21, 21, 830374873932e-20, -3.75546121742e-9], [22, 0, -1.13735124259e-8, 0], [22, 1, 162309865679e-19, -3.77303475153e-9], [22, 2, -2.64090261387e-8, -2.10832402428e-9], [22, 3, 11658001654e-18, 106764617222e-19], [22, 4, -2.70979141451e-9, 174980820565e-19], [22, 5, -1.8645262501e-9, 744718166476e-21], [22, 6, 964390704406e-20, -6.37316743908e-9], [22, 7, 159715981795e-19, 439600942993e-20], [22, 8, -2.35157426998e-8, 483673695086e-20], [22, 9, 829435796737e-20, 873382159986e-20], [22, 10, 600704037701e-20, 221854121109e-19], [22, 11, -4.96078301539e-9, -1.78822672474e-8], [22, 12, 213502315463e-20, -7.96120522503e-9], [22, 13, -1.72631843979e-8, 197026896892e-19], [22, 14, 109297133018e-19, 825280905301e-20], [22, 15, 258410840629e-19, 460172998318e-20], [22, 16, 141258558921e-21, -7.182380053e-9], [22, 17, 889294096846e-20, -1.45618348246e-8], [22, 18, 105047447464e-19, -1.64271275481e-8], [22, 19, 141305509124e-19, -3.84537168599e-9], [22, 20, -1.67617655441e-8, 199561513321e-19], [22, 21, -2.50948756455e-8, 236151346133e-19], [22, 22, -9.59596694809e-9, 249861413883e-20], [23, 0, -2.26201075082e-8, 0], [23, 1, 110870239758e-19, 16137915153e-18], [23, 2, -1.35191027779e-8, -5.01411714852e-9], [23, 3, -2.45128011445e-8, -1.60570438998e-8], [23, 4, -2.39887874558e-8, 731536362289e-20], [23, 5, 799636624146e-21, -16144974141e-20], [23, 6, -1.26082781309e-8, 161308155632e-19], [23, 7, -8.04132133762e-9, -1.11647197494e-9], [23, 8, 753785326469e-20, -32967992522e-20], [23, 9, 25505325495e-19, -1.28071525548e-8], [23, 10, 165167929134e-19, -1.85239620853e-9], [23, 11, 942656822725e-20, 152386181583e-19], [23, 12, 163632625535e-19, -1.24098327824e-8], [23, 13, -1.15107832808e-8, -4.84279171627e-9], [23, 14, 675321602206e-20, -1.82899962212e-9], [23, 15, 18689804286e-18, -3.60523754481e-9], [23, 16, 613840121864e-20, 110362707266e-19], [23, 17, -5.5372102391e-9, -1.2845906046e-8], [23, 18, 843361263813e-20, -1.49115921605e-8], [23, 19, -5.20848228342e-9, 107789593943e-19], [23, 20, 860434396837e-20, -5.34641639372e-9], [23, 21, 154578189867e-19, 115333325358e-19], [23, 22, -1.78417206471e-8, 433092348903e-20], [23, 23, 285393980111e-20, -1.1323294597e-8], [24, 0, 763657386411e-21, 0], [24, 1, -3.14943681427e-9, -1.77191190396e-9], [24, 2, 138595572093e-20, 1711040664e-17], [24, 3, -4.76406913528e-9, -9.42329378125e-9], [24, 4, 605108036341e-20, 549769910191e-20], [24, 5, -7.2947904748e-9, -2.13826490504e-8], [24, 6, 454210367535e-20, 185596665318e-20], [24, 7, -6.14244489298e-9, 470081667951e-20], [24, 8, 154822444425e-19, -4.34472097787e-9], [24, 9, -9.76623425797e-9, -1.6275513762e-8], [24, 10, 108934628974e-19, 209168783608e-19], [24, 11, 145280775337e-19, 187398018797e-19], [24, 12, 118970310717e-19, -6.2293309815e-9], [24, 13, -2.89676673058e-9, 313251295024e-20], [24, 14, -2.00006558603e-8, -1.87249636821e-9], [24, 15, 610396350698e-20, -1.58957680563e-8], [24, 16, 888750753375e-20, 296492703352e-20], [24, 17, -1.19629964611e-8, -5.82074593955e-9], [24, 18, -652630641555e-21, -1.01332355837e-8], [24, 19, -4.38896550264e-9, -8.14552569977e-9], [24, 20, -5.17551981851e-9, 890354942378e-20], [24, 21, 603436755046e-20, 140116090741e-19], [24, 22, 393640283055e-20, -4.28327655754e-9], [24, 23, -6.1428347955e-9, -8.692679021e-9], [24, 24, 123903921309e-19, -3.75059286959e-9], [25, 0, 321309208115e-20, 0], [25, 1, 689649208567e-20, -7.995518294e-9], [25, 2, 219498139173e-19, 901370249111e-20], [25, 3, -1.17774931587e-8, -1.26719024392e-8], [25, 4, 94254362892e-19, 684937199311e-21], [25, 5, -1.00497487339e-8, -92212239967e-20], [25, 6, 166832871654e-19, 430583576199e-21], [25, 7, 771426681671e-20, -4.11703290425e-9], [25, 8, 31565194415e-19, -781960217669e-21], [25, 9, -2.99385350515e-8, 212695473199e-19], [25, 10, 881931818034e-20, -4.18041586166e-9], [25, 11, 12340148568e-19, 108069128123e-19], [25, 12, -7.65146786755e-9, 11747374286e-18], [25, 13, 832308127158e-20, -1.13072604626e-8], [25, 14, -1.97042124794e-8, 653183488635e-20], [25, 15, -4.35732052985e-9, -7.35147227573e-9], [25, 16, 918239548455e-21, -1.28124888592e-8], [25, 17, -1.52176535379e-8, -3.21280397924e-9], [25, 18, 121901534245e-20, -1.49040483259e-8], [25, 19, 777589111757e-20, 992518771941e-20], [25, 20, -7.50856670672e-9, -562826155305e-21], [25, 21, 10723284068e-18, 816090174381e-20], [25, 22, -1.39902235929e-8, 358546198324e-20], [25, 23, 840270853655e-20, -1.23338407961e-8], [25, 24, 412447134569e-20, -8.30716465317e-9], [25, 25, 107484366767e-19, 472369913984e-20], [26, 0, 505833635414e-20, 0], [26, 1, -1.54756177965e-9, -7.70012788871e-9], [26, 2, -3.58729876836e-9, 114484111182e-19], [26, 3, 140505671267e-19, 430905534294e-20], [26, 4, 190548709216e-19, -1.94161179658e-8], [26, 5, 107190025408e-19, 908952851813e-20], [26, 6, 113116909406e-19, -9.34393384449e-9], [26, 7, -1.562282956e-9, 481168302477e-20], [26, 8, 394920146317e-20, 1153405253e-18], [26, 9, -1.20371433638e-8, 475177058134e-21], [26, 10, -1.41246124334e-8, -6.45217247294e-9], [26, 11, -5.20385857649e-9, 212443340407e-20], [26, 12, -1.75071176484e-8, 201974971938e-20], [26, 13, -335708835245e-22, 150474091686e-20], [26, 14, 796385051492e-20, 784704068835e-20], [26, 15, -1.32388781089e-8, 803960091442e-20], [26, 16, 129093226253e-20, -6.11434455706e-9], [26, 17, -1.24494157564e-8, 78077484564e-19], [26, 18, -1.30317424459e-8, 49998916257e-19], [26, 19, -2.05807464595e-9, 354396135438e-20], [26, 20, 655952144018e-20, -1.1687804118e-8], [26, 21, -8.70038868454e-9, 168222257564e-20], [26, 22, 101580452049e-19, 754358531576e-20], [26, 23, 124105057436e-20, 108580088935e-19], [26, 24, 858620351967e-20, 148288510099e-19], [26, 25, 393441578873e-20, -597792415806e-21], [26, 26, 393179749568e-21, 193894997772e-20], [27, 0, 27717632236e-19, 0], [27, 1, 248982909452e-20, 377378455357e-20], [27, 2, 145270146453e-20, 503113268026e-21], [27, 3, -362306812856e-21, 1088457625e-17], [27, 4, -599191537157e-21, 940517681233e-20], [27, 5, 167690560888e-19, 138338587209e-19], [27, 6, 364265989803e-20, 613032807744e-20], [27, 7, -1.23459266009e-8, -3.86514075952e-9], [27, 8, -6.1040764482e-9, -8.99504471581e-9], [27, 9, 340113157078e-20, 110992938665e-19], [27, 10, -1.33158893187e-8, 172832279915e-21], [27, 11, 198322808107e-20, -9.69054254426e-9], [27, 12, -1.13695413044e-8, 190072943781e-20], [27, 13, -4.97224781272e-9, -4.14521559996e-9], [27, 14, 155033957088e-19, 11882128969e-18], [27, 15, -1.80057326196e-9, 11763698622e-19], [27, 16, 27572995289e-19, 278770269194e-20], [27, 17, 379281571763e-20, 314983101049e-21], [27, 18, -2.87144071715e-9, 744190558718e-20], [27, 19, -326518614707e-21, -2.93243500455e-9], [27, 20, -855182561846e-21, 347617208115e-20], [27, 21, 486877030983e-20, -7.0872528354e-9], [27, 22, -5.74332100084e-9, 290056687384e-20], [27, 23, -5.41033470941e-9, -1.10452433655e-8], [27, 24, 416951885933e-21, -1.80038186307e-9], [27, 25, 122815470212e-19, 562425137285e-20], [27, 26, -6.59498075164e-9, -2.22838418639e-9], [27, 27, 760067381059e-20, 69238741892e-20], [28, 0, -9.10376375863e-9, 0], [28, 1, -5.55484993587e-9, 79330019258e-19], [28, 2, -1.5189131211e-8, -7.97957089012e-9], [28, 3, 25318254224e-19, 111373049392e-19], [28, 4, -1.99212752126e-9, 125054704704e-19], [28, 5, 108871875702e-19, -4.22573826989e-9], [28, 6, -5.22194316032e-9, 132656509709e-19], [28, 7, -705588863746e-21, 512740997711e-20], [28, 8, -4.23704976329e-9, -3.32584474553e-9], [28, 9, 113842461859e-19, -1.04163010811e-8], [28, 10, -9.22867885082e-9, 817851851593e-20], [28, 11, -2.9809734257e-9, -1.45944538949e-9], [28, 12, -483471863256e-21, 964951845027e-20], [28, 13, 164993974957e-20, 663803768689e-20], [28, 14, -8.23334828619e-9, -1.26939492243e-8], [28, 15, -1.22774798187e-8, -1.97537366262e-9], [28, 16, -3.57280690709e-9, -1.35890044766e-8], [28, 17, 133742628184e-19, -4.72374226319e-9], [28, 18, 562532322748e-20, -3.87230727328e-9], [28, 19, 577104709635e-20, 235011734292e-19], [28, 20, -1.15922189521e-9, 662939940662e-20], [28, 21, 663154344375e-20, 633201211223e-20], [28, 22, -1.94231451662e-9, -7.33725263107e-9], [28, 23, 620158165102e-20, 261202437682e-20], [28, 24, 111186270621e-19, -1.35606378769e-8], [28, 25, 729495896149e-20, -1.76041477031e-8], [28, 26, 123084992259e-19, 389251843939e-20], [28, 27, -8.11971206724e-9, 13027922855e-19], [28, 28, 69872587832e-19, 680526167979e-20], [29, 0, -4.97406439473e-9, 0], [29, 1, 498979084585e-20, -9.82512461189e-9], [29, 2, -3.12119754621e-9, -2.63433487676e-9], [29, 3, 182518120454e-20, -1.05769977751e-8], [29, 4, -2.42786314995e-8, 226110758622e-20], [29, 5, -6.8110306367e-9, 601242555817e-20], [29, 6, 119592879211e-19, 97020069574e-19], [29, 7, -5.91100934209e-9, -2.14599788734e-9], [29, 8, -1.6946723555e-8, 111160276839e-19], [29, 9, -1.2937116169e-9, 141793573226e-20], [29, 10, 137184624798e-19, 179543486167e-20], [29, 11, -5.96272885876e-9, 633350180946e-20], [29, 12, -456278910357e-21, -5.01222008898e-9], [29, 13, -1.09095923049e-9, -2.34179014389e-9], [29, 14, -3.23718965114e-9, -4.58306325034e-9], [29, 15, -9.57359749406e-9, -6.77546725808e-9], [29, 16, 137450063496e-20, -1.4864526654e-8], [29, 17, -1.57662415501e-9, -3.92506699434e-9], [29, 18, -3.67597840865e-9, -2.58549575294e-9], [29, 19, -6.30046143533e-9, 586840708296e-20], [29, 20, -7.96446331531e-9, 574239983127e-20], [29, 21, -9.8726430286e-9, -5.51700601596e-9], [29, 22, 115574836058e-19, -1.47663300854e-9], [29, 23, -1.84576717899e-9, 263546763516e-20], [29, 24, 342199668119e-21, -2.38230581193e-9], [29, 25, 585864038329e-20, 868333958543e-20], [29, 26, 787039835357e-20, -6.92232980921e-9], [29, 27, -7.98313300841e-9, -1.01903214091e-9], [29, 28, 973355537526e-20, -5.71293958601e-9], [29, 29, 128224843767e-19, -5.01548480482e-9], [30, 0, 602882084759e-20, 0], [30, 1, -557556615596e-21, 124285275602e-20], [30, 2, -1.0370644769e-8, -2.61802322444e-9], [30, 3, 214692300603e-20, -1.36464188501e-8], [30, 4, -455090433473e-21, -3.91117213505e-9], [30, 5, -4.36973977446e-9, -5.35558974983e-9], [30, 6, 328451285815e-21, 317808233981e-20], [30, 7, 404923220309e-20, 183962458779e-20], [30, 8, 254952865236e-20, 462058281854e-20], [30, 9, -7.32592511128e-9, -9.7277817424e-9], [30, 10, 427609484555e-20, -4.10864961814e-9], [30, 11, -1.04043005227e-8, 107581457651e-19], [30, 12, 171622295302e-19, -1.08456775556e-8], [30, 13, 142173587056e-19, 296806226352e-20], [30, 14, 511505860834e-20, 807288811257e-20], [30, 15, 210512146846e-21, -1.04541123836e-9], [30, 16, -1.08921920457e-8, 435254063533e-20], [30, 17, -6.14382436271e-9, -6.03140938575e-9], [30, 18, -1.1114926509e-8, -7.65521957976e-9], [30, 19, -1.2967398433e-8, 242005669694e-20], [30, 20, -4.89261172033e-9, 127655684422e-19], [30, 21, -1.0628473781e-8, -5.97537587412e-9], [30, 22, -4.83763240001e-9, -9.37720111156e-9], [30, 23, 57411388543e-19, -1.03756082222e-8], [30, 24, -2.35238020789e-9, -2.7590933962e-9], [30, 25, 304426404856e-20, -1.54853389229e-8], [30, 26, 122149787623e-20, 124069551653e-19], [30, 27, -7.95063844863e-9, 127529431593e-19], [30, 28, -5.47120800289e-9, -7.96006293513e-9], [30, 29, 41592295424e-19, 189489104417e-20], [30, 30, 264794018006e-20, 812994755178e-20], [31, 0, 733100089318e-20, 0], [31, 1, 611169376734e-20, -1.60774540844e-8], [31, 2, 749625106123e-20, 637776322444e-20], [31, 3, -8.89920966189e-9, -7.6550294416e-9], [31, 4, 122555580723e-19, -4.94466436575e-9], [31, 5, -8.71279064045e-9, 308325747379e-20], [31, 6, -1.68890803585e-9, 13703621527e-19], [31, 7, -2.71996133536e-9, -68862512168e-20], [31, 8, -750260355354e-21, 228102724239e-20], [31, 9, -655840403272e-21, 524179002617e-20], [31, 10, 399161675027e-20, -4.73500202132e-9], [31, 11, 693506892777e-21, 208668068881e-19], [31, 12, 55287540984e-20, 452042167068e-20], [31, 13, 940389423562e-20, 46684078573e-19], [31, 14, -7.88650771167e-9, 351952460147e-20], [31, 15, 429954776132e-20, -2.80870684394e-9], [31, 16, -7.19430261173e-9, 611805049979e-20], [31, 17, -2.53821168958e-9, 683008216722e-20], [31, 18, -602099321996e-21, -2.04187286905e-9], [31, 19, 289086482301e-20, 443976791609e-20], [31, 20, -1.75732193914e-9, 564081954558e-20], [31, 21, -9.67143669208e-9, 709357408027e-20], [31, 22, -9.0531201252e-9, -1.18308417466e-8], [31, 23, 832234353898e-20, 451774572555e-20], [31, 24, -2.81565064366e-9, -3.34369513768e-9], [31, 25, -1.64574268169e-8, -2.20460908971e-9], [31, 26, -1.26653070356e-8, 159189398991e-20], [31, 27, -1.34953305827e-9, 107507650019e-19], [31, 28, 104226918411e-19, 28072229491e-19], [31, 29, -1.5812688103e-9, -2.18247510672e-9], [31, 30, -947416722001e-21, -7.78077525656e-9], [31, 31, -8.59193452715e-9, -1.85200316483e-9], [32, 0, -2.33966288032e-9, 0], [32, 1, -1.69210486076e-9, 127760467976e-20], [32, 2, 113999662663e-19, -3.35609127916e-9], [32, 3, -1444433154e-19, 405424830941e-20], [32, 4, 856367829112e-21, -6.75422476107e-9], [32, 5, 860776205333e-20, 182572279646e-20], [32, 6, -1.00402568672e-8, -7.6305617634e-9], [32, 7, 137058613278e-20, 275465347035e-20], [32, 8, 119653531908e-19, 491018212548e-20], [32, 9, 7332252213e-18, 718971591052e-21], [32, 10, 912133506379e-22, -5.70680927495e-9], [32, 11, -5.42043742127e-9, 7583606425e-18], [32, 12, -1.70289059214e-8, 140808168623e-19], [32, 13, 402186822027e-20, 534936491964e-20], [32, 14, -5.44420334437e-9, 220410694316e-20], [32, 15, 51658020828e-19, -8.74727531741e-9], [32, 16, 414867061294e-20, 427270420004e-20], [32, 17, -6.46857778906e-9, 101916486215e-19], [32, 18, 127286345117e-19, -1.12136888089e-9], [32, 19, 755189536923e-21, -2.7754653073e-9], [32, 20, 38161056442e-19, 319534855653e-21], [32, 21, -2.33262996771e-9, 116411650251e-19], [32, 22, -1.20880678762e-8, -2.72691793232e-9], [32, 23, 818682122143e-20, -2.33549712722e-9], [32, 24, -3.55036315667e-9, 654834763861e-21], [32, 25, -1.89374992503e-8, -6.43429532848e-9], [32, 26, 522535531492e-20, -3.68856221241e-9], [32, 27, -4.53740085214e-9, -6.68075560111e-9], [32, 28, 1653041745e-18, -5.73130340772e-9], [32, 29, 432768192965e-20, 288179889934e-20], [32, 30, -6.74805866294e-9, 139346268546e-20], [32, 31, -6.26740251766e-9, -218475608171e-21], [32, 32, 33975660331e-19, 142646165155e-20], [33, 0, -3.49357179498e-9, 0], [33, 1, -1.39642913445e-9, -2.16391760811e-9], [33, 2, -7.48774194896e-9, -50187208152e-20], [33, 3, -1.99661955793e-9, 70930410268e-19], [33, 4, -4.270199819e-9, 227426656698e-20], [33, 5, 237784729729e-21, 374439169451e-20], [33, 6, 122603039921e-20, -2.87328300836e-9], [33, 7, -6.11215086076e-9, 249383366316e-20], [33, 8, -823144405057e-21, 144915555407e-19], [33, 9, 505097392033e-20, 74