#include <stdint.h>
#include <stddef.h>
#include <math.h>

#define EPHEMERIS_START_YEAR 2025
#define EPHEMERIS_END_YEAR 2030
#define EPHEMERIS_YEAR_COUNT 6

// these are the days counted from the day the ephemeris was generated
// for ex, the ephemeris was made on August 18, 2025
// look at ephemeris_month_start_days[2][1] = 501, it has been 501 days
// since August 18, 2025. This helps the stm32 tremedously not to deal/solve
// the days in a month and leap year
static const int16_t ephemeris_month_start_days[EPHEMERIS_YEAR_COUNT][12] = {
    {-229, -198, -170, -139, -109, -78, -48, -17, 14, 44, 75, 105}, // 2025
    {136, 167, 195, 226, 256, 287, 317, 348, 379, 409, 440, 470}, // 2026
    {501, 532, 560, 591, 621, 652, 682, 713, 744, 774, 805, 835}, // 2027
    {866, 897, 926, 957, 987, 1018, 1048, 1079, 1110, 1140, 1171, 1201}, // 2028
    {1232, 1263, 1291, 1322, 1352, 1383, 1413, 1444, 1475, 1505, 1536, 1566}, // 2029
    {1597, 1628, 1656, 1687, 1717, 1748, 1778, 1809, 1840, 1870, 1901, 1931}, // 2030
};

#define EPHEMERIS_COEFF_RANGE 1.15
#define EPHEMERIS_INT16_SCALE (32767.0 / EPHEMERIS_COEFF_RANGE)

static const float earth_theta0_rad = -0.58844252867867364;

static const float earth_r_slow[3][3] = {
    {0.9999968796709876, 1.4122090862293292e-06, -0.0024981285583662747},
    {-1.5036105299294652e-06, 0.9999999993295986, -3.6586089709243098e-05},
    {0.0024981285050266568, 3.6589731755423533e-05, 0.99999687900271161},
};

// mercury: degree=5, segment_days=32
static const int16_t mercury_ephemeris[58][3][6] = {
    {
        {-23647, -6189, 1022, 431, -111, -5},
        {11438, -11229, -1098, 348, 8, -19},
        {5385, -4231, -934, 181, 18, -12},
    },
    {
        {-24403, 5176, 966, -128, -1, -1},
        {-10892, -9496, 884, 27, -4, 1},
        {-5031, -5089, 389, 34, -2, 1},
    },
    {
        {-14624, 1561, -2747, -464, 120, 99},
        {-21959, -1279, 1303, 125, 29, -10},
        {-10406, 318, 1151, 118, -13, -24},
    },
    {
        {-13857, 5088, 2458, -486, 48, 17},
        {-22762, -2278, -902, 504, -28, -40},
        {-9023, -1312, -828, 365, -34, -21},
    },
    {
        {5232, 12026, -53, -96, -2, -1},
        {-24191, 2478, 1221, 22, -3, 0},
        {-11085, 389, 665, 25, -1, 0},
    },
    {
        {24169, 5575, -1572, -36, 61, 11},
        {-11502, 8802, -701, -621, -94, 11},
        {-5122, 5153, 28, -298, -64, -1},
    },
    {
        {27285, -803, 383, 261, -58, -35},
        {-7381, -2529, 1562, 575, -267, 14},
        {-2254, -2283, 193, 454, -110, -16},
    },
    {
        {27410, -490, -1047, -198, 6, -1},
        {1050, 9958, 792, -123, -1, -2},
        {-639, 4062, 653, -56, 0, -1},
    },
    {
        {13713, -13388, -1038, 448, 54, -24},
        {20381, 7168, -1763, -168, 74, 13},
        {9019, 4299, -885, -160, 34, 10},
    },
    {
        {-8147, -5999, 1975, 64, -1, -2},
        {24671, -913, 334, 202, -25, -5},
        {10702, -1918, -174, 134, 0, 0},
    },
    {
        {-10003, 952, -1748, -509, 113, 18},
        {25048, 132, -811, -123, 26, -15},
        {9032, 723, 317, -144, -23, 3},
    },
    {
        {-20758, -8890, 1164, 406, -104, -5},
        {15069, -10589, -1151, 290, 22, -19},
        {6967, -3976, -927, 144, 25, -12},
    },
    {
        {-26147, 3173, 1004, -145, -4, -2},
        {-6969, -9831, 816, 47, -3, 1},
        {-3369, -5293, 345, 43, -2, 1},
    },
    {
        {-20524, -387, -2202, -30, 265, 90},
        {-17622, 54, 1865, 57, -104, -69},
        {-8608, 974, 1437, 64, -93, -56},
    },
    {
        {-18895, 6066, 1817, -288, 32, -2},
        {-19085, -4688, -809, 591, -97, -10},
        {-7486, -2344, -742, 380, -61, -6},
    },
    {
        {866, 12303, 82, -87, -3, -1},
        {-24635, 649, 1223, 17, -2, 0},
        {-11282, -404, 655, 24, 0, 0},
    },
    {
        {21219, 6465, -1801, -192, 22, 7},
        {-16139, 6165, -1056, -701, -91, 24},
        {-7104, 4088, -88, -335, -70, 2},
    },
    {
        {23721, -962, 1412, 197, -204, 24},
        {-14627, -1074, 2133, 96, -188, 71},
        {-5391, -1702, 551, 250, -108, 17},
    },
    {
        {26848, 1793, -1048, -194, 4, -1},
        {-3890, 10625, 830, -80, -6, -2},
        {-2701, 4344, 638, -32, -2, -1},
    },
    {
        {17504, -11409, -1132, 448, 60, -23},
        {17895, 9034, -1633, -197, 73, 15},
        {7988, 5136, -802, -177, 31, 11},
    },
    {
        {-87, -3372, 2210, 12, -46, -13},
        {25990, 710, 23, 84, -47, -3},
        {11269, -1353, -330, 111, 1, 2},
    },
    {
        {-1081, -1864, -2343, -166, 86, -12},
        {26644, -391, -290, -49, -46, -5},
        {9790, 600, 423, -120, -30, 4},
    },
    {
        {-17388, -11255, 1218, 387, -95, -6},
        {18065, -9305, -1294, 255, 31, -18},
        {8278, -3433, -965, 118, 29, -11},
    },
    {
        {-27201, 1096, 1018, -159, -7, -2},
        {-2649, -9691, 775, 77, -1, 2},
        {-1544, -5310, 311, 58, 0, 1},
    },
    {
        {-25075, -1128, -1183, 312, 235, 4},
        {-11730, 1733, 1849, -338, -284, -72},
        {-6150, 1800, 1459, -150, -197, -56},
    },
    {
        {-22576, 5878, 1443, -110, -11, 3},
        {-14812, -7195, -518, 548, -114, 6},
        {-5684, -3410, -584, 343, -65, 2},
    },
    {
        {-3497, 12171, 213, -85, -3, -1},
        {-24444, -1179, 1200, 10, -2, 0},
        {-11212, -1206, 636, 22, 0, 0},
    },
    {
        {16873, 6120, -2349, -409, -8, 18},
        {-20372, 3354, -1315, -675, -36, 53},
        {-8920, 2949, -171, -335, -58, 10},
    },
    {
        {18265, 233, 2301, -176, -167, 73},
        {-20275, 603, 1864, -170, -21, 40},
        {-7863, -988, 546, 109, -50, 16},
    },
    {
        {25424, 4088, -1015, -182, 0, -1},
        {-8323, 10625, 919, -48, -8, -2},
        {-4563, 4336, 652, -13, -3, -1},
    },
    {
        {20917, -8908, -1130, 458, 68, -22},
        {14756, 10357, -1521, -235, 72, 17},
        {6678, 5756, -726, -197, 27, 11},
    },
    {
        {8949, -364, 1900, -261, -107, -5},
        {24746, 768, -480, 41, -14, 12},
        {10767, -1424, -529, 137, 24, 5},
    },
    {
        {7374, -4923, -2208, -8, 17, -4},
        {25549, 784, 193, -167, -44, 5},
        {9438, 1114, 528, -150, -20, 4},
    },
    {
        {-13638, -13163, 1176, 380, -88, -8},
        {20446, -7521, -1469, 232, 38, -17},
        {9326, -2665, -1022, 98, 32, -10},
    },
    {
        {-27434, -927, 1022, -164, -8, -1},
        {2048, -8996, 785, 120, 3, 2},
        {433, -5110, 296, 79, 2, 2},
    },
    {
        {-27751, -698, -246, 271, 36, -54},
        {-4696, 2970, 1054, -831, -305, 20},
        {-3203, 2461, 1121, -423, -223, -5},
    },
    {
        {-25016, 4718, 1337, -6, -43, 10},
        {-10300, -9386, -224, 457, -101, 10},
        {-3771, -4337, -435, 288, -55, 4},
    },
    {
        {-7780, 11638, 330, -88, -3, -2},
        {-23624, -2935, 1155, 3, -3, -1},
        {-10876, -1985, 608, 20, 0, 0},
    },
    {
        {11114, 4496, -3093, -555, 39, 67},
        {-23717, 968, -1218, -463, 75, 83},
        {-10370, 1984, -119, -271, -28, 18},
    },
    {
        {11714, 2528, 2565, -499, -26, 52},
        {-23985, 1586, 1180, -109, 47, -6},
        {-9522, -531, 337, 94, -19, 3},
    },
    {
        {23306, 6235, -938, -167, -3, -1},
        {-12252, 10083, 1026, -26, -9, -2},
        {-6222, 4093, 679, 0, -3, -1},
    },
    {
        {23837, -6016, -1032, 474, 77, -21},
        {10926, 10951, -1491, -292, 67, 18},
        {5074, 6078, -686, -228, 21, 12},
    },
    {
        {17513, 1504, 852, -519, -46, 32},
        {20495, -452, -549, 263, 42, -1},
        {9004, -1996, -496, 279, 42, -9},
    },
    {
        {14306, -6853, -1855, -37, -3, 3},
        {22493, 3253, 321, -246, -17, 1},
        {8264, 2116, 516, -160, -8, 0},
    },
    {
        {-9579, -14532, 1051, 381, -81, -9},
        {22220, -5371, -1631, 213, 43, -16},
        {10116, -1729, -1078, 80, 35, -9},
    },
    {
        {-26648, -2691, 1056, -150, -6, 0},
        {7094, -7669, 863, 173, 9, 3},
        {2547, -4663, 308, 107, 6, 2},
    },
    {
        {-28176, 342, 29, -111, -96, -3},
        {2948, 3130, -245, -1043, -102, 96},
        {12, 2679, 528, -581, -132, 46},
    },
    {
        {-26387, 2877, 1406, 36, -59, 15},
        {-5762, -11049, -31, 371, -80, 8},
        {-1838, -5037, -338, 239, -43, 2},
    },
    {
        {-11914, 10720, 422, -100, -5, -2},
        {-22180, -4547, 1093, -2, -3, -1},
        {-10279, -2713, 574, 20, 0, 0},
    },
    {
        {4212, 2022, -3631, -414, 227, 141},
        {-25647, -399, -625, -128, 163, 65},
        {-11232, 1440, 124, -167, -11, 9},
    },
    {
        {4875, 5168, 2272, -579, 68, 12},
        {-25757, 1414, 599, 84, 15, -15},
        {-10357, -542, 138, 142, -24, 0},
    },
    {
        {20609, 8137, -820, -152, -5, -1},
        {-15675, 9106, 1126, -11, -9, -2},
        {-7674, 3662, 708, 9, -3, -1},
    },
    {
        {26086, -2962, -886, 481, 80, -22},
        {6359, 10618, -1622, -382, 59, 21},
        {3157, 6016, -716, -275, 13, 12},
    },
    {
        {24082, 1547, -201, -387, 79, 15},
        {13713, -1580, 271, 509, -43, -30},
        {6165, -2492, -53, 409, -18, -27},
    },
    {
        {19435, -7229, -1651, -103, 2, 4},
        {18406, 6056, 262, -245, -8, -2},
        {6640, 3238, 453, -141, -5, -2},
    },
    {
        {-5267, -15298, 870, 387, -76, -9},
        {23378, -2978, -1752, 195, 49, -16},
        {10644, -679, -1120, 63, 37, -8},
    },
    {
        {-24547, -3878, 1186, -100, 2, 2},
        {12402, -5690, 1001, 223, 9, 1},
        {4760, -3960, 346, 138, 9, 2},
    },
    {
        {-26143, 1060, -553, -459, -2, 62},
        {10537, 2013, -1423, -811, 105, 60},
        {3220, 2352, -58, -533, -13, 44},
    },
};

// venus: degree=5, segment_days=64
static const int16_t venus_ephemeris[29][3][6] = {
    {
        {-21723, -9315, 2671, 223, -26, -2},
        {11731, -14661, -1529, 280, 20, -2},
        {5458, -5759, -786, 108, 11, -1},
    },
    {
        {-16602, 14075, 2239, -294, -25, 2},
        {-17432, -11211, 2328, 244, -25, -2},
        {-7103, -5346, 917, 123, -10, -1},
    },
    {
        {15786, 14593, -2127, -306, 24, 2},
        {-17695, 10957, 2340, -240, -24, 2},
        {-8220, 4413, 1133, -93, -12, 1},
    },
    {
        {22124, -8833, -2812, 202, 28, -1},
        {11179, 14640, -1505, -289, 19, 2},
        {4637, 6987, -578, -143, 7, 1},
    },
    {
        {-6985, -17070, 949, 313, -16, -1},
        {22167, -4501, -2512, 137, 25, -1},
        {10483, -1722, -1266, 42, 12, 0},
    },
    {
        {-26248, -1125, 2181, -174, -43, -1},
        {1651, -13396, 569, 295, -6, -1},
        {293, -7368, 30, 142, 0, 0},
    },
    {
        {-24350, -719, -1677, 345, 292, -7},
        {-12072, 1146, 2027, -505, -254, -38},
        {-8131, 661, 1979, -35, -177, -59},
    },
    {
        {-21351, 6966, 2147, 18, -17, -8},
        {-16035, -7871, -859, 593, -37, -5},
        {-6217, -1794, -1002, 313, -11, -7},
    },
    {
        {4856, 17130, -324, -359, 0, 3},
        {-23371, 3446, 2642, -2, -35, 1},
        {-9225, 515, 1077, 33, -17, 0},
    },
    {
        {25289, 919, -3124, -27, 32, 0},
        {-965, 16792, 110, -331, -1, 2},
        {-1051, 6917, 215, -141, -3, 1},
    },
    {
        {6584, -17698, -856, 350, 10, -2},
        {22478, 4151, -2836, -88, 27, 1},
        {9483, 2422, -1191, -58, 11, 0},
    },
    {
        {-22558, -8234, 2916, 177, -29, -1},
        {10050, -15278, -1299, 313, 15, -2},
        {4973, -6520, -703, 132, 8, -1},
    },
    {
        {-15147, 14846, 1975, -311, -21, 2},
        {-18411, -10015, 2421, 204, -26, -1},
        {-8060, -5032, 1036, 110, -11, -1},
    },
    {
        {16900, 13650, -2190, -261, 27, 2},
        {-16929, 11178, 2047, -256, -21, 2},
        {-8152, 4980, 1080, -105, -11, 1},
    },
    {
        {23204, -7201, -2008, 302, 31, -2},
        {10331, 13058, -1476, -196, 31, 3},
        {5262, 6998, -598, -116, 11, 1},
    },
    {
        {9288, -1867, 3546, 193, -243, -86},
        {23873, 1170, -818, 88, -67, -4},
        {12064, -628, -1185, -47, 8, 21},
    },
    {
        {7988, -6225, -3040, 376, 2, -13},
        {25241, 1610, 322, -400, -35, 30},
        {9228, 12, 804, -282, -13, 20},
    },
    {
        {-15192, -13437, 1197, 337, -9, -3},
        {19410, -9533, -2139, 83, 34, -1},
        {7795, -2923, -969, 8, 16, -1},
    },
    {
        {-23533, 6677, 3036, -104, -36, 1},
        {-8621, -15777, 1043, 340, -8, -3},
        {-2964, -6774, 270, 154, -1, -1},
    },
    {
        {4678, 18413, -622, -392, 7, 3},
        {-22630, 3449, 3011, -75, -33, 1},
        {-9817, 827, 1329, -12, -15, 0},
    },
    {
        {25148, -219, -3299, 15, 34, 0},
        {515, 17031, -114, -354, 3, 2},
        {-394, 7537, 86, -158, 0, 1},
    },
    {
        {4510, -18064, -534, 366, 3, -2},
        {22686, 2792, -2881, -40, 29, 0},
        {10145, 1827, -1297, -38, 13, 0},
    },
    {
        {-23419, -6999, 2839, 110, -30, 0},
        {8823, -15012, -953, 304, 7, -1},
        {4415, -6953, -588, 136, 5, -1},
    },
    {
        {-16275, 12892, 1365, -319, -17, 1},
        {-18014, -9295, 2009, 91, -32, -1},
        {-8932, -5085, 949, 76, -12, -1},
    },
    {
        {6363, 5803, -3354, -418, 33, 34},
        {-24804, 157, -739, -411, 75, 48},
        {-11438, 2146, 438, -149, -4, 3},
    },
    {
        {8451, 3589, 3491, -412, -160, 79},
        {-25595, 1374, 1324, 57, 60, -10},
        {-8415, 186, -192, 241, 6, -16},
    },
    {
        {23581, 6735, -2123, -247, 33, 0},
        {-9982, 14240, 1215, -230, -20, 2},
        {-4136, 4834, 716, -85, -11, 1},
    },
    {
        {16883, -13356, -2051, 232, 22, -1},
        {17781, 10729, -2065, -220, 18, 1},
        {6869, 4934, -735, -112, 7, 1},
    },
    {
        {-14684, -14930, 1812, 316, -15, -2},
        {18757, -10046, -2399, 187, 26, -1},
        {8382, -3753, -1121, 64, 13, 0},
    },
};

// moon: degree=5, segment_days=12
static const int16_t moon_ephemeris[153][3][6] = {
    {
        {-15764, -11996, 10450, 521, -488, 43},
        {5674, -24315, -3312, 2256, -36, -70},
        {2743, -13504, -1582, 1240, -30, -38},
    },
    {
        {10219, 23167, -6876, -2626, 54, 126},
        {-11213, 17589, 8379, -1113, -540, -47},
        {-5889, 10095, 4419, -664, -293, -23},
    },
    {
        {-6883, -28303, 5456, 2421, -411, -35},
        {12814, -10675, -9332, 1455, 339, -69},
        {6839, -6437, -4968, 847, 176, -38},
    },
    {
        {-1311, 29527, 1175, -2069, -158, -22},
        {-15586, -1645, 9141, 494, -172, -25},
        {-8516, -250, 5005, 222, -98, -14},
    },
    {
        {4980, -29593, -4151, 3536, 34, -202},
        {12029, 10568, -10789, -786, 778, -40},
        {6644, 5094, -5960, -347, 424, -26},
    },
    {
        {-12818, 20724, 6894, -1497, -147, 24},
        {-11368, -18241, 6223, 1220, -185, -1},
        {-6433, -9419, 3538, 627, -104, 0},
    },
    {
        {13385, -12286, -12397, 963, 1005, 28},
        {4348, 26128, -3744, -3276, 62, 229},
        {2651, 13831, -2325, -1749, 59, 125},
    },
    {
        {-17699, 2430, 10338, -618, -243, 21},
        {-1433, -25993, 1187, 1865, -134, -1},
        {-1197, -13950, 907, 993, -79, 0},
    },
    {
        {14686, 12193, -10289, -1846, 226, 98},
        {-6437, 24697, 5139, -1876, -431, -27},
        {-3058, 13609, 2482, -1064, -226, -12},
    },
    {
        {-12816, -19687, 10034, 1113, -641, 91},
        {8577, -20801, -5951, 2461, -29, -102},
        {4221, -11743, -2907, 1358, -34, -52},
    },
    {
        {6763, 27204, -3650, -2219, 6, 36},
        {-14534, 10080, 8675, -440, -301, -12},
        {-7556, 6270, 4549, -308, -162, -5},
    },
    {
        {-1450, -31832, 1471, 3721, -233, -233},
        {12697, -1913, -11425, 495, 834, -63},
        {6746, -2104, -6092, 391, 441, -42},
    },
    {
        {-5528, 27955, 3219, -1910, -142, -7},
        {-15147, -8110, 8400, 666, -173, -25},
        {-8321, -3365, 4635, 292, -99, -14},
    },
    {
        {10041, -23914, -8637, 2315, 604, -46},
        {9725, 18506, -8071, -2200, 357, 116},
        {5604, 9075, -4665, -1101, 215, 61},
    },
    {
        {-15135, 14698, 8856, -1461, -107, 37},
        {-7766, -22943, 4993, 1479, -242, 34},
        {-4762, -11813, 3024, 744, -135, 20},
    },
    {
        {15731, -2418, -12058, -194, 648, 37},
        {526, 27377, -147, -2747, -117, 105},
        {887, 14679, -537, -1490, -39, 58},
    },
    {
        {-16162, -7258, 11268, 92, -555, 61},
        {3285, -26069, -1866, 2488, -108, -86},
        {1157, -14344, -576, 1346, -80, -44},
    },
    {
        {12568, 19219, -8137, -2197, 123, 107},
        {-9885, 20502, 7091, -1378, -459, -33},
        {-4858, 11785, 3511, -828, -243, -14},
    },
    {
        {-8840, -26169, 7093, 2301, -476, -42},
        {11605, -14445, -8810, 1773, 346, -78},
        {5915, -8769, -4469, 1044, 168, -44},
    },
    {
        {1952, 29214, -858, -2063, -65, -18},
        {-15760, 2703, 9102, 63, -181, -15},
        {-8378, 2575, 4853, -48, -100, -9},
    },
    {
        {2906, -31083, -2409, 3623, -6, -202},
        {12547, 6631, -11239, -488, 786, -34},
        {6815, 2335, -6113, -116, 421, -26},
    },
    {
        {-10169, 24104, 5476, -1814, -88, 30},
        {-13115, -15080, 7350, 945, -234, 7},
        {-7377, -7070, 4150, 430, -129, 5},
    },
    {
        {12693, -16803, -11409, 1366, 927, 20},
        {6204, 24162, -5183, -3048, 117, 209},
        {3811, 12142, -3242, -1565, 102, 112},
    },
    {
        {-16827, 7451, 10149, -1071, -235, 34},
        {-3939, -25661, 2793, 1845, -206, 0},
        {-2804, -13288, 1930, 935, -120, 2},
    },
    {
        {15959, 7211, -10868, -1393, 267, 89},
        {-4355, 26063, 3560, -2023, -364, -18},
        {-1573, 14133, 1388, -1140, -181, -5},
    },
    {
        {-13935, -15514, 11185, 726, -689, 103},
        {6584, -23583, -4648, 2711, -87, -109},
        {2815, -13221, -1933, 1473, -79, -53},
    },
    {
        {9680, 24540, -5278, -1981, 68, 27},
        {-13541, 13932, 7896, -766, -262, -5},
        {-6670, 8592, 3927, -505, -136, -1},
    },
    {
        {-3713, -31008, 3527, 3672, -347, -237},
        {12255, -6424, -11284, 945, 842, -82},
        {6292, -4987, -5806, 688, 429, -56},
    },
    {
        {-2226, 28998, 1258, -2001, -59, 1},
        {-15921, -3751, 8786, 267, -196, -16},
        {-8553, -481, 4731, 39, -107, -8},
    },
    {
        {8141, -26986, -7121, 2600, 585, -49},
        {11025, 14994, -9124, -1968, 397, 125},
        {6285, 6538, -5222, -909, 242, 64},
    },
    {
        {-13000, 19293, 7657, -1857, -45, 36},
        {-10026, -20515, 6510, 1229, -290, 43},
        {-6018, -9879, 3865, 555, -157, 25},
    },
    {
        {15722, -7592, -11555, 232, 581, 28},
        {2820, 26614, -1745, -2608, -59, 84},
        {2329, 13737, -1541, -1373, 0, 46},
    },
    {
        {-16108, -1920, 11754, -451, -588, 93},
        {763, -27207, -132, 2638, -220, -92},
        {-438, -14540, 555, 1376, -148, -44},
    },
    {
        {14674, 14497, -9245, -1723, 208, 93},
        {-7947, 23117, 5557, -1653, -381, -11},
        {-3446, 13007, 2450, -967, -190, -1},
    },
    {
        {-10639, -23062, 8667, 2115, -541, -58},
        {10137, -18236, -7983, 2093, 357, -87},
        {4800, -10847, -3753, 1220, 160, -49},
    },
    {
        {5373, 27953, -2903, -1981, 0, -17},
        {-15326, 7383, 8816, -345, -176, -14},
        {-7773, 5381, 4484, -291, -93, -8},
    },
    {
        {550, -31715, -369, 3572, -83, -178},
        {13016, 2065, -11423, -82, 746, -38},
        {6841, -640, -6014, 155, 387, -30},
    },
    {
        {-7119, 26840, 3776, -2069, -5, 36},
        {-14491, -11292, 8318, 602, -276, 21},
        {-7940, -4397, 4567, 198, -146, 13},
    },
    {
        {11425, -21152, -10067, 1835, 857, -9},
        {8164, 21423, -6696, -2775, 216, 200},
        {4892, 9936, -4079, -1341, 163, 104},
    },
    {
        {-15487, 12509, 9550, -1484, -222, 41},
        {-6381, -24527, 4388, 1751, -264, -2},
        {-4223, -12004, 2859, 825, -151, 1},
    },
    {
        {16782, 1933, -11130, -941, 283, 82},
        {-1976, 26784, 1900, -2102, -304, -17},
        {17, 14032, 296, -1155, -141, -3},
    },
    {
        {-14696, -10705, 12054, 239, -708, 123},
        {4436, -25849, -3077, 2897, -176, -108},
        {1361, -14107, -834, 1523, -136, -48},
    },
    {
        {12373, 21146, -6699, -1667, 132, 18},
        {-12104, 17403, 6850, -1069, -213, 5},
        {-5468, 10425, 3129, -666, -103, 4},
    },
    {
        {-5717, -29353, 5426, 3590, -441, -253},
        {11556, -10767, -10922, 1360, 865, -95},
        {5626, -7546, -5326, 945, 422, -66},
    },
    {
        {1151, 29103, -711, -1990, 18, 3},
        {-16189, 744, 8885, -138, -198, -9},
        {-8350, 2327, 4579, -204, -102, -5},
    },
    {
        {6242, -29061, -5512, 2732, 541, -38},
        {12210, 11266, -9846, -1695, 395, 123},
        {6774, 3926, -5494, -700, 242, 62},
    },
    {
        {-10495, 23105, 6244, -2236, 42, 40},
        {-11779, -17672, 7892, 923, -352, 60},
        {-6824, -7655, 4522, 330, -181, 34},
    },
    {
        {15334, -12183, -10721, 609, 514, 18},
        {5115, 25226, -3186, -2417, -3, 70},
        {3658, 12287, -2368, -1213, 33, 38},
    },
    {
        {-15484, 3155, 11946, -933, -636, 117},
        {-1447, -27682, 1496, 2770, -309, -108},
        {-1756, -14118, 1571, 1372, -203, -48},
    },
    {
        {16312, 9650, -9884, -1220, 240, 73},
        {-5803, 24910, 3968, -1796, -290, -3},
        {-1930, 13485, 1383, -1009, -133, 3},
    },
    {
        {-11963, -19597, 9950, 1906, -593, -68},
        {8653, -21374, -7074, 2362, 360, -94},
        {3654, -12284, -2964, 1345, 145, -53},
    },
    {
        {8456, 25880, -4804, -1792, 90, -18},
        {-14400, 11610, 8222, -773, -154, -5},
        {-6788, 7700, 3881, -522, -73, -4},
    },
    {
        {-1601, -31467, 1379, 3490, -109, -169},
        {13209, -2176, -11369, 215, 722, -28},
        {6608, -3288, -5707, 355, 361, -26},
    },
    {
        {-3974, 28748, 1990, -2278, 78, 39},
        {-15273, -7263, 9097, 233, -314, 34},
        {-8023, -1650, 4777, -45, -155, 20},
    },
    {
        {10009, -24503, -8483, 2116, 736, -17},
        {10036, 18217, -7836, -2404, 261, 171},
        {5806, 7461, -4604, -1067, 187, 86},
    },
    {
        {-13671, 17006, 8800, -1901, -203, 57},
        {-8399, -22897, 5916, 1645, -340, -2},
        {-5264, -10345, 3661, 695, -188, 3},
    },
    {
        {17067, -3354, -11037, -430, 305, 70},
        {653, 26783, 122, -2140, -224, -7},
        {1632, 13328, -779, -1121, -91, 2},
    },
    {
        {-14995, -5726, 12537, -174, -721, 125},
        {2359, -27429, -1515, 3013, -225, -111},
        {36, -14357, 197, 1517, -170, -47},
    },
    {
        {14639, 17124, -7957, -1327, 177, 8},
        {-10102, 20563, 5658, -1343, -162, 8},
        {-3981, 11772, 2255, -786, -69, 5},
    },
    {
        {-7728, -26706, 7280, 3316, -544, -239},
        {10717, -15045, -10156, 1794, 821, -113},
        {4838, -9728, -4589, 1170, 374, -76},
    },
    {
        {4471, 28360, -2652, -1925, 98, 6},
        {-15850, 5320, 8753, -540, -198, 1},
        {-7702, 4914, 4235, -425, -93, 1},
    },
    {
        {3878, -30550, -3626, 2917, 494, -45},
        {13184, 6878, -10517, -1360, 435, 127},
        {6989, 1114, -5614, -461, 259, 61},
    },
    {
        {-7686, 26348, 4503, -2482, 124, 34},
        {-13254, -13975, 9026, 553, -376, 70},
        {-7301, -5034, 4918, 85, -181, 38},
    },
    {
        {14324, -16680, -9654, 965, 440, 12},
        {7577, 23094, -4646, -2190, 45, 53},
        {4910, 10364, -3093, -1029, 57, 28},
    },
    {
        {-14492, 8601, 11687, -1521, -629, 155},
        {-3741, -27317, 3397, 2770, -441, -108},
        {-2977, -13064, 2616, 1274, -271, -42},
    },
    {
        {17412, 4277, -10257, -703, 279, 57},
        {-3122, 26154, 2194, -1917, -203, 10},
        {-237, 13416, 294, -1015, -79, 10},
    },
    {
        {-13105, -15238, 11101, 1629, -652, -86},
        {6894, -24305, -5847, 2637, 365, -104},
        {2420, -13295, -2039, 1445, 130, -59},
    },
    {
        {11364, 22792, -6563, -1514, 145, -22},
        {-12858, 15853, 7307, -1146, -118, -5},
        {-5474, 9680, 3104, -694, -47, -4},
    },
    {
        {-4015, -30268, 3260, 3284, -160, -142},
        {13207, -6759, -11007, 577, 660, -28},
        {6190, -5795, -5185, 555, 314, -25},
    },
    {
        {-728, 29797, 1, -2398, 187, 40},
        {-15581, -2753, 9613, -204, -339, 55},
        {-7726, 1112, 4752, -301, -153, 30},
    },
    {
        {8017, -27314, -6650, 2401, 627, -37},
        {11803, 14334, -8882, -1999, 328, 152},
        {6479, 4754, -4948, -783, 216, 72},
    },
    {
        {-11580, 21171, 7702, -2258, -182, 69},
        {-10217, -20459, 7335, 1470, -402, -5},
        {-6020, -8259, 4280, 532, -214, 3},
    },
    {
        {16793, -8480, -10582, 41, 297, 61},
        {3402, 25997, -1621, -2084, -154, -5},
        {3140, 12075, -1721, -1025, -50, 3},
    },
    {
        {-14945, -551, 12705, -641, -713, 136},
        {229, -28318, 198, 3065, -299, -109},
        {-1197, -14010, 1209, 1456, -210, -42},
    },
    {
        {16412, 12668, -8893, -927, 219, -3},
        {-7755, 23102, 4247, -1570, -100, 14},
        {-2389, 12497, 1314, -855, -30, 7},
    },
    {
        {-9408, -23467, 8810, 3048, -609, -241},
        {9681, -18847, -9238, 2147, 801, -120},
        {3955, -11329, -3779, 1324, 341, -80},
    },
    {
        {7530, 26753, -4477, -1766, 169, 3},
        {-15004, 9757, 8338, -932, -177, 8},
        {-6738, 7114, 3707, -613, -72, 4},
    },
    {
        {1566, -30979, -1810, 2927, 425, -37},
        {14014, 2584, -10792, -1013, 427, 119},
        {7004, -1398, -5443, -241, 246, 55},
    },
    {
        {-4838, 28685, 2696, -2715, 229, 35},
        {-14105, -10124, 9986, 149, -418, 90},
        {-7299, -2485, 5110, -164, -185, 47},
    },
    {
        {12922, -20375, -8346, 1263, 370, 5},
        {9912, 20451, -5880, -1921, 91, 42},
        {5901, 8191, -3580, -823, 77, 21},
    },
    {
        {-13191, 13436, 11204, -2003, -647, 180},
        {-5593, -26322, 5071, 2762, -538, -122},
        {-3820, -11573, 3428, 1163, -317, -44},
    },
    {
        {17911, -866, -10225, -204, 273, 40},
        {-348, 26565, 461, -1919, -117, 12},
        {1367, 12716, -677, -944, -32, 9},
    },
    {
        {-13893, -10807, 11918, 1334, -690, -95},
        {5191, -26473, -4561, 2842, 355, -109},
        {1272, -13646, -1131, 1485, 109, -61},
    },
    {
        {13667, 19192, -8062, -1157, 212, -30},
        {-10894, 19465, 6146, -1504, -62, 1},
        {-3982, 11031, 2217, -827, -11, -2},
    },
    {
        {-6236, -28368, 4829, 3074, -176, -129},
        {12927, -10924, -10454, 853, 617, -18},
        {5589, -7797, -4554, 690, 279, -20},
    },
    {
        {2304, 29970, -1986, -2452, 294, 38},
        {-15310, 1858, 9884, -660, -353, 74},
        {-7072, 3656, 4535, -542, -142, 39},
    },
    {
        {5797, -29097, -4720, 2517, 493, -41},
        {13395, 10140, -9556, -1541, 350, 123},
        {6919, 2113, -5000, -499, 213, 55},
    },
    {
        {-9266, 24692, 6461, -2620, -151, 90},
        {-11582, -17539, 8669, 1270, -484, -5},
        {-6390, -6036, 4742, 359, -245, 6},
    },
    {
        {15839, -13413, -9785, 532, 289, 50},
        {6258, 24431, -3395, -1975, -72, 2},
        {4480, 10381, -2542, -891, -7, 6},
    },
    {
        {-14606, 4637, 12519, -1026, -698, 128},
        {-1836, -28446, 1870, 3046, -332, -110},
        {-2250, -13122, 2072, 1354, -224, -40},
    },
    {
        {17549, 7710, -9630, -500, 241, -14},
        {-4960, 25152, 2677, -1753, -34, 13},
        {-727, 12697, 368, -881, 7, 5},
    },
    {
        {-11144, -19323, 10203, 2587, -683, -211},
        {8373, -22367, -7876, 2497, 706, -134},
        {2955, -12426, -2788, 1428, 271, -83},
    },
    {
        {10267, 24345, -6198, -1567, 244, 1},
        {-13587, 14109, 7672, -1310, -155, 20},
        {-5507, 8932, 3056, -767, -50, 10},
    },
    {
        {-1183, -30663, 250, 2978, 352, -48},
        {14402, -2316, -10933, -591, 461, 117},
        {6690, -3906, -5133, -1, 250, 50},
    },
    {
        {-1880, 30178, 669, -2776, 310, 25},
        {-14671, -5486, 10558, -288, -412, 97},
        {-7063, 187, 5024, -394, -165, 48},
    },
    {
        {10841, -23720, -6843, 1527, 298, 3},
        {12160, 17044, -7066, -1620, 127, 29},
        {6655, 5786, -3938, -614, 88, 14},
    },
    {
        {-11591, 18309, 10182, -2550, -586, 217},
        {-7497, -24300, 6908, 2567, -672, -111},
        {-4538, -9607, 4164, 957, -368, -32},
    },
    {
        {17698, -6195, -9883, 274, 272, 26},
        {2725, 26217, -1340, -1883, -37, 18},
        {2892, 11561, -1555, -848, 9, 11},
    },
    {
        {-14451, -5684, 12526, 969, -737, -109},
        {3202, -28137, -2980, 3039, 340, -119},
        {114, -13518, -182, 1498, 87, -65},
    },
    {
        {15545, 14729, -9262, -733, 237, -37},
        {-8441, 22691, 4678, -1765, 2, -3},
        {-2390, 11864, 1263, -886, 24, -5},
    },
    {
        {-8602, -25592, 6381, 2763, -210, -104},
        {12294, -15062, -9581, 1157, 545, -16},
        {4803, -9417, -3786, 803, 231, -18},
    },
    {
        {5154, 29210, -4031, -2403, 419, 31},
        {-14565, 6653, 9807, -1157, -347, 100},
        {-6178, 5930, 4113, -769, -119, 49},
    },
    {
        {3139, -30113, -2694, 2602, 376, -51},
        {14634, 5507, -10011, -1073, 381, 102},
        {7033, -446, -4867, -236, 212, 42},
    },
    {
        {-6895, 27560, 4984, -2896, -124, 105},
        {-12675, -13943, 9778, 1015, -547, -10},
        {-6508, -3683, 4985, 179, -263, 6},
    },
    {
        {14349, -17769, -8673, 946, 250, 41},
        {8973, 22102, -5001, -1767, -4, 1},
        {5532, 8400, -3149, -717, 23, 5},
    },
    {
        {-13974, 9580, 12038, -1423, -669, 129},
        {-3861, -27819, 3555, 2965, -384, -107},
        {-3129, -11821, 2807, 1218, -242, -36},
    },
    {
        {18047, 2686, -9998, -43, 259, -27},
        {-2044, 26416, 988, -1875, 41, 15},
        {790, 12334, -522, -860, 45, 4},
    },
    {
        {-12521, -14931, 11178, 2178, -709, -199},
        {6924, -25146, -6469, 2732, 644, -133},
        {1972, -12881, -1867, 1453, 224, -80},
    },
    {
        {12495, 21294, -7713, -1295, 305, -5},
        {-11784, 18034, 6770, -1657, -116, 27},
        {-4176, 10202, 2326, -877, -22, 12},
    },
    {
        {-3819, -29400, 2091, 2850, 264, -43},
        {14578, -6789, -10650, -188, 442, 102},
        {6211, -5853, -4599, 191, 224, 42},
    },
    {
        {809, 30822, -1269, -2844, 413, 25},
        {-14617, -998, 10947, -729, -430, 117},
        {-6477, 2487, 4793, -603, -154, 55},
    },
    {
        {8433, -26170, -5194, 1734, 229, -2},
        {14084, 13275, -7975, -1280, 163, 21},
        {7071, 3413, -4066, -402, 95, 9},
    },
    {
        {-9944, 22316, 9055, -2946, -565, 234},
        {-8947, -21758, 8397, 2384, -753, -119},
        {-4924, -7509, 4618, 773, -391, -30},
    },
    {
        {16855, -11037, -9245, 713, 239, 14},
        {5678, 25099, -3037, -1754, 37, 15},
        {4151, 10043, -2259, -709, 41, 8},
    },
    {
        {-14764, -743, 12768, 590, -755, -111},
        {1251, -28953, -1369, 3141, 302, -121},
        {-907, -12877, 663, 1450, 58, -65},
    },
    {
        {16674, 10073, -10164, -274, 269, -48},
        {-5752, 25168, 3064, -1992, 79, -2},
        {-873, 12130, 338, -909, 62, -5},
    },
    {
        {-10765, -22266, 7649, 2456, -223, -91},
        {11307, -18709, -8541, 1401, 490, -10},
        {3908, -10503, -3004, 867, 194, -14},
    },
    {
        {7618, 27590, -5981, -2272, 533, 20},
        {-13363, 11362, 9434, -1646, -324, 123},
        {-5135, 7798, 3564, -956, -89, 56},
    },
    {
        {255, -30159, -667, 2555, 250, -50},
        {15511, 728, -10108, -584, 376, 75},
        {6882, -2708, -4528, -1, 191, 28},
    },
    {
        {-4452, 29731, 3355, -3170, -81, 130},
        {-13352, -9879, 10751, 717, -629, -10},
        {-6344, -1394, 5077, -2, -285, 9},
    },
    {
        {12166, -21738, -7249, 1344, 211, 31},
        {11536, 18947, -6526, -1499, 66, 4},
        {6288, 6197, -3591, -525, 50, 5},
    },
    {
        {-13123, 14381, 11238, -1736, -632, 112},
        {-5873, -26335, 5151, 2812, -396, -104},
        {-3859, -10168, 3367, 1063, -236, -35},
    },
    {
        {17825, -2687, -10110, 440, 252, -40},
        {1096, 26953, -857, -1928, 122, 9},
        {2187, 11538, -1363, -800, 79, 0},
    },
    {
        {-13868, -9798, 11898, 1599, -735, -158},
        {5045, -27344, -4638, 2922, 510, -138},
        {885, -12859, -868, 1427, 150, -76},
    },
    {
        {14242, 17522, -9066, -997, 375, -10},
        {-9542, 21650, 5612, -1987, -77, 42},
        {-2797, 11065, 1557, -960, 4, 17},
    },
    {
        {-6709, -27241, 4081, 2728, 171, -54},
        {14073, -11637, -10119, 280, 455, 93},
        {5429, -7628, -3968, 387, 212, 35},
    },
    {
        {3504, 30442, -3273, -2736, 471, 16},
        {-14310, 4033, 10865, -1153, -402, 118},
        {-5802, 4659, 4349, -762, -127, 52},
    },
    {
        {5471, -28020, -3379, 1894, 155, -2},
        {15613, 8837, -8742, -905, 186, 10},
        {7180, 1053, -4068, -200, 95, 4},
    },
    {
        {-8010, 25980, 7405, -3344, -459, 258},
        {-10399, -18181, 9861, 2000, -852, -97},
        {-5198, -5192, 4930, 523, -409, -16},
    },
    {
        {15316, -15727, -8310, 1116, 212, 2},
        {8593, 23130, -4680, -1584, 107, 16},
        {5153, 8268, -2816, -563, 67, 7},
    },
    {
        {-14767, 4552, 12726, 165, -776, -117},
        {-943, -28993, 432, 3204, 260, -128},
        {-1873, -11845, 1455, 1377, 32, -66},
    },
    {
        {17270, 4870, -10681, 212, 263, -54},
        {-2807, 26909, 1241, -2099, 154, -10},
        {541, 11901, -544, -869, 92, -9},
    },
    {
        {-12873, -18276, 8754, 2068, -244, -70},
        {9874, -21936, -7208, 1632, 412, -9},
        {2900, -11132, -2179, 899, 150, -11},
    },
    {
        {9697, 25139, -7821, -2056, 657, 7},
        {-11788, 15872, 8709, -2135, -284, 153},
        {-4040, 9232, 2910, -1110, -54, 65},
    },
    {
        {-2813, -29362, 1301, 2458, 144, -52},
        {15830, -4148, -9914, -115, 371, 56},
        {6442, -4651, -4065, 195, 171, 18},
    },
    {
        {-2124, 31043, 1650, -3336, -51, 145},
        {-13761, -5435, 11407, 398, -682, -17},
        {-6036, 722, 4977, -160, -292, 7},
    },
    {
        {9609, -24834, -5610, 1641, 144, 25},
        {13677, 15230, -7765, -1146, 118, 0},
        {6687, 4028, -3809, -321, 64, 2},
    },
    {
        {-12037, 18576, 10211, -2029, -586, 105},
        {-7769, -24186, 6616, 2610, -423, -98},
        {-4391, -8384, 3749, 898, -234, -31},
    },
    {
        {16989, -7758, -9865, 927, 242, -55},
        {4042, 26653, -2689, -1916, 212, 6},
        {3262, 10388, -2060, -710, 112, -3},
    },
    {
        {-14828, -4800, 12190, 1121, -716, -139},
        {3079, -28640, -2910, 2986, 421, -129},
        {-91, -12332, -54, 1344, 106, -67},
    },
    {
        {15384, 13396, -10167, -648, 431, -19},
        {-7147, 24593, 4291, -2271, -23, 51},
        {-1527, 11405, 809, -1001, 32, 19},
    },
    {
        {-9373, -24386, 5715, 2445, 80, -48},
        {13277, -15733, -9196, 682, 412, 75},
        {4569, -8760, -3234, 514, 177, 26},
    },
    {
        {5740, 29397, -5090, -2666, 553, 19},
        {-13501, 8637, 10634, -1564, -404, 132},
        {-4975, 6324, 3869, -896, -113, 56},
    },
    {
        {2359, -28949, -1512, 1986, 80, -5},
        {16610, 4233, -9182, -499, 207, 2},
        {6989, -1047, -3895, -12, 92, 1},
    },
    {
        {-6167, 28663, 5797, -3578, -406, 260},
        {-11472, -14285, 10910, 1663, -892, -97},
        {-5260, -3051, 5006, 331, -403, -14},
    },
    {
        {13260, -19778, -7156, 1476, 158, -7},
        {11136, 20495, -6177, -1335, 169, 9},
        {5815, 6425, -3209, -400, 84, 3},
    },
    {
        {-14523, 9469, 12316, -262, -766, -108},
        {-3152, -28168, 2202, 3162, 192, -128},
        {-2692, -10544, 2091, 1261, 4, -63},
    },
    {
        {17146, -296, -10905, 703, 263, -66},
        {120, 27837, -635, -2168, 239, -12},
        {1708, 11300, -1313, -813, 123, -11},
    },
    {
        {-14675, -13846, 9601, 1691, -253, -59},
        {8006, -24569, -5741, 1813, 352, -5},
        {1859, -11322, -1412, 898, 118, -8},
    },
    {
        {11385, 21858, -9487, -1741, 758, -12},
        {-9919, 20067, 7645, -2583, -218, 174},
        {-2964, 10228, 2202, -1214, -16, 69},
    },
    {
        {-5968, -27662, 3187, 2257, 40, -46},
        {15587, -8949, -9373, 342, 337, 34},
        {5785, -6215, -3496, 351, 140, 10},
    },
    {
        {247, 31589, -232, -3496, 7, 172},
        {-13786, -581, 11858, 9, -755, -15},
        {-5566, 2672, 4769, -321, -304, 10},
    },
    {
        {6505, -27301, -3714, 1878, 79, 19},
        {15381, 10728, -8771, -737, 162, -2},
        {6791, 1837, -3868, -122, 72, 1},
    },
};

// mars: degree=4, segment_days=160
static const int16_t mars_ephemeris[12][3][5] = {
    {
        {-10241, 22315, 3551, -857, -155},
        {-17595, -10299, 5029, 763, -84},
        {-7829, -4857, 2218, 337, -35},
    },
    {
        {20841, -1144, -7353, 255, 233},
        {1167, 24086, -633, -1326, 64},
        {67, 10649, -182, -579, 26},
    },
    {
        {-9368, -19817, 2994, 536, -124},
        {20049, -7289, -3176, 857, 101},
        {9237, -2401, -1295, 387, 48},
    },
    {
        {-24723, 1411, -838, -1548, 123},
        {12000, 2612, -876, -2415, 417},
        {6832, 790, -958, -930, 298},
    },
    {
        {-22688, 6780, 4853, 323, -141},
        {-6126, -18909, 128, 878, 47},
        {-2543, -8833, 144, 371, 23},
    },
    {
        {12997, 20597, -4604, -1259, 137},
        {-14591, 15412, 5433, -802, -204},
        {-6829, 6715, 2450, -349, -90},
    },
    {
        {7844, -22934, -1741, 1109, -31},
        {18877, 8227, -5586, -76, 139},
        {8261, 4036, -2414, -37, 62},
    },
    {
        {-24706, -5352, 3136, -598, -164},
        {5818, -15176, 1547, 1017, 53},
        {3651, -5952, 726, 446, 18},
    },
    {
        {-27828, 412, 826, 232, 231},
        {-4012, -1006, -5246, -484, 902},
        {-887, -1643, -2343, -23, 328},
    },
    {
        {-4741, 24488, 2182, -1101, -163},
        {-19376, -4352, 5525, 686, -157},
        {-8977, -2046, 2514, 295, -68},
    },
    {
        {20117, -7705, -6677, 645, 164},
        {6057, 22611, -2351, -1101, 125},
        {2427, 10247, -1008, -489, 55},
    },
    {
        {-14536, -17972, 3631, 492, -86},
        {16285, -13160, -3524, 610, 41},
        {7630, -5408, -1552, 266, 18},
    },
};

// jupiter: degree=4, segment_days=160
static const int16_t jupiter_ephemeris[12][3][5] = {
    {
        {-9863, -636, 1954, -23, -106},
        {24462, -226, 659, 17, -76},
        {10664, -2, 291, 5, -34},
    },
    {
        {-9903, -3078, -1724, 259, 44},
        {24312, -1171, -670, -24, -3},
        {10742, -470, -294, -7, -2},
    },
    {
        {-20058, -4792, 955, 110, -12},
        {17910, -4376, 402, 262, 20},
        {8094, -1789, 193, 115, 8},
    },
    {
        {-22148, 1581, -478, -434, 48},
        {16149, 1842, -568, -440, 87},
        {7532, 828, -290, -186, 42},
    },
    {
        {-24919, -3450, 275, 156, -27},
        {11445, -6328, -519, 176, 12},
        {5476, -2731, -202, 77, 5},
    },
    {
        {-28232, 8, 239, -13, 18},
        {2978, -12, 1784, -110, -132},
        {1994, 142, 754, -64, -59},
    },
    {
        {-28129, -341, -109, 140, 16},
        {2937, -3272, -1580, 188, 25},
        {1968, -1535, -671, 88, 8},
    },
    {
        {-26844, 1719, -60, -211, -18},
        {-7996, -5417, 1084, 221, -5},
        {-2802, -2252, 498, 94, -3},
    },
    {
        {-26468, -859, 414, 150, -54},
        {-9794, 1935, -899, -471, 101},
        {-3481, 757, -443, -191, 47},
    },
    {
        {-22970, 4488, 573, -114, -29},
        {-14803, -5870, 58, 212, -14},
        {-5850, -2594, 53, 92, -6},
    },
    {
        {-17085, -559, -1432, 212, 131},
        {-21096, 393, 995, -113, -59},
        {-8542, 211, 402, -62, -25},
    },
    {
        {-16657, 3604, 1420, -112, -14},
        {-21152, -2217, -783, 221, 18},
        {-8719, -1103, -322, 99, 6},
    },
};

// saturn: degree=4, segment_days=160
static const int16_t saturn_ephemeris[12][3][5] = {
    {
        {28420, -26, 43, 25, -9},
        {-770, -866, 860, 182, -59},
        {-1623, -296, 410, 65, -27},
    },
    {
        {28140, -448, -113, 42, 13},
        {3305, 3881, -255, -173, 6},
        {230, 1625, -151, -74, 3},
    },
    {
        {27883, 360, 38, -76, 5},
        {5604, -1695, -279, 305, 30},
        {1032, -780, -59, 138, 8},
    },
    {
        {27511, -960, -252, 9, 11},
        {6682, 3414, 491, -186, -2},
        {1627, 1554, 173, -83, 0},
    },
    {
        {25775, -78, 488, -10, -35},
        {11562, 204, -961, 22, 42},
        {3625, -60, -402, 25, 19},
    },
    {
        {26065, -553, -490, 2, 9},
        {10926, 1055, 1002, -66, -45},
        {3382, 617, 428, -42, -17},
    },
    {
        {22902, -1834, 428, 134, -5},
        {15838, 2405, -650, -96, 10},
        {5580, 934, -313, -36, 6},
    },
    {
        {22780, 906, -445, -160, 37},
        {16125, -1115, 513, 231, -41},
        {5613, -382, 276, 87, -21},
    },
    {
        {20163, -3168, -84, 139, 9},
        {18639, 2953, -124, -125, 12},
        {6902, 1297, -95, -53, 5},
    },
    {
        {17596, 1243, 519, -245, -45},
        {20968, -907, -407, 150, 38},
        {7812, -430, -124, 76, 13},
    },
    {
        {17113, -2779, -691, 121, 10},
        {21154, 1831, 382, -140, -1},
        {8074, 927, 134, -64, 1},
    },
    {
        {11722, -1064, 1083, 69, -44},
        {24175, 493, -460, -7, 6},
        {9412, 133, -200, 7, 4},
    },
};

// uranus: degree=3, segment_days=160
static const int16_t uranus_ephemeris[12][3][4] = {
    {
        {14520, 938, 145, -135},
        {22521, -515, -89, 70},
        {9652, -218, -36, 30},
    },
    {
        {14363, -1455, -284, 87},
        {22584, 767, 129, -56},
        {9697, 342, 54, -25},
    },
    {
        {12443, 224, 503, -41},
        {23545, -103, -223, 16},
        {10124, -42, -96, 7},
    },
    {
        {13063, -535, -525, 28},
        {23253, 243, 248, -20},
        {10011, 116, 107, -9},
    },
    {
        {10718, -951, 476, 63},
        {24231, 362, -185, -14},
        {10449, 161, -80, -6},
    },
    {
        {11182, 598, -438, -90},
        {24055, -233, 169, 41},
        {10385, -92, 74, 17},
    },
    {
        {9461, -1779, 168, 105},
        {24638, 579, -83, -28},
        {10653, 257, -36, -12},
    },
    {
        {8862, 1095, 37, -159},
        {24839, -332, -21, 47},
        {10752, -137, -9, 20},
    },
    {
        {8395, -1766, -226, 104},
        {24953, 491, 37, -37},
        {10815, 220, 16, -16},
    },
    {
        {6486, 501, 501, -76},
        {25448, -114, -108, 12},
        {11044, -42, -47, 5},
    },
    {
        {7046, -879, -541, 55},
        {25312, 196, 122, -21},
        {10998, 90, 53, -9},
    },
    {
        {4469, -755, 560, 47},
        {25798, 113, -85, 0},
        {11222, 58, -36, 0},
    },
};

// neptune: degree=3, segment_days=160
static const int16_t neptune_ephemeris[12][3][4] = {
    {
        {28482, 2, -1, 3},
        {235, -459, 261, 65},
        {-631, -186, 120, 26},
    },
    {
        {28454, -40, -7, 6},
        {1208, 1087, -122, -71},
        {-196, 457, -62, -30},
    },
    {
        {28448, 37, -3, -5},
        {1497, -723, -26, 91},
        {-109, -320, -1, 40},
    },
    {
        {28430, -66, -19, 1},
        {1694, 1061, 140, -74},
        {-6, 466, 52, -33},
    },
    {
        {28355, 37, 28, -7},
        {2745, -380, -282, 49},
        {416, -190, -116, 23},
    },
    {
        {28393, -48, -31, -1},
        {2325, 514, 337, -34},
        {239, 244, 142, -17},
    },
    {
        {28230, -44, 50, 4},
        {3754, 326, -342, -15},
        {846, 109, -150, -4},
    },
    {
        {28298, 30, -40, -3},
        {3256, -231, 327, 40},
        {612, -79, 147, 15},
    },
    {
        {28112, -161, 28, 15},
        {4441, 945, -204, -59},
        {1136, 388, -97, -25},
    },
    {
        {28116, 122, -20, -14},
        {4449, -690, 87, 90},
        {1104, -296, 49, 38},
    },
    {
        {28017, -221, -21, 14},
        {4930, 1121, 41, -76},
        {1335, 486, 7, -33},
    },
    {
        {27863, 128, 44, -18},
        {5712, -558, -204, 69},
        {1635, -262, -79, 32},
    },
};

// pluto: degree=3, segment_days=160
static const int16_t pluto_ephemeris[12][3][4] = {
    {
        {14980, 316, 273, -18},
        {-21422, 181, 158, -6},
        {-11333, 80, 63, -8},
    },
    {
        {16046, 280, -264, -12},
        {-20732, 227, -162, -12},
        {-11155, -25, -76, 0},
    },
    {
        {15642, -246, 233, 36},
        {-20919, -150, 135, 23},
        {-11379, -66, 73, 4},
    },
    {
        {16459, 723, -148, -49},
        {-20371, 512, -79, -36},
        {-11206, 125, -57, -13},
    },
    {
        {16471, -544, 46, 64},
        {-20283, -336, 21, 42},
        {-11355, -190, 39, 17},
    },
    {
        {16737, 808, 47, -60},
        {-20086, 560, 54, -38},
        {-11303, 203, -5, -18},
    },
    {
        {17310, -411, -154, 48},
        {-19612, -240, -118, 33},
        {-11289, -209, -26, 20},
    },
    {
        {17062, 492, 215, -36},
        {-19760, 336, 159, -18},
        {-11404, 162, 52, -14},
    },
    {
        {17993, 37, -244, 7},
        {-19025, 94, -186, 1},
        {-11229, -101, -78, 8},
    },
    {
        {17566, -28, 248, 13},
        {-19288, -36, 175, 13},
        {-11456, 18, 85, -2},
    },
    {
        {18440, 513, -192, -32},
        {-18591, 461, -136, -31},
        {-11221, 73, -81, -8},
    },
    {
        {18252, -428, 122, 53},
        {-18652, -330, 81, 41},
        {-11430, -149, 68, 13},
    },
};

typedef struct {
    const void *coefficients;
    uint32_t segment_count;
    uint16_t segment_days;
    uint8_t cheb_degree;
} ephemeris_body_t;

static const ephemeris_body_t ephemeris_bodies[] = {
    { mercury_ephemeris, 58, 32, 5 }, // mercury
    { venus_ephemeris, 29, 64, 5 }, // venus
    { moon_ephemeris, 153, 12, 5 }, // moon
    { mars_ephemeris, 12, 160, 4 }, // mars
    { jupiter_ephemeris, 12, 160, 4 }, // jupiter
    { saturn_ephemeris, 12, 160, 4 }, // saturn
    { uranus_ephemeris, 12, 160, 3 }, // uranus
    { neptune_ephemeris, 12, 160, 3 }, // neptune
    { pluto_ephemeris, 12, 160, 3 }, // pluto
};
