diff --git a/.github/workflows/formal_verification.yml b/.github/workflows/formal_verification.yml index c9d6d664..55a906d3 100644 --- a/.github/workflows/formal_verification.yml +++ b/.github/workflows/formal_verification.yml @@ -37,7 +37,7 @@ jobs: # Remove `cdylib` from targets in Cargo.toml because it confuses Kani sed '17d' Cargo.toml > Cargo.toml.new mv Cargo.toml.new Cargo.toml - cargo kani | (cargo kani --visualize && exit 1) # Re-run for artifacts if it has failed. + cargo kani - name: Save formal verification artifacts uses: actions/upload-artifact@v3 diff --git a/Cargo.toml b/Cargo.toml index d006a69d..29de1014 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "hifitime" -version = "3.7.0" +version = "3.8.0" authors = ["Christopher Rabotin "] description = "Ultra-precise date and time handling in Rust for scientific applications with leap second support" homepage = "https://nyxspace.com/" @@ -10,7 +10,7 @@ keywords = ["date", "time", "science", "leap-second", "no-std"] categories = ["date-and-time"] readme = "README.md" license = "Apache-2.0" -exclude = ["*.tar.gz"] +exclude = ["*.tar.gz", "data/"] edition = "2021" [lib] @@ -24,6 +24,9 @@ der = {version = "0.6.1", features = ["derive", "real"], optional = true} pyo3 = { version = "0.17.3", features = ["extension-module"], optional = true} num-traits = {version = "0.2.15", default-features = false, features = ["libm"]} lexical-core = {version = "0.8.5", default-features = false, features = ["parse-integers", "parse-floats"]} +reqwest = { version = "0.11", features = ["blocking", "json"], optional = true} +tabled = {version = "0.10.0", optional = true} +openssl = { version = "0.10", features = ["vendored"], optional = true } [dev-dependencies] serde_json = "1.0.91" @@ -34,7 +37,8 @@ iai = "0.1" default = ["std"] std = ["serde", "serde_derive"] asn1der = ["der"] -python = ["std", "asn1der", "pyo3"] +python = ["std", "asn1der", "pyo3", "ut1"] +ut1 = ["std", "reqwest", "tabled", "openssl"] [[bench]] name = "bench_epoch" diff --git a/README.md b/README.md index a1170064..2a8745e6 100644 --- a/README.md +++ b/README.md @@ -292,7 +292,12 @@ Thanks again to [@gwbres](https://github.com/gwbres) for his work in this releas + Fix CI of the formal verification and upload artifacts, cf. [#179](https://github.com/nyx-space/hifitime/pull/179) + Introduce time of week construction and conversion by [@gwbres](https://github.com/gwbres), cf.[#180](https://github.com/nyx-space/hifitime/pull/180) and [#188](https://github.com/nyx-space/hifitime/pull/188) + Fix minor typo in `src/timeunits.rs` by [@gwbres](https://github.com/gwbres), cf. [#189](https://github.com/nyx-space/hifitime/pull/189) -+ Significantly extend formal verification of `Duration` and `Epoch`, and introduce `kani::Arbitrary` to `Duration` and `Epoch` for others to formally verify their use of time, cf. [#192](https://github.com/nyx-space/hifitime/pull/192) ++ Significantly extend formal verification of `Duration` and `Epoch`, and introduce `kani::Arbitrary` to `Duration` and `Epoch` for users to formally verify their use of time, cf. [#192](https://github.com/nyx-space/hifitime/pull/192) ++ It is now possible to specify a Leap Seconds file (in IERS format) using the `LeapSecondsFile::from_path` (requires the `std` feature to read the file), cf. [#43](https://github.com/nyx-space/hifitime/issues/43). ++ UT1 time scale is now supported! You must build a `Ut1Provider` structure with data from the JPL Earth Orientation Parameters, or just use `Ut1Provider::download_short_from_jpl()` to automatically download the data from NASA JPL. ++ `strptime` and `strftime` equivalents from C89 are now supported, cf. [#181](https://github.com/nyx-space/hifitime/issues/181). Please refer to the [documentation](https://docs.rs/hifitime/latest/hifitime/efmt/format/struct.Format.html) for important limitations and how to build a custom formatter. ++ ISO Day of Year and Day In Year are now supported for initialization of an Epoch (provided a time scale and a year), and formatting, cf. [#182](https://github.com/nyx-space/hifitime/issues/182). ++ **Python:** the representation of an epoch is now in the time scale it was initialized in ## 3.7.0 Huge thanks to [@gwbres](https://github.com/gwbres) who put in all of the work for this release. These usability changes allow [Rinex](https://crates.io/crates/rinex) to use hifitime, check out this work. diff --git a/data/eop-2021-10-12--2023-01-04.short b/data/eop-2021-10-12--2023-01-04.short new file mode 100644 index 00000000..8426dbd2 --- /dev/null +++ b/data/eop-2021-10-12--2023-01-04.short @@ -0,0 +1,470 @@ + $ JPL Earth Orientation Parameter 2 (EOP2) File + $ Last UTPM Data Point 2022-10-12T00:00:00 UTC + $ UTPM Predicts to 2023-01-04T00:00:00 UTC + $ + $ Last DX,DY Data Point 2022-09-23T00:00:00 UTC + $ DX, DY Predicts to 2023-01-04T00:00:00 UTC + $ + EOP2LBL='EOP2. LAST UTPM DATUM 2022-10-12. UTPM PREDICTS-> 2023-01-04. UT1TYP=UT1.' + EOP2LXY=' LAST DX,DY DATUM 2022-09-23. DX,DY PREDICTS-> 2023-01-04.' + EOP2FNG='Enter MAKE_EOP2 2022-10-12T18:04:13 UTC linked 2020-08-05T19:40:43 UTC' + EOP2UT1='UT1' + EOP2TYP='EOP2' + EOP2TIM='2022-10-12T18:04:13 UTC' + EOP2TRF='ITRF2008' + EOP2CRF='ICRF2' + EOP2PNM='IAU 2006/2000A' + $ + $ MJD, PMx, PMy, TAI-UT1, PMxSig, PMySig, UTSig, UTPM Correlations, DX, DY, DXSig DYSig Corr. + $ (TAI) (mas) (mas) (ms) (mas) (mas) (ms) PMxy PMxUT PMyUT (mas) (mas) (mas) (mas) DXDY + EOP2= + 59500.0, 201.3317, 265.0565, 37105.3665, 0.0513, 0.0427, 0.0057, -0.1109, -0.0673, 0.0189, 0.281, -0.008, 0.024, 0.025, 0.000, $ 2021-10-13 + 59501.0, 199.4109, 264.5047, 37105.0474, 0.0610, 0.0504, 0.0081, -0.2026, -0.0223, 0.0111, 0.293, -0.032, 0.031, 0.031, 0.000, $ 2021-10-14 + 59502.0, 197.0837, 264.0177, 37104.8148, 0.0545, 0.0469, 0.0070, -0.1505, -0.0118, -0.0180, 0.290, -0.055, 0.031, 0.031, 0.000, $ 2021-10-15 + 59503.0, 194.6100, 263.3153, 37104.7202, 0.0612, 0.0506, 0.0070, -0.2006, 0.0021, 0.0006, 0.283, -0.065, 0.036, 0.036, 0.000, $ 2021-10-16 + 59504.0, 192.4698, 262.7114, 37104.7926, 0.0617, 0.0508, 0.0079, -0.2080, 0.0000, -0.0001, 0.276, -0.070, 0.040, 0.040, 0.000, $ 2021-10-17 + 59505.0, 190.3628, 262.0345, 37105.0009, 0.0619, 0.0507, 0.0096, -0.2126, 0.0003, 0.0009, 0.268, -0.075, 0.037, 0.037, 0.000, $ 2021-10-18 + 59506.0, 188.4810, 261.1113, 37105.3213, 0.0498, 0.0417, 0.0059, -0.0702, -0.0582, 0.0002, 0.261, -0.081, 0.025, 0.025, 0.000, $ 2021-10-19 + 59507.0, 186.9936, 260.3410, 37105.6503, 0.0613, 0.0505, 0.0087, -0.2037, -0.0044, -0.0001, 0.274, -0.100, 0.031, 0.032, 0.000, $ 2021-10-20 + 59508.0, 185.8976, 259.6487, 37105.9518, 0.0600, 0.0492, 0.0092, -0.1649, -0.1575, 0.1496, 0.293, -0.122, 0.032, 0.034, 0.000, $ 2021-10-21 + 59509.0, 185.0655, 258.8858, 37106.1545, 0.0510, 0.0461, 0.0064, -0.1394, -0.1128, -0.0109, 0.304, -0.132, 0.028, 0.028, 0.000, $ 2021-10-22 + 59510.0, 183.8797, 258.0497, 37106.1624, 0.0605, 0.0504, 0.0066, -0.1920, -0.0376, 0.0240, 0.308, -0.122, 0.034, 0.034, 0.000, $ 2021-10-23 + 59511.0, 182.2353, 256.8276, 37105.9438, 0.0616, 0.0507, 0.0078, -0.2064, -0.0011, 0.0005, 0.310, -0.104, 0.040, 0.040, 0.000, $ 2021-10-24 + 59512.0, 180.7876, 255.7241, 37105.5501, 0.0616, 0.0507, 0.0101, -0.2085, -0.0005, -0.0019, 0.312, -0.086, 0.038, 0.039, 0.000, $ 2021-10-25 + 59513.0, 179.3721, 255.1358, 37105.0628, 0.0539, 0.0451, 0.0084, -0.1662, 0.0267, 0.0255, 0.314, -0.069, 0.029, 0.031, 0.000, $ 2021-10-26 + 59514.0, 177.3481, 254.6524, 37104.5738, 0.0574, 0.0487, 0.0064, -0.1794, -0.2261, 0.0553, 0.328, -0.092, 0.030, 0.031, 0.000, $ 2021-10-27 + 59515.0, 175.0103, 254.1547, 37104.1158, 0.0612, 0.0505, 0.0091, -0.2050, -0.0247, 0.0184, 0.320, -0.105, 0.033, 0.033, 0.000, $ 2021-10-28 + 59516.0, 172.9500, 253.7018, 37103.7560, 0.0517, 0.0447, 0.0072, -0.0886, -0.0080, -0.0235, 0.304, -0.112, 0.026, 0.027, 0.000, $ 2021-10-29 + 59517.0, 171.1076, 253.4360, 37103.5738, 0.0611, 0.0507, 0.0075, -0.2003, 0.0004, 0.0014, 0.297, -0.108, 0.034, 0.035, 0.000, $ 2021-10-30 + 59518.0, 169.1368, 253.0232, 37103.6489, 0.0622, 0.0509, 0.0084, -0.2096, 0.0000, 0.0000, 0.294, -0.100, 0.041, 0.042, 0.000, $ 2021-10-31 + 59519.0, 167.1692, 252.5435, 37104.0446, 0.0625, 0.0522, 0.0123, -0.2059, 0.0001, -0.0001, 0.291, -0.092, 0.043, 0.044, 0.000, $ 2021-11-01 + 59520.0, 165.5198, 251.9544, 37104.6913, 0.0649, 0.0533, 0.0149, -0.1902, -0.0002, -0.0001, 0.288, -0.084, 0.040, 0.041, 0.000, $ 2021-11-02 + 59521.0, 164.3554, 251.1525, 37105.5117, 0.0559, 0.0473, 0.0096, -0.1553, -0.0167, 0.0101, 0.285, -0.077, 0.031, 0.032, 0.000, $ 2021-11-03 + 59522.0, 163.2678, 250.4069, 37106.3561, 0.0584, 0.0488, 0.0065, -0.1806, -0.2257, 0.0766, 0.266, -0.079, 0.029, 0.030, 0.000, $ 2021-11-04 + 59523.0, 161.4001, 249.7890, 37107.0318, 0.0513, 0.0455, 0.0058, -0.1118, -0.0673, -0.0074, 0.215, -0.054, 0.025, 0.027, 0.000, $ 2021-11-05 + 59524.0, 158.9366, 249.2495, 37107.4107, 0.0609, 0.0506, 0.0070, -0.1966, -0.0199, 0.0103, 0.219, -0.051, 0.032, 0.034, 0.000, $ 2021-11-06 + 59525.0, 156.4983, 248.6990, 37107.4994, 0.0622, 0.0509, 0.0084, -0.2111, 0.0003, -0.0001, 0.256, -0.064, 0.039, 0.040, 0.000, $ 2021-11-07 + 59526.0, 154.3875, 248.0627, 37107.3801, 0.0621, 0.0507, 0.0097, -0.2115, -0.0005, -0.0016, 0.293, -0.078, 0.038, 0.039, 0.000, $ 2021-11-08 + 59527.0, 152.5043, 247.5708, 37107.1692, 0.0567, 0.0460, 0.0079, -0.1816, -0.0258, 0.0546, 0.330, -0.091, 0.031, 0.032, 0.000, $ 2021-11-09 + 59528.0, 150.7839, 247.1394, 37106.9736, 0.0572, 0.0494, 0.0061, -0.1726, -0.2487, 0.0766, 0.342, -0.102, 0.030, 0.031, 0.000, $ 2021-11-10 + 59529.0, 149.4973, 246.7782, 37106.9041, 0.0618, 0.0506, 0.0106, -0.2083, -0.0355, 0.0200, 0.329, -0.084, 0.035, 0.035, 0.000, $ 2021-11-11 + 59530.0, 148.5024, 246.5823, 37106.9977, 0.0576, 0.0482, 0.0104, -0.2122, -0.0296, 0.0516, 0.311, -0.058, 0.033, 0.032, 0.000, $ 2021-11-12 + 59531.0, 147.7101, 246.4679, 37107.2428, 0.0615, 0.0519, 0.0082, -0.1933, -0.0473, 0.0228, 0.298, -0.059, 0.038, 0.037, 0.000, $ 2021-11-13 + 59532.0, 146.9702, 246.4276, 37107.6138, 0.0624, 0.0534, 0.0106, -0.2007, -0.0031, 0.0019, 0.286, -0.070, 0.041, 0.040, 0.000, $ 2021-11-14 + 59533.0, 145.6797, 246.2908, 37107.9833, 0.0622, 0.0520, 0.0099, -0.2071, 0.0005, 0.0002, 0.274, -0.082, 0.039, 0.038, 0.000, $ 2021-11-15 + 59534.0, 143.5629, 245.9654, 37108.2691, 0.0525, 0.0472, 0.0058, -0.1898, -0.0009, -0.0185, 0.263, -0.093, 0.029, 0.027, 0.000, $ 2021-11-16 + 59535.0, 141.4789, 245.3630, 37108.4632, 0.0582, 0.0492, 0.0077, -0.1530, 0.1219, -0.0498, 0.225, -0.077, 0.031, 0.031, 0.000, $ 2021-11-17 + 59536.0, 139.7450, 245.1202, 37108.5377, 0.0572, 0.0500, 0.0102, -0.1792, 0.0459, -0.0260, 0.230, -0.057, 0.031, 0.032, 0.000, $ 2021-11-18 + 59537.0, 137.7751, 245.2332, 37108.4601, 0.0521, 0.0450, 0.0060, -0.1161, -0.0224, -0.0218, 0.265, 0.002, 0.025, 0.025, 0.000, $ 2021-11-19 + 59538.0, 135.5397, 245.3067, 37108.1964, 0.0608, 0.0505, 0.0074, -0.1959, -0.0259, 0.0158, 0.280, 0.003, 0.033, 0.033, 0.000, $ 2021-11-20 + 59539.0, 133.4981, 245.9258, 37107.7775, 0.0616, 0.0507, 0.0098, -0.2079, -0.0089, 0.0046, 0.287, -0.023, 0.039, 0.039, 0.000, $ 2021-11-21 + 59540.0, 131.6180, 246.8425, 37107.2905, 0.0617, 0.0506, 0.0095, -0.2110, 0.0004, 0.0006, 0.294, -0.048, 0.039, 0.039, 0.000, $ 2021-11-22 + 59541.0, 129.7089, 247.2107, 37106.7499, 0.0510, 0.0438, 0.0050, -0.1381, -0.1196, 0.0272, 0.300, -0.073, 0.031, 0.031, 0.000, $ 2021-11-23 + 59542.0, 127.8427, 247.2960, 37106.2081, 0.0492, 0.0416, 0.0047, -0.0618, -0.0392, -0.0203, 0.323, -0.059, 0.023, 0.023, 0.000, $ 2021-11-24 + 59543.0, 126.5816, 247.6721, 37105.7199, 0.0500, 0.0433, 0.0051, -0.0801, -0.0935, -0.0024, 0.369, -0.106, 0.022, 0.022, 0.000, $ 2021-11-25 + 59544.0, 125.2885, 248.3553, 37105.3808, 0.0560, 0.0482, 0.0057, -0.1864, -0.0611, 0.0708, 0.370, -0.083, 0.028, 0.028, 0.000, $ 2021-11-26 + 59545.0, 123.9256, 249.1413, 37105.2948, 0.0622, 0.0508, 0.0083, -0.2080, -0.0159, 0.0057, 0.344, -0.083, 0.036, 0.036, 0.000, $ 2021-11-27 + 59546.0, 122.5217, 250.0855, 37105.4442, 0.0649, 0.0508, 0.0094, -0.1909, -0.0470, 0.0248, 0.313, -0.103, 0.040, 0.040, 0.000, $ 2021-11-28 + 59547.0, 120.9644, 250.7881, 37105.7585, 0.0682, 0.0509, 0.0113, -0.1888, -0.0030, 0.0011, 0.282, -0.122, 0.037, 0.037, 0.000, $ 2021-11-29 + 59548.0, 119.4781, 251.3941, 37106.2292, 0.0535, 0.0425, 0.0065, -0.0835, -0.0413, 0.0042, 0.252, -0.141, 0.026, 0.026, 0.000, $ 2021-11-30 + 59549.0, 117.8459, 252.1970, 37106.8176, 0.0482, 0.0410, 0.0050, -0.0490, -0.0851, -0.0003, 0.269, -0.180, 0.020, 0.020, 0.000, $ 2021-12-01 + 59550.0, 116.5863, 253.0976, 37107.3567, 0.0603, 0.0503, 0.0070, -0.2008, -0.0941, 0.0304, 0.282, -0.176, 0.028, 0.028, 0.000, $ 2021-12-02 + 59551.0, 115.1410, 254.1315, 37107.7589, 0.0556, 0.0474, 0.0061, -0.1375, -0.0022, 0.0042, 0.307, -0.151, 0.029, 0.029, 0.000, $ 2021-12-03 + 59552.0, 113.5538, 254.4211, 37107.8945, 0.0663, 0.0531, 0.0084, -0.1642, 0.0024, -0.0009, 0.310, -0.143, 0.035, 0.035, 0.000, $ 2021-12-04 + 59553.0, 112.1852, 254.5870, 37107.7630, 0.0650, 0.0522, 0.0105, -0.1935, -0.0002, 0.0000, 0.304, -0.141, 0.041, 0.041, 0.000, $ 2021-12-05 + 59554.0, 110.8699, 255.0829, 37107.5202, 0.0664, 0.0511, 0.0111, -0.2051, 0.0006, 0.0011, 0.297, -0.140, 0.040, 0.040, 0.000, $ 2021-12-06 + 59555.0, 109.0805, 255.6967, 37107.2687, 0.0565, 0.0445, 0.0063, -0.1345, 0.0146, -0.0439, 0.290, -0.139, 0.033, 0.032, 0.000, $ 2021-12-07 + 59556.0, 106.6565, 256.2444, 37107.1264, 0.0621, 0.0507, 0.0097, -0.2104, 0.0038, 0.0030, 0.283, -0.137, 0.034, 0.034, 0.000, $ 2021-12-08 + 59557.0, 103.9814, 256.7719, 37107.1585, 0.0576, 0.0492, 0.0080, -0.1675, -0.2318, 0.0753, 0.276, -0.135, 0.030, 0.031, 0.000, $ 2021-12-09 + 59558.0, 101.3232, 257.0848, 37107.3886, 0.0522, 0.0459, 0.0055, -0.0802, -0.0601, -0.0026, 0.285, -0.136, 0.024, 0.025, 0.000, $ 2021-12-10 + 59559.0, 98.4049, 257.3399, 37107.7521, 0.0645, 0.0531, 0.0074, -0.1720, -0.0403, 0.0207, 0.294, -0.150, 0.032, 0.032, 0.000, $ 2021-12-11 + 59560.0, 95.2950, 257.3563, 37108.1927, 0.0656, 0.0521, 0.0099, -0.1984, -0.0060, 0.0124, 0.301, -0.168, 0.036, 0.036, 0.000, $ 2021-12-12 + 59561.0, 92.5803, 257.4302, 37108.6114, 0.0574, 0.0495, 0.0078, -0.2295, -0.2378, -0.0374, 0.308, -0.187, 0.032, 0.031, 0.000, $ 2021-12-13 + 59562.0, 90.2355, 258.0988, 37108.9502, 0.0482, 0.0411, 0.0054, -0.0593, -0.0845, 0.0098, 0.331, -0.142, 0.022, 0.022, 0.000, $ 2021-12-14 + 59563.0, 87.8619, 258.9436, 37109.1920, 0.0551, 0.0475, 0.0051, -0.1600, -0.2042, 0.0651, 0.327, -0.149, 0.026, 0.027, 0.000, $ 2021-12-15 + 59564.0, 85.2743, 259.7904, 37109.2791, 0.0514, 0.0449, 0.0059, -0.0022, -0.0408, 0.0418, 0.317, -0.162, 0.026, 0.026, 0.000, $ 2021-12-16 + 59565.0, 82.5958, 260.6684, 37109.2534, 0.0531, 0.0464, 0.0051, -0.1221, -0.0069, -0.0319, 0.283, -0.154, 0.026, 0.027, 0.000, $ 2021-12-17 + 59566.0, 80.3010, 261.2835, 37109.0459, 0.0607, 0.0505, 0.0078, -0.1946, -0.0360, 0.0215, 0.270, -0.143, 0.034, 0.035, 0.000, $ 2021-12-18 + 59567.0, 78.7301, 261.7245, 37108.7213, 0.0617, 0.0508, 0.0110, -0.2088, -0.0040, 0.0019, 0.268, -0.132, 0.038, 0.039, 0.000, $ 2021-12-19 + 59568.0, 77.2859, 262.5590, 37108.3731, 0.0615, 0.0506, 0.0111, -0.2089, 0.0006, 0.0006, 0.267, -0.122, 0.036, 0.036, 0.000, $ 2021-12-20 + 59569.0, 75.2864, 263.4734, 37107.9921, 0.0507, 0.0423, 0.0055, -0.1059, -0.0259, -0.0206, 0.265, -0.112, 0.024, 0.025, 0.000, $ 2021-12-21 + 59570.0, 73.1134, 264.2874, 37107.5864, 0.0611, 0.0505, 0.0083, -0.2054, -0.0008, 0.0027, 0.264, -0.097, 0.030, 0.030, 0.000, $ 2021-12-22 + 59571.0, 70.8788, 265.2061, 37107.3026, 0.0627, 0.0510, 0.0099, -0.2159, 0.0003, -0.0002, 0.262, -0.082, 0.029, 0.029, 0.000, $ 2021-12-23 + 59572.0, 68.5182, 266.4774, 37107.2541, 0.0634, 0.0511, 0.0129, -0.2193, 0.0006, -0.0004, 0.267, -0.105, 0.036, 0.037, 0.000, $ 2021-12-24 + 59573.0, 66.1410, 267.7761, 37107.3937, 0.0632, 0.0511, 0.0142, -0.2162, -0.0426, 0.0228, 0.275, -0.142, 0.043, 0.043, 0.000, $ 2021-12-25 + 59574.0, 64.2690, 268.9725, 37107.7329, 0.0638, 0.0513, 0.0147, -0.2232, -0.0204, 0.0106, 0.283, -0.179, 0.044, 0.044, 0.000, $ 2021-12-26 + 59575.0, 62.7433, 270.3445, 37108.2815, 0.0638, 0.0512, 0.0125, -0.2255, 0.0016, 0.0003, 0.291, -0.217, 0.041, 0.041, 0.000, $ 2021-12-27 + 59576.0, 61.0518, 271.8675, 37108.9201, 0.0555, 0.0460, 0.0056, -0.1604, 0.0264, -0.0555, 0.299, -0.254, 0.032, 0.032, 0.000, $ 2021-12-28 + 59577.0, 59.2584, 273.4370, 37109.5522, 0.0634, 0.0511, 0.0087, -0.2208, 0.0055, 0.0008, 0.262, -0.250, 0.035, 0.035, 0.000, $ 2021-12-29 + 59578.0, 57.7675, 274.6618, 37110.0947, 0.0587, 0.0479, 0.0069, -0.1969, 0.0180, -0.0318, 0.214, -0.234, 0.035, 0.035, 0.000, $ 2021-12-30 + 59579.0, 56.2491, 275.9352, 37110.4250, 0.0627, 0.0510, 0.0084, -0.2121, 0.0055, -0.0014, 0.203, -0.218, 0.040, 0.040, 0.000, $ 2021-12-31 + 59580.0, 54.6203, 276.9796, 37110.5023, 0.0652, 0.0522, 0.0107, -0.1952, -0.0020, 0.0005, 0.205, -0.202, 0.044, 0.045, 0.000, $ 2022-01-01 + 59581.0, 53.4048, 277.9202, 37110.3630, 0.0648, 0.0521, 0.0107, -0.1894, -0.0445, 0.0234, 0.206, -0.186, 0.044, 0.045, 0.000, $ 2022-01-02 + 59582.0, 52.9476, 279.0337, 37110.0794, 0.0626, 0.0509, 0.0096, -0.2140, -0.0048, 0.0020, 0.208, -0.170, 0.040, 0.041, 0.000, $ 2022-01-03 + 59583.0, 53.2127, 280.6971, 37109.8907, 0.0534, 0.0461, 0.0062, -0.1476, 0.0198, 0.0054, 0.210, -0.154, 0.029, 0.031, 0.000, $ 2022-01-04 + 59584.0, 53.4485, 282.9207, 37109.8755, 0.0616, 0.0507, 0.0093, -0.2054, 0.0010, -0.0015, 0.219, -0.138, 0.034, 0.035, 0.000, $ 2022-01-05 + 59585.0, 52.9288, 285.0328, 37110.0482, 0.0642, 0.0518, 0.0132, -0.1887, 0.0000, 0.0012, 0.229, -0.121, 0.036, 0.037, 0.000, $ 2022-01-06 + 59586.0, 51.7560, 286.9016, 37110.3631, 0.0550, 0.0469, 0.0078, -0.1065, -0.0166, -0.0228, 0.240, -0.104, 0.029, 0.030, 0.000, $ 2022-01-07 + 59587.0, 50.2080, 288.6494, 37110.7718, 0.0616, 0.0507, 0.0073, -0.2030, -0.0003, 0.0017, 0.251, -0.088, 0.034, 0.035, 0.000, $ 2022-01-08 + 59588.0, 48.6056, 290.1813, 37111.2018, 0.0623, 0.0508, 0.0099, -0.2123, 0.0000, -0.0001, 0.261, -0.073, 0.039, 0.039, 0.000, $ 2022-01-09 + 59589.0, 47.1293, 291.4565, 37111.5765, 0.0622, 0.0507, 0.0094, -0.2151, 0.0001, 0.0004, 0.272, -0.058, 0.037, 0.038, 0.000, $ 2022-01-10 + 59590.0, 45.5503, 292.5963, 37111.8502, 0.0516, 0.0440, 0.0055, -0.1344, -0.0229, -0.0053, 0.282, -0.043, 0.026, 0.028, 0.000, $ 2022-01-11 + 59591.0, 44.2474, 293.4492, 37111.9367, 0.0613, 0.0505, 0.0073, -0.2050, -0.0011, 0.0014, 0.246, -0.069, 0.031, 0.032, 0.000, $ 2022-01-12 + 59592.0, 43.3759, 294.4074, 37111.8462, 0.0576, 0.0483, 0.0059, -0.2043, 0.0550, -0.0279, 0.199, -0.107, 0.030, 0.030, 0.000, $ 2022-01-13 + 59593.0, 43.1155, 295.8804, 37111.5842, 0.0515, 0.0441, 0.0049, -0.0892, -0.0214, -0.0191, 0.199, -0.085, 0.024, 0.024, 0.000, $ 2022-01-14 + 59594.0, 42.9517, 297.9173, 37111.1346, 0.0584, 0.0499, 0.0062, -0.1648, -0.0502, 0.0278, 0.181, -0.085, 0.027, 0.029, 0.000, $ 2022-01-15 + 59595.0, 42.4029, 299.8886, 37110.5762, 0.0572, 0.0488, 0.0081, -0.1325, -0.0439, 0.0243, 0.172, -0.095, 0.031, 0.034, 0.000, $ 2022-01-16 + 59596.0, 41.4237, 301.4626, 37109.9647, 0.0615, 0.0507, 0.0082, -0.2084, -0.0004, 0.0017, 0.193, -0.096, 0.035, 0.037, 0.000, $ 2022-01-17 + 59597.0, 39.8959, 302.9319, 37109.3435, 0.0554, 0.0475, 0.0052, -0.1737, -0.3343, 0.0929, 0.215, -0.098, 0.029, 0.031, 0.000, $ 2022-01-18 + 59598.0, 38.4889, 303.9751, 37108.8040, 0.0498, 0.0428, 0.0054, -0.0748, -0.0669, -0.0008, 0.189, -0.139, 0.024, 0.024, 0.000, $ 2022-01-19 + 59599.0, 37.7956, 305.0133, 37108.4286, 0.0505, 0.0439, 0.0053, -0.0916, -0.0822, -0.0095, 0.177, -0.177, 0.022, 0.023, 0.000, $ 2022-01-20 + 59600.0, 37.4181, 306.1579, 37108.2811, 0.0519, 0.0438, 0.0052, -0.0706, -0.0419, -0.0130, 0.201, -0.180, 0.022, 0.022, 0.000, $ 2022-01-21 + 59601.0, 36.8918, 307.3191, 37108.3208, 0.0660, 0.0520, 0.0089, -0.1693, -0.0052, 0.0031, 0.195, -0.171, 0.031, 0.031, 0.000, $ 2022-01-22 + 59602.0, 35.9079, 308.6333, 37108.4891, 0.0677, 0.0534, 0.0112, -0.1760, 0.0003, -0.0001, 0.175, -0.162, 0.037, 0.037, 0.000, $ 2022-01-23 + 59603.0, 34.4187, 310.0919, 37108.7455, 0.0682, 0.0521, 0.0096, -0.1832, -0.0005, 0.0005, 0.154, -0.152, 0.035, 0.035, 0.000, $ 2022-01-24 + 59604.0, 32.6933, 311.5206, 37109.0137, 0.0534, 0.0433, 0.0055, -0.0869, -0.0716, 0.0127, 0.134, -0.142, 0.023, 0.024, 0.000, $ 2022-01-25 + 59605.0, 31.3804, 312.7797, 37109.2088, 0.0664, 0.0532, 0.0074, -0.1641, -0.0675, -0.0033, 0.160, -0.143, 0.029, 0.030, 0.000, $ 2022-01-26 + 59606.0, 30.2354, 314.0933, 37109.2607, 0.0584, 0.0512, 0.0099, -0.2073, 0.0384, 0.0205, 0.201, -0.148, 0.029, 0.032, 0.000, $ 2022-01-27 + 59607.0, 29.1034, 315.6524, 37109.1344, 0.0541, 0.0456, 0.0066, -0.1295, 0.0002, -0.0266, 0.225, -0.162, 0.026, 0.027, 0.000, $ 2022-01-28 + 59608.0, 28.2683, 317.1522, 37108.8047, 0.0644, 0.0508, 0.0085, -0.1901, -0.0007, 0.0013, 0.218, -0.176, 0.033, 0.034, 0.000, $ 2022-01-29 + 59609.0, 27.5228, 318.9897, 37108.3350, 0.0677, 0.0509, 0.0098, -0.1798, -0.0459, 0.0224, 0.200, -0.188, 0.038, 0.039, 0.000, $ 2022-01-30 + 59610.0, 26.6636, 320.9414, 37107.8169, 0.0653, 0.0509, 0.0102, -0.2049, -0.0066, 0.0028, 0.183, -0.201, 0.035, 0.036, 0.000, $ 2022-01-31 + 59611.0, 26.0421, 323.1042, 37107.3826, 0.0522, 0.0433, 0.0062, -0.0984, -0.0188, -0.0091, 0.166, -0.214, 0.023, 0.025, 0.000, $ 2022-02-01 + 59612.0, 25.7856, 325.4540, 37107.1486, 0.0571, 0.0494, 0.0079, -0.2162, 0.0463, 0.0183, 0.162, -0.213, 0.024, 0.027, 0.000, $ 2022-02-02 + 59613.0, 25.6155, 327.7378, 37107.1146, 0.0544, 0.0478, 0.0063, -0.1747, 0.0372, -0.0456, 0.175, -0.192, 0.026, 0.028, 0.000, $ 2022-02-03 + 59614.0, 25.7648, 329.9718, 37107.2262, 0.0558, 0.0470, 0.0055, -0.1693, -0.0091, -0.0220, 0.165, -0.186, 0.029, 0.031, 0.000, $ 2022-02-04 + 59615.0, 25.7507, 332.1182, 37107.4241, 0.0613, 0.0506, 0.0082, -0.2044, -0.0006, 0.0022, 0.166, -0.153, 0.036, 0.037, 0.000, $ 2022-02-05 + 59616.0, 25.7181, 333.8795, 37107.6000, 0.0619, 0.0508, 0.0106, -0.2105, 0.0001, -0.0002, 0.174, -0.108, 0.039, 0.040, 0.000, $ 2022-02-06 + 59617.0, 25.7018, 335.5997, 37107.6562, 0.0618, 0.0507, 0.0107, -0.2116, 0.0003, 0.0007, 0.182, -0.064, 0.036, 0.037, 0.000, $ 2022-02-07 + 59618.0, 25.0930, 337.2777, 37107.5766, 0.0509, 0.0443, 0.0061, -0.0961, -0.0424, -0.0022, 0.190, -0.019, 0.024, 0.026, 0.000, $ 2022-02-08 + 59619.0, 24.1133, 338.4712, 37107.3026, 0.0632, 0.0517, 0.0102, -0.1801, -0.0047, 0.0022, 0.209, -0.011, 0.032, 0.033, 0.000, $ 2022-02-09 + 59620.0, 22.9012, 339.5041, 37106.8166, 0.0615, 0.0506, 0.0129, -0.2055, -0.0002, -0.0012, 0.232, -0.013, 0.036, 0.037, 0.000, $ 2022-02-10 + 59621.0, 21.2952, 340.6221, 37106.1198, 0.0564, 0.0466, 0.0078, -0.1648, 0.0223, 0.0126, 0.254, -0.014, 0.032, 0.034, 0.000, $ 2022-02-11 + 59622.0, 19.5461, 341.9074, 37105.2566, 0.0612, 0.0506, 0.0078, -0.2016, 0.0020, -0.0023, 0.261, -0.038, 0.036, 0.038, 0.000, $ 2022-02-12 + 59623.0, 18.0869, 343.0858, 37104.3934, 0.0617, 0.0508, 0.0094, -0.2090, -0.0174, 0.0093, 0.262, -0.070, 0.040, 0.041, 0.000, $ 2022-02-13 + 59624.0, 17.2425, 344.3007, 37103.6176, 0.0617, 0.0506, 0.0092, -0.2101, -0.0138, 0.0090, 0.264, -0.103, 0.037, 0.038, 0.000, $ 2022-02-14 + 59625.0, 16.7590, 345.8780, 37102.9881, 0.0508, 0.0437, 0.0058, -0.1123, -0.0266, -0.0343, 0.265, -0.135, 0.026, 0.027, 0.000, $ 2022-02-15 + 59626.0, 16.4034, 347.6561, 37102.5297, 0.0619, 0.0506, 0.0098, -0.2097, -0.0002, 0.0030, 0.266, -0.188, 0.032, 0.031, 0.000, $ 2022-02-16 + 59627.0, 16.1425, 349.9590, 37102.2768, 0.0623, 0.0508, 0.0128, -0.2151, 0.0004, 0.0008, 0.261, -0.211, 0.035, 0.034, 0.000, $ 2022-02-17 + 59628.0, 15.9014, 352.5520, 37102.2718, 0.0532, 0.0460, 0.0074, -0.1336, -0.0158, -0.0156, 0.254, -0.223, 0.028, 0.028, 0.000, $ 2022-02-18 + 59629.0, 16.0190, 354.9785, 37102.4851, 0.0615, 0.0507, 0.0079, -0.2056, -0.0231, 0.0139, 0.242, -0.202, 0.034, 0.034, 0.000, $ 2022-02-19 + 59630.0, 16.1494, 357.2970, 37102.8280, 0.0627, 0.0509, 0.0103, -0.2182, -0.0160, 0.0086, 0.227, -0.169, 0.038, 0.039, 0.000, $ 2022-02-20 + 59631.0, 16.2516, 359.4112, 37103.1888, 0.0629, 0.0508, 0.0110, -0.2220, 0.0003, 0.0003, 0.212, -0.135, 0.036, 0.036, 0.000, $ 2022-02-21 + 59632.0, 16.6233, 361.2728, 37103.5150, 0.0509, 0.0427, 0.0058, -0.1117, -0.0400, 0.0048, 0.197, -0.102, 0.024, 0.025, 0.000, $ 2022-02-22 + 59633.0, 17.5800, 362.7635, 37103.7106, 0.0571, 0.0484, 0.0060, -0.1798, -0.2468, 0.0724, 0.239, -0.153, 0.027, 0.026, 0.000, $ 2022-02-23 + 59634.0, 18.4256, 364.3555, 37103.6998, 0.0549, 0.0474, 0.0074, -0.0808, 0.0486, -0.0021, 0.251, -0.155, 0.029, 0.027, 0.000, $ 2022-02-24 + 59635.0, 18.9157, 365.7828, 37103.4688, 0.0516, 0.0448, 0.0060, -0.0945, -0.0140, -0.0316, 0.237, -0.171, 0.025, 0.025, 0.000, $ 2022-02-25 + 59636.0, 19.5944, 367.2494, 37103.0832, 0.0606, 0.0505, 0.0075, -0.1929, -0.0388, 0.0230, 0.227, -0.169, 0.033, 0.033, 0.000, $ 2022-02-26 + 59637.0, 20.2227, 368.8278, 37102.6580, 0.0621, 0.0508, 0.0100, -0.2110, -0.0025, 0.0011, 0.221, -0.155, 0.039, 0.038, 0.000, $ 2022-02-27 + 59638.0, 20.6227, 370.6080, 37102.3180, 0.0621, 0.0507, 0.0100, -0.2121, 0.0006, 0.0010, 0.214, -0.142, 0.037, 0.037, 0.000, $ 2022-02-28 + 59639.0, 20.8703, 372.3469, 37102.1417, 0.0513, 0.0438, 0.0058, -0.0495, -0.0236, -0.0308, 0.207, -0.128, 0.028, 0.027, 0.000, $ 2022-03-01 + 59640.0, 21.8299, 374.0393, 37102.1653, 0.0614, 0.0518, 0.0103, -0.1956, -0.0004, 0.0013, 0.230, -0.111, 0.034, 0.034, 0.000, $ 2022-03-02 + 59641.0, 23.3116, 376.2367, 37102.4211, 0.0618, 0.0507, 0.0139, -0.2078, 0.0007, 0.0017, 0.260, -0.093, 0.037, 0.038, 0.000, $ 2022-03-03 + 59642.0, 25.0062, 378.4659, 37102.8320, 0.0551, 0.0459, 0.0080, -0.1015, -0.0091, -0.0323, 0.290, -0.076, 0.031, 0.034, 0.000, $ 2022-03-04 + 59643.0, 26.7064, 380.5355, 37103.2453, 0.0617, 0.0507, 0.0081, -0.2075, 0.0010, 0.0017, 0.279, -0.068, 0.036, 0.038, 0.000, $ 2022-03-05 + 59644.0, 28.1393, 382.6032, 37103.5569, 0.0629, 0.0510, 0.0101, -0.2177, 0.0000, -0.0001, 0.254, -0.065, 0.040, 0.040, 0.000, $ 2022-03-06 + 59645.0, 29.5463, 384.7291, 37103.7215, 0.0626, 0.0508, 0.0097, -0.2177, 0.0003, 0.0010, 0.229, -0.062, 0.037, 0.037, 0.000, $ 2022-03-07 + 59646.0, 30.9111, 386.7037, 37103.6827, 0.0499, 0.0430, 0.0057, -0.0800, -0.0426, -0.0235, 0.204, -0.058, 0.026, 0.025, 0.000, $ 2022-03-08 + 59647.0, 32.1736, 388.5221, 37103.3983, 0.0614, 0.0506, 0.0095, -0.2068, -0.0013, 0.0060, 0.232, -0.058, 0.032, 0.032, 0.000, $ 2022-03-09 + 59648.0, 33.0526, 390.2960, 37102.9140, 0.0613, 0.0506, 0.0095, -0.2089, -0.0668, 0.0017, 0.274, -0.059, 0.034, 0.034, 0.000, $ 2022-03-10 + 59649.0, 33.6191, 392.0918, 37102.3219, 0.0525, 0.0451, 0.0063, -0.0947, -0.0461, 0.0002, 0.318, -0.048, 0.027, 0.028, 0.000, $ 2022-03-11 + 59650.0, 34.1046, 393.6859, 37101.6537, 0.0613, 0.0506, 0.0082, -0.2025, -0.0014, 0.0026, 0.322, -0.047, 0.033, 0.034, 0.000, $ 2022-03-12 + 59651.0, 34.3878, 395.1566, 37100.9956, 0.0648, 0.0521, 0.0103, -0.1961, 0.0001, -0.0001, 0.311, -0.051, 0.039, 0.038, 0.000, $ 2022-03-13 + 59652.0, 34.3573, 396.6237, 37100.3779, 0.0679, 0.0532, 0.0102, -0.1793, -0.0003, 0.0011, 0.300, -0.055, 0.037, 0.036, 0.000, $ 2022-03-14 + 59653.0, 34.2179, 398.0493, 37099.8721, 0.0524, 0.0445, 0.0063, -0.0627, -0.0307, -0.0262, 0.290, -0.059, 0.026, 0.025, 0.000, $ 2022-03-15 + 59654.0, 33.9406, 399.5501, 37099.5480, 0.0592, 0.0497, 0.0059, -0.1696, -0.2545, 0.0619, 0.315, -0.066, 0.028, 0.026, 0.000, $ 2022-03-16 + 59655.0, 33.5388, 401.2160, 37099.4434, 0.0557, 0.0466, 0.0071, 0.0286, -0.1151, 0.0720, 0.298, -0.088, 0.026, 0.024, 0.000, $ 2022-03-17 + 59656.0, 33.1033, 402.8643, 37099.5423, 0.0566, 0.0473, 0.0059, -0.0901, -0.0145, -0.0359, 0.289, -0.123, 0.029, 0.029, 0.000, $ 2022-03-18 + 59657.0, 32.9176, 404.4115, 37099.7918, 0.0639, 0.0507, 0.0072, -0.1866, 0.0032, 0.0012, 0.282, -0.125, 0.037, 0.038, 0.000, $ 2022-03-19 + 59658.0, 33.0279, 405.9461, 37100.1674, 0.0670, 0.0508, 0.0082, -0.1801, 0.0000, 0.0000, 0.274, -0.115, 0.043, 0.043, 0.000, $ 2022-03-20 + 59659.0, 33.4019, 407.3896, 37100.5366, 0.0669, 0.0508, 0.0115, -0.1793, 0.0002, -0.0001, 0.265, -0.105, 0.043, 0.043, 0.000, $ 2022-03-21 + 59660.0, 34.3010, 408.8434, 37100.7535, 0.0666, 0.0518, 0.0118, -0.1749, -0.0005, 0.0004, 0.256, -0.095, 0.038, 0.038, 0.000, $ 2022-03-22 + 59661.0, 35.7733, 410.7280, 37100.7652, 0.0527, 0.0441, 0.0064, -0.0834, -0.0549, 0.0149, 0.247, -0.084, 0.026, 0.026, 0.000, $ 2022-03-23 + 59662.0, 37.1744, 412.8318, 37100.5639, 0.0577, 0.0507, 0.0056, -0.1904, -0.1610, -0.0036, 0.234, -0.079, 0.027, 0.027, 0.000, $ 2022-03-24 + 59663.0, 38.2922, 414.8967, 37100.1803, 0.0521, 0.0444, 0.0046, -0.0507, -0.0783, 0.0210, 0.235, -0.115, 0.023, 0.022, 0.000, $ 2022-03-25 + 59664.0, 39.2717, 416.8747, 37099.7259, 0.0654, 0.0532, 0.0069, -0.1508, -0.0064, 0.0024, 0.249, -0.115, 0.031, 0.031, 0.000, $ 2022-03-26 + 59665.0, 40.3570, 418.5352, 37099.3148, 0.0671, 0.0534, 0.0080, -0.1690, 0.0001, 0.0000, 0.266, -0.101, 0.038, 0.038, 0.000, $ 2022-03-27 + 59666.0, 41.6304, 420.1374, 37099.0371, 0.0677, 0.0533, 0.0079, -0.1726, 0.0001, 0.0003, 0.284, -0.087, 0.036, 0.037, 0.000, $ 2022-03-28 + 59667.0, 42.7136, 421.7015, 37098.9676, 0.0558, 0.0455, 0.0050, -0.0881, -0.0007, -0.0313, 0.301, -0.073, 0.026, 0.028, 0.000, $ 2022-03-29 + 59668.0, 43.3871, 423.0701, 37099.0772, 0.0679, 0.0534, 0.0075, -0.1654, 0.0002, 0.0007, 0.293, -0.077, 0.032, 0.033, 0.000, $ 2022-03-30 + 59669.0, 43.5446, 424.8058, 37099.2547, 0.0627, 0.0533, 0.0091, -0.1899, -0.0408, -0.0001, 0.278, -0.087, 0.034, 0.033, 0.000, $ 2022-03-31 + 59670.0, 43.3202, 426.9059, 37099.5028, 0.0575, 0.0483, 0.0063, -0.1238, -0.0135, -0.0098, 0.290, -0.095, 0.029, 0.028, 0.000, $ 2022-04-01 + 59671.0, 43.5645, 428.8708, 37099.8040, 0.0663, 0.0532, 0.0072, -0.1589, -0.0005, 0.0000, 0.296, -0.087, 0.035, 0.034, 0.000, $ 2022-04-02 + 59672.0, 44.3747, 430.9831, 37100.0257, 0.0675, 0.0534, 0.0084, -0.1705, 0.0000, 0.0000, 0.296, -0.075, 0.039, 0.039, 0.000, $ 2022-04-03 + 59673.0, 45.1137, 433.5375, 37100.0848, 0.0650, 0.0521, 0.0093, -0.1946, 0.0002, 0.0007, 0.297, -0.062, 0.038, 0.038, 0.000, $ 2022-04-04 + 59674.0, 45.6032, 436.1236, 37099.9576, 0.0515, 0.0450, 0.0056, -0.1128, -0.0421, -0.0121, 0.297, -0.049, 0.028, 0.028, 0.000, $ 2022-04-05 + 59675.0, 46.3689, 438.2580, 37099.6117, 0.0639, 0.0531, 0.0100, -0.1781, -0.0022, 0.0025, 0.302, -0.049, 0.034, 0.034, 0.000, $ 2022-04-06 + 59676.0, 47.7129, 440.0524, 37099.0940, 0.0667, 0.0530, 0.0129, -0.1702, 0.0003, 0.0003, 0.309, -0.052, 0.037, 0.036, 0.000, $ 2022-04-07 + 59677.0, 49.4172, 441.8268, 37098.5052, 0.0573, 0.0476, 0.0068, -0.1079, -0.0113, -0.0140, 0.316, -0.056, 0.031, 0.030, 0.000, $ 2022-04-08 + 59678.0, 51.2074, 443.5769, 37097.9330, 0.0654, 0.0528, 0.0072, -0.1581, -0.0027, 0.0007, 0.326, -0.058, 0.036, 0.035, 0.000, $ 2022-04-09 + 59679.0, 52.5570, 445.3041, 37097.4009, 0.0632, 0.0528, 0.0080, -0.1725, -0.0434, 0.0236, 0.338, -0.059, 0.039, 0.039, 0.000, $ 2022-04-10 + 59680.0, 53.4387, 447.0450, 37096.9233, 0.0616, 0.0530, 0.0090, -0.1971, -0.0017, 0.0020, 0.349, -0.061, 0.036, 0.036, 0.000, $ 2022-04-11 + 59681.0, 54.2836, 449.0310, 37096.5732, 0.0486, 0.0434, 0.0053, -0.0390, -0.0726, -0.0050, 0.361, -0.063, 0.024, 0.023, 0.000, $ 2022-04-12 + 59682.0, 55.3264, 451.0286, 37096.4290, 0.0609, 0.0528, 0.0081, -0.1888, -0.0041, 0.0045, 0.363, -0.103, 0.029, 0.028, 0.000, $ 2022-04-13 + 59683.0, 56.4867, 452.9144, 37096.5459, 0.0530, 0.0463, 0.0058, -0.0981, -0.0211, -0.0220, 0.362, -0.154, 0.027, 0.025, 0.000, $ 2022-04-14 + 59684.0, 57.8583, 454.4493, 37096.9069, 0.0630, 0.0530, 0.0086, -0.1745, -0.0032, 0.0010, 0.358, -0.151, 0.035, 0.034, 0.000, $ 2022-04-15 + 59685.0, 59.4355, 456.1225, 37097.4235, 0.0645, 0.0533, 0.0093, -0.1868, 0.0001, 0.0000, 0.354, -0.129, 0.043, 0.042, 0.000, $ 2022-04-16 + 59686.0, 61.2994, 457.7450, 37097.9749, 0.0646, 0.0534, 0.0127, -0.1890, 0.0000, 0.0000, 0.349, -0.107, 0.047, 0.046, 0.000, $ 2022-04-17 + 59687.0, 63.7086, 459.2741, 37098.4555, 0.0642, 0.0531, 0.0146, -0.1871, 0.0001, 0.0000, 0.345, -0.084, 0.046, 0.045, 0.000, $ 2022-04-18 + 59688.0, 66.1636, 460.7882, 37098.7836, 0.0641, 0.0530, 0.0115, -0.1860, -0.0003, -0.0003, 0.340, -0.062, 0.041, 0.040, 0.000, $ 2022-04-19 + 59689.0, 68.3278, 461.9909, 37098.8814, 0.0536, 0.0490, 0.0063, -0.1962, -0.0259, 0.0294, 0.336, -0.040, 0.031, 0.028, 0.000, $ 2022-04-20 + 59690.0, 70.4830, 463.0456, 37098.6976, 0.0570, 0.0495, 0.0056, -0.1850, -0.1718, 0.0641, 0.337, -0.066, 0.030, 0.028, 0.000, $ 2022-04-21 + 59691.0, 72.7327, 464.1018, 37098.3236, 0.0565, 0.0475, 0.0051, -0.1070, -0.0484, -0.0028, 0.350, -0.121, 0.026, 0.025, 0.000, $ 2022-04-22 + 59692.0, 75.2207, 465.0819, 37097.9171, 0.0662, 0.0532, 0.0069, -0.1635, -0.0048, 0.0017, 0.356, -0.133, 0.034, 0.033, 0.000, $ 2022-04-23 + 59693.0, 77.8646, 466.2737, 37097.5441, 0.0667, 0.0533, 0.0078, -0.1687, -0.0397, 0.0203, 0.356, -0.128, 0.040, 0.039, 0.000, $ 2022-04-24 + 59694.0, 80.4906, 467.9054, 37097.2774, 0.0671, 0.0533, 0.0102, -0.1739, -0.0040, -0.0014, 0.357, -0.123, 0.040, 0.039, 0.000, $ 2022-04-25 + 59695.0, 82.8338, 469.8490, 37097.1700, 0.0592, 0.0485, 0.0079, -0.1902, -0.0618, 0.1040, 0.358, -0.118, 0.033, 0.033, 0.000, $ 2022-04-26 + 59696.0, 84.8211, 471.4484, 37097.2302, 0.0616, 0.0519, 0.0095, -0.1976, -0.0107, 0.0038, 0.361, -0.131, 0.037, 0.037, 0.000, $ 2022-04-27 + 59697.0, 86.4772, 472.7243, 37097.3521, 0.0620, 0.0519, 0.0099, -0.2032, 0.0007, 0.0001, 0.366, -0.149, 0.039, 0.038, 0.000, $ 2022-04-28 + 59698.0, 87.9383, 473.5380, 37097.4814, 0.0550, 0.0480, 0.0056, -0.0941, -0.0069, -0.0244, 0.370, -0.166, 0.033, 0.032, 0.000, $ 2022-04-29 + 59699.0, 89.6769, 474.0585, 37097.5752, 0.0631, 0.0530, 0.0064, -0.1733, -0.0269, 0.0142, 0.369, -0.150, 0.038, 0.038, 0.000, $ 2022-04-30 + 59700.0, 91.7036, 474.6052, 37097.5532, 0.0628, 0.0523, 0.0077, -0.2128, -0.0030, 0.0019, 0.366, -0.121, 0.043, 0.043, 0.000, $ 2022-05-01 + 59701.0, 93.6414, 475.3055, 37097.4077, 0.0625, 0.0510, 0.0099, -0.2159, 0.0001, -0.0001, 0.363, -0.091, 0.043, 0.043, 0.000, $ 2022-05-02 + 59702.0, 95.5825, 476.0916, 37097.1913, 0.0620, 0.0507, 0.0093, -0.2136, 0.0001, 0.0004, 0.359, -0.062, 0.038, 0.038, 0.000, $ 2022-05-03 + 59703.0, 97.6778, 476.9287, 37096.9006, 0.0520, 0.0432, 0.0057, -0.1214, -0.0188, -0.0061, 0.356, -0.033, 0.026, 0.025, 0.000, $ 2022-05-04 + 59704.0, 99.7695, 477.8829, 37096.5051, 0.0514, 0.0447, 0.0052, -0.1077, -0.1046, 0.0095, 0.339, -0.024, 0.023, 0.022, 0.000, $ 2022-05-05 + 59705.0, 101.6387, 478.8295, 37096.0238, 0.0532, 0.0450, 0.0049, -0.1263, -0.0238, -0.0029, 0.360, -0.007, 0.024, 0.024, 0.000, $ 2022-05-06 + 59706.0, 103.3917, 479.4665, 37095.5625, 0.0615, 0.0507, 0.0067, -0.2054, -0.0024, 0.0023, 0.364, -0.030, 0.033, 0.033, 0.000, $ 2022-05-07 + 59707.0, 105.0931, 480.0354, 37095.1688, 0.0615, 0.0507, 0.0072, -0.2044, -0.0423, 0.0235, 0.357, -0.070, 0.039, 0.038, 0.000, $ 2022-05-08 + 59708.0, 106.6997, 480.4792, 37094.8822, 0.0618, 0.0507, 0.0083, -0.2113, -0.0007, 0.0011, 0.350, -0.109, 0.038, 0.037, 0.000, $ 2022-05-09 + 59709.0, 108.5227, 480.9615, 37094.7995, 0.0517, 0.0459, 0.0055, -0.1255, -0.0127, -0.0300, 0.343, -0.149, 0.028, 0.027, 0.000, $ 2022-05-10 + 59710.0, 110.9104, 481.7563, 37094.9891, 0.0616, 0.0519, 0.0088, -0.1937, 0.0004, 0.0008, 0.343, -0.164, 0.033, 0.032, 0.000, $ 2022-05-11 + 59711.0, 113.4786, 482.6352, 37095.4328, 0.0607, 0.0505, 0.0075, -0.2190, 0.0078, -0.0049, 0.346, -0.172, 0.034, 0.033, 0.000, $ 2022-05-12 + 59712.0, 116.0292, 483.3916, 37096.0516, 0.0536, 0.0476, 0.0050, -0.1443, -0.0108, -0.0143, 0.360, -0.178, 0.028, 0.027, 0.000, $ 2022-05-13 + 59713.0, 118.4886, 483.9250, 37096.7551, 0.0612, 0.0519, 0.0064, -0.1930, -0.0005, 0.0015, 0.377, -0.169, 0.035, 0.034, 0.000, $ 2022-05-14 + 59714.0, 120.6984, 484.4556, 37097.3894, 0.0648, 0.0534, 0.0075, -0.1827, 0.0000, 0.0000, 0.393, -0.155, 0.040, 0.040, 0.000, $ 2022-05-15 + 59715.0, 122.2645, 485.2800, 37097.8844, 0.0678, 0.0534, 0.0091, -0.1754, 0.0000, -0.0012, 0.409, -0.141, 0.040, 0.039, 0.000, $ 2022-05-16 + 59716.0, 123.2586, 485.8037, 37098.1821, 0.0575, 0.0492, 0.0065, -0.1554, 0.0439, 0.0306, 0.426, -0.128, 0.034, 0.031, 0.000, $ 2022-05-17 + 59717.0, 124.6378, 485.6579, 37098.2697, 0.0638, 0.0531, 0.0088, -0.1791, 0.0043, -0.0027, 0.434, -0.126, 0.039, 0.036, 0.000, $ 2022-05-18 + 59718.0, 126.4540, 485.5365, 37098.1549, 0.0641, 0.0532, 0.0104, -0.1836, -0.0010, -0.0005, 0.441, -0.128, 0.041, 0.039, 0.000, $ 2022-05-19 + 59719.0, 128.4121, 485.5976, 37097.9357, 0.0598, 0.0496, 0.0077, -0.1395, -0.0276, 0.0373, 0.448, -0.130, 0.038, 0.035, 0.000, $ 2022-05-20 + 59720.0, 130.6662, 486.0189, 37097.7477, 0.0633, 0.0518, 0.0070, -0.1794, -0.0037, 0.0018, 0.437, -0.123, 0.041, 0.039, 0.000, $ 2022-05-21 + 59721.0, 132.9902, 486.7099, 37097.6850, 0.0616, 0.0508, 0.0083, -0.2057, 0.0001, 0.0000, 0.420, -0.112, 0.043, 0.042, 0.000, $ 2022-05-22 + 59722.0, 135.3518, 487.3445, 37097.7593, 0.0617, 0.0507, 0.0080, -0.2107, -0.0001, -0.0001, 0.402, -0.102, 0.039, 0.038, 0.000, $ 2022-05-23 + 59723.0, 137.7011, 488.1149, 37097.9652, 0.0536, 0.0452, 0.0053, -0.1535, -0.0156, 0.0224, 0.385, -0.092, 0.029, 0.028, 0.000, $ 2022-05-24 + 59724.0, 139.6765, 488.4871, 37098.2387, 0.0562, 0.0492, 0.0056, -0.1698, -0.2311, 0.0472, 0.379, -0.105, 0.028, 0.028, 0.000, $ 2022-05-25 + 59725.0, 141.6558, 488.4805, 37098.4716, 0.0618, 0.0531, 0.0087, -0.1974, -0.0293, 0.0200, 0.383, -0.060, 0.032, 0.032, 0.000, $ 2022-05-26 + 59726.0, 143.5606, 488.4632, 37098.6321, 0.0535, 0.0463, 0.0059, -0.1138, 0.0088, -0.0210, 0.389, 0.004, 0.029, 0.028, 0.000, $ 2022-05-27 + 59727.0, 145.1492, 488.3430, 37098.6073, 0.0614, 0.0508, 0.0068, -0.2047, 0.0026, -0.0002, 0.389, 0.007, 0.035, 0.034, 0.000, $ 2022-05-28 + 59728.0, 146.6749, 488.2272, 37098.3198, 0.0622, 0.0521, 0.0082, -0.2086, 0.0000, 0.0000, 0.387, -0.013, 0.040, 0.040, 0.000, $ 2022-05-29 + 59729.0, 148.1454, 487.9355, 37097.7402, 0.0622, 0.0533, 0.0087, -0.2022, -0.0008, -0.0003, 0.385, -0.033, 0.038, 0.040, 0.000, $ 2022-05-30 + 59730.0, 149.7909, 487.1533, 37096.9058, 0.0529, 0.0452, 0.0067, 0.0117, -0.0493, 0.0571, 0.383, -0.053, 0.030, 0.032, 0.000, $ 2022-05-31 + 59731.0, 151.9903, 486.1677, 37095.8928, 0.0533, 0.0448, 0.0055, -0.1354, -0.0203, 0.0126, 0.396, -0.046, 0.028, 0.028, 0.000, $ 2022-06-01 + 59732.0, 154.3419, 485.4077, 37094.7813, 0.0610, 0.0504, 0.0084, -0.2041, -0.0021, 0.0008, 0.417, -0.044, 0.033, 0.033, 0.000, $ 2022-06-02 + 59733.0, 156.6299, 484.7477, 37093.6438, 0.0568, 0.0477, 0.0060, -0.1907, -0.0409, 0.0186, 0.440, -0.043, 0.033, 0.032, 0.000, $ 2022-06-03 + 59734.0, 158.8745, 484.1300, 37092.5829, 0.0611, 0.0506, 0.0070, -0.1972, -0.0402, 0.0219, 0.440, -0.053, 0.038, 0.037, 0.000, $ 2022-06-04 + 59735.0, 161.1514, 483.6027, 37091.6384, 0.0623, 0.0509, 0.0086, -0.2125, -0.0021, 0.0009, 0.431, -0.067, 0.042, 0.041, 0.000, $ 2022-06-05 + 59736.0, 163.5036, 483.1266, 37090.8077, 0.0622, 0.0508, 0.0092, -0.2122, 0.0003, 0.0036, 0.422, -0.080, 0.040, 0.040, 0.000, $ 2022-06-06 + 59737.0, 166.2539, 482.7911, 37090.1334, 0.0560, 0.0495, 0.0058, -0.1659, -0.3130, 0.0437, 0.414, -0.094, 0.033, 0.031, 0.000, $ 2022-06-07 + 59738.0, 169.3782, 482.8228, 37089.6706, 0.0525, 0.0452, 0.0050, -0.0807, -0.0933, 0.0201, 0.406, -0.105, 0.025, 0.024, 0.000, $ 2022-06-08 + 59739.0, 172.3400, 482.8308, 37089.3383, 0.0615, 0.0519, 0.0077, -0.1972, -0.0060, 0.0045, 0.409, -0.088, 0.032, 0.031, 0.000, $ 2022-06-09 + 59740.0, 175.1713, 482.8507, 37089.0906, 0.0567, 0.0471, 0.0053, -0.1664, -0.0318, 0.0094, 0.415, -0.064, 0.033, 0.031, 0.000, $ 2022-06-10 + 59741.0, 177.8183, 482.6130, 37088.8453, 0.0613, 0.0507, 0.0066, -0.2018, -0.0055, 0.0033, 0.401, -0.071, 0.038, 0.036, 0.000, $ 2022-06-11 + 59742.0, 180.3220, 481.9762, 37088.4951, 0.0614, 0.0507, 0.0080, -0.2013, -0.0417, 0.0229, 0.380, -0.089, 0.041, 0.040, 0.000, $ 2022-06-12 + 59743.0, 182.7822, 481.2061, 37087.9267, 0.0619, 0.0508, 0.0089, -0.2106, -0.0018, 0.0014, 0.359, -0.107, 0.039, 0.038, 0.000, $ 2022-06-13 + 59744.0, 185.0654, 480.3805, 37087.0792, 0.0523, 0.0445, 0.0052, -0.1344, -0.0424, -0.0047, 0.338, -0.125, 0.029, 0.028, 0.000, $ 2022-06-14 + 59745.0, 187.0652, 479.2545, 37085.9843, 0.0613, 0.0506, 0.0071, -0.2049, -0.0022, 0.0026, 0.337, -0.144, 0.036, 0.035, 0.000, $ 2022-06-15 + 59746.0, 189.2095, 477.9883, 37084.7323, 0.0617, 0.0507, 0.0079, -0.2061, 0.0000, -0.0001, 0.340, -0.164, 0.042, 0.041, 0.000, $ 2022-06-16 + 59747.0, 191.6039, 476.6760, 37083.4964, 0.0588, 0.0507, 0.0058, -0.1773, -0.0078, 0.0089, 0.344, -0.184, 0.043, 0.040, 0.000, $ 2022-06-17 + 59748.0, 194.0322, 475.5077, 37082.4324, 0.0612, 0.0518, 0.0072, -0.1946, -0.0017, 0.0010, 0.345, -0.183, 0.046, 0.044, 0.000, $ 2022-06-18 + 59749.0, 196.5860, 474.4901, 37081.5837, 0.0618, 0.0508, 0.0096, -0.2061, 0.0000, 0.0000, 0.345, -0.174, 0.047, 0.046, 0.000, $ 2022-06-19 + 59750.0, 199.4573, 473.5484, 37080.8959, 0.0618, 0.0508, 0.0116, -0.2085, 0.0000, -0.0001, 0.345, -0.165, 0.045, 0.045, 0.000, $ 2022-06-20 + 59751.0, 202.3987, 472.7936, 37080.3146, 0.0614, 0.0505, 0.0110, -0.2088, 0.0002, 0.0005, 0.346, -0.157, 0.039, 0.039, 0.000, $ 2022-06-21 + 59752.0, 205.0985, 472.2519, 37079.7500, 0.0503, 0.0432, 0.0049, -0.0906, -0.0573, -0.0075, 0.346, -0.148, 0.025, 0.025, 0.000, $ 2022-06-22 + 59753.0, 207.5926, 471.5890, 37079.1137, 0.0566, 0.0503, 0.0073, -0.2141, -0.0253, 0.0054, 0.305, -0.153, 0.028, 0.029, 0.000, $ 2022-06-23 + 59754.0, 210.0989, 470.7695, 37078.3015, 0.0531, 0.0458, 0.0055, -0.1259, 0.0033, -0.0224, 0.302, -0.157, 0.026, 0.028, 0.000, $ 2022-06-24 + 59755.0, 212.7146, 469.6795, 37077.3273, 0.0612, 0.0506, 0.0071, -0.2023, 0.0028, 0.0001, 0.333, -0.151, 0.033, 0.035, 0.000, $ 2022-06-25 + 59756.0, 215.3936, 468.4231, 37076.1712, 0.0617, 0.0508, 0.0086, -0.2100, 0.0000, 0.0000, 0.370, -0.142, 0.039, 0.039, 0.000, $ 2022-06-26 + 59757.0, 218.2340, 467.0066, 37074.8387, 0.0617, 0.0506, 0.0099, -0.2108, 0.0002, 0.0005, 0.408, -0.133, 0.038, 0.037, 0.000, $ 2022-06-27 + 59758.0, 221.3863, 465.5797, 37073.3599, 0.0516, 0.0443, 0.0055, -0.1152, -0.0320, -0.0064, 0.445, -0.123, 0.028, 0.028, 0.000, $ 2022-06-28 + 59759.0, 224.4095, 464.1371, 37071.7938, 0.0612, 0.0516, 0.0081, -0.1972, -0.0028, 0.0002, 0.454, -0.101, 0.033, 0.033, 0.000, $ 2022-06-29 + 59760.0, 227.2331, 462.5866, 37070.2047, 0.0610, 0.0493, 0.0080, -0.2305, 0.0201, 0.0533, 0.455, -0.076, 0.034, 0.036, 0.000, $ 2022-06-30 + 59761.0, 230.0089, 460.8282, 37068.6553, 0.0555, 0.0474, 0.0062, -0.1641, 0.0221, -0.0267, 0.446, -0.066, 0.032, 0.034, 0.000, $ 2022-07-01 + 59762.0, 232.9269, 459.2176, 37067.2270, 0.0611, 0.0505, 0.0070, -0.2024, 0.0050, -0.0019, 0.431, -0.080, 0.037, 0.038, 0.000, $ 2022-07-02 + 59763.0, 236.0823, 457.8156, 37065.9625, 0.0627, 0.0510, 0.0081, -0.2166, -0.0001, 0.0000, 0.414, -0.100, 0.040, 0.041, 0.000, $ 2022-07-03 + 59764.0, 239.1537, 456.5351, 37064.9249, 0.0627, 0.0509, 0.0086, -0.2193, 0.0000, 0.0001, 0.398, -0.120, 0.037, 0.037, 0.000, $ 2022-07-04 + 59765.0, 241.8981, 455.1314, 37064.1383, 0.0522, 0.0443, 0.0054, -0.1541, -0.0233, 0.0096, 0.382, -0.140, 0.026, 0.025, 0.000, $ 2022-07-05 + 59766.0, 244.4223, 453.2614, 37063.5458, 0.0516, 0.0434, 0.0048, -0.1025, -0.0881, 0.0056, 0.405, -0.120, 0.023, 0.023, 0.000, $ 2022-07-06 + 59767.0, 247.0674, 451.6102, 37063.0393, 0.0552, 0.0474, 0.0050, -0.1691, -0.0004, -0.0121, 0.387, -0.140, 0.027, 0.028, 0.000, $ 2022-07-07 + 59768.0, 249.7091, 450.1063, 37062.5707, 0.0613, 0.0506, 0.0084, -0.2031, 0.0022, -0.0001, 0.372, -0.147, 0.036, 0.037, 0.000, $ 2022-07-08 + 59769.0, 252.2804, 448.6414, 37062.0284, 0.0618, 0.0508, 0.0080, -0.2092, -0.0005, 0.0002, 0.364, -0.144, 0.042, 0.042, 0.000, $ 2022-07-09 + 59770.0, 254.6571, 447.0217, 37061.3016, 0.0614, 0.0507, 0.0075, -0.2019, -0.0402, 0.0222, 0.356, -0.140, 0.043, 0.043, 0.000, $ 2022-07-10 + 59771.0, 256.7673, 445.3978, 37060.3198, 0.0620, 0.0507, 0.0091, -0.2129, -0.0017, 0.0017, 0.347, -0.136, 0.038, 0.038, 0.000, $ 2022-07-11 + 59772.0, 258.3193, 443.9364, 37059.1218, 0.0507, 0.0436, 0.0055, -0.1224, -0.0446, -0.0117, 0.339, -0.133, 0.026, 0.026, 0.000, $ 2022-07-12 + 59773.0, 259.2154, 441.9968, 37057.7949, 0.0616, 0.0507, 0.0083, -0.2062, -0.0026, 0.0035, 0.347, -0.141, 0.033, 0.033, 0.000, $ 2022-07-13 + 59774.0, 260.2368, 439.9042, 37056.4461, 0.0619, 0.0508, 0.0091, -0.2107, 0.0003, 0.0005, 0.359, -0.152, 0.036, 0.037, 0.000, $ 2022-07-14 + 59775.0, 261.6914, 438.1312, 37055.2436, 0.0549, 0.0472, 0.0064, -0.1707, 0.0097, -0.0301, 0.371, -0.163, 0.032, 0.034, 0.000, $ 2022-07-15 + 59776.0, 263.4359, 436.3372, 37054.2880, 0.0615, 0.0507, 0.0074, -0.2025, 0.0041, -0.0002, 0.374, -0.153, 0.036, 0.038, 0.000, $ 2022-07-16 + 59777.0, 265.2863, 434.3569, 37053.5239, 0.0619, 0.0509, 0.0081, -0.2080, -0.0001, 0.0000, 0.374, -0.135, 0.040, 0.041, 0.000, $ 2022-07-17 + 59778.0, 267.2485, 432.3129, 37052.8885, 0.0620, 0.0508, 0.0086, -0.2122, 0.0001, 0.0004, 0.374, -0.116, 0.037, 0.038, 0.000, $ 2022-07-18 + 59779.0, 269.2344, 430.2812, 37052.2974, 0.0502, 0.0439, 0.0048, -0.1155, -0.0664, 0.0048, 0.374, -0.098, 0.025, 0.027, 0.000, $ 2022-07-19 + 59780.0, 270.9541, 428.1778, 37051.6661, 0.0614, 0.0506, 0.0071, -0.2046, -0.0035, 0.0033, 0.369, -0.111, 0.032, 0.034, 0.000, $ 2022-07-20 + 59781.0, 272.5332, 426.2403, 37050.9106, 0.0623, 0.0507, 0.0079, -0.2124, 0.0002, 0.0003, 0.362, -0.133, 0.035, 0.037, 0.000, $ 2022-07-21 + 59782.0, 274.0465, 424.4507, 37049.9715, 0.0557, 0.0471, 0.0060, -0.1592, -0.0212, -0.0103, 0.356, -0.154, 0.029, 0.033, 0.000, $ 2022-07-22 + 59783.0, 275.6147, 422.6786, 37048.8670, 0.0616, 0.0507, 0.0066, -0.2031, -0.0019, 0.0022, 0.355, -0.169, 0.035, 0.038, 0.000, $ 2022-07-23 + 59784.0, 277.0357, 420.8970, 37047.6008, 0.0620, 0.0508, 0.0076, -0.2075, -0.0204, 0.0110, 0.355, -0.181, 0.040, 0.043, 0.000, $ 2022-07-24 + 59785.0, 278.4602, 419.3182, 37046.1839, 0.0619, 0.0507, 0.0096, -0.2111, -0.0060, 0.0016, 0.355, -0.193, 0.039, 0.044, 0.000, $ 2022-07-25 + 59786.0, 279.8477, 417.8804, 37044.7360, 0.0545, 0.0486, 0.0073, -0.2081, -0.0106, 0.0354, 0.355, -0.205, 0.031, 0.039, 0.000, $ 2022-07-26 + 59787.0, 281.0710, 416.1068, 37043.2743, 0.0616, 0.0506, 0.0114, -0.2040, -0.0031, -0.0008, 0.350, -0.209, 0.037, 0.043, 0.000, $ 2022-07-27 + 59788.0, 282.2590, 414.1264, 37041.8183, 0.0615, 0.0506, 0.0147, -0.2057, -0.0005, -0.0031, 0.343, -0.212, 0.040, 0.044, 0.000, $ 2022-07-28 + 59789.0, 283.3683, 411.8084, 37040.4161, 0.0581, 0.0490, 0.0104, -0.2182, -0.0163, 0.0547, 0.336, -0.214, 0.036, 0.042, 0.000, $ 2022-07-29 + 59790.0, 284.5965, 409.4064, 37039.1895, 0.0613, 0.0506, 0.0077, -0.2030, -0.0066, 0.0000, 0.337, -0.227, 0.040, 0.043, 0.000, $ 2022-07-30 + 59791.0, 285.9509, 407.2701, 37038.1893, 0.0619, 0.0509, 0.0081, -0.2081, -0.0002, 0.0001, 0.341, -0.243, 0.041, 0.043, 0.000, $ 2022-07-31 + 59792.0, 287.0669, 405.1846, 37037.3801, 0.0615, 0.0518, 0.0088, -0.1998, -0.0338, 0.0193, 0.344, -0.259, 0.038, 0.038, 0.000, $ 2022-08-01 + 59793.0, 287.8477, 403.2654, 37036.7388, 0.0515, 0.0442, 0.0063, -0.1182, -0.0940, 0.0499, 0.348, -0.275, 0.026, 0.025, 0.000, $ 2022-08-02 + 59794.0, 288.4787, 400.9970, 37036.2457, 0.0566, 0.0482, 0.0059, -0.1700, -0.2295, 0.0670, 0.380, -0.262, 0.027, 0.027, 0.000, $ 2022-08-03 + 59795.0, 289.5130, 398.7019, 37035.8028, 0.0536, 0.0477, 0.0057, -0.1570, -0.0686, 0.0457, 0.366, -0.259, 0.026, 0.028, 0.000, $ 2022-08-04 + 59796.0, 290.5111, 396.5449, 37035.3223, 0.0607, 0.0516, 0.0091, -0.1897, -0.0082, 0.0047, 0.347, -0.261, 0.034, 0.036, 0.000, $ 2022-08-05 + 59797.0, 291.0685, 394.1840, 37034.7275, 0.0611, 0.0506, 0.0098, -0.2035, 0.0004, -0.0002, 0.333, -0.264, 0.041, 0.042, 0.000, $ 2022-08-06 + 59798.0, 291.5564, 391.6165, 37033.9442, 0.0615, 0.0507, 0.0091, -0.2069, 0.0000, -0.0001, 0.318, -0.266, 0.043, 0.044, 0.000, $ 2022-08-07 + 59799.0, 292.3388, 388.9955, 37032.9682, 0.0618, 0.0507, 0.0100, -0.2105, 0.0003, 0.0009, 0.304, -0.268, 0.039, 0.040, 0.000, $ 2022-08-08 + 59800.0, 293.1915, 386.2056, 37031.8828, 0.0519, 0.0450, 0.0059, -0.1250, -0.0326, -0.0140, 0.290, -0.271, 0.028, 0.030, 0.000, $ 2022-08-09 + 59801.0, 293.8259, 383.2350, 37030.7922, 0.0612, 0.0505, 0.0085, -0.2024, -0.0015, 0.0027, 0.298, -0.277, 0.034, 0.034, 0.000, $ 2022-08-10 + 59802.0, 294.4303, 380.3269, 37029.8414, 0.0615, 0.0506, 0.0097, -0.2082, 0.0003, 0.0006, 0.313, -0.284, 0.035, 0.035, 0.000, $ 2022-08-11 + 59803.0, 295.0194, 377.8261, 37029.1235, 0.0524, 0.0450, 0.0068, -0.1005, -0.0066, -0.0213, 0.328, -0.292, 0.027, 0.027, 0.000, $ 2022-08-12 + 59804.0, 295.5802, 375.6948, 37028.6306, 0.0609, 0.0505, 0.0076, -0.1988, 0.0007, 0.0013, 0.328, -0.275, 0.034, 0.034, 0.000, $ 2022-08-13 + 59805.0, 296.3539, 373.5624, 37028.2908, 0.0616, 0.0507, 0.0087, -0.2075, 0.0000, 0.0000, 0.321, -0.250, 0.041, 0.042, 0.000, $ 2022-08-14 + 59806.0, 297.4208, 371.3209, 37027.9901, 0.0613, 0.0506, 0.0095, -0.2049, 0.0000, 0.0000, 0.315, -0.225, 0.043, 0.044, 0.000, $ 2022-08-15 + 59807.0, 298.4800, 369.0542, 37027.6205, 0.0611, 0.0505, 0.0082, -0.2043, -0.0002, -0.0006, 0.308, -0.199, 0.040, 0.042, 0.000, $ 2022-08-16 + 59808.0, 299.2938, 366.7234, 37027.0811, 0.0538, 0.0475, 0.0052, -0.1472, 0.0321, 0.0331, 0.302, -0.174, 0.030, 0.034, 0.000, $ 2022-08-17 + 59809.0, 299.9112, 364.3684, 37026.3180, 0.0614, 0.0517, 0.0083, -0.1985, 0.0005, -0.0037, 0.305, -0.139, 0.035, 0.038, 0.000, $ 2022-08-18 + 59810.0, 300.8756, 362.0123, 37025.3306, 0.0585, 0.0513, 0.0066, -0.1737, 0.0538, -0.0345, 0.311, -0.101, 0.037, 0.040, 0.000, $ 2022-08-19 + 59811.0, 302.0714, 359.7721, 37024.1790, 0.0614, 0.0518, 0.0075, -0.1984, 0.0115, -0.0066, 0.297, -0.100, 0.041, 0.043, 0.000, $ 2022-08-20 + 59812.0, 302.9778, 357.4128, 37022.8400, 0.0618, 0.0508, 0.0118, -0.2078, -0.0002, 0.0001, 0.276, -0.112, 0.042, 0.044, 0.000, $ 2022-08-21 + 59813.0, 303.7470, 354.9107, 37021.4120, 0.0617, 0.0506, 0.0127, -0.2090, 0.0000, 0.0000, 0.256, -0.124, 0.039, 0.039, 0.000, $ 2022-08-22 + 59814.0, 304.4622, 352.4990, 37019.9900, 0.0529, 0.0433, 0.0058, -0.1183, -0.0359, 0.0171, 0.235, -0.136, 0.027, 0.029, 0.000, $ 2022-08-23 + 59815.0, 304.8691, 349.8963, 37018.6425, 0.0610, 0.0504, 0.0099, -0.2027, -0.0033, 0.0018, 0.258, -0.154, 0.034, 0.034, 0.000, $ 2022-08-24 + 59816.0, 305.1783, 347.4415, 37017.3999, 0.0613, 0.0505, 0.0121, -0.2053, 0.0005, 0.0004, 0.293, -0.172, 0.038, 0.037, 0.000, $ 2022-08-25 + 59817.0, 305.3365, 344.9271, 37016.2852, 0.0538, 0.0469, 0.0062, -0.1409, -0.0120, -0.0195, 0.328, -0.191, 0.034, 0.032, 0.000, $ 2022-08-26 + 59818.0, 305.2524, 342.3262, 37015.3482, 0.0606, 0.0504, 0.0065, -0.1928, -0.0261, 0.0160, 0.335, -0.195, 0.038, 0.037, 0.000, $ 2022-08-27 + 59819.0, 304.9604, 339.8935, 37014.6229, 0.0618, 0.0507, 0.0079, -0.2060, -0.0023, 0.0011, 0.331, -0.195, 0.041, 0.040, 0.000, $ 2022-08-28 + 59820.0, 304.6063, 337.3762, 37014.1127, 0.0619, 0.0506, 0.0093, -0.2092, 0.0004, 0.0009, 0.328, -0.195, 0.038, 0.038, 0.000, $ 2022-08-29 + 59821.0, 304.4543, 335.0018, 37013.7893, 0.0516, 0.0444, 0.0058, -0.1322, -0.0236, -0.0249, 0.325, -0.195, 0.027, 0.029, 0.000, $ 2022-08-30 + 59822.0, 304.5689, 332.7232, 37013.6090, 0.0609, 0.0504, 0.0070, -0.2026, -0.0002, 0.0020, 0.328, -0.182, 0.033, 0.034, 0.000, $ 2022-08-31 + 59823.0, 304.7231, 330.3732, 37013.4742, 0.0615, 0.0505, 0.0073, -0.2078, 0.0001, 0.0001, 0.333, -0.165, 0.035, 0.035, 0.000, $ 2022-09-01 + 59824.0, 304.4925, 327.6583, 37013.2469, 0.0519, 0.0446, 0.0049, -0.0968, -0.0180, -0.0169, 0.338, -0.147, 0.027, 0.027, 0.000, $ 2022-09-02 + 59825.0, 304.1927, 325.0317, 37012.8900, 0.0608, 0.0505, 0.0066, -0.1964, -0.0011, 0.0023, 0.333, -0.155, 0.033, 0.033, 0.000, $ 2022-09-03 + 59826.0, 304.0725, 322.7493, 37012.3752, 0.0617, 0.0507, 0.0078, -0.2072, 0.0000, 0.0000, 0.324, -0.172, 0.038, 0.039, 0.000, $ 2022-09-04 + 59827.0, 303.7540, 320.4541, 37011.7111, 0.0615, 0.0507, 0.0094, -0.2083, -0.0002, -0.0006, 0.315, -0.189, 0.037, 0.038, 0.000, $ 2022-09-05 + 59828.0, 303.2055, 317.9484, 37011.0123, 0.0531, 0.0462, 0.0062, -0.1796, -0.0110, 0.0270, 0.306, -0.206, 0.026, 0.029, 0.000, $ 2022-09-06 + 59829.0, 302.5805, 314.9261, 37010.3972, 0.0613, 0.0506, 0.0088, -0.2025, -0.0025, -0.0004, 0.343, -0.182, 0.033, 0.035, 0.000, $ 2022-09-07 + 59830.0, 301.6612, 311.7660, 37009.9827, 0.0619, 0.0507, 0.0087, -0.2081, 0.0002, 0.0003, 0.393, -0.147, 0.036, 0.037, 0.000, $ 2022-09-08 + 59831.0, 300.2914, 308.6984, 37009.8050, 0.0543, 0.0468, 0.0061, -0.1389, 0.0029, -0.0199, 0.442, -0.112, 0.031, 0.032, 0.000, $ 2022-09-09 + 59832.0, 299.1262, 305.6546, 37009.8959, 0.0614, 0.0507, 0.0071, -0.2016, -0.0031, 0.0029, 0.447, -0.114, 0.036, 0.036, 0.000, $ 2022-09-10 + 59833.0, 298.5252, 302.8528, 37010.1958, 0.0620, 0.0509, 0.0076, -0.2086, -0.0199, 0.0110, 0.436, -0.129, 0.040, 0.040, 0.000, $ 2022-09-11 + 59834.0, 298.0769, 300.2673, 37010.5711, 0.0620, 0.0508, 0.0090, -0.2142, 0.0002, 0.0003, 0.424, -0.145, 0.037, 0.038, 0.000, $ 2022-09-12 + 59835.0, 297.5476, 297.9380, 37010.8640, 0.0521, 0.0433, 0.0051, -0.1113, -0.0441, -0.0013, 0.413, -0.161, 0.026, 0.027, 0.000, $ 2022-09-13 + 59836.0, 296.9521, 295.7861, 37010.9905, 0.0617, 0.0507, 0.0074, -0.2084, -0.0025, 0.0025, 0.412, -0.148, 0.032, 0.033, 0.000, $ 2022-09-14 + 59837.0, 296.3055, 293.7923, 37010.8888, 0.0621, 0.0507, 0.0080, -0.2112, 0.0001, 0.0002, 0.414, -0.129, 0.035, 0.035, 0.000, $ 2022-09-15 + 59838.0, 295.5800, 291.6700, 37010.5313, 0.0527, 0.0454, 0.0052, -0.1059, -0.0034, -0.0224, 0.415, -0.109, 0.028, 0.027, 0.000, $ 2022-09-16 + 59839.0, 294.6977, 289.6031, 37009.9844, 0.0612, 0.0505, 0.0064, -0.2016, 0.0010, 0.0009, 0.418, -0.110, 0.034, 0.033, 0.000, $ 2022-09-17 + 59840.0, 293.5773, 287.7586, 37009.2522, 0.0511, 0.0464, 0.0081, -0.1101, 0.0000, -0.0001, 0.422, -0.119, 0.039, 0.038, 0.000, $ 2022-09-18 + 59841.0, 292.2960, 285.8212, 37008.4279, 0.0419, 0.0424, 0.0090, -0.0047, 0.0002, 0.0007, 0.425, -0.127, 0.037, 0.037, 0.000, $ 2022-09-19 + 59842.0, 291.3369, 283.4942, 37007.5540, 0.0390, 0.0390, 0.0052, 0.0230, -0.0063, -0.0218, 0.428, -0.136, 0.028, 0.026, 0.000, $ 2022-09-20 + 59843.0, 290.6447, 281.0196, 37006.7071, 0.0415, 0.0415, 0.0088, 0.0034, 0.0012, 0.0036, 0.415, -0.101, 0.034, 0.033, 0.000, $ 2022-09-21 + 59844.0, 289.7697, 278.3521, 37005.9947, 0.0418, 0.0419, 0.0108, 0.0002, -0.0001, 0.0004, 0.397, -0.055, 0.037, 0.037, 0.000, $ 2022-09-22 + 59845.0, 288.6332, 275.5391, 37005.4451, 0.0405, 0.0408, 0.0055, 0.0009, 0.0019, -0.0220, 0.379, -0.010, 0.033, 0.032, 0.000, $ 2022-09-23 + 59846.0, 287.2689, 272.9073, 37005.0951, 0.0415, 0.0422, 0.0062, 0.0020, -0.0131, 0.0107, 0.374, 0.001, 0.042, 0.042, 0.000, $ 2022-09-24 + 59847.0, 285.9411, 270.4160, 37004.9451, 0.0418, 0.0421, 0.0077, 0.0002, 0.0009, -0.0005, 0.372, -0.001, 0.055, 0.054, 0.000, $ 2022-09-25 + 59848.0, 285.1587, 268.1427, 37004.9572, 0.0421, 0.0420, 0.0087, 0.0000, 0.0000, 0.0000, 0.371, -0.003, 0.064, 0.064, 0.000, $ 2022-09-26 + 59849.0, 284.7137, 266.3778, 37005.1094, 0.0423, 0.0421, 0.0070, -0.0001, 0.0000, 0.0000, 0.370, -0.006, 0.073, 0.072, 0.000, $ 2022-09-27 + 59850.0, 283.8949, 264.8927, 37005.3161, 0.0428, 0.0422, 0.0076, -0.0001, 0.0000, 0.0000, 0.369, -0.008, 0.080, 0.080, 0.000, $ 2022-09-28 + 59851.0, 283.0040, 263.2665, 37005.4030, 0.0437, 0.0421, 0.0082, -0.0002, 0.0000, 0.0000, 0.367, -0.010, 0.087, 0.086, 0.000, $ 2022-09-29 + 59852.0, 282.3195, 261.4847, 37005.3357, 0.0435, 0.0425, 0.0073, -0.0004, 0.0000, 0.0000, 0.366, -0.012, 0.093, 0.092, 0.000, $ 2022-09-30 + 59853.0, 281.3597, 259.7124, 37005.0464, 0.0431, 0.0431, 0.0077, -0.0002, -0.0002, 0.0001, 0.365, -0.014, 0.098, 0.098, 0.000, $ 2022-10-01 + 59854.0, 280.0349, 257.8471, 37004.5661, 0.0427, 0.0432, 0.0082, 0.0001, 0.0044, -0.0019, 0.363, -0.017, 0.103, 0.103, 0.000, $ 2022-10-02 + 59855.0, 278.4459, 255.7118, 37004.0621, 0.0420, 0.0431, 0.0081, 0.0028, -0.0241, 0.0120, 0.362, -0.019, 0.108, 0.108, 0.000, $ 2022-10-03 + 59856.0, 276.5720, 253.5088, 37003.6062, 0.0421, 0.0428, 0.0074, 0.0002, 0.0016, -0.0007, 0.361, -0.021, 0.113, 0.112, 0.000, $ 2022-10-04 + 59857.0, 274.4178, 251.4185, 37003.2441, 0.0421, 0.0423, 0.0076, 0.0000, 0.0000, 0.0000, 0.359, -0.023, 0.117, 0.117, 0.000, $ 2022-10-05 + 59858.0, 272.4621, 249.2277, 37003.0707, 0.0420, 0.0419, 0.0087, 0.0000, 0.0000, 0.0000, 0.358, -0.025, 0.121, 0.121, 0.000, $ 2022-10-06 + 59859.0, 270.8992, 246.7080, 37003.1806, 0.0422, 0.0423, 0.0075, -0.0001, 0.0000, 0.0000, 0.356, -0.027, 0.125, 0.125, 0.000, $ 2022-10-07 + 59860.0, 269.4267, 244.2713, 37003.5497, 0.0425, 0.0431, 0.0068, 0.0000, 0.0012, -0.0006, 0.355, -0.029, 0.128, 0.128, 0.000, $ 2022-10-08 + 59861.0, 267.4241, 242.1310, 37004.0820, 0.0421, 0.0433, 0.0072, 0.0028, -0.0195, 0.0095, 0.353, -0.031, 0.132, 0.132, 0.000, $ 2022-10-09 + 59862.0, 265.3308, 239.9778, 37004.6455, 0.0417, 0.0427, 0.0091, -0.0014, 0.0033, -0.0014, 0.352, -0.033, 0.135, 0.135, 0.000, $ 2022-10-10 + 59863.0, 263.6845, 237.8537, 37005.1663, 0.0402, 0.0411, 0.0100, -0.0280, -0.0003, 0.0001, 0.350, -0.035, 0.138, 0.138, 0.000, $ 2022-10-11 + 59864.0, 262.0200, 235.7245, 37005.4926, 0.0323, 0.0236, 0.0095, -0.5722, 0.0000, 0.0000, 0.349, -0.038, 0.141, 0.141, 0.000, $ 2022-10-12 + 59865.0, 260.1658, 233.5037, 37005.5797, 0.0449, 0.0395, 0.0169, -0.4670, 0.0000, 0.0000, 0.347, -0.040, 0.144, 0.144, 0.000, $ 2022-10-13 + 59866.0, 257.8437, 231.7738, 37005.4552, 0.0999, 0.0987, 0.0391, -0.0860, 0.0000, 0.0000, 0.346, -0.042, 0.147, 0.147, 0.000, $ 2022-10-14 + 59867.0, 255.2930, 230.4826, 37005.1995, 0.1535, 0.1529, 0.0897, -0.0363, 0.0000, 0.0000, 0.344, -0.044, 0.150, 0.150, 0.000, $ 2022-10-15 + 59868.0, 251.9768, 229.0135, 37004.8803, 0.1934, 0.1930, 0.1519, -0.0229, 0.0000, 0.0000, 0.342, -0.046, 0.152, 0.152, 0.000, $ 2022-10-16 + 59869.0, 248.7268, 227.2097, 37004.5665, 0.2264, 0.2262, 0.2227, -0.0167, 0.0000, 0.0000, 0.341, -0.048, 0.155, 0.155, 0.000, $ 2022-10-17 + 59870.0, 246.2635, 225.1733, 37004.3114, 0.2612, 0.2612, 0.3049, -0.0125, 0.0000, 0.0000, 0.339, -0.050, 0.157, 0.157, 0.000, $ 2022-10-18 + 59871.0, 243.9465, 223.0053, 37004.1689, 0.4599, 0.4598, 0.4029, -0.0040, 0.0000, 0.0000, 0.338, -0.052, 0.159, 0.159, 0.000, $ 2022-10-19 + 59872.0, 241.5969, 220.8713, 37004.1942, 0.8832, 0.8830, 0.5159, -0.0011, 0.0000, 0.0000, 0.336, -0.053, 0.162, 0.162, 0.000, $ 2022-10-20 + 59873.0, 239.2153, 218.7717, 37004.4233, 1.4441, 1.4436, 0.6428, -0.0004, 0.0000, 0.0000, 0.334, -0.055, 0.164, 0.164, 0.000, $ 2022-10-21 + 59874.0, 236.8021, 216.7069, 37004.8667, 2.1070, 2.1060, 0.7823, -0.0002, 0.0000, 0.0000, 0.333, -0.057, 0.166, 0.166, 0.000, $ 2022-10-22 + 59875.0, 234.3579, 214.6775, 37005.5017, 2.8555, 2.8539, 0.9333, -0.0001, 0.0000, 0.0000, 0.331, -0.059, 0.168, 0.168, 0.000, $ 2022-10-23 + 59876.0, 231.8832, 212.6839, 37006.2670, 3.6798, 3.6772, 1.0950, -0.0001, 0.0000, 0.0000, 0.329, -0.061, 0.170, 0.170, 0.000, $ 2022-10-24 + 59877.0, 229.3785, 210.7265, 37007.0656, 4.5728, 4.5691, 1.2667, -0.0001, 0.0000, 0.0000, 0.327, -0.063, 0.172, 0.172, 0.000, $ 2022-10-25 + 59878.0, 226.8445, 208.8058, 37007.7825, 5.5296, 5.5244, 1.4479, -0.0001, 0.0000, 0.0000, 0.326, -0.065, 0.174, 0.174, 0.000, $ 2022-10-26 + 59879.0, 224.2818, 206.9221, 37008.3170, 6.5458, 6.5390, 1.6379, -0.0001, 0.0000, 0.0000, 0.324, -0.067, 0.176, 0.175, 0.000, $ 2022-10-27 + 59880.0, 221.6907, 205.0759, 37008.6158, 7.6182, 7.6094, 1.8365, -0.0001, 0.0000, 0.0000, 0.322, -0.068, 0.177, 0.177, 0.000, $ 2022-10-28 + 59881.0, 219.0720, 203.2676, 37008.6941, 8.7437, 8.7326, 2.0431, -0.0002, 0.0000, 0.0000, 0.320, -0.070, 0.179, 0.179, 0.000, $ 2022-10-29 + 59882.0, 216.4263, 201.4975, 37008.6321, 9.9200, 9.9063, 2.2576, -0.0002, 0.0000, 0.0000, 0.318, -0.072, 0.181, 0.181, 0.000, $ 2022-10-30 + 59883.0, 213.7541, 199.7661, 37008.5504, 11.1449, 11.1282, 2.4795, -0.0002, 0.0000, 0.0000, 0.316, -0.074, 0.182, 0.182, 0.000, $ 2022-10-31 + 59884.0, 211.0559, 198.0738, 37008.5729, 12.4163, 12.3964, 2.7087, -0.0002, 0.0000, 0.0000, 0.315, -0.076, 0.184, 0.184, 0.000, $ 2022-11-01 + 59885.0, 208.3325, 196.4209, 37008.7921, 13.7326, 13.7092, 2.9450, -0.0003, 0.0000, 0.0000, 0.313, -0.077, 0.185, 0.185, 0.000, $ 2022-11-02 + 59886.0, 205.5844, 194.8078, 37009.2465, 15.0923, 15.0649, 3.1880, -0.0003, 0.0000, 0.0000, 0.311, -0.079, 0.187, 0.187, 0.000, $ 2022-11-03 + 59887.0, 202.8123, 193.2347, 37009.9138, 16.4939, 16.4622, 3.4376, -0.0003, 0.0000, 0.0000, 0.309, -0.081, 0.188, 0.188, 0.000, $ 2022-11-04 + 59888.0, 200.0167, 191.7022, 37010.7199, 17.9361, 17.8997, 3.6937, -0.0004, 0.0000, 0.0000, 0.307, -0.082, 0.190, 0.190, 0.000, $ 2022-11-05 + 59889.0, 197.1982, 190.2105, 37011.5596, 19.4177, 19.3763, 3.9560, -0.0004, 0.0000, 0.0000, 0.305, -0.084, 0.191, 0.191, 0.000, $ 2022-11-06 + 59890.0, 194.3576, 188.7598, 37012.3236, 20.9376, 20.8908, 4.2245, -0.0005, 0.0000, 0.0000, 0.303, -0.086, 0.192, 0.192, 0.000, $ 2022-11-07 + 59891.0, 191.4954, 187.3507, 37012.9231, 22.4947, 22.4422, 4.4990, -0.0005, 0.0000, 0.0000, 0.301, -0.087, 0.194, 0.193, 0.000, $ 2022-11-08 + 59892.0, 188.6122, 185.9833, 37013.3069, 24.0882, 24.0295, 4.7793, -0.0006, 0.0000, 0.0000, 0.299, -0.089, 0.195, 0.195, 0.000, $ 2022-11-09 + 59893.0, 185.7088, 184.6579, 37013.4657, 25.7171, 25.6518, 5.0653, -0.0006, 0.0000, 0.0000, 0.297, -0.090, 0.196, 0.196, 0.000, $ 2022-11-10 + 59894.0, 182.7857, 183.3749, 37013.4276, 27.3805, 27.3082, 5.3569, -0.0007, 0.0000, 0.0000, 0.295, -0.092, 0.197, 0.197, 0.000, $ 2022-11-11 + 59895.0, 179.8436, 182.1345, 37013.2474, 29.0776, 28.9980, 5.6541, -0.0007, 0.0000, 0.0000, 0.293, -0.094, 0.198, 0.198, 0.000, $ 2022-11-12 + 59896.0, 176.8832, 180.9369, 37012.9963, 30.8076, 30.7203, 5.9566, -0.0008, 0.0000, 0.0000, 0.291, -0.095, 0.199, 0.199, 0.000, $ 2022-11-13 + 59897.0, 173.9051, 179.7825, 37012.7507, 32.5700, 32.4745, 6.2645, -0.0008, 0.0000, 0.0000, 0.289, -0.097, 0.201, 0.200, 0.000, $ 2022-11-14 + 59898.0, 170.9099, 178.6715, 37012.5824, 34.3638, 34.2598, 6.5776, -0.0009, 0.0000, 0.0000, 0.287, -0.098, 0.202, 0.202, 0.000, $ 2022-11-15 + 59899.0, 167.8984, 177.6042, 37012.5505, 36.1885, 36.0756, 6.8958, -0.0009, 0.0000, 0.0000, 0.285, -0.100, 0.203, 0.203, 0.000, $ 2022-11-16 + 59900.0, 164.8712, 176.5807, 37012.6955, 38.0435, 37.9213, 7.2190, -0.0010, 0.0000, 0.0000, 0.283, -0.101, 0.204, 0.204, 0.000, $ 2022-11-17 + 59901.0, 161.8290, 175.6013, 37013.0363, 39.9281, 39.7962, 7.5473, -0.0011, 0.0000, 0.0000, 0.281, -0.102, 0.205, 0.205, 0.000, $ 2022-11-18 + 59902.0, 158.7725, 174.6662, 37013.5658, 41.8417, 41.6998, 7.8804, -0.0011, 0.0000, 0.0000, 0.279, -0.104, 0.206, 0.206, 0.000, $ 2022-11-19 + 59903.0, 155.7023, 173.7756, 37014.2453, 43.7839, 43.6314, 8.2183, -0.0012, 0.0000, 0.0000, 0.277, -0.105, 0.207, 0.206, 0.000, $ 2022-11-20 + 59904.0, 152.6191, 172.9296, 37015.0000, 45.7539, 45.5907, 8.5610, -0.0013, 0.0000, 0.0000, 0.275, -0.107, 0.207, 0.207, 0.000, $ 2022-11-21 + 59905.0, 149.5237, 172.1286, 37015.7252, 47.7514, 47.5769, 8.9084, -0.0013, 0.0000, 0.0000, 0.272, -0.108, 0.208, 0.208, 0.000, $ 2022-11-22 + 59906.0, 146.4166, 171.3726, 37016.3089, 49.7758, 49.5897, 9.2604, -0.0014, 0.0000, 0.0000, 0.270, -0.109, 0.209, 0.209, 0.000, $ 2022-11-23 + 59907.0, 143.2986, 170.6618, 37016.6675, 51.8266, 51.6286, 9.6169, -0.0015, 0.0000, 0.0000, 0.268, -0.110, 0.210, 0.210, 0.000, $ 2022-11-24 + 59908.0, 140.1704, 169.9963, 37016.7806, 53.9034, 53.6930, 9.9780, -0.0015, 0.0000, 0.0000, 0.266, -0.112, 0.211, 0.211, 0.000, $ 2022-11-25 + 59909.0, 137.0327, 169.3764, 37016.7049, 56.0056, 55.7826, 10.3435, -0.0016, 0.0000, 0.0000, 0.264, -0.113, 0.212, 0.212, 0.000, $ 2022-11-26 + 59910.0, 133.8861, 168.8021, 37016.5576, 58.1328, 57.8968, 10.7134, -0.0017, 0.0000, 0.0000, 0.262, -0.114, 0.213, 0.212, 0.000, $ 2022-11-27 + 59911.0, 130.7314, 168.2735, 37016.4749, 60.2846, 60.0353, 11.0876, -0.0018, 0.0000, 0.0000, 0.260, -0.115, 0.213, 0.213, 0.000, $ 2022-11-28 + 59912.0, 127.5692, 167.7908, 37016.5657, 62.4605, 62.1976, 11.4662, -0.0019, 0.0000, 0.0000, 0.257, -0.117, 0.214, 0.214, 0.000, $ 2022-11-29 + 59913.0, 124.4004, 167.3540, 37016.8790, 64.6602, 64.3833, 11.8490, -0.0019, 0.0000, 0.0000, 0.255, -0.118, 0.215, 0.215, 0.000, $ 2022-11-30 + 59914.0, 121.2255, 166.9633, 37017.3970, 66.8832, 66.5920, 12.2360, -0.0020, 0.0000, 0.0000, 0.253, -0.119, 0.216, 0.215, 0.000, $ 2022-12-01 + 59915.0, 118.0453, 166.6187, 37018.0485, 69.1291, 68.8233, 12.6271, -0.0021, 0.0000, 0.0000, 0.251, -0.120, 0.216, 0.216, 0.000, $ 2022-12-02 + 59916.0, 114.8604, 166.3204, 37018.7348, 71.3976, 71.0769, 13.0223, -0.0022, 0.0000, 0.0000, 0.249, -0.121, 0.217, 0.217, 0.000, $ 2022-12-03 + 59917.0, 111.6717, 166.0683, 37019.3549, 73.6882, 73.3523, 13.4216, -0.0023, 0.0000, 0.0000, 0.246, -0.122, 0.218, 0.218, 0.000, $ 2022-12-04 + 59918.0, 108.4797, 165.8625, 37019.8259, 76.0005, 75.6493, 13.8250, -0.0024, 0.0000, 0.0000, 0.244, -0.123, 0.218, 0.218, 0.000, $ 2022-12-05 + 59919.0, 105.2853, 165.7030, 37020.0950, 78.3343, 77.9674, 14.2323, -0.0025, 0.0000, 0.0000, 0.242, -0.124, 0.219, 0.219, 0.000, $ 2022-12-06 + 59920.0, 102.0890, 165.5900, 37020.1444, 80.6891, 80.3063, 14.6435, -0.0026, 0.0000, 0.0000, 0.240, -0.125, 0.220, 0.220, 0.000, $ 2022-12-07 + 59921.0, 98.8917, 165.5233, 37019.9904, 83.0645, 82.6656, 15.0587, -0.0027, 0.0000, 0.0000, 0.238, -0.126, 0.220, 0.220, 0.000, $ 2022-12-08 + 59922.0, 95.6940, 165.5030, 37019.6770, 85.4603, 85.0450, 15.4778, -0.0027, 0.0000, 0.0000, 0.235, -0.127, 0.221, 0.221, 0.000, $ 2022-12-09 + 59923.0, 92.4966, 165.5292, 37019.2681, 87.8761, 87.4442, 15.9006, -0.0028, 0.0000, 0.0000, 0.233, -0.128, 0.221, 0.221, 0.000, $ 2022-12-10 + 59924.0, 89.3003, 165.6017, 37018.8372, 90.3115, 89.8629, 16.3273, -0.0029, 0.0000, 0.0000, 0.231, -0.129, 0.222, 0.222, 0.000, $ 2022-12-11 + 59925.0, 86.1057, 165.7207, 37018.4573, 92.7662, 92.3007, 16.7577, -0.0030, 0.0000, 0.0000, 0.229, -0.130, 0.222, 0.222, 0.000, $ 2022-12-12 + 59926.0, 82.9136, 165.8859, 37018.1904, 95.2399, 94.7573, 17.1919, -0.0031, 0.0000, 0.0000, 0.226, -0.130, 0.223, 0.223, 0.000, $ 2022-12-13 + 59927.0, 79.7247, 166.0975, 37018.0806, 97.7322, 97.2325, 17.6298, -0.0032, 0.0000, 0.0000, 0.224, -0.131, 0.224, 0.224, 0.000, $ 2022-12-14 + 59928.0, 76.5396, 166.3553, 37018.1494, 100.2429, 99.7258, 18.0713, -0.0033, 0.0000, 0.0000, 0.222, -0.132, 0.224, 0.224, 0.000, $ 2022-12-15 + 59929.0, 73.3591, 166.6592, 37018.3955, 102.7716, 102.2370, 18.5165, -0.0034, 0.0000, 0.0000, 0.220, -0.133, 0.225, 0.225, 0.000, $ 2022-12-16 + 59930.0, 70.1839, 167.0093, 37018.7929, 105.3179, 104.7659, 18.9653, -0.0035, 0.0000, 0.0000, 0.217, -0.133, 0.225, 0.225, 0.000, $ 2022-12-17 + 59931.0, 67.0146, 167.4054, 37019.2882, 107.8817, 107.3120, 19.4177, -0.0036, 0.0000, 0.0000, 0.215, -0.134, 0.226, 0.226, 0.000, $ 2022-12-18 + 59932.0, 63.8521, 167.8474, 37019.7999, 110.4625, 109.8752, 19.8737, -0.0037, 0.0000, 0.0000, 0.213, -0.135, 0.226, 0.226, 0.000, $ 2022-12-19 + 59933.0, 60.6969, 168.3353, 37020.2274, 113.0602, 112.4551, 20.3331, -0.0038, 0.0000, 0.0000, 0.211, -0.135, 0.227, 0.227, 0.000, $ 2022-12-20 + 59934.0, 57.5498, 168.8689, 37020.4762, 115.6743, 115.0515, 20.7961, -0.0039, 0.0000, 0.0000, 0.208, -0.136, 0.227, 0.227, 0.000, $ 2022-12-21 + 59935.0, 54.4115, 169.4480, 37020.4942, 118.3045, 117.6640, 21.2625, -0.0040, 0.0000, 0.0000, 0.206, -0.137, 0.227, 0.227, 0.000, $ 2022-12-22 + 59936.0, 51.2826, 170.0726, 37020.3011, 120.9507, 120.2924, 21.7324, -0.0041, 0.0000, 0.0000, 0.204, -0.137, 0.228, 0.228, 0.000, $ 2022-12-23 + 59937.0, 48.1639, 170.7426, 37019.9920, 123.6125, 122.9365, 22.2057, -0.0043, 0.0000, 0.0000, 0.202, -0.138, 0.228, 0.228, 0.000, $ 2022-12-24 + 59938.0, 45.0561, 171.4576, 37019.7078, 126.2896, 125.5959, 22.6824, -0.0044, 0.0000, 0.0000, 0.199, -0.138, 0.229, 0.229, 0.000, $ 2022-12-25 + 59939.0, 41.9598, 172.2177, 37019.5826, 128.9817, 128.2704, 23.1625, -0.0045, 0.0000, 0.0000, 0.197, -0.139, 0.229, 0.229, 0.000, $ 2022-12-26 + 59940.0, 38.8757, 173.0226, 37019.6942, 131.6885, 130.9598, 23.6459, -0.0046, 0.0000, 0.0000, 0.195, -0.139, 0.230, 0.230, 0.000, $ 2022-12-27 + 59941.0, 35.8045, 173.8721, 37020.0399, 134.4098, 133.6637, 24.1327, -0.0047, 0.0000, 0.0000, 0.193, -0.140, 0.230, 0.230, 0.000, $ 2022-12-28 + 59942.0, 32.7468, 174.7660, 37020.5462, 137.1454, 136.3819, 24.6227, -0.0048, 0.0000, 0.0000, 0.190, -0.140, 0.230, 0.230, 0.000, $ 2022-12-29 + 59943.0, 29.7035, 175.7042, 37021.1012, 139.8948, 139.1142, 25.1161, -0.0049, 0.0000, 0.0000, 0.188, -0.140, 0.231, 0.231, 0.000, $ 2022-12-30 + 59944.0, 26.6750, 176.6864, 37021.5922, 142.6578, 141.8603, 25.6127, -0.0050, 0.0000, 0.0000, 0.186, -0.141, 0.231, 0.231, 0.000, $ 2022-12-31 + 59945.0, 23.6621, 177.7124, 37021.9318, 145.4342, 144.6199, 26.1125, -0.0051, 0.0000, 0.0000, 0.184, -0.141, 0.231, 0.231, 0.000, $ 2023-01-01 + 59946.0, 20.6655, 178.7819, 37022.0692, 148.2238, 147.3929, 26.6155, -0.0052, 0.0000, 0.0000, 0.182, -0.141, 0.232, 0.232, 0.000, $ 2023-01-02 + 59947.0, 17.6858, 179.8948, 37021.9893, 151.0261, 150.1789, 27.1218, -0.0053, 0.0000, 0.0000, 0.179, -0.142, 0.232, 0.232, 0.000, $ 2023-01-03 + 59948.0, 14.7237, 181.0508, 37021.7078, 153.8410, 152.9776, 27.6312, -0.0054, 0.0000, 0.0000, 0.177, -0.142, 0.232, 0.232, 0.000, $ 2023-01-04 + $END diff --git a/data/leap-seconds.list b/data/leap-seconds.list new file mode 100644 index 00000000..5b519b70 --- /dev/null +++ b/data/leap-seconds.list @@ -0,0 +1,255 @@ +# +# In the following text, the symbol '#' introduces +# a comment, which continues from that symbol until +# the end of the line. A plain comment line has a +# whitespace character following the comment indicator. +# There are also special comment lines defined below. +# A special comment will always have a non-whitespace +# character in column 2. +# +# A blank line should be ignored. +# +# The following table shows the corrections that must +# be applied to compute International Atomic Time (TAI) +# from the Coordinated Universal Time (UTC) values that +# are transmitted by almost all time services. +# +# The first column shows an epoch as a number of seconds +# since 1 January 1900, 00:00:00 (1900.0 is also used to +# indicate the same epoch.) Both of these time stamp formats +# ignore the complexities of the time scales that were +# used before the current definition of UTC at the start +# of 1972. (See note 3 below.) +# The second column shows the number of seconds that +# must be added to UTC to compute TAI for any timestamp +# at or after that epoch. The value on each line is +# valid from the indicated initial instant until the +# epoch given on the next one or indefinitely into the +# future if there is no next line. +# (The comment on each line shows the representation of +# the corresponding initial epoch in the usual +# day-month-year format. The epoch always begins at +# 00:00:00 UTC on the indicated day. See Note 5 below.) +# +# Important notes: +# +# 1. Coordinated Universal Time (UTC) is often referred to +# as Greenwich Mean Time (GMT). The GMT time scale is no +# longer used, and the use of GMT to designate UTC is +# discouraged. +# +# 2. The UTC time scale is realized by many national +# laboratories and timing centers. Each laboratory +# identifies its realization with its name: Thus +# UTC(NIST), UTC(USNO), etc. The differences among +# these different realizations are typically on the +# order of a few nanoseconds (i.e., 0.000 000 00x s) +# and can be ignored for many purposes. These differences +# are tabulated in Circular T, which is published monthly +# by the International Bureau of Weights and Measures +# (BIPM). See www.bipm.org for more information. +# +# 3. The current definition of the relationship between UTC +# and TAI dates from 1 January 1972. A number of different +# time scales were in use before that epoch, and it can be +# quite difficult to compute precise timestamps and time +# intervals in those "prehistoric" days. For more information, +# consult: +# +# The Explanatory Supplement to the Astronomical +# Ephemeris. +# or +# Terry Quinn, "The BIPM and the Accurate Measurement +# of Time," Proc. of the IEEE, Vol. 79, pp. 894-905, +# July, 1991. +# reprinted in: +# Christine Hackman and Donald B Sullivan (eds.) +# Time and Frequency Measurement +# American Association of Physics Teachers (1996) +# , pp. 75-86 +# +# 4. The decision to insert a leap second into UTC is currently +# the responsibility of the International Earth Rotation and +# Reference Systems Service. (The name was changed from the +# International Earth Rotation Service, but the acronym IERS +# is still used.) +# +# Leap seconds are announced by the IERS in its Bulletin C. +# +# See www.iers.org for more details. +# +# Every national laboratory and timing center uses the +# data from the BIPM and the IERS to construct UTC(lab), +# their local realization of UTC. +# +# Although the definition also includes the possibility +# of dropping seconds ("negative" leap seconds), this has +# never been done and is unlikely to be necessary in the +# foreseeable future. +# +# 5. If your system keeps time as the number of seconds since +# some epoch (e.g., NTP timestamps), then the algorithm for +# assigning a UTC time stamp to an event that happens during a positive +# leap second is not well defined. The official name of that leap +# second is 23:59:60, but there is no way of representing that time +# in these systems. +# Many systems of this type effectively stop the system clock for +# one second during the leap second and use a time that is equivalent +# to 23:59:59 UTC twice. For these systems, the corresponding TAI +# timestamp would be obtained by advancing to the next entry in the +# following table when the time equivalent to 23:59:59 UTC +# is used for the second time. Thus the leap second which +# occurred on 30 June 1972 at 23:59:59 UTC would have TAI +# timestamps computed as follows: +# +# ... +# 30 June 1972 23:59:59 (2287785599, first time): TAI= UTC + 10 seconds +# 30 June 1972 23:59:60 (2287785599,second time): TAI= UTC + 11 seconds +# 1 July 1972 00:00:00 (2287785600) TAI= UTC + 11 seconds +# ... +# +# If your system realizes the leap second by repeating 00:00:00 UTC twice +# (this is possible but not usual), then the advance to the next entry +# in the table must occur the second time that a time equivalent to +# 00:00:00 UTC is used. Thus, using the same example as above: +# +# ... +# 30 June 1972 23:59:59 (2287785599): TAI= UTC + 10 seconds +# 30 June 1972 23:59:60 (2287785600, first time): TAI= UTC + 10 seconds +# 1 July 1972 00:00:00 (2287785600,second time): TAI= UTC + 11 seconds +# ... +# +# in both cases the use of timestamps based on TAI produces a smooth +# time scale with no discontinuity in the time interval. However, +# although the long-term behavior of the time scale is correct in both +# methods, the second method is technically not correct because it adds +# the extra second to the wrong day. +# +# This complexity would not be needed for negative leap seconds (if they +# are ever used). The UTC time would skip 23:59:59 and advance from +# 23:59:58 to 00:00:00 in that case. The TAI offset would decrease by +# 1 second at the same instant. This is a much easier situation to deal +# with, since the difficulty of unambiguously representing the epoch +# during the leap second does not arise. +# +# Some systems implement leap seconds by amortizing the leap second +# over the last few minutes of the day. The frequency of the local +# clock is decreased (or increased) to realize the positive (or +# negative) leap second. This method removes the time step described +# above. Although the long-term behavior of the time scale is correct +# in this case, this method introduces an error during the adjustment +# period both in time and in frequency with respect to the official +# definition of UTC. +# +# Questions or comments to: +# Judah Levine +# Time and Frequency Division +# NIST +# Boulder, Colorado +# Judah.Levine@nist.gov +# +# Last Update of leap second values: 8 July 2016 +# +# The following line shows this last update date in NTP timestamp +# format. This is the date on which the most recent change to +# the leap second data was added to the file. This line can +# be identified by the unique pair of characters in the first two +# columns as shown below. +# +#$ 3676924800 +# +# The NTP timestamps are in units of seconds since the NTP epoch, +# which is 1 January 1900, 00:00:00. The Modified Julian Day number +# corresponding to the NTP time stamp, X, can be computed as +# +# X/86400 + 15020 +# +# where the first term converts seconds to days and the second +# term adds the MJD corresponding to the time origin defined above. +# The integer portion of the result is the integer MJD for that +# day, and any remainder is the time of day, expressed as the +# fraction of the day since 0 hours UTC. The conversion from day +# fraction to seconds or to hours, minutes, and seconds may involve +# rounding or truncation, depending on the method used in the +# computation. +# +# The data in this file will be updated periodically as new leap +# seconds are announced. In addition to being entered on the line +# above, the update time (in NTP format) will be added to the basic +# file name leap-seconds to form the name leap-seconds.. +# In addition, the generic name leap-seconds.list will always point to +# the most recent version of the file. +# +# This update procedure will be performed only when a new leap second +# is announced. +# +# The following entry specifies the expiration date of the data +# in this file in units of seconds since the origin at the instant +# 1 January 1900, 00:00:00. This expiration date will be changed +# at least twice per year whether or not a new leap second is +# announced. These semi-annual changes will be made no later +# than 1 June and 1 December of each year to indicate what +# action (if any) is to be taken on 30 June and 31 December, +# respectively. (These are the customary effective dates for new +# leap seconds.) This expiration date will be identified by a +# unique pair of characters in columns 1 and 2 as shown below. +# In the unlikely event that a leap second is announced with an +# effective date other than 30 June or 31 December, then this +# file will be edited to include that leap second as soon as it is +# announced or at least one month before the effective date +# (whichever is later). +# If an announcement by the IERS specifies that no leap second is +# scheduled, then only the expiration date of the file will +# be advanced to show that the information in the file is still +# current -- the update time stamp, the data and the name of the file +# will not change. +# +# Updated through IERS Bulletin C64 +# File expires on: 28 June 2023 +# +#@ 3896899200 +# +2272060800 10 # 1 Jan 1972 +2287785600 11 # 1 Jul 1972 +2303683200 12 # 1 Jan 1973 +2335219200 13 # 1 Jan 1974 +2366755200 14 # 1 Jan 1975 +2398291200 15 # 1 Jan 1976 +2429913600 16 # 1 Jan 1977 +2461449600 17 # 1 Jan 1978 +2492985600 18 # 1 Jan 1979 +2524521600 19 # 1 Jan 1980 +2571782400 20 # 1 Jul 1981 +2603318400 21 # 1 Jul 1982 +2634854400 22 # 1 Jul 1983 +2698012800 23 # 1 Jul 1985 +2776982400 24 # 1 Jan 1988 +2840140800 25 # 1 Jan 1990 +2871676800 26 # 1 Jan 1991 +2918937600 27 # 1 Jul 1992 +2950473600 28 # 1 Jul 1993 +2982009600 29 # 1 Jul 1994 +3029443200 30 # 1 Jan 1996 +3076704000 31 # 1 Jul 1997 +3124137600 32 # 1 Jan 1999 +3345062400 33 # 1 Jan 2006 +3439756800 34 # 1 Jan 2009 +3550089600 35 # 1 Jul 2012 +3644697600 36 # 1 Jul 2015 +3692217600 37 # 1 Jan 2017 +# +# the following special comment contains the +# hash value of the data in this file computed +# use the secure hash algorithm as specified +# by FIPS 180-1. See the files in ~/pub/sha for +# the details of how this hash value is +# computed. Note that the hash computation +# ignores comments and whitespace characters +# in data lines. It includes the NTP values +# of both the last modification time and the +# expiration time of the file, but not the +# white space on those lines. +# the hash line is also ignored in the +# computation. +# +#h 2c413af9 124e1031 f165174 ff527c6b 756ae00b diff --git a/src/efmt/consts.rs b/src/efmt/consts.rs index 5f9a0c1a..020795f2 100644 --- a/src/efmt/consts.rs +++ b/src/efmt/consts.rs @@ -176,7 +176,7 @@ pub const RFC3339: Format = Format { Some(Item { token: Token::Second, sep_char: Some('.'), - second_sep_char: Some('Z'), + second_sep_char: None, optional: false, }), Some(Item { diff --git a/src/efmt/format.rs b/src/efmt/format.rs index fda82d97..2ea2bd27 100644 --- a/src/efmt/format.rs +++ b/src/efmt/format.rs @@ -185,6 +185,10 @@ impl Format { ts = TimeScale::from_str(s[idx..].trim())?; } break; + } else if char == 'Z' { + // This is a single character to represent UTC + // UTC is the default time scale, so we don't need to do anything. + break; } prev_item = cur_item; prev_token = cur_token; diff --git a/src/epoch.rs b/src/epoch.rs index 16401b81..ee22dbbb 100644 --- a/src/epoch.rs +++ b/src/epoch.rs @@ -9,6 +9,7 @@ */ use crate::duration::{Duration, Unit}; +use crate::leap_seconds::{LatestLeapSeconds, LeapSecondProvider}; use crate::parser::Token; use crate::{ Errors, MonthName, TimeScale, BDT_REF_EPOCH, DAYS_PER_YEAR_NLD, ET_EPOCH_S, GPST_REF_EPOCH, @@ -33,6 +34,9 @@ use pyo3::prelude::*; #[cfg(feature = "python")] use pyo3::pyclass::CompareOp; +#[cfg(feature = "python")] +use crate::leap_seconds_file::LeapSecondsFile; + #[cfg(feature = "serde")] use serde_derive::{Deserialize, Serialize}; @@ -43,6 +47,9 @@ use std::time::SystemTime; #[cfg(not(feature = "std"))] use num_traits::{Euclid, Float}; +#[cfg(feature = "ut1")] +use crate::ut1::Ut1Provider; + const TT_OFFSET_MS: i64 = 32_184; const ET_OFFSET_US: i64 = 32_184_935; @@ -55,54 +62,6 @@ pub const NAIF_EB: f64 = 1.671e-2; /// NAIF leap second kernel data used to calculate the difference between ET and TAI. pub const NAIF_K: f64 = 1.657e-3; -/// List of leap seconds from https://www.ietf.org/timezones/data/leap-seconds.list . -/// This list corresponds the number of seconds in TAI to the UTC offset and to whether it was an announced leap second or not. -/// The unannoucned leap seconds come from dat.c in the SOFA library. -const LEAP_SECONDS: [(f64, f64, bool); 42] = [ - (1_893_369_600.0, 1.417818, false), // SOFA: 01 Jan 1960 - (1_924_992_000.0, 1.422818, false), // SOFA: 01 Jan 1961 - (1_943_308_800.0, 1.372818, false), // SOFA: 01 Aug 1961 - (1_956_528_000.0, 1.845858, false), // SOFA: 01 Jan 1962 - (2_014_329_600.0, 1.945858, false), // SOFA: 01 Jan 1963 - (2_019_600_000.0, 3.24013, false), // SOFA: 01 Jan 1964 - (2_027_462_400.0, 3.34013, false), // SOFA: 01 Apr 1964 - (2_040_681_600.0, 3.44013, false), // SOFA: 01 Sep 1964 - (2_051_222_400.0, 3.54013, false), // SOFA: 01 Jan 1965 - (2_056_320_000.0, 3.64013, false), // SOFA: 01 Mar 1965 - (2_066_860_800.0, 3.74013, false), // SOFA: 01 Jul 1965 - (2_072_217_600.0, 3.84013, false), // SOFA: 01 Sep 1965 - (2_082_758_400.0, 4.31317, false), // SOFA: 01 Jan 1966 - (2_148_508_800.0, 4.21317, false), // SOFA: 01 Feb 1968 - (2_272_060_800.0, 10.0, true), // IERS: 01 Jan 1972 - (2_287_785_600.0, 11.0, true), // IERS: 01 Jul 1972 - (2_303_683_200.0, 12.0, true), // IERS: 01 Jan 1973 - (2_335_219_200.0, 13.0, true), // IERS: 01 Jan 1974 - (2_366_755_200.0, 14.0, true), // IERS: 01 Jan 1975 - (2_398_291_200.0, 15.0, true), // IERS: 01 Jan 1976 - (2_429_913_600.0, 16.0, true), // IERS: 01 Jan 1977 - (2_461_449_600.0, 17.0, true), // IERS: 01 Jan 1978 - (2_492_985_600.0, 18.0, true), // IERS: 01 Jan 1979 - (2_524_521_600.0, 19.0, true), // IERS: 01 Jan 1980 - (2_571_782_400.0, 20.0, true), // IERS: 01 Jul 1981 - (2_603_318_400.0, 21.0, true), // IERS: 01 Jul 1982 - (2_634_854_400.0, 22.0, true), // IERS: 01 Jul 1983 - (2_698_012_800.0, 23.0, true), // IERS: 01 Jul 1985 - (2_776_982_400.0, 24.0, true), // IERS: 01 Jan 1988 - (2_840_140_800.0, 25.0, true), // IERS: 01 Jan 1990 - (2_871_676_800.0, 26.0, true), // IERS: 01 Jan 1991 - (2_918_937_600.0, 27.0, true), // IERS: 01 Jul 1992 - (2_950_473_600.0, 28.0, true), // IERS: 01 Jul 1993 - (2_982_009_600.0, 29.0, true), // IERS: 01 Jul 1994 - (3_029_443_200.0, 30.0, true), // IERS: 01 Jan 1996 - (3_076_704_000.0, 31.0, true), // IERS: 01 Jul 1997 - (3_124_137_600.0, 32.0, true), // IERS: 01 Jan 1999 - (3_345_062_400.0, 33.0, true), // IERS: 01 Jan 2006 - (3_439_756_800.0, 34.0, true), // IERS: 01 Jan 2009 - (3_550_089_600.0, 35.0, true), // IERS: 01 Jul 2012 - (3_644_697_600.0, 36.0, true), // IERS: 01 Jul 2015 - (3_692_217_600.0, 37.0, true), // IERS: 01 Jan 2017 -]; - /// Years when January had the leap second const fn january_years(year: i32) -> bool { matches!( @@ -281,6 +240,26 @@ impl Ord for Epoch { // Defines the methods that should be staticmethods in Python, but must be redefined as per https://github.com/PyO3/pyo3/issues/1003#issuecomment-844433346 impl Epoch { + /// Get the accumulated number of leap seconds up to this Epoch from the provided LeapSecondProvider. + /// Returns None if the epoch is before 1960, year at which UTC was defined. + /// + /// # Why does this function return an `Option` when the other returns a value + /// This is to match the `iauDat` function of SOFA (src/dat.c). That function will return a warning and give up if the start date is before 1960. + pub fn leap_seconds_with( + &self, + iers_only: bool, + provider: L, + ) -> Option { + for leap_second in provider.rev() { + if self.duration_since_j1900_tai.to_seconds() >= leap_second.timestamp_tai_s + && (!iers_only || leap_second.announced_by_iers) + { + return Some(leap_second.delta_at); + } + } + None + } + /// Makes a copy of self and sets the duration and time scale appropriately given the new duration #[must_use] pub fn from_duration(new_duration: Duration, time_scale: TimeScale) -> Self { @@ -1062,6 +1041,23 @@ impl Epoch { format.parse(s_in) } + #[cfg(feature = "ut1")] + #[must_use] + /// Initialize an Epoch from the provided UT1 duration since 1900 January 01 at midnight + /// + /// # Warning + /// The time scale of this Epoch will be set to TAI! This is to ensure that no additional computations will change the duration since it's stored in TAI. + /// However, this also means that calling `to_duration()` on this Epoch will return the TAI duration and not the UT1 duration! + pub fn from_ut1_duration(duration: Duration, provider: Ut1Provider) -> Self { + let mut e = Self::from_tai_duration(duration); + // Compute the TAI to UT1 offset at this time. + // We have the time in TAI. But we were given UT1. + // The offset is provided as offset = TAI - UT1 <=> TAI = UT1 + offset + e.duration_since_j1900_tai += e.ut1_offset(provider).unwrap_or(Duration::ZERO); + e.time_scale = TimeScale::TAI; + e + } + fn delta_et_tai(seconds: f64) -> f64 { // Calculate M, the mean anomaly.4 let m = NAIF_M0 + seconds * NAIF_M1; @@ -1237,14 +1233,34 @@ impl Epoch { /// # Why does this function return an `Option` when the other returns a value /// This is to match the `iauDat` function of SOFA (src/dat.c). That function will return a warning and give up if the start date is before 1960. pub fn leap_seconds(&self, iers_only: bool) -> Option { - for (tai_ts, delta_at, announced) in LEAP_SECONDS.iter().rev() { - if self.duration_since_j1900_tai.to_seconds() >= *tai_ts && (!iers_only || *announced) { - return Some(*delta_at); + self.leap_seconds_with(iers_only, LatestLeapSeconds::default()) + } + + #[cfg(feature = "ut1")] + /// Get the accumulated offset between this epoch and UT1, assuming that the provider includes all data. + pub fn ut1_offset(&self, provider: Ut1Provider) -> Option { + for delta_tai_ut1 in provider.rev() { + if self > &delta_tai_ut1.epoch { + return Some(delta_tai_ut1.delta_tai_minus_ut1); } } None } + /// Get the accumulated number of leap seconds up to this Epoch from the provided LeapSecondProvider. + /// Returns None if the epoch is before 1960, year at which UTC was defined. + /// + /// # Why does this function return an `Option` when the other returns a value + /// This is to match the `iauDat` function of SOFA (src/dat.c). That function will return a warning and give up if the start date is before 1960. + #[cfg(feature = "python")] + pub fn leap_seconds_with_file( + &self, + iers_only: bool, + provider: LeapSecondsFile, + ) -> Option { + self.leap_seconds_with(iers_only, provider) + } + #[cfg(feature = "python")] #[staticmethod] /// Creates a new Epoch from a Duration as the time difference between this epoch and TAI reference epoch. @@ -2195,6 +2211,25 @@ impl Epoch { Self::compute_gregorian(self.to_tai_duration()) } + #[cfg(feature = "ut1")] + #[must_use] + /// Returns this time in a Duration past J1900 counted in UT1 + pub fn to_ut1_duration(&self, provider: Ut1Provider) -> Duration { + // TAI = UT1 + offset <=> UTC = TAI - offset + self.duration_since_j1900_tai - self.ut1_offset(provider).unwrap_or(Duration::ZERO) + } + + #[cfg(feature = "ut1")] + #[must_use] + /// Returns this time in a Duration past J1900 counted in UT1 + pub fn to_ut1(&self, provider: Ut1Provider) -> Self { + let mut me = *self; + // TAI = UT1 + offset <=> UTC = TAI - offset + me.duration_since_j1900_tai -= self.ut1_offset(provider).unwrap_or(Duration::ZERO); + me.time_scale = TimeScale::TAI; + me + } + #[must_use] /// Floors this epoch to the closest provided duration /// @@ -2598,7 +2633,7 @@ impl Epoch { #[cfg(feature = "python")] fn __repr__(&self) -> String { - format!("{self}") + format!("{self:?}") } #[cfg(feature = "python")] diff --git a/src/errors.rs b/src/errors.rs index fbeba1d7..775cee66 100644 --- a/src/errors.rs +++ b/src/errors.rs @@ -15,6 +15,12 @@ use core::num::ParseIntError; #[cfg(feature = "std")] use std::error::Error; +#[cfg(feature = "std")] +use std::io::ErrorKind as IOError; + +#[cfg(feature = "ut1")] +use reqwest::StatusCode; + use crate::Weekday; /// Errors handles all oddities which may occur in this library. @@ -56,6 +62,10 @@ pub enum ParsingErrors { found: Weekday, expected: Weekday, }, + #[cfg(feature = "std")] + IOError(IOError), + #[cfg(feature = "ut1")] + DownloadError(StatusCode), } impl fmt::Display for Errors { diff --git a/src/leap_seconds.rs b/src/leap_seconds.rs new file mode 100644 index 00000000..e44b5cc1 --- /dev/null +++ b/src/leap_seconds.rs @@ -0,0 +1,149 @@ +/* + * Hifitime, part of the Nyx Space tools + * Copyright (C) 2022 Christopher Rabotin et al. (cf. AUTHORS.md) + * This Source Code Form is subject to the terms of the Apache + * v. 2.0. If a copy of the Apache License was not distributed with this + * file, You can obtain one at https://www.apache.org/licenses/LICENSE-2.0. + * + * Documentation: https://nyxspace.com/ + */ + +#[cfg(feature = "python")] +use pyo3::prelude::*; + +#[cfg(feature = "std")] +pub use super::leap_seconds_file::LeapSecondsFile; + +use core::ops::Index; + +pub trait LeapSecondProvider: DoubleEndedIterator + Index {} + +/// A structure representing a leap second +#[repr(C)] +#[cfg_attr(feature = "python", pyclass)] +#[derive(Copy, Clone, Debug, PartialEq)] +pub struct LeapSecond { + /// Timestamp in TAI seconds for this leap second, e.g. `2_272_060_800.0` for the first IERS leap second. + pub timestamp_tai_s: f64, + /// ΔAT is the accumulated time offset after this leap second has past. + pub delta_at: f64, + /// Whether or not this leap second was announced by the IERS. + pub announced_by_iers: bool, +} + +impl LeapSecond { + pub const fn new(timestamp_tai_s: f64, delta_at: f64, announced: bool) -> Self { + Self { + timestamp_tai_s, + delta_at, + announced_by_iers: announced, + } + } +} + +const LATEST_LEAP_SECONDS: [LeapSecond; 42] = [ + LeapSecond::new(1_893_369_600.0, 1.417818, false), // SOFA: 01 Jan 1960 + LeapSecond::new(1_924_992_000.0, 1.422818, false), // SOFA: 01 Jan 1961 + LeapSecond::new(1_943_308_800.0, 1.372818, false), // SOFA: 01 Aug 1961 + LeapSecond::new(1_956_528_000.0, 1.845858, false), // SOFA: 01 Jan 1962 + LeapSecond::new(2_014_329_600.0, 1.945858, false), // SOFA: 01 Jan 1963 + LeapSecond::new(2_019_600_000.0, 3.24013, false), // SOFA: 01 Jan 1964 + LeapSecond::new(2_027_462_400.0, 3.34013, false), // SOFA: 01 Apr 1964 + LeapSecond::new(2_040_681_600.0, 3.44013, false), // SOFA: 01 Sep 1964 + LeapSecond::new(2_051_222_400.0, 3.54013, false), // SOFA: 01 Jan 1965 + LeapSecond::new(2_056_320_000.0, 3.64013, false), // SOFA: 01 Mar 1965 + LeapSecond::new(2_066_860_800.0, 3.74013, false), // SOFA: 01 Jul 1965 + LeapSecond::new(2_072_217_600.0, 3.84013, false), // SOFA: 01 Sep 1965 + LeapSecond::new(2_082_758_400.0, 4.31317, false), // SOFA: 01 Jan 1966 + LeapSecond::new(2_148_508_800.0, 4.21317, false), // SOFA: 01 Feb 1968 + LeapSecond::new(2_272_060_800.0, 10.0, true), // IERS: 01 Jan 1972 + LeapSecond::new(2_287_785_600.0, 11.0, true), // IERS: 01 Jul 1972 + LeapSecond::new(2_303_683_200.0, 12.0, true), // IERS: 01 Jan 1973 + LeapSecond::new(2_335_219_200.0, 13.0, true), // IERS: 01 Jan 1974 + LeapSecond::new(2_366_755_200.0, 14.0, true), // IERS: 01 Jan 1975 + LeapSecond::new(2_398_291_200.0, 15.0, true), // IERS: 01 Jan 1976 + LeapSecond::new(2_429_913_600.0, 16.0, true), // IERS: 01 Jan 1977 + LeapSecond::new(2_461_449_600.0, 17.0, true), // IERS: 01 Jan 1978 + LeapSecond::new(2_492_985_600.0, 18.0, true), // IERS: 01 Jan 1979 + LeapSecond::new(2_524_521_600.0, 19.0, true), // IERS: 01 Jan 1980 + LeapSecond::new(2_571_782_400.0, 20.0, true), // IERS: 01 Jul 1981 + LeapSecond::new(2_603_318_400.0, 21.0, true), // IERS: 01 Jul 1982 + LeapSecond::new(2_634_854_400.0, 22.0, true), // IERS: 01 Jul 1983 + LeapSecond::new(2_698_012_800.0, 23.0, true), // IERS: 01 Jul 1985 + LeapSecond::new(2_776_982_400.0, 24.0, true), // IERS: 01 Jan 1988 + LeapSecond::new(2_840_140_800.0, 25.0, true), // IERS: 01 Jan 1990 + LeapSecond::new(2_871_676_800.0, 26.0, true), // IERS: 01 Jan 1991 + LeapSecond::new(2_918_937_600.0, 27.0, true), // IERS: 01 Jul 1992 + LeapSecond::new(2_950_473_600.0, 28.0, true), // IERS: 01 Jul 1993 + LeapSecond::new(2_982_009_600.0, 29.0, true), // IERS: 01 Jul 1994 + LeapSecond::new(3_029_443_200.0, 30.0, true), // IERS: 01 Jan 1996 + LeapSecond::new(3_076_704_000.0, 31.0, true), // IERS: 01 Jul 1997 + LeapSecond::new(3_124_137_600.0, 32.0, true), // IERS: 01 Jan 1999 + LeapSecond::new(3_345_062_400.0, 33.0, true), // IERS: 01 Jan 2006 + LeapSecond::new(3_439_756_800.0, 34.0, true), // IERS: 01 Jan 2009 + LeapSecond::new(3_550_089_600.0, 35.0, true), // IERS: 01 Jul 2012 + LeapSecond::new(3_644_697_600.0, 36.0, true), // IERS: 01 Jul 2015 + LeapSecond::new(3_692_217_600.0, 37.0, true), // IERS: 01 Jan 2017 +]; + +/// List of leap seconds from https://www.ietf.org/timezones/data/leap-seconds.list . +/// This list corresponds the number of seconds in TAI to the UTC offset and to whether it was an announced leap second or not. +/// The unannoucned leap seconds come from dat.c in the SOFA library. +#[cfg_attr(feature = "python", pyclass)] +#[derive(Clone, Debug)] +pub struct LatestLeapSeconds { + data: [LeapSecond; 42], + iter_pos: usize, +} + +#[cfg(feature = "python")] +#[cfg_attr(feature = "python", pymethods)] +impl LatestLeapSeconds { + #[new] + pub fn __new__() -> Self { + Self::default() + } + + fn __repr__(&self) -> String { + format!("{self:?}") + } +} + +impl Default for LatestLeapSeconds { + fn default() -> Self { + Self { + data: LATEST_LEAP_SECONDS, + iter_pos: 0, + } + } +} + +impl Iterator for LatestLeapSeconds { + type Item = LeapSecond; + + fn next(&mut self) -> Option { + self.iter_pos += 1; + self.data.get(self.iter_pos - 1).copied() + } +} + +impl DoubleEndedIterator for LatestLeapSeconds { + fn next_back(&mut self) -> Option { + if self.iter_pos == self.data.len() { + None + } else { + self.iter_pos += 1; + self.data.get(self.data.len() - self.iter_pos).copied() + } + } +} + +impl Index for LatestLeapSeconds { + type Output = LeapSecond; + + fn index(&self, index: usize) -> &Self::Output { + self.data.index(index) + } +} + +impl LeapSecondProvider for LatestLeapSeconds {} diff --git a/src/leap_seconds_file.rs b/src/leap_seconds_file.rs new file mode 100644 index 00000000..f95ff11a --- /dev/null +++ b/src/leap_seconds_file.rs @@ -0,0 +1,122 @@ +/* + * Hifitime, part of the Nyx Space tools + * Copyright (C) 2022 Christopher Rabotin et al. (cf. AUTHORS.md) + * This Source Code Form is subject to the terms of the Apache + * v. 2.0. If a copy of the Apache License was not distributed with this + * file, You can obtain one at https://www.apache.org/licenses/LICENSE-2.0. + * + * Documentation: https://nyxspace.com/ + */ + +#[cfg(feature = "python")] +use pyo3::prelude::*; + +use std::{fs::File, io::Read}; + +use core::ops::Index; + +use crate::{ + leap_seconds::{LeapSecond, LeapSecondProvider}, + Errors, ParsingErrors, +}; + +#[repr(C)] +#[cfg_attr(feature = "python", pyclass)] +#[derive(Clone, Debug, Default)] +/// A leap second provider that uses an IERS formatted leap seconds file. +pub struct LeapSecondsFile { + data: Vec, + iter_pos: usize, +} + +impl LeapSecondsFile { + /// Builds a leap second provider from the provided Leap Seconds file in IERS format as found on . + pub fn from_path(path: &str) -> Result { + let mut f = match File::open(path) { + Ok(f) => f, + Err(e) => return Err(Errors::ParseError(ParsingErrors::IOError(e.kind()))), + }; + + let mut contents = String::new(); + if let Err(e) = f.read_to_string(&mut contents) { + return Err(Errors::ParseError(ParsingErrors::IOError(e.kind()))); + } + + let mut me = Self::default(); + + for line in contents.lines() { + if let Some(first_char) = line.chars().next() { + if first_char == '#' { + continue; + } else { + // We have data of interest! + let data: Vec<&str> = line.split_whitespace().collect(); + if data.len() < 2 { + return Err(Errors::ParseError(ParsingErrors::UnknownFormat)); + } + + let timestamp_tai_s: u64 = match lexical_core::parse(data[0].as_bytes()) { + Ok(val) => val, + Err(_) => return Err(Errors::ParseError(ParsingErrors::ValueError)), + }; + + let delta_at: u8 = match lexical_core::parse(data[1].as_bytes()) { + Ok(val) => val, + Err(_) => return Err(Errors::ParseError(ParsingErrors::ValueError)), + }; + + me.data.push(LeapSecond { + timestamp_tai_s: (timestamp_tai_s as f64), + delta_at: (delta_at as f64), + announced_by_iers: true, + }); + } + } + } + + Ok(me) + } +} + +#[cfg(feature = "python")] +#[cfg_attr(feature = "python", pymethods)] +impl LeapSecondsFile { + #[new] + pub fn __new__(path: String) -> Result { + Self::from_path(&path) + } + + fn __repr__(&self) -> String { + format!("{self:?}") + } +} + +impl Iterator for LeapSecondsFile { + type Item = LeapSecond; + + fn next(&mut self) -> Option { + self.iter_pos += 1; + self.data.get(self.iter_pos - 1).copied() + } +} + +impl DoubleEndedIterator for LeapSecondsFile { + fn next_back(&mut self) -> Option { + if self.iter_pos == self.data.len() { + None + } else { + self.iter_pos += 1; + self.data.get(self.data.len() - self.iter_pos).copied() + } + } +} + +impl Index for LeapSecondsFile { + type Output = LeapSecond; + + fn index(&self, index: usize) -> &Self::Output { + self.data.index(index) + } +} + +impl LeapSecondProvider for LeapSecondsFile {} diff --git a/src/lib.rs b/src/lib.rs index 55ab9ea7..46e80fe8 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -113,6 +113,14 @@ pub use weekday::*; mod month; pub use month::*; +pub mod leap_seconds; + +#[cfg(feature = "std")] +mod leap_seconds_file; + +#[cfg(feature = "ut1")] +pub mod ut1; + /// This module defines all of the deprecated methods. mod deprecated; diff --git a/src/python.rs b/src/python.rs index 25dc34f3..ca95994d 100644 --- a/src/python.rs +++ b/src/python.rs @@ -12,6 +12,10 @@ use pyo3::{exceptions::PyException, prelude::*}; use crate::prelude::*; +use crate::leap_seconds::{LatestLeapSeconds, LeapSecondsFile}; + +use crate::ut1::Ut1Provider; + impl std::convert::From for PyErr { fn from(err: Errors) -> PyErr { PyException::new_err(err.to_string()) @@ -25,5 +29,8 @@ fn hifitime(_py: Python, m: &PyModule) -> PyResult<()> { m.add_class::()?; m.add_class::()?; m.add_class::()?; + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; Ok(()) } diff --git a/src/ut1.rs b/src/ut1.rs new file mode 100644 index 00000000..b9caef7c --- /dev/null +++ b/src/ut1.rs @@ -0,0 +1,162 @@ +/* + * Hifitime, part of the Nyx Space tools + * Copyright (C) 2022 Christopher Rabotin et al. (cf. AUTHORS.md) + * This Source Code Form is subject to the terms of the Apache + * v. 2.0. If a copy of the Apache License was not distributed with this + * file, You can obtain one at https://www.apache.org/licenses/LICENSE-2.0. + * + * Documentation: https://nyxspace.com/ + */ + +#[cfg(feature = "python")] +use pyo3::prelude::*; + +use reqwest::{blocking::get, StatusCode}; + +use tabled::{Style, Table, Tabled}; + +use std::{fs::File, io::Read}; + +use core::fmt; +use core::ops::Index; + +use crate::{Duration, Epoch, Errors, ParsingErrors, Unit}; + +#[derive(Copy, Clone, Debug, Default, Tabled)] +pub struct DeltaTaiUt1 { + pub epoch: Epoch, + pub delta_tai_minus_ut1: Duration, +} + +#[repr(C)] +#[cfg_attr(feature = "python", pyclass)] +#[derive(Clone, Debug, Default)] +/// A structure storing all of the TAI-UT1 data +pub struct Ut1Provider { + data: Vec, + iter_pos: usize, +} + +impl Ut1Provider { + /// Build a UT1 provider by downloading the data from (short time scale UT1 data) and parsing it. + pub fn download_short_from_jpl() -> Result { + match get("https://eop2-external.jpl.nasa.gov/eop2/latest_eop2.short") { + Ok(resp) => { + let eop_data = String::from_utf8(resp.bytes().unwrap().to_vec()).unwrap(); + Self::from_eop_data(eop_data) + } + Err(e) => Err(Errors::ParseError(ParsingErrors::DownloadError( + e.status().unwrap_or(StatusCode::SEE_OTHER), + ))), + } + } + + /// Builds a UT1 provider from the provided path to an EOP file. + pub fn from_eop_file(path: &str) -> Result { + let mut f = match File::open(path) { + Ok(f) => f, + Err(e) => return Err(Errors::ParseError(ParsingErrors::IOError(e.kind()))), + }; + + let mut contents = String::new(); + if let Err(e) = f.read_to_string(&mut contents) { + return Err(Errors::ParseError(ParsingErrors::IOError(e.kind()))); + } + + Self::from_eop_data(contents) + } + + /// Builds a UT1 provider from the provided EOP data + pub fn from_eop_data(contents: String) -> Result { + let mut me = Self::default(); + + let mut ignore = true; + for line in contents.lines() { + if line == " EOP2=" { + // Data will start after this line + ignore = false; + continue; + } else if line == " $END" { + // We've reached the end of the EOP data file. + break; + } + if ignore { + continue; + } + + // We have data of interest! + let data: Vec<&str> = line.split(',').collect(); + if data.len() < 4 { + return Err(Errors::ParseError(ParsingErrors::UnknownFormat)); + } + + let mjd_tai_days: f64; + match lexical_core::parse(data[0].trim().as_bytes()) { + Ok(val) => mjd_tai_days = val, + Err(_) => return Err(Errors::ParseError(ParsingErrors::ValueError)), + } + + let delta_ut1_ms: f64; + match lexical_core::parse(data[3].trim().as_bytes()) { + Ok(val) => delta_ut1_ms = val, + Err(_) => return Err(Errors::ParseError(ParsingErrors::ValueError)), + } + + me.data.push(DeltaTaiUt1 { + epoch: Epoch::from_mjd_tai(mjd_tai_days), + delta_tai_minus_ut1: delta_ut1_ms * Unit::Millisecond, + }); + } + + Ok(me) + } +} + +#[cfg(feature = "python")] +#[cfg_attr(feature = "python", pymethods)] +impl Ut1Provider { + #[new] + pub fn __new__() -> Result { + Self::download_short_from_jpl() + } + + fn __repr__(&self) -> String { + format!("{self}") + } +} + +impl fmt::Display for Ut1Provider { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let mut table = Table::new(&self.data); + table.with(Style::rounded()); + write!(f, "{}", table) + } +} + +impl Iterator for Ut1Provider { + type Item = DeltaTaiUt1; + + fn next(&mut self) -> Option { + self.iter_pos += 1; + self.data.get(self.iter_pos - 1).copied() + } +} + +impl DoubleEndedIterator for Ut1Provider { + fn next_back(&mut self) -> Option { + if self.iter_pos == self.data.len() { + None + } else { + self.iter_pos += 1; + self.data.get(self.data.len() - self.iter_pos).copied() + } + } +} + +impl Index for Ut1Provider { + type Output = DeltaTaiUt1; + + fn index(&self, index: usize) -> &Self::Output { + self.data.index(index) + } +} diff --git a/tests/epoch.rs b/tests/epoch.rs index 38854443..11b203d6 100644 --- a/tests/epoch.rs +++ b/tests/epoch.rs @@ -8,7 +8,6 @@ use hifitime::{ SECONDS_GST_TAI_OFFSET, SECONDS_PER_DAY, }; -#[cfg(feature = "fmt")] use hifitime::efmt::{Format, Formatter}; #[cfg(feature = "std")] @@ -1769,7 +1768,6 @@ fn test_day_of_year() { } /// Tests that for a number of epochs covering different leap seconds, creating an Epoch with a given time scale will allow us to retrieve in that same time scale with the same value. -#[cfg(feature = "fmt")] #[test] fn test_epoch_formatter() { use core::str::FromStr; @@ -1827,3 +1825,22 @@ fn test_epoch_formatter() { Err(hifitime::ParsingErrors::UnknownFormattingToken('p')) ); } + +#[cfg(feature = "std")] +#[test] +fn test_leap_seconds_file() { + use hifitime::leap_seconds::{LatestLeapSeconds, LeapSecondsFile}; + + let provider = LeapSecondsFile::from_path("data/leap-seconds.list").unwrap(); + + let default = LatestLeapSeconds::default(); + + // Check that we read the data correctly knowing that the IERS data only contains the announced leap seconds. + let mut pos = 0; + for expected in default { + if expected.announced_by_iers { + assert_eq!(expected, provider[pos]); + pos += 1; + } + } +} diff --git a/tests/ut1.rs b/tests/ut1.rs new file mode 100644 index 00000000..7bd9aedc --- /dev/null +++ b/tests/ut1.rs @@ -0,0 +1,49 @@ +use core::str::FromStr; + +use hifitime::Epoch; + +#[cfg(feature = "ut1")] +#[test] +fn test_ut1_from_file() { + use hifitime::ut1::Ut1Provider; + + let provider = Ut1Provider::from_eop_file("data/eop-2021-10-12--2023-01-04.short").unwrap(); + + println!("{}", provider); + + // Grabbed from AstroPy: + // >>> Time("2022-01-03 03:05:06.789101") + //