From e622050d7981960c64552c05f3f8f96f44983865 Mon Sep 17 00:00:00 2001 From: Andrei Zisu Date: Sun, 12 Mar 2023 22:58:00 +0100 Subject: [PATCH 01/27] Add nom dep --- Cargo.lock | 21 +++++++++++---------- crates/lox_core/Cargo.toml | 1 + 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0f62b14d..016391da 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -338,6 +338,7 @@ dependencies = [ "divan", "float_eq", "glam", + "nom", "num", "proptest", "rstest", @@ -670,25 +671,25 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d119d7c7ca818f8a53c300863d4f87566aac09943aef5b355bb83969dae75d87" +checksum = "aaac441002f822bc9705a681810a4dd2963094b9ca0ddc41cb963a4c189189ea" dependencies = [ "aho-corasick", "memchr", "regex-automata", - "regex-syntax 0.8.1", + "regex-syntax 0.8.2", ] [[package]] name = "regex-automata" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "465c6fc0621e4abc4187a2bda0937bfd4f722c2730b29562e19689ea796c9a4b" +checksum = "5011c7e263a695dc8ca064cddb722af1be54e517a280b12a5356f98366899e5d" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.1", + "regex-syntax 0.8.2", ] [[package]] @@ -705,9 +706,9 @@ checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" [[package]] name = "regex-syntax" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56d84fdd47036b038fc80dd333d10b6aab10d5d31f4a366e20014def75328d33" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "relative-path" @@ -755,9 +756,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.18" +version = "0.38.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a74ee2d7c2581cd139b42447d7d9389b889bdaad3a73f1ebb16f2a3237bb19c" +checksum = "745ecfa778e66b2b63c88a61cb36e0eea109e803b0b86bf9879fbc77c70e86ed" dependencies = [ "bitflags 2.4.0", "errno", diff --git a/crates/lox_core/Cargo.toml b/crates/lox_core/Cargo.toml index b90e4a25..b80050b8 100644 --- a/crates/lox_core/Cargo.toml +++ b/crates/lox_core/Cargo.toml @@ -8,6 +8,7 @@ float_eq = "1.0.1" glam = "0.24.2" num = "0.4.0" thiserror.workspace = true +nom = "7.1.3" [dev-dependencies] proptest = "1.1.0" From f75f04cd2a56b28307e3d86dd315501b80bd6be3 Mon Sep 17 00:00:00 2001 From: Andrei Zisu Date: Sun, 12 Mar 2023 22:58:44 +0100 Subject: [PATCH 02/27] Parse DAF/SPK file record --- crates/lox_core/src/ephemeris.rs | 1 + crates/lox_core/src/ephemeris/daf_spk.rs | 1 + .../lox_core/src/ephemeris/daf_spk/parser.rs | 224 ++++++++++++++++++ crates/lox_core/src/lib.rs | 1 + 4 files changed, 227 insertions(+) create mode 100644 crates/lox_core/src/ephemeris.rs create mode 100644 crates/lox_core/src/ephemeris/daf_spk.rs create mode 100644 crates/lox_core/src/ephemeris/daf_spk/parser.rs diff --git a/crates/lox_core/src/ephemeris.rs b/crates/lox_core/src/ephemeris.rs new file mode 100644 index 00000000..801695c7 --- /dev/null +++ b/crates/lox_core/src/ephemeris.rs @@ -0,0 +1 @@ +pub mod daf_spk; diff --git a/crates/lox_core/src/ephemeris/daf_spk.rs b/crates/lox_core/src/ephemeris/daf_spk.rs new file mode 100644 index 00000000..67c567fa --- /dev/null +++ b/crates/lox_core/src/ephemeris/daf_spk.rs @@ -0,0 +1 @@ +pub mod parser; diff --git a/crates/lox_core/src/ephemeris/daf_spk/parser.rs b/crates/lox_core/src/ephemeris/daf_spk/parser.rs new file mode 100644 index 00000000..da16f599 --- /dev/null +++ b/crates/lox_core/src/ephemeris/daf_spk/parser.rs @@ -0,0 +1,224 @@ +#[derive(Debug, PartialEq)] +pub struct FileRecord { + pub locidw: String, + pub nd: u32, + pub ni: u32, + pub locifn: String, + pub fward: u32, + pub bward: u32, + pub free: u32, + pub locfmt: String, + pub prenul: Vec, + pub ftpstr: Vec, + pub pstnul: Vec, +} + +pub fn parse_file_record(input: &[u8]) -> nom::IResult<&[u8], FileRecord> { + // 1. LOCIDW (8 charactersu8, 8 bytes): An identification word (`DAF/xxxx'). + // The 'xxxx' substring is a string of four characters or less indicating the + // type of data stored in the DAF file. This is used by the SPICELIB + // subroutines to verify that a particular file is in fact a DAF and not + // merely a direct access file with the same record length. When + // a DAF is openedu8, an error signals if this keyword is not present. [Address + // 0] + let (input, locidw) = nom::bytes::complete::take(8u32)(input)?; + + // 2. ND ( 1 integeru8, 4 bytes): The number of double precision components in + // each array summary. [Address 8] + let (input, nd) = nom::number::complete::le_u32(input)?; + + // 3. NI ( 1 integeru8, 4 bytes): The number of integer components in each array + // summary. [Address 12] + let (input, ni) = nom::number::complete::le_u32(input)?; + + // 4. LOCIFN (60 charactersu8, 60 bytes): The internal name or description of + // the array file. [Address 16] + let (input, locifn) = nom::bytes::complete::take(60u32)(input)?; + + // 5. FWARD ( 1 integeru8, 4 bytes): The record number of the initial summary + // record in the file. [Address 76] + let (input, fward) = nom::number::complete::le_u32(input)?; + + // 6. BWARD ( 1 integeru8, 4 bytes): The record number of the final summary + // record in the file. [Address 80] + let (input, bward) = nom::number::complete::le_u32(input)?; + + // 7. FREE ( 1 integeru8, 4 bytes): The first free address in the file. This is + // the address at which the first element of the next array to be added to + // the file will be stored. [Address 84] + let (input, free) = nom::number::complete::le_u32(input)?; + + // 8. LOCFMT ( 8 charactersu8, 8 bytes): The character string that indicates the + // numeric binary format of the DAF. The string has value either "LTL-IEEE" + // or "BIG-IEEE." [Address 88] + let (input, locfmt) = nom::bytes::complete::take(8u32)(input)?; + + // 9. PRENUL ( 603 charactersu8, 603 bytes): A block of nulls to pad between the + // last character of LOCFMT and the first character of FTPSTR to keep FTPSTR + // at character 700 (address 699) in a 1024 byte record. [Address 96] + let (input, prenul) = nom::bytes::complete::take(603u32)(input)?; + + // 10. FTPSTR ( 28 charactersu8, 28 bytes): The FTP validation string. + // This string is assembled using components returned from the SPICELIB private + // routine ZZFTPSTR. [Address 699] + let (input, ftpstr) = nom::bytes::complete::take(28u32)(input)?; + + // 11. PSTNUL ( 297 charactersu8, 297 bytes): A block of nulls to pad from the + // last character of FTPSTR to the end of the file record. Note: this value + // enforces the length of the file record as 1024 bytes. [Address 727] + let (input, pstnul) = nom::bytes::complete::take(297u32)(input)?; + + // We know the loc strings are ASCII in the spec, so parsing them as utf-8 + // should be safe. + Ok(( + input, + FileRecord { + locidw: String::from_utf8_lossy(locidw).trim().to_string(), + nd, + ni, + locifn: String::from_utf8_lossy(locifn).trim().to_string(), + fward, + bward, + free, + locfmt: String::from_utf8_lossy(locfmt).trim().to_string(), + prenul: prenul.to_owned(), + ftpstr: ftpstr.to_owned(), + pstnul: pstnul.to_owned(), + }, + )) +} + +pub fn parse_daf_spk() { + // From https://naif.jpl.nasa.gov/pub/naif/toolkit_docs/C/req/daf.html +} + +#[test] +fn test_parse_file_record() { + // NASA NAIF spy returns the following values for the file record bytes below + // ================================================================== + // File Architecture : DAF + // Binary File Format : LTL-IEEE + // FTP Validation String : Present and Intact + // Internal File Name : NIO2SPK + // ID Word : DAF/SPK + // ND : 2 + // NI : 6 + // Forward Record Pointer : 4 + // Backward Record Pointer: 4 + // First Free Address : 14967465 + // ================================================================== + const FILE_RECORD_SEGMENT: [u8; 1024] = [ + 0x44u8, 0x41u8, 0x46u8, 0x2Fu8, 0x53u8, 0x50u8, 0x4Bu8, 0x20u8, 0x02u8, 0x00u8, 0x00u8, + 0x00u8, 0x06u8, 0x00u8, 0x00u8, 0x00u8, 0x4Eu8, 0x49u8, 0x4Fu8, 0x32u8, 0x53u8, 0x50u8, + 0x4Bu8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x04u8, + 0x00u8, 0x00u8, 0x00u8, 0x04u8, 0x00u8, 0x00u8, 0x00u8, 0xA9u8, 0x62u8, 0xE4u8, 0x00u8, + 0x4Cu8, 0x54u8, 0x4Cu8, 0x2Du8, 0x49u8, 0x45u8, 0x45u8, 0x45u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x46u8, 0x54u8, 0x50u8, 0x53u8, 0x54u8, + 0x52u8, 0x3Au8, 0x0Du8, 0x3Au8, 0x0Au8, 0x3Au8, 0x0Du8, 0x0Au8, 0x3Au8, 0x0Du8, 0x00u8, + 0x3Au8, 0x81u8, 0x3Au8, 0x10u8, 0xCEu8, 0x3Au8, 0x45u8, 0x4Eu8, 0x44u8, 0x46u8, 0x54u8, + 0x50u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, + ]; + + let (unparsed_string, file_record) = + parse_file_record(&FILE_RECORD_SEGMENT).expect("File record parsing should succeed"); + + assert_eq!(unparsed_string.len(), 0); + + assert_eq!(file_record.locidw, "DAF/SPK"); + assert_eq!(file_record.nd, 2); + assert_eq!(file_record.ni, 6); + assert_eq!(file_record.locifn, "NIO2SPK"); + assert_eq!(file_record.fward, 4); + assert_eq!(file_record.bward, 4); + assert_eq!(file_record.free, 14967465); + assert_eq!(file_record.locfmt, "LTL-IEEE"); + assert_eq!( + file_record.ftpstr, + b"FTPSTR:\r:\n:\r\n:\r\x00:\x81:\x10\xce:ENDFTP" + ); +} diff --git a/crates/lox_core/src/lib.rs b/crates/lox_core/src/lib.rs index 97efaf5a..bbedc7ba 100644 --- a/crates/lox_core/src/lib.rs +++ b/crates/lox_core/src/lib.rs @@ -8,6 +8,7 @@ pub mod bodies; pub mod communications; +pub mod ephemeris; pub mod errors; pub mod frames; pub mod time; From ecd9a6011ba4e277232aec5bc430c5e339f34e02 Mon Sep 17 00:00:00 2001 From: Andrei Zisu Date: Mon, 20 Mar 2023 00:24:20 +0100 Subject: [PATCH 03/27] Implement comment area parsing --- .../lox_core/src/ephemeris/daf_spk/parser.rs | 299 +++++++++++++++++- 1 file changed, 298 insertions(+), 1 deletion(-) diff --git a/crates/lox_core/src/ephemeris/daf_spk/parser.rs b/crates/lox_core/src/ephemeris/daf_spk/parser.rs index da16f599..61b4bc63 100644 --- a/crates/lox_core/src/ephemeris/daf_spk/parser.rs +++ b/crates/lox_core/src/ephemeris/daf_spk/parser.rs @@ -1,3 +1,7 @@ +use nom::error::ErrorKind; + +const RECORD_SIZE: u32 = 1024; + #[derive(Debug, PartialEq)] pub struct FileRecord { pub locidw: String, @@ -13,6 +17,12 @@ pub struct FileRecord { pub pstnul: Vec, } +#[derive(Debug, PartialEq)] +pub struct SPK { + pub file_record: FileRecord, + pub comment: String, +} + pub fn parse_file_record(input: &[u8]) -> nom::IResult<&[u8], FileRecord> { // 1. LOCIDW (8 charactersu8, 8 bytes): An identification word (`DAF/xxxx'). // The 'xxxx' substring is a string of four characters or less indicating the @@ -88,8 +98,295 @@ pub fn parse_file_record(input: &[u8]) -> nom::IResult<&[u8], FileRecord> { )) } -pub fn parse_daf_spk() { +pub fn parse_comment_area(input: &[u8], comment_areas_count: u32) -> nom::IResult<&[u8], String> { + // This function is definetely not optimal as there are several allocations at different points but this is not a hot data path. + let mut comment_area = String::new(); + + let mut input_cursor = input; + for _ in 0..comment_areas_count { + let (updated_input_cursor, comment_areas) = + nom::bytes::complete::take(RECORD_SIZE)(input_cursor)?; + + input_cursor = updated_input_cursor; + + let (_, comment_record_content) = nom::bytes::complete::take(1000u32)(comment_areas)?; + + let comment_record_content = + match nom::bytes::complete::take_until("\x04")(comment_record_content) { + Ok((_, content_to_end_of_transmission_char)) => content_to_end_of_transmission_char, + Err(error) => match error { + // This is one ugly error type. What we're saying here is, if we can't + // find the end of transmission character, just return the whole thing. + nom::Err::Error(nom::error::Error { + input: _, + code: ErrorKind::TakeUntil, + }) => comment_record_content, + _ => Err(error)?, + }, + }; + + let comment_record_content = + String::from_utf8_lossy(comment_record_content).replace("\0", "\n"); + + comment_area.push_str(&comment_record_content) + } + + let comment_area = comment_area.trim().to_string(); + + Ok((input_cursor, comment_area)) +} + +pub fn parse_daf_spk(input: &[u8]) -> nom::IResult<&[u8], SPK> { // From https://naif.jpl.nasa.gov/pub/naif/toolkit_docs/C/req/daf.html + + let (input, file_record) = parse_file_record(input)?; + + let (input, comment) = parse_comment_area(input, file_record.fward - 2)?; + + Ok(( + input, + SPK { + file_record, + comment, + }, + )) +} + +#[test] +fn test_parse_comment_area() { + const COMMENT_AREA_SEGMENT: [u8; 2048] = [ + 0x00u8, 0x00u8, 0x53u8, 0x65u8, 0x70u8, 0x74u8, 0x65u8, 0x6du8, 0x62u8, 0x65u8, 0x72u8, + 0x20u8, 0x30u8, 0x33u8, 0x2cu8, 0x20u8, 0x32u8, 0x30u8, 0x31u8, 0x33u8, 0x00u8, 0x43u8, + 0x2eu8, 0x20u8, 0x41u8, 0x63u8, 0x74u8, 0x6fu8, 0x6eu8, 0x00u8, 0x00u8, 0x4au8, 0x50u8, + 0x4cu8, 0x27u8, 0x73u8, 0x20u8, 0x53u8, 0x6fu8, 0x6cu8, 0x61u8, 0x72u8, 0x20u8, 0x53u8, + 0x79u8, 0x73u8, 0x74u8, 0x65u8, 0x6du8, 0x20u8, 0x44u8, 0x79u8, 0x6eu8, 0x61u8, 0x6du8, + 0x69u8, 0x63u8, 0x73u8, 0x20u8, 0x47u8, 0x72u8, 0x6fu8, 0x75u8, 0x70u8, 0x20u8, 0x68u8, + 0x61u8, 0x73u8, 0x20u8, 0x72u8, 0x65u8, 0x6cu8, 0x65u8, 0x61u8, 0x73u8, 0x65u8, 0x64u8, + 0x20u8, 0x74u8, 0x77u8, 0x6fu8, 0x20u8, 0x6eu8, 0x65u8, 0x77u8, 0x20u8, 0x70u8, 0x6cu8, + 0x61u8, 0x6eu8, 0x65u8, 0x74u8, 0x61u8, 0x72u8, 0x79u8, 0x2fu8, 0x6cu8, 0x75u8, 0x6eu8, + 0x61u8, 0x72u8, 0x20u8, 0x65u8, 0x70u8, 0x68u8, 0x65u8, 0x6du8, 0x65u8, 0x72u8, 0x69u8, + 0x64u8, 0x65u8, 0x73u8, 0x2cu8, 0x00u8, 0x6eu8, 0x61u8, 0x6du8, 0x65u8, 0x64u8, 0x20u8, + 0x44u8, 0x45u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x61u8, 0x6eu8, 0x64u8, 0x20u8, 0x44u8, + 0x45u8, 0x34u8, 0x33u8, 0x31u8, 0x2eu8, 0x00u8, 0x00u8, 0x44u8, 0x45u8, 0x34u8, 0x33u8, + 0x30u8, 0x20u8, 0x69u8, 0x73u8, 0x20u8, 0x6eu8, 0x6fu8, 0x77u8, 0x20u8, 0x63u8, 0x6fu8, + 0x6eu8, 0x73u8, 0x69u8, 0x64u8, 0x65u8, 0x72u8, 0x65u8, 0x64u8, 0x20u8, 0x74u8, 0x68u8, + 0x65u8, 0x20u8, 0x6fu8, 0x66u8, 0x66u8, 0x69u8, 0x63u8, 0x69u8, 0x61u8, 0x6cu8, 0x20u8, + 0x65u8, 0x78u8, 0x70u8, 0x6fu8, 0x72u8, 0x74u8, 0x20u8, 0x6cu8, 0x75u8, 0x6eu8, 0x61u8, + 0x72u8, 0x2fu8, 0x70u8, 0x6cu8, 0x61u8, 0x6eu8, 0x65u8, 0x74u8, 0x61u8, 0x72u8, 0x79u8, + 0x20u8, 0x65u8, 0x70u8, 0x68u8, 0x65u8, 0x6du8, 0x65u8, 0x72u8, 0x69u8, 0x73u8, 0x2cu8, + 0x20u8, 0x73u8, 0x75u8, 0x69u8, 0x74u8, 0x61u8, 0x62u8, 0x6cu8, 0x65u8, 0x20u8, 0x66u8, + 0x6fu8, 0x72u8, 0x00u8, 0x61u8, 0x6cu8, 0x6cu8, 0x20u8, 0x75u8, 0x73u8, 0x65u8, 0x72u8, + 0x73u8, 0x2fu8, 0x75u8, 0x73u8, 0x65u8, 0x73u8, 0x2eu8, 0x20u8, 0x49u8, 0x74u8, 0x27u8, + 0x73u8, 0x20u8, 0x61u8, 0x70u8, 0x70u8, 0x72u8, 0x6fu8, 0x78u8, 0x69u8, 0x6du8, 0x61u8, + 0x74u8, 0x65u8, 0x20u8, 0x74u8, 0x69u8, 0x6du8, 0x65u8, 0x20u8, 0x73u8, 0x70u8, 0x61u8, + 0x6eu8, 0x20u8, 0x69u8, 0x73u8, 0x20u8, 0x31u8, 0x35u8, 0x35u8, 0x30u8, 0x20u8, 0x4au8, + 0x41u8, 0x4eu8, 0x20u8, 0x30u8, 0x31u8, 0x20u8, 0x74u8, 0x6fu8, 0x20u8, 0x32u8, 0x36u8, + 0x35u8, 0x30u8, 0x20u8, 0x4au8, 0x41u8, 0x4eu8, 0x20u8, 0x32u8, 0x32u8, 0x2eu8, 0x00u8, + 0x00u8, 0x49u8, 0x66u8, 0x20u8, 0x61u8, 0x20u8, 0x6cu8, 0x6fu8, 0x6eu8, 0x67u8, 0x65u8, + 0x72u8, 0x20u8, 0x74u8, 0x69u8, 0x6du8, 0x65u8, 0x20u8, 0x73u8, 0x70u8, 0x61u8, 0x6eu8, + 0x20u8, 0x69u8, 0x73u8, 0x20u8, 0x6eu8, 0x65u8, 0x65u8, 0x64u8, 0x65u8, 0x64u8, 0x2cu8, + 0x20u8, 0x44u8, 0x45u8, 0x34u8, 0x33u8, 0x31u8, 0x20u8, 0x6du8, 0x61u8, 0x79u8, 0x20u8, + 0x62u8, 0x65u8, 0x20u8, 0x75u8, 0x73u8, 0x65u8, 0x64u8, 0x2cu8, 0x20u8, 0x65u8, 0x78u8, + 0x63u8, 0x65u8, 0x70u8, 0x74u8, 0x20u8, 0x74u8, 0x68u8, 0x61u8, 0x74u8, 0x20u8, 0x74u8, + 0x68u8, 0x65u8, 0x20u8, 0x6cu8, 0x75u8, 0x6eu8, 0x61u8, 0x72u8, 0x20u8, 0x65u8, 0x70u8, + 0x68u8, 0x65u8, 0x6du8, 0x65u8, 0x72u8, 0x69u8, 0x73u8, 0x00u8, 0x70u8, 0x6fu8, 0x72u8, + 0x74u8, 0x69u8, 0x6fu8, 0x6eu8, 0x20u8, 0x69u8, 0x73u8, 0x20u8, 0x6fu8, 0x66u8, 0x20u8, + 0x72u8, 0x65u8, 0x6cu8, 0x61u8, 0x74u8, 0x69u8, 0x76u8, 0x65u8, 0x6cu8, 0x79u8, 0x20u8, + 0x70u8, 0x6fu8, 0x6fu8, 0x72u8, 0x20u8, 0x61u8, 0x63u8, 0x63u8, 0x75u8, 0x72u8, 0x61u8, + 0x63u8, 0x79u8, 0x20u8, 0x6fu8, 0x75u8, 0x74u8, 0x73u8, 0x69u8, 0x64u8, 0x65u8, 0x20u8, + 0x6fu8, 0x66u8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x74u8, 0x69u8, 0x6du8, 0x65u8, + 0x20u8, 0x73u8, 0x70u8, 0x61u8, 0x6eu8, 0x20u8, 0x63u8, 0x6fu8, 0x76u8, 0x65u8, 0x72u8, + 0x65u8, 0x64u8, 0x20u8, 0x62u8, 0x79u8, 0x20u8, 0x44u8, 0x45u8, 0x34u8, 0x33u8, 0x30u8, + 0x2eu8, 0x00u8, 0x54u8, 0x68u8, 0x65u8, 0x20u8, 0x74u8, 0x69u8, 0x6du8, 0x65u8, 0x20u8, + 0x73u8, 0x70u8, 0x61u8, 0x6eu8, 0x20u8, 0x63u8, 0x6fu8, 0x76u8, 0x65u8, 0x72u8, 0x65u8, + 0x64u8, 0x20u8, 0x62u8, 0x79u8, 0x20u8, 0x44u8, 0x45u8, 0x34u8, 0x33u8, 0x31u8, 0x20u8, + 0x69u8, 0x73u8, 0x20u8, 0x61u8, 0x70u8, 0x70u8, 0x72u8, 0x6fu8, 0x78u8, 0x69u8, 0x6du8, + 0x61u8, 0x74u8, 0x65u8, 0x6cu8, 0x79u8, 0x20u8, 0x31u8, 0x33u8, 0x32u8, 0x30u8, 0x32u8, + 0x20u8, 0x42u8, 0x2eu8, 0x43u8, 0x2eu8, 0x20u8, 0x74u8, 0x6fu8, 0x20u8, 0x31u8, 0x37u8, + 0x31u8, 0x39u8, 0x31u8, 0x20u8, 0x41u8, 0x2eu8, 0x44u8, 0x2eu8, 0x20u8, 0x42u8, 0x65u8, + 0x63u8, 0x61u8, 0x75u8, 0x73u8, 0x65u8, 0x20u8, 0x64u8, 0x65u8, 0x34u8, 0x33u8, 0x31u8, + 0x00u8, 0x69u8, 0x73u8, 0x20u8, 0x73u8, 0x6fu8, 0x20u8, 0x6cu8, 0x6fu8, 0x6eu8, 0x67u8, + 0x2cu8, 0x20u8, 0x6cu8, 0x65u8, 0x61u8, 0x64u8, 0x69u8, 0x6eu8, 0x67u8, 0x20u8, 0x74u8, + 0x6fu8, 0x20u8, 0x61u8, 0x20u8, 0x68u8, 0x75u8, 0x67u8, 0x65u8, 0x20u8, 0x66u8, 0x69u8, + 0x6cu8, 0x65u8, 0x2cu8, 0x20u8, 0x69u8, 0x74u8, 0x20u8, 0x68u8, 0x61u8, 0x73u8, 0x20u8, + 0x62u8, 0x65u8, 0x65u8, 0x6eu8, 0x20u8, 0x73u8, 0x70u8, 0x6cu8, 0x69u8, 0x74u8, 0x20u8, + 0x69u8, 0x6eu8, 0x74u8, 0x6fu8, 0x20u8, 0x74u8, 0x77u8, 0x6fu8, 0x20u8, 0x70u8, 0x61u8, + 0x72u8, 0x74u8, 0x73u8, 0x20u8, 0x68u8, 0x61u8, 0x76u8, 0x69u8, 0x6eu8, 0x67u8, 0x20u8, + 0x74u8, 0x68u8, 0x65u8, 0x00u8, 0x61u8, 0x70u8, 0x70u8, 0x72u8, 0x6fu8, 0x78u8, 0x69u8, + 0x6du8, 0x61u8, 0x67u8, 0x74u8, 0x65u8, 0x20u8, 0x74u8, 0x69u8, 0x6du8, 0x65u8, 0x20u8, + 0x73u8, 0x70u8, 0x61u8, 0x6eu8, 0x73u8, 0x20u8, 0x6fu8, 0x66u8, 0x3au8, 0x00u8, 0x00u8, + 0x20u8, 0x20u8, 0x20u8, 0x31u8, 0x33u8, 0x32u8, 0x30u8, 0x32u8, 0x20u8, 0x42u8, 0x2eu8, + 0x43u8, 0x2eu8, 0x20u8, 0x74u8, 0x6fu8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x30u8, + 0x00u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x30u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x74u8, 0x6fu8, 0x20u8, 0x31u8, 0x37u8, 0x31u8, 0x39u8, + 0x31u8, 0x20u8, 0x41u8, 0x2eu8, 0x44u8, 0x2eu8, 0x00u8, 0x00u8, 0x4du8, 0x6fu8, 0x72u8, + 0x65u8, 0x20u8, 0x64u8, 0x65u8, 0x74u8, 0x61u8, 0x69u8, 0x6cu8, 0x73u8, 0x20u8, 0x61u8, + 0x62u8, 0x6fu8, 0x75u8, 0x74u8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x73u8, 0x65u8, 0x20u8, + 0x65u8, 0x70u8, 0x68u8, 0x65u8, 0x6du8, 0x65u8, 0x72u8, 0x69u8, 0x73u8, 0x20u8, 0x66u8, + 0x69u8, 0x6cu8, 0x65u8, 0x73u8, 0x20u8, 0x61u8, 0x72u8, 0x65u8, 0x20u8, 0x63u8, 0x6fu8, + 0x6eu8, 0x74u8, 0x61u8, 0x69u8, 0x6eu8, 0x65u8, 0x64u8, 0x20u8, 0x69u8, 0x6eu8, 0x20u8, + 0x61u8, 0x63u8, 0x63u8, 0x6fu8, 0x6du8, 0x70u8, 0x61u8, 0x6eu8, 0x79u8, 0x69u8, 0x6eu8, + 0x67u8, 0x20u8, 0x64u8, 0x6fu8, 0x63u8, 0x75u8, 0x6du8, 0x65u8, 0x6eu8, 0x74u8, 0x61u8, + 0x74u8, 0x69u8, 0x6fu8, 0x6eu8, 0x00u8, 0x61u8, 0x76u8, 0x61u8, 0x69u8, 0x6cu8, 0x61u8, + 0x62u8, 0x6cu8, 0x65u8, 0x20u8, 0x6fu8, 0x6eu8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x20u8, + 0x4eu8, 0x41u8, 0x49u8, 0x46u8, 0x20u8, 0x73u8, 0x65u8, 0x72u8, 0x76u8, 0x65u8, 0x72u8, + 0x3au8, 0x20u8, 0x20u8, 0x68u8, 0x74u8, 0x74u8, 0x70u8, 0x3au8, 0x2fu8, 0x2fu8, 0x6eu8, + 0x61u8, 0x69u8, 0x66u8, 0x2eu8, 0x6au8, 0x70u8, 0x6cu8, 0x2eu8, 0x6eu8, 0x61u8, 0x73u8, + 0x61u8, 0x2eu8, 0x67u8, 0x6fu8, 0x76u8, 0x2fu8, 0x70u8, 0x75u8, 0x62u8, 0x2fu8, 0x6eu8, + 0x61u8, 0x69u8, 0x66u8, 0x2fu8, 0x67u8, 0x65u8, 0x6eu8, 0x65u8, 0x72u8, 0x69u8, 0x63u8, + 0x5fu8, 0x6bu8, 0x65u8, 0x72u8, 0x6eu8, 0x65u8, 0x6cu8, 0x73u8, 0x2fu8, 0x73u8, 0x70u8, + 0x6bu8, 0x2fu8, 0x70u8, 0x6cu8, 0x61u8, 0x6eu8, 0x65u8, 0x74u8, 0x73u8, 0x2fu8, 0x00u8, + 0x00u8, 0x00u8, 0x53u8, 0x70u8, 0x65u8, 0x63u8, 0x69u8, 0x61u8, 0x6cu8, 0x20u8, 0x6eu8, + 0x6fu8, 0x74u8, 0x65u8, 0x20u8, 0x72u8, 0x65u8, 0x67u8, 0x61u8, 0x72u8, 0x64u8, 0x69u8, + 0x6eu8, 0x67u8, 0x20u8, 0x4du8, 0x61u8, 0x72u8, 0x73u8, 0x3au8, 0x20u8, 0x20u8, 0x73u8, + 0x74u8, 0x61u8, 0x72u8, 0x74u8, 0x69u8, 0x6eu8, 0x67u8, 0x20u8, 0x77u8, 0x69u8, 0x74u8, + 0x68u8, 0x20u8, 0x74u8, 0x68u8, 0x69u8, 0x73u8, 0x20u8, 0x44u8, 0x45u8, 0x20u8, 0x66u8, + 0x69u8, 0x6cu8, 0x65u8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x6cu8, 0x6fu8, 0x63u8, + 0x61u8, 0x74u8, 0x69u8, 0x6fu8, 0x6eu8, 0x20u8, 0x6fu8, 0x66u8, 0x20u8, 0x4du8, 0x61u8, + 0x72u8, 0x73u8, 0x27u8, 0x20u8, 0x6du8, 0x61u8, 0x73u8, 0x73u8, 0x20u8, 0x63u8, 0x65u8, + 0x6eu8, 0x74u8, 0x65u8, 0x72u8, 0x00u8, 0x28u8, 0x4eu8, 0x41u8, 0x49u8, 0x46u8, 0x20u8, + 0x49u8, 0x44u8, 0x20u8, 0x3du8, 0x20u8, 0x34u8, 0x39u8, 0x39u8, 0x29u8, 0x20u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x69u8, 0x73u8, 0x20u8, 0x2au8, 0x4eu8, 0x4fu8, 0x54u8, 0x2au8, 0x20u8, 0x69u8, + 0x6eu8, 0x63u8, 0x6cu8, 0x75u8, 0x64u8, 0x65u8, 0x64u8, 0x3bu8, 0x20u8, 0x6fu8, 0x6eu8, + 0x6cu8, 0x79u8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x4du8, 0x61u8, 0x72u8, 0x73u8, + 0x20u8, 0x73u8, 0x79u8, 0x73u8, 0x74u8, 0x65u8, 0x6du8, 0x20u8, 0x62u8, 0x61u8, 0x72u8, + 0x79u8, 0x63u8, 0x65u8, 0x6eu8, 0x74u8, 0x65u8, 0x72u8, 0x20u8, 0x28u8, 0x49u8, 0x44u8, + 0x20u8, 0x3du8, 0x20u8, 0x34u8, 0x29u8, 0x20u8, 0x69u8, 0x73u8, 0x20u8, 0x70u8, 0x72u8, + 0x65u8, 0x73u8, 0x65u8, 0x6eu8, 0x74u8, 0x2eu8, 0x00u8, 0x54u8, 0x68u8, 0x65u8, 0x20u8, + 0x6fu8, 0x66u8, 0x66u8, 0x73u8, 0x65u8, 0x74u8, 0x20u8, 0x62u8, 0x65u8, 0x74u8, 0x77u8, + 0x65u8, 0x65u8, 0x6eu8, 0x20u8, 0x4du8, 0x61u8, 0x72u8, 0x73u8, 0x27u8, 0x20u8, 0x6du8, + 0x61u8, 0x73u8, 0x73u8, 0x20u8, 0x63u8, 0x65u8, 0x6eu8, 0x74u8, 0x65u8, 0x72u8, 0x20u8, + 0x61u8, 0x6eu8, 0x64u8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x4du8, 0x61u8, 0x72u8, + 0x73u8, 0x27u8, 0x20u8, 0x73u8, 0x79u8, 0x73u8, 0x74u8, 0x65u8, 0x6du8, 0x20u8, 0x62u8, + 0x61u8, 0x72u8, 0x79u8, 0x63u8, 0x65u8, 0x6eu8, 0x74u8, 0x65u8, 0x72u8, 0x20u8, 0x69u8, + 0x6eu8, 0x20u8, 0x44u8, 0x45u8, 0x34u8, 0x30u8, 0x33u8, 0x20u8, 0x69u8, 0x73u8, 0x20u8, + 0x71u8, 0x75u8, 0x69u8, 0x74u8, 0x65u8, 0x20u8, 0x73u8, 0x6du8, 0x61u8, 0x6cu8, 0x6cu8, + 0x00u8, 0x2du8, 0x2du8, 0x61u8, 0x62u8, 0x6fu8, 0x75u8, 0x74u8, 0x20u8, 0x32u8, 0x30u8, + 0x20u8, 0x63u8, 0x6du8, 0x2eu8, 0x2du8, 0x2du8, 0x73u8, 0x6fu8, 0x20u8, 0x6du8, 0x6fu8, + 0x73u8, 0x74u8, 0x20u8, 0x53u8, 0x50u8, 0x49u8, 0x43u8, 0x45u8, 0x20u8, 0x75u8, 0x73u8, + 0x65u8, 0x72u8, 0x73u8, 0x20u8, 0x63u8, 0x6fu8, 0x75u8, 0x6cu8, 0x64u8, 0x20u8, 0x75u8, + 0x73u8, 0x65u8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x4du8, 0x61u8, 0x72u8, 0x73u8, + 0x20u8, 0x73u8, 0x79u8, 0x73u8, 0x74u8, 0x65u8, 0x6du8, 0x20u8, 0x62u8, 0x61u8, 0x72u8, + 0x79u8, 0x63u8, 0x65u8, 0x6eu8, 0x74u8, 0x65u8, 0x72u8, 0x20u8, 0x69u8, 0x6eu8, 0x20u8, + 0x70u8, 0x6cu8, 0x61u8, 0x63u8, 0x65u8, 0x20u8, 0x6fu8, 0x66u8, 0x20u8, 0x74u8, 0x68u8, + 0x65u8, 0x00u8, 0x4du8, 0x61u8, 0x72u8, 0x73u8, 0x20u8, 0x6du8, 0x61u8, 0x73u8, 0x73u8, + 0x20u8, 0x63u8, 0x65u8, 0x6eu8, 0x74u8, 0x65u8, 0x72u8, 0x2eu8, 0x20u8, 0x48u8, 0x6fu8, + 0x77u8, 0x65u8, 0x76u8, 0x65u8, 0x72u8, 0x2cu8, 0x20u8, 0x69u8, 0x66u8, 0x20u8, 0x79u8, + 0x6fu8, 0x75u8, 0x20u8, 0x77u8, 0x69u8, 0x73u8, 0x68u8, 0x2fu8, 0x6eu8, 0x65u8, 0x65u8, + 0x64u8, 0x20u8, 0x74u8, 0x6fu8, 0x20u8, 0x68u8, 0x61u8, 0x76u8, 0x65u8, 0x20u8, 0x74u8, + 0x68u8, 0x65u8, 0x20u8, 0x4du8, 0x61u8, 0x72u8, 0x73u8, 0x20u8, 0x6du8, 0x61u8, 0x73u8, + 0x73u8, 0x20u8, 0x63u8, 0x65u8, 0x6eu8, 0x74u8, 0x65u8, 0x72u8, 0x20u8, 0x61u8, 0x76u8, + 0x61u8, 0x69u8, 0x6cu8, 0x61u8, 0x62u8, 0x6cu8, 0x65u8, 0x20u8, 0x74u8, 0x6fu8, 0x20u8, + 0x79u8, 0x6fu8, 0x75u8, 0x72u8, 0x00u8, 0x70u8, 0x72u8, 0x6fu8, 0x67u8, 0x72u8, 0x61u8, + 0x6du8, 0x2cu8, 0x20u8, 0x79u8, 0x6fu8, 0x75u8, 0x27u8, 0x6cu8, 0x6cu8, 0x20u8, 0x6eu8, + 0x65u8, 0x65u8, 0x64u8, 0x20u8, 0x74u8, 0x6fu8, 0x20u8, 0x6cu8, 0x6fu8, 0x61u8, 0x64u8, + 0x20u8, 0x61u8, 0x20u8, 0x4du8, 0x61u8, 0x72u8, 0x73u8, 0x20u8, 0x73u8, 0x61u8, 0x74u8, + 0x65u8, 0x6cu8, 0x6cu8, 0x69u8, 0x74u8, 0x65u8, 0x20u8, 0x65u8, 0x70u8, 0x68u8, 0x65u8, + 0x6du8, 0x65u8, 0x72u8, 0x69u8, 0x73u8, 0x20u8, 0x66u8, 0x69u8, 0x6cu8, 0x65u8, 0x20u8, + 0x73u8, 0x75u8, 0x63u8, 0x68u8, 0x20u8, 0x61u8, 0x73u8, 0x20u8, 0x22u8, 0x6du8, 0x61u8, + 0x72u8, 0x30u8, 0x39u8, 0x37u8, 0x2eu8, 0x62u8, 0x73u8, 0x70u8, 0x22u8, 0x20u8, 0x69u8, + 0x6eu8, 0x20u8, 0x61u8, 0x64u8, 0x64u8, 0x69u8, 0x74u8, 0x69u8, 0x6fu8, 0x6eu8, 0x00u8, + 0x74u8, 0x6fu8, 0x20u8, 0x44u8, 0x45u8, 0x34u8, 0x33u8, 0x30u8, 0x2eu8, 0x20u8, 0x53u8, + 0x61u8, 0x74u8, 0x65u8, 0x6cu8, 0x6cu8, 0x69u8, 0x74u8, 0x65u8, 0x20u8, 0x65u8, 0x70u8, + 0x68u8, 0x65u8, 0x6du8, 0x65u8, 0x72u8, 0x69u8, 0x73u8, 0x20u8, 0x66u8, 0x69u8, 0x6cu8, + 0x65u8, 0x73u8, 0x20u8, 0x61u8, 0x72u8, 0x65u8, 0x20u8, 0x61u8, 0x76u8, 0x61u8, 0x69u8, + 0x6cu8, 0x61u8, 0x62u8, 0x6cu8, 0x65u8, 0x20u8, 0x66u8, 0x72u8, 0x6fu8, 0x6du8, 0x20u8, + 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x4eu8, 0x41u8, 0x49u8, 0x46u8, 0x20u8, 0x73u8, 0x65u8, + 0x72u8, 0x76u8, 0x65u8, 0x72u8, 0x20u8, 0x68u8, 0x65u8, 0x72u8, 0x65u8, 0x3au8, 0x00u8, + 0x68u8, 0x74u8, 0x74u8, 0x70u8, 0x3au8, 0x2fu8, 0x2fu8, 0x6eu8, 0x61u8, 0x69u8, 0x66u8, + 0x2eu8, 0x6au8, 0x70u8, 0x6cu8, 0x2eu8, 0x6eu8, 0x61u8, 0x73u8, 0x61u8, 0x2eu8, 0x67u8, + 0x6fu8, 0x76u8, 0x2fu8, 0x70u8, 0x75u8, 0x62u8, 0x2fu8, 0x6eu8, 0x61u8, 0x69u8, 0x66u8, + 0x2fu8, 0x67u8, 0x65u8, 0x6eu8, 0x65u8, 0x72u8, 0x69u8, 0x63u8, 0x5fu8, 0x6bu8, 0x65u8, + 0x72u8, 0x6eu8, 0x65u8, 0x6cu8, 0x73u8, 0x2fu8, 0x73u8, 0x70u8, 0x6bu8, 0x2fu8, 0x73u8, + 0x61u8, 0x74u8, 0x65u8, 0x6cu8, 0x6cu8, 0x69u8, 0x74u8, 0x65u8, 0x73u8, 0x2fu8, 0x00u8, + 0x00u8, 0x00u8, 0x44u8, 0x65u8, 0x74u8, 0x61u8, 0x69u8, 0x6cu8, 0x73u8, 0x20u8, 0x61u8, + 0x62u8, 0x6fu8, 0x75u8, 0x74u8, 0x20u8, 0x53u8, 0x50u8, 0x49u8, 0x43u8, 0x45u8, 0x20u8, + 0x70u8, 0x6cu8, 0x61u8, 0x6eu8, 0x65u8, 0x74u8, 0x20u8, 0x61u8, 0x6eu8, 0x64u8, 0x20u8, + 0x73u8, 0x61u8, 0x74u8, 0x65u8, 0x6cu8, 0x6cu8, 0x69u8, 0x74u8, 0x65u8, 0x20u8, 0x65u8, + 0x70u8, 0x68u8, 0x65u8, 0x6du8, 0x65u8, 0x72u8, 0x69u8, 0x73u8, 0x20u8, 0x66u8, 0x69u8, + 0x6cu8, 0x65u8, 0x73u8, 0x2cu8, 0x20u8, 0x6bu8, 0x6eu8, 0x6fu8, 0x77u8, 0x6eu8, 0x20u8, + 0x61u8, 0x73u8, 0x20u8, 0x53u8, 0x50u8, 0x4bu8, 0x20u8, 0x66u8, 0x69u8, 0x6cu8, 0x65u8, + 0x73u8, 0x2cu8, 0x20u8, 0x69u8, 0x6eu8, 0x63u8, 0x6cu8, 0x75u8, 0x64u8, 0x69u8, 0x6eu8, + 0x67u8, 0x00u8, 0x68u8, 0x6fu8, 0x77u8, 0x20u8, 0x74u8, 0x6fu8, 0x20u8, 0x72u8, 0x65u8, + 0x61u8, 0x64u8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x6du8, 0x20u8, 0x75u8, 0x73u8, 0x69u8, + 0x6eu8, 0x67u8, 0x20u8, 0x53u8, 0x50u8, 0x49u8, 0x43u8, 0x45u8, 0x20u8, 0x54u8, 0x6fu8, + 0x6fu8, 0x6cu8, 0x6bu8, 0x69u8, 0x74u8, 0x20u8, 0x73u8, 0x6fu8, 0x66u8, 0x74u8, 0x77u8, + 0x61u8, 0x72u8, 0x65u8, 0x2cu8, 0x20u8, 0x6du8, 0x61u8, 0x79u8, 0x20u8, 0x62u8, 0x65u8, + 0x20u8, 0x66u8, 0x6fu8, 0x75u8, 0x6eu8, 0x64u8, 0x20u8, 0x69u8, 0x6eu8, 0x20u8, 0x74u8, + 0x68u8, 0x65u8, 0x20u8, 0x53u8, 0x50u8, 0x4bu8, 0x20u8, 0x74u8, 0x75u8, 0x74u8, 0x6fu8, + 0x72u8, 0x69u8, 0x61u8, 0x6cu8, 0x20u8, 0x28u8, 0x50u8, 0x44u8, 0x46u8, 0x20u8, 0x66u8, + 0x69u8, 0x6cu8, 0x65u8, 0x00u8, 0x6eu8, 0x61u8, 0x6du8, 0x65u8, 0x20u8, 0x69u8, 0x73u8, + 0x20u8, 0x22u8, 0x31u8, 0x39u8, 0x5fu8, 0x73u8, 0x70u8, 0x6bu8, 0x22u8, 0x29u8, 0x20u8, + 0x61u8, 0x76u8, 0x61u8, 0x69u8, 0x6cu8, 0x61u8, 0x62u8, 0x6cu8, 0x65u8, 0x20u8, 0x66u8, + 0x72u8, 0x6fu8, 0x6du8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x4eu8, 0x41u8, 0x49u8, + 0x46u8, 0x20u8, 0x77u8, 0x65u8, 0x62u8, 0x73u8, 0x69u8, 0x74u8, 0x65u8, 0x20u8, 0x28u8, + 0x68u8, 0x74u8, 0x74u8, 0x70u8, 0x3au8, 0x2fu8, 0x2fu8, 0x6eu8, 0x61u8, 0x69u8, 0x66u8, + 0x2eu8, 0x6au8, 0x70u8, 0x6cu8, 0x2eu8, 0x6eu8, 0x61u8, 0x73u8, 0x61u8, 0x2eu8, 0x67u8, + 0x6fu8, 0x76u8, 0x2fu8, 0x74u8, 0x75u8, 0x74u8, 0x6fu8, 0x72u8, 0x69u8, 0x61u8, 0x6cu8, + 0x73u8, 0x2eu8, 0x68u8, 0x74u8, 0x6du8, 0x6cu8, 0x29u8, 0x2eu8, 0x00u8, 0x00u8, 0x00u8, + 0x04u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, + ]; + + let (unparsed_string, comment) = + parse_comment_area(&COMMENT_AREA_SEGMENT, 2).expect("Comment area parsing should succeed"); + + assert_eq!(unparsed_string.len(), 0); + + assert_eq!( + r#"September 03, 2013 +C. Acton + +JPL's Solar System Dynamics Group has released two new planetary/lunar ephemerides, +named DE430 and DE431. + +DE430 is now considered the official export lunar/planetary ephemeris, suitable for +all users/uses. It's approximate time span is 1550 JAN 01 to 2650 JAN 22. + +If a longer time span is needed, DE431 may be used, except that the lunar ephemeris +portion is of relatively poor accuracy outside of the time span covered by DE430. +The time span covered by DE431 is approximately 13202 B.C. to 17191 A.D. Because de431 +is so long, leading to a huge file, it has been split into two parts having the +approximagte time spans of: + + 13202 B.C. to 0 + 0 to 17191 A.D. + +More details about these ephemeris files are contained in accompanying documentation +available on the NAIF server: http://naif.jpl.nasa.gov/pub/naif/generic_kernels/spk/planets/ + + +Special note regarding Mars: starting with this DE file the location of Mars' mass center +(NAIF ID = 499) is *NOT* included; only the Mars system barycenter (ID = 4) is present. +The offset between Mars' mass center and the Mars' system barycenter in DE403 is quite small +--about 20 cm.--so most SPICE users could use the Mars system barycenter in place of the +Mars mass center. However, if you wish/need to have the Mars mass center available to your +program, you'll need to load a Mars satellite ephemeris file such as "mar097.bsp" in addition +to DE430. Satellite ephemeris files are available from the NAIF server here: +http://naif.jpl.nasa.gov/pub/naif/generic_kernels/spk/satellites/ + + +Details about SPICE planet and satellite ephemeris files, known as SPK files, including +how to read them using SPICE Toolkit software, may be found in the SPK tutorial (PDF file +name is "19_spk") available from the NAIF website (http://naif.jpl.nasa.gov/tutorials.html)."#, + comment + ); } #[test] From cfd1b9245ad9eb2f0222de756859b78a9044b65a Mon Sep 17 00:00:00 2001 From: Andrei Zisu Date: Wed, 5 Apr 2023 23:40:17 +0200 Subject: [PATCH 04/27] Implement DAF summary parsing --- .../lox_core/src/ephemeris/daf_spk/parser.rs | 1123 +++++++++++++++-- 1 file changed, 1046 insertions(+), 77 deletions(-) diff --git a/crates/lox_core/src/ephemeris/daf_spk/parser.rs b/crates/lox_core/src/ephemeris/daf_spk/parser.rs index 61b4bc63..9d9204a8 100644 --- a/crates/lox_core/src/ephemeris/daf_spk/parser.rs +++ b/crates/lox_core/src/ephemeris/daf_spk/parser.rs @@ -17,6 +17,25 @@ pub struct FileRecord { pub pstnul: Vec, } +#[derive(Debug, PartialEq)] +pub struct Components { + pub double_precision_components: Vec, + pub integer_components: Vec, +} + +#[derive(Debug, PartialEq)] + +pub struct Summary { + pub name: String, + pub components: Components, +} + +#[derive(Debug, PartialEq)] +pub struct SummaryRecord { + pub next: u32, + pub summaries: Vec, +} + #[derive(Debug, PartialEq)] pub struct SPK { pub file_record: FileRecord, @@ -99,15 +118,14 @@ pub fn parse_file_record(input: &[u8]) -> nom::IResult<&[u8], FileRecord> { } pub fn parse_comment_area(input: &[u8], comment_areas_count: u32) -> nom::IResult<&[u8], String> { - // This function is definetely not optimal as there are several allocations at different points but this is not a hot data path. + // This function is definetely not optimal as there are several allocations at + // different points but this is not a hot data path. let mut comment_area = String::new(); let mut input_cursor = input; for _ in 0..comment_areas_count { - let (updated_input_cursor, comment_areas) = - nom::bytes::complete::take(RECORD_SIZE)(input_cursor)?; - - input_cursor = updated_input_cursor; + let comment_areas; + (input_cursor, comment_areas) = nom::bytes::complete::take(RECORD_SIZE)(input_cursor)?; let (_, comment_record_content) = nom::bytes::complete::take(1000u32)(comment_areas)?; @@ -136,15 +154,109 @@ pub fn parse_comment_area(input: &[u8], comment_areas_count: u32) -> nom::IResul Ok((input_cursor, comment_area)) } -pub fn parse_daf_spk(input: &[u8]) -> nom::IResult<&[u8], SPK> { - // From https://naif.jpl.nasa.gov/pub/naif/toolkit_docs/C/req/daf.html +pub fn parse_summary_and_name_record_pair( + input: &[u8], + nd: u32, + ni: u32, +) -> nom::IResult<&[u8], SummaryRecord> { + let summary_record_input = input; + let mut name_record_input = &input[1024..]; + + let nc = 8 * (nd + (ni + 1) / 2); + + let mut summaries = Vec::new(); + + // 1. The record number of the next summary record in the file. (Zero if this is + // the final summary record.) + let (summary_record_input, next) = nom::number::complete::le_f64(summary_record_input)?; + let next = next as u32; + + // 2. The record number of the previous summary record in the file. (Zero if + // this is the initial summary record.) + let (summary_record_input, _) = nom::number::complete::le_f64(summary_record_input)?; + + // 3. The number of summaries stored in this record. + let (mut summary_record_input, nsum) = nom::number::complete::le_f64(summary_record_input)?; + let nsum = nsum as u32; + + for _ in 0..nsum { + let double_precision_components; + (summary_record_input, double_precision_components) = + nom::multi::many_m_n(nd as usize, nd as usize, nom::number::complete::le_f64)( + summary_record_input, + )?; + + let integer_components; + (summary_record_input, integer_components) = + nom::multi::many_m_n(ni as usize, ni as usize, nom::number::complete::le_i64)( + summary_record_input, + )?; + + let name; + (name_record_input, name) = nom::bytes::complete::take(nc)(name_record_input)?; + + summaries.push(Summary { + name: String::from_utf8_lossy(name).trim().to_string(), + components: Components { + double_precision_components, + integer_components, + }, + }); + } + + Ok((&[], SummaryRecord { next, summaries })) +} + +pub fn parse_all_summary_and_name_record_pairs( + input: &[u8], + nd: u32, + ni: u32, + fward: u32, +) -> nom::IResult<&[u8], Vec> { + let mut all_summary_records = Vec::new(); + + let mut next = fward; + loop { + let start = ((next - 1) * RECORD_SIZE) as usize; + let end = ((next + 1) * RECORD_SIZE) as usize; + + let summary_and_name_record_pair = &input[start..end]; + + let (_, summaries_record) = + parse_summary_and_name_record_pair(summary_and_name_record_pair, nd, ni)?; + + next = summaries_record.next; + + all_summary_records.push(summaries_record); + + if next == 0 { + break; + } + } + + Ok((&[], all_summary_records)) +} + +pub fn parse_daf_spk(full_input: &[u8]) -> nom::IResult<&[u8], SPK> { + // - https://naif.jpl.nasa.gov/pub/naif/toolkit_docs/C/req/daf.html + // - https://naif.jpl.nasa.gov/pub/naif/toolkit_docs/C/req/spk.html + // - https://naif.jpl.nasa.gov/pub/naif/toolkit_docs/Tutorials/office/individual_docs/42_making_an_spk.pptx + + let input_cursor = full_input; - let (input, file_record) = parse_file_record(input)?; + let (input_cursor, file_record) = parse_file_record(input_cursor)?; - let (input, comment) = parse_comment_area(input, file_record.fward - 2)?; + let (_, comment) = parse_comment_area(input_cursor, file_record.fward - 2)?; + + let (_, all_summaries) = parse_all_summary_and_name_record_pairs( + full_input, + file_record.nd, + file_record.ni, + file_record.fward, + )?; Ok(( - input, + full_input, //@TODO SPK { file_record, comment, @@ -152,8 +264,930 @@ pub fn parse_daf_spk(input: &[u8]) -> nom::IResult<&[u8], SPK> { )) } -#[test] -fn test_parse_comment_area() { +#[cfg(test)] +mod test { + use super::*; + + fn get_expected_summary_record() -> SummaryRecord { + // @TODO Find out if these values are correct by comparing to other libs + SummaryRecord { + next: 0, + summaries: vec![ + Summary { + name: "DE-0430LE-0430".to_string().to_string(), + components: Components { + double_precision_components: vec![-14200747200.0, 20514081600.0], + integer_components: vec![ + 1, + 8589934593, + 9494025207808641, + -4464629148630908928, + 4761178849910194176, + 2, + ], + }, + }, + Summary { + name: "DE-0430LE-0430".to_string(), + components: Components { + double_precision_components: vec![ + 4.2439915824e-314, + 8.341616384367734e-308, + ], + integer_components: vec![ + -4464629148630908928, + 4761178849910194176, + 3, + 8589934593, + 17367490538372553, + -4464629148630908928, + ], + }, + }, + Summary { + name: "DE-0430LE-0430".to_string(), + components: Components { + double_precision_components: vec![20514081600.0, 2e-323], + integer_components: vec![ + 8589934593, + 19254974047171493, + -4464629148630908928, + 4761178849910194176, + 5, + 8589934593, + ], + }, + }, + Summary { + name: "DE-0430LE-0430".to_string(), + components: Components { + double_precision_components: vec![2.8245970871090138e-307, -14200747200.0], + integer_components: vec![ + 4761178849910194176, + 6, + 8589934593, + 21897461266736009, + -4464629148630908928, + 4761178849910194176, + ], + }, + }, + Summary { + name: "DE-0430LE-0430".to_string(), + components: Components { + double_precision_components: vec![3.5e-323, 4.2439915824e-314], + integer_components: vec![ + 22976030634265505, + -4464629148630908928, + 4761178849910194176, + 8, + 8589934593, + 24054600001757333, + ], + }, + }, + Summary { + name: "DE-0430LE-0430".to_string(), + components: Components { + double_precision_components: vec![-14200747200.0, 20514081600.0], + integer_components: vec![ + 9, + 8589934593, + 25133169369249161, + -4464629148630908928, + 4761178849910194176, + 10, + ], + }, + }, + Summary { + name: "DE-0430LE-0430".to_string(), + components: Components { + double_precision_components: vec![ + 4.2439915824e-314, + 1.0102845736390232e-306, + ], + integer_components: vec![ + -4464629148630908928, + 4761178849910194176, + 12884902189, + 8589934593, + 46596392258810825, + -4464629148630908928, + ], + }, + }, + Summary { + name: "DE-0430LE-0430".to_string(), + components: Components { + double_precision_components: vec![20514081600.0, 6.36598757e-314], + integer_components: vec![ + 8589934593, + 64284665315691309, + -4464629148630908928, + 4761178849910194176, + 4294967495, + 8589934593, + ], + }, + }, + Summary { + name: "DE-0430LE-0430".to_string(), + components: Components { + double_precision_components: vec![2.3223582656725217e-304, -14200747200.0], + integer_components: vec![ + 4761178849910194176, + 8589934891, + 8589934593, + 64284768399024797, + 0, + 0, + ], + }, + }, + Summary { + name: "DE-0430LE-0430".to_string(), + components: Components { + double_precision_components: vec![0.0, 0.0], + integer_components: vec![0, 0, 0, 0, 0, 0], + }, + }, + Summary { + name: "DE-0430LE-0430".to_string(), + components: Components { + double_precision_components: vec![0.0, 0.0], + integer_components: vec![0, 0, 0, 0, 0, 0], + }, + }, + Summary { + name: "DE-0430LE-0430".to_string(), + components: Components { + double_precision_components: vec![0.0, 0.0], + integer_components: vec![0, 0, 0, 0, 0, 0], + }, + }, + Summary { + name: "DE-0430LE-0430".to_string(), + components: Components { + double_precision_components: vec![0.0, 0.0], + integer_components: vec![0, 0, 0, 0, 0, 0], + }, + }, + Summary { + name: "DE-0430LE-0430".to_string(), + components: Components { + double_precision_components: vec![0.0, 0.0], + integer_components: vec![0, 0, 0, 0, 0, 0], + }, + }, + ], + } + } + + #[test] + fn test_parse_all_summary_and_name_record_pairs() { + let (_, all_summary_records) = + parse_all_summary_and_name_record_pairs(&FILE_CONTENTS, 2, 6, 4) + .expect("Summary record parsing should succeed"); + + assert_eq!(all_summary_records, vec![get_expected_summary_record()]); + } + + #[test] + fn test_parse_summary_and_name_record_pair() { + let (_, summary_record) = parse_summary_and_name_record_pair(&SUMMARY_RECORD, 2, 6) + .expect("Summary record parsing should succeed"); + + assert_eq!(summary_record, get_expected_summary_record()); + } + + #[test] + fn test_parse_comment_area() { + let (unparsed_string, comment) = parse_comment_area(&COMMENT_AREA_SEGMENT, 2) + .expect("Comment area parsing should succeed"); + + assert_eq!(unparsed_string.len(), 0); + + assert_eq!( + r#"September 03, 2013 +C. Acton + +JPL's Solar System Dynamics Group has released two new planetary/lunar ephemerides, +named DE430 and DE431. + +DE430 is now considered the official export lunar/planetary ephemeris, suitable for +all users/uses. It's approximate time span is 1550 JAN 01 to 2650 JAN 22. + +If a longer time span is needed, DE431 may be used, except that the lunar ephemeris +portion is of relatively poor accuracy outside of the time span covered by DE430. +The time span covered by DE431 is approximately 13202 B.C. to 17191 A.D. Because de431 +is so long, leading to a huge file, it has been split into two parts having the +approximagte time spans of: + + 13202 B.C. to 0 + 0 to 17191 A.D. + +More details about these ephemeris files are contained in accompanying documentation +available on the NAIF server: http://naif.jpl.nasa.gov/pub/naif/generic_kernels/spk/planets/ + + +Special note regarding Mars: starting with this DE file the location of Mars' mass center +(NAIF ID = 499) is *NOT* included; only the Mars system barycenter (ID = 4) is present. +The offset between Mars' mass center and the Mars' system barycenter in DE403 is quite small +--about 20 cm.--so most SPICE users could use the Mars system barycenter in place of the +Mars mass center. However, if you wish/need to have the Mars mass center available to your +program, you'll need to load a Mars satellite ephemeris file such as "mar097.bsp" in addition +to DE430. Satellite ephemeris files are available from the NAIF server here: +http://naif.jpl.nasa.gov/pub/naif/generic_kernels/spk/satellites/ + + +Details about SPICE planet and satellite ephemeris files, known as SPK files, including +how to read them using SPICE Toolkit software, may be found in the SPK tutorial (PDF file +name is "19_spk") available from the NAIF website (http://naif.jpl.nasa.gov/tutorials.html)."#, + comment + ); + } + + #[test] + fn test_parse_file_record() { + let (unparsed_string, file_record) = + parse_file_record(&FILE_RECORD_SEGMENT).expect("File record parsing should succeed"); + + assert_eq!(unparsed_string.len(), 0); + + assert_eq!(file_record.locidw, "DAF/SPK"); + assert_eq!(file_record.nd, 2); + assert_eq!(file_record.ni, 6); + assert_eq!(file_record.locifn, "NIO2SPK"); + assert_eq!(file_record.fward, 4); + assert_eq!(file_record.bward, 4); + assert_eq!(file_record.free, 14967465); + assert_eq!(file_record.locfmt, "LTL-IEEE"); + assert_eq!( + file_record.ftpstr, + b"FTPSTR:\r:\n:\r\n:\r\x00:\x81:\x10\xce:ENDFTP" + ); + } + + const FILE_CONTENTS: [u8; 5120] = [ + 0x44u8, 0x41u8, 0x46u8, 0x2Fu8, 0x53u8, 0x50u8, 0x4Bu8, 0x20u8, 0x02u8, 0x00u8, 0x00u8, + 0x00u8, 0x06u8, 0x00u8, 0x00u8, 0x00u8, 0x4Eu8, 0x49u8, 0x4Fu8, 0x32u8, 0x53u8, 0x50u8, + 0x4Bu8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x04u8, + 0x00u8, 0x00u8, 0x00u8, 0x04u8, 0x00u8, 0x00u8, 0x00u8, 0xA9u8, 0x62u8, 0xE4u8, 0x00u8, + 0x4Cu8, 0x54u8, 0x4Cu8, 0x2Du8, 0x49u8, 0x45u8, 0x45u8, 0x45u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x46u8, 0x54u8, 0x50u8, 0x53u8, 0x54u8, + 0x52u8, 0x3Au8, 0x0Du8, 0x3Au8, 0x0Au8, 0x3Au8, 0x0Du8, 0x0Au8, 0x3Au8, 0x0Du8, 0x00u8, + 0x3Au8, 0x81u8, 0x3Au8, 0x10u8, 0xCEu8, 0x3Au8, 0x45u8, 0x4Eu8, 0x44u8, 0x46u8, 0x54u8, + 0x50u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x53u8, 0x65u8, 0x70u8, 0x74u8, 0x65u8, 0x6du8, 0x62u8, 0x65u8, + 0x72u8, 0x20u8, 0x30u8, 0x33u8, 0x2cu8, 0x20u8, 0x32u8, 0x30u8, 0x31u8, 0x33u8, 0x00u8, + 0x43u8, 0x2eu8, 0x20u8, 0x41u8, 0x63u8, 0x74u8, 0x6fu8, 0x6eu8, 0x00u8, 0x00u8, 0x4au8, + 0x50u8, 0x4cu8, 0x27u8, 0x73u8, 0x20u8, 0x53u8, 0x6fu8, 0x6cu8, 0x61u8, 0x72u8, 0x20u8, + 0x53u8, 0x79u8, 0x73u8, 0x74u8, 0x65u8, 0x6du8, 0x20u8, 0x44u8, 0x79u8, 0x6eu8, 0x61u8, + 0x6du8, 0x69u8, 0x63u8, 0x73u8, 0x20u8, 0x47u8, 0x72u8, 0x6fu8, 0x75u8, 0x70u8, 0x20u8, + 0x68u8, 0x61u8, 0x73u8, 0x20u8, 0x72u8, 0x65u8, 0x6cu8, 0x65u8, 0x61u8, 0x73u8, 0x65u8, + 0x64u8, 0x20u8, 0x74u8, 0x77u8, 0x6fu8, 0x20u8, 0x6eu8, 0x65u8, 0x77u8, 0x20u8, 0x70u8, + 0x6cu8, 0x61u8, 0x6eu8, 0x65u8, 0x74u8, 0x61u8, 0x72u8, 0x79u8, 0x2fu8, 0x6cu8, 0x75u8, + 0x6eu8, 0x61u8, 0x72u8, 0x20u8, 0x65u8, 0x70u8, 0x68u8, 0x65u8, 0x6du8, 0x65u8, 0x72u8, + 0x69u8, 0x64u8, 0x65u8, 0x73u8, 0x2cu8, 0x00u8, 0x6eu8, 0x61u8, 0x6du8, 0x65u8, 0x64u8, + 0x20u8, 0x44u8, 0x45u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x61u8, 0x6eu8, 0x64u8, 0x20u8, + 0x44u8, 0x45u8, 0x34u8, 0x33u8, 0x31u8, 0x2eu8, 0x00u8, 0x00u8, 0x44u8, 0x45u8, 0x34u8, + 0x33u8, 0x30u8, 0x20u8, 0x69u8, 0x73u8, 0x20u8, 0x6eu8, 0x6fu8, 0x77u8, 0x20u8, 0x63u8, + 0x6fu8, 0x6eu8, 0x73u8, 0x69u8, 0x64u8, 0x65u8, 0x72u8, 0x65u8, 0x64u8, 0x20u8, 0x74u8, + 0x68u8, 0x65u8, 0x20u8, 0x6fu8, 0x66u8, 0x66u8, 0x69u8, 0x63u8, 0x69u8, 0x61u8, 0x6cu8, + 0x20u8, 0x65u8, 0x78u8, 0x70u8, 0x6fu8, 0x72u8, 0x74u8, 0x20u8, 0x6cu8, 0x75u8, 0x6eu8, + 0x61u8, 0x72u8, 0x2fu8, 0x70u8, 0x6cu8, 0x61u8, 0x6eu8, 0x65u8, 0x74u8, 0x61u8, 0x72u8, + 0x79u8, 0x20u8, 0x65u8, 0x70u8, 0x68u8, 0x65u8, 0x6du8, 0x65u8, 0x72u8, 0x69u8, 0x73u8, + 0x2cu8, 0x20u8, 0x73u8, 0x75u8, 0x69u8, 0x74u8, 0x61u8, 0x62u8, 0x6cu8, 0x65u8, 0x20u8, + 0x66u8, 0x6fu8, 0x72u8, 0x00u8, 0x61u8, 0x6cu8, 0x6cu8, 0x20u8, 0x75u8, 0x73u8, 0x65u8, + 0x72u8, 0x73u8, 0x2fu8, 0x75u8, 0x73u8, 0x65u8, 0x73u8, 0x2eu8, 0x20u8, 0x49u8, 0x74u8, + 0x27u8, 0x73u8, 0x20u8, 0x61u8, 0x70u8, 0x70u8, 0x72u8, 0x6fu8, 0x78u8, 0x69u8, 0x6du8, + 0x61u8, 0x74u8, 0x65u8, 0x20u8, 0x74u8, 0x69u8, 0x6du8, 0x65u8, 0x20u8, 0x73u8, 0x70u8, + 0x61u8, 0x6eu8, 0x20u8, 0x69u8, 0x73u8, 0x20u8, 0x31u8, 0x35u8, 0x35u8, 0x30u8, 0x20u8, + 0x4au8, 0x41u8, 0x4eu8, 0x20u8, 0x30u8, 0x31u8, 0x20u8, 0x74u8, 0x6fu8, 0x20u8, 0x32u8, + 0x36u8, 0x35u8, 0x30u8, 0x20u8, 0x4au8, 0x41u8, 0x4eu8, 0x20u8, 0x32u8, 0x32u8, 0x2eu8, + 0x00u8, 0x00u8, 0x49u8, 0x66u8, 0x20u8, 0x61u8, 0x20u8, 0x6cu8, 0x6fu8, 0x6eu8, 0x67u8, + 0x65u8, 0x72u8, 0x20u8, 0x74u8, 0x69u8, 0x6du8, 0x65u8, 0x20u8, 0x73u8, 0x70u8, 0x61u8, + 0x6eu8, 0x20u8, 0x69u8, 0x73u8, 0x20u8, 0x6eu8, 0x65u8, 0x65u8, 0x64u8, 0x65u8, 0x64u8, + 0x2cu8, 0x20u8, 0x44u8, 0x45u8, 0x34u8, 0x33u8, 0x31u8, 0x20u8, 0x6du8, 0x61u8, 0x79u8, + 0x20u8, 0x62u8, 0x65u8, 0x20u8, 0x75u8, 0x73u8, 0x65u8, 0x64u8, 0x2cu8, 0x20u8, 0x65u8, + 0x78u8, 0x63u8, 0x65u8, 0x70u8, 0x74u8, 0x20u8, 0x74u8, 0x68u8, 0x61u8, 0x74u8, 0x20u8, + 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x6cu8, 0x75u8, 0x6eu8, 0x61u8, 0x72u8, 0x20u8, 0x65u8, + 0x70u8, 0x68u8, 0x65u8, 0x6du8, 0x65u8, 0x72u8, 0x69u8, 0x73u8, 0x00u8, 0x70u8, 0x6fu8, + 0x72u8, 0x74u8, 0x69u8, 0x6fu8, 0x6eu8, 0x20u8, 0x69u8, 0x73u8, 0x20u8, 0x6fu8, 0x66u8, + 0x20u8, 0x72u8, 0x65u8, 0x6cu8, 0x61u8, 0x74u8, 0x69u8, 0x76u8, 0x65u8, 0x6cu8, 0x79u8, + 0x20u8, 0x70u8, 0x6fu8, 0x6fu8, 0x72u8, 0x20u8, 0x61u8, 0x63u8, 0x63u8, 0x75u8, 0x72u8, + 0x61u8, 0x63u8, 0x79u8, 0x20u8, 0x6fu8, 0x75u8, 0x74u8, 0x73u8, 0x69u8, 0x64u8, 0x65u8, + 0x20u8, 0x6fu8, 0x66u8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x74u8, 0x69u8, 0x6du8, + 0x65u8, 0x20u8, 0x73u8, 0x70u8, 0x61u8, 0x6eu8, 0x20u8, 0x63u8, 0x6fu8, 0x76u8, 0x65u8, + 0x72u8, 0x65u8, 0x64u8, 0x20u8, 0x62u8, 0x79u8, 0x20u8, 0x44u8, 0x45u8, 0x34u8, 0x33u8, + 0x30u8, 0x2eu8, 0x00u8, 0x54u8, 0x68u8, 0x65u8, 0x20u8, 0x74u8, 0x69u8, 0x6du8, 0x65u8, + 0x20u8, 0x73u8, 0x70u8, 0x61u8, 0x6eu8, 0x20u8, 0x63u8, 0x6fu8, 0x76u8, 0x65u8, 0x72u8, + 0x65u8, 0x64u8, 0x20u8, 0x62u8, 0x79u8, 0x20u8, 0x44u8, 0x45u8, 0x34u8, 0x33u8, 0x31u8, + 0x20u8, 0x69u8, 0x73u8, 0x20u8, 0x61u8, 0x70u8, 0x70u8, 0x72u8, 0x6fu8, 0x78u8, 0x69u8, + 0x6du8, 0x61u8, 0x74u8, 0x65u8, 0x6cu8, 0x79u8, 0x20u8, 0x31u8, 0x33u8, 0x32u8, 0x30u8, + 0x32u8, 0x20u8, 0x42u8, 0x2eu8, 0x43u8, 0x2eu8, 0x20u8, 0x74u8, 0x6fu8, 0x20u8, 0x31u8, + 0x37u8, 0x31u8, 0x39u8, 0x31u8, 0x20u8, 0x41u8, 0x2eu8, 0x44u8, 0x2eu8, 0x20u8, 0x42u8, + 0x65u8, 0x63u8, 0x61u8, 0x75u8, 0x73u8, 0x65u8, 0x20u8, 0x64u8, 0x65u8, 0x34u8, 0x33u8, + 0x31u8, 0x00u8, 0x69u8, 0x73u8, 0x20u8, 0x73u8, 0x6fu8, 0x20u8, 0x6cu8, 0x6fu8, 0x6eu8, + 0x67u8, 0x2cu8, 0x20u8, 0x6cu8, 0x65u8, 0x61u8, 0x64u8, 0x69u8, 0x6eu8, 0x67u8, 0x20u8, + 0x74u8, 0x6fu8, 0x20u8, 0x61u8, 0x20u8, 0x68u8, 0x75u8, 0x67u8, 0x65u8, 0x20u8, 0x66u8, + 0x69u8, 0x6cu8, 0x65u8, 0x2cu8, 0x20u8, 0x69u8, 0x74u8, 0x20u8, 0x68u8, 0x61u8, 0x73u8, + 0x20u8, 0x62u8, 0x65u8, 0x65u8, 0x6eu8, 0x20u8, 0x73u8, 0x70u8, 0x6cu8, 0x69u8, 0x74u8, + 0x20u8, 0x69u8, 0x6eu8, 0x74u8, 0x6fu8, 0x20u8, 0x74u8, 0x77u8, 0x6fu8, 0x20u8, 0x70u8, + 0x61u8, 0x72u8, 0x74u8, 0x73u8, 0x20u8, 0x68u8, 0x61u8, 0x76u8, 0x69u8, 0x6eu8, 0x67u8, + 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x00u8, 0x61u8, 0x70u8, 0x70u8, 0x72u8, 0x6fu8, 0x78u8, + 0x69u8, 0x6du8, 0x61u8, 0x67u8, 0x74u8, 0x65u8, 0x20u8, 0x74u8, 0x69u8, 0x6du8, 0x65u8, + 0x20u8, 0x73u8, 0x70u8, 0x61u8, 0x6eu8, 0x73u8, 0x20u8, 0x6fu8, 0x66u8, 0x3au8, 0x00u8, + 0x00u8, 0x20u8, 0x20u8, 0x20u8, 0x31u8, 0x33u8, 0x32u8, 0x30u8, 0x32u8, 0x20u8, 0x42u8, + 0x2eu8, 0x43u8, 0x2eu8, 0x20u8, 0x74u8, 0x6fu8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x30u8, 0x00u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x30u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x74u8, 0x6fu8, 0x20u8, 0x31u8, 0x37u8, 0x31u8, + 0x39u8, 0x31u8, 0x20u8, 0x41u8, 0x2eu8, 0x44u8, 0x2eu8, 0x00u8, 0x00u8, 0x4du8, 0x6fu8, + 0x72u8, 0x65u8, 0x20u8, 0x64u8, 0x65u8, 0x74u8, 0x61u8, 0x69u8, 0x6cu8, 0x73u8, 0x20u8, + 0x61u8, 0x62u8, 0x6fu8, 0x75u8, 0x74u8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x73u8, 0x65u8, + 0x20u8, 0x65u8, 0x70u8, 0x68u8, 0x65u8, 0x6du8, 0x65u8, 0x72u8, 0x69u8, 0x73u8, 0x20u8, + 0x66u8, 0x69u8, 0x6cu8, 0x65u8, 0x73u8, 0x20u8, 0x61u8, 0x72u8, 0x65u8, 0x20u8, 0x63u8, + 0x6fu8, 0x6eu8, 0x74u8, 0x61u8, 0x69u8, 0x6eu8, 0x65u8, 0x64u8, 0x20u8, 0x69u8, 0x6eu8, + 0x20u8, 0x61u8, 0x63u8, 0x63u8, 0x6fu8, 0x6du8, 0x70u8, 0x61u8, 0x6eu8, 0x79u8, 0x69u8, + 0x6eu8, 0x67u8, 0x20u8, 0x64u8, 0x6fu8, 0x63u8, 0x75u8, 0x6du8, 0x65u8, 0x6eu8, 0x74u8, + 0x61u8, 0x74u8, 0x69u8, 0x6fu8, 0x6eu8, 0x00u8, 0x61u8, 0x76u8, 0x61u8, 0x69u8, 0x6cu8, + 0x61u8, 0x62u8, 0x6cu8, 0x65u8, 0x20u8, 0x6fu8, 0x6eu8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, + 0x20u8, 0x4eu8, 0x41u8, 0x49u8, 0x46u8, 0x20u8, 0x73u8, 0x65u8, 0x72u8, 0x76u8, 0x65u8, + 0x72u8, 0x3au8, 0x20u8, 0x20u8, 0x68u8, 0x74u8, 0x74u8, 0x70u8, 0x3au8, 0x2fu8, 0x2fu8, + 0x6eu8, 0x61u8, 0x69u8, 0x66u8, 0x2eu8, 0x6au8, 0x70u8, 0x6cu8, 0x2eu8, 0x6eu8, 0x61u8, + 0x73u8, 0x61u8, 0x2eu8, 0x67u8, 0x6fu8, 0x76u8, 0x2fu8, 0x70u8, 0x75u8, 0x62u8, 0x2fu8, + 0x6eu8, 0x61u8, 0x69u8, 0x66u8, 0x2fu8, 0x67u8, 0x65u8, 0x6eu8, 0x65u8, 0x72u8, 0x69u8, + 0x63u8, 0x5fu8, 0x6bu8, 0x65u8, 0x72u8, 0x6eu8, 0x65u8, 0x6cu8, 0x73u8, 0x2fu8, 0x73u8, + 0x70u8, 0x6bu8, 0x2fu8, 0x70u8, 0x6cu8, 0x61u8, 0x6eu8, 0x65u8, 0x74u8, 0x73u8, 0x2fu8, + 0x00u8, 0x00u8, 0x00u8, 0x53u8, 0x70u8, 0x65u8, 0x63u8, 0x69u8, 0x61u8, 0x6cu8, 0x20u8, + 0x6eu8, 0x6fu8, 0x74u8, 0x65u8, 0x20u8, 0x72u8, 0x65u8, 0x67u8, 0x61u8, 0x72u8, 0x64u8, + 0x69u8, 0x6eu8, 0x67u8, 0x20u8, 0x4du8, 0x61u8, 0x72u8, 0x73u8, 0x3au8, 0x20u8, 0x20u8, + 0x73u8, 0x74u8, 0x61u8, 0x72u8, 0x74u8, 0x69u8, 0x6eu8, 0x67u8, 0x20u8, 0x77u8, 0x69u8, + 0x74u8, 0x68u8, 0x20u8, 0x74u8, 0x68u8, 0x69u8, 0x73u8, 0x20u8, 0x44u8, 0x45u8, 0x20u8, + 0x66u8, 0x69u8, 0x6cu8, 0x65u8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x6cu8, 0x6fu8, + 0x63u8, 0x61u8, 0x74u8, 0x69u8, 0x6fu8, 0x6eu8, 0x20u8, 0x6fu8, 0x66u8, 0x20u8, 0x4du8, + 0x61u8, 0x72u8, 0x73u8, 0x27u8, 0x20u8, 0x6du8, 0x61u8, 0x73u8, 0x73u8, 0x20u8, 0x63u8, + 0x65u8, 0x6eu8, 0x74u8, 0x65u8, 0x72u8, 0x00u8, 0x28u8, 0x4eu8, 0x41u8, 0x49u8, 0x46u8, + 0x20u8, 0x49u8, 0x44u8, 0x20u8, 0x3du8, 0x20u8, 0x34u8, 0x39u8, 0x39u8, 0x29u8, 0x20u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x69u8, 0x73u8, 0x20u8, 0x2au8, 0x4eu8, 0x4fu8, 0x54u8, 0x2au8, 0x20u8, + 0x69u8, 0x6eu8, 0x63u8, 0x6cu8, 0x75u8, 0x64u8, 0x65u8, 0x64u8, 0x3bu8, 0x20u8, 0x6fu8, + 0x6eu8, 0x6cu8, 0x79u8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x4du8, 0x61u8, 0x72u8, + 0x73u8, 0x20u8, 0x73u8, 0x79u8, 0x73u8, 0x74u8, 0x65u8, 0x6du8, 0x20u8, 0x62u8, 0x61u8, + 0x72u8, 0x79u8, 0x63u8, 0x65u8, 0x6eu8, 0x74u8, 0x65u8, 0x72u8, 0x20u8, 0x28u8, 0x49u8, + 0x44u8, 0x20u8, 0x3du8, 0x20u8, 0x34u8, 0x29u8, 0x20u8, 0x69u8, 0x73u8, 0x20u8, 0x70u8, + 0x72u8, 0x65u8, 0x73u8, 0x65u8, 0x6eu8, 0x74u8, 0x2eu8, 0x00u8, 0x54u8, 0x68u8, 0x65u8, + 0x20u8, 0x6fu8, 0x66u8, 0x66u8, 0x73u8, 0x65u8, 0x74u8, 0x20u8, 0x62u8, 0x65u8, 0x74u8, + 0x77u8, 0x65u8, 0x65u8, 0x6eu8, 0x20u8, 0x4du8, 0x61u8, 0x72u8, 0x73u8, 0x27u8, 0x20u8, + 0x6du8, 0x61u8, 0x73u8, 0x73u8, 0x20u8, 0x63u8, 0x65u8, 0x6eu8, 0x74u8, 0x65u8, 0x72u8, + 0x20u8, 0x61u8, 0x6eu8, 0x64u8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x4du8, 0x61u8, + 0x72u8, 0x73u8, 0x27u8, 0x20u8, 0x73u8, 0x79u8, 0x73u8, 0x74u8, 0x65u8, 0x6du8, 0x20u8, + 0x62u8, 0x61u8, 0x72u8, 0x79u8, 0x63u8, 0x65u8, 0x6eu8, 0x74u8, 0x65u8, 0x72u8, 0x20u8, + 0x69u8, 0x6eu8, 0x20u8, 0x44u8, 0x45u8, 0x34u8, 0x30u8, 0x33u8, 0x20u8, 0x69u8, 0x73u8, + 0x20u8, 0x71u8, 0x75u8, 0x69u8, 0x74u8, 0x65u8, 0x20u8, 0x73u8, 0x6du8, 0x61u8, 0x6cu8, + 0x6cu8, 0x00u8, 0x2du8, 0x2du8, 0x61u8, 0x62u8, 0x6fu8, 0x75u8, 0x74u8, 0x20u8, 0x32u8, + 0x30u8, 0x20u8, 0x63u8, 0x6du8, 0x2eu8, 0x2du8, 0x2du8, 0x73u8, 0x6fu8, 0x20u8, 0x6du8, + 0x6fu8, 0x73u8, 0x74u8, 0x20u8, 0x53u8, 0x50u8, 0x49u8, 0x43u8, 0x45u8, 0x20u8, 0x75u8, + 0x73u8, 0x65u8, 0x72u8, 0x73u8, 0x20u8, 0x63u8, 0x6fu8, 0x75u8, 0x6cu8, 0x64u8, 0x20u8, + 0x75u8, 0x73u8, 0x65u8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x4du8, 0x61u8, 0x72u8, + 0x73u8, 0x20u8, 0x73u8, 0x79u8, 0x73u8, 0x74u8, 0x65u8, 0x6du8, 0x20u8, 0x62u8, 0x61u8, + 0x72u8, 0x79u8, 0x63u8, 0x65u8, 0x6eu8, 0x74u8, 0x65u8, 0x72u8, 0x20u8, 0x69u8, 0x6eu8, + 0x20u8, 0x70u8, 0x6cu8, 0x61u8, 0x63u8, 0x65u8, 0x20u8, 0x6fu8, 0x66u8, 0x20u8, 0x74u8, + 0x68u8, 0x65u8, 0x00u8, 0x4du8, 0x61u8, 0x72u8, 0x73u8, 0x20u8, 0x6du8, 0x61u8, 0x73u8, + 0x73u8, 0x20u8, 0x63u8, 0x65u8, 0x6eu8, 0x74u8, 0x65u8, 0x72u8, 0x2eu8, 0x20u8, 0x48u8, + 0x6fu8, 0x77u8, 0x65u8, 0x76u8, 0x65u8, 0x72u8, 0x2cu8, 0x20u8, 0x69u8, 0x66u8, 0x20u8, + 0x79u8, 0x6fu8, 0x75u8, 0x20u8, 0x77u8, 0x69u8, 0x73u8, 0x68u8, 0x2fu8, 0x6eu8, 0x65u8, + 0x65u8, 0x64u8, 0x20u8, 0x74u8, 0x6fu8, 0x20u8, 0x68u8, 0x61u8, 0x76u8, 0x65u8, 0x20u8, + 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x4du8, 0x61u8, 0x72u8, 0x73u8, 0x20u8, 0x6du8, 0x61u8, + 0x73u8, 0x73u8, 0x20u8, 0x63u8, 0x65u8, 0x6eu8, 0x74u8, 0x65u8, 0x72u8, 0x20u8, 0x61u8, + 0x76u8, 0x61u8, 0x69u8, 0x6cu8, 0x61u8, 0x62u8, 0x6cu8, 0x65u8, 0x20u8, 0x74u8, 0x6fu8, + 0x20u8, 0x79u8, 0x6fu8, 0x75u8, 0x72u8, 0x00u8, 0x70u8, 0x72u8, 0x6fu8, 0x67u8, 0x72u8, + 0x61u8, 0x6du8, 0x2cu8, 0x20u8, 0x79u8, 0x6fu8, 0x75u8, 0x27u8, 0x6cu8, 0x6cu8, 0x20u8, + 0x6eu8, 0x65u8, 0x65u8, 0x64u8, 0x20u8, 0x74u8, 0x6fu8, 0x20u8, 0x6cu8, 0x6fu8, 0x61u8, + 0x64u8, 0x20u8, 0x61u8, 0x20u8, 0x4du8, 0x61u8, 0x72u8, 0x73u8, 0x20u8, 0x73u8, 0x61u8, + 0x74u8, 0x65u8, 0x6cu8, 0x6cu8, 0x69u8, 0x74u8, 0x65u8, 0x20u8, 0x65u8, 0x70u8, 0x68u8, + 0x65u8, 0x6du8, 0x65u8, 0x72u8, 0x69u8, 0x73u8, 0x20u8, 0x66u8, 0x69u8, 0x6cu8, 0x65u8, + 0x20u8, 0x73u8, 0x75u8, 0x63u8, 0x68u8, 0x20u8, 0x61u8, 0x73u8, 0x20u8, 0x22u8, 0x6du8, + 0x61u8, 0x72u8, 0x30u8, 0x39u8, 0x37u8, 0x2eu8, 0x62u8, 0x73u8, 0x70u8, 0x22u8, 0x20u8, + 0x69u8, 0x6eu8, 0x20u8, 0x61u8, 0x64u8, 0x64u8, 0x69u8, 0x74u8, 0x69u8, 0x6fu8, 0x6eu8, + 0x00u8, 0x74u8, 0x6fu8, 0x20u8, 0x44u8, 0x45u8, 0x34u8, 0x33u8, 0x30u8, 0x2eu8, 0x20u8, + 0x53u8, 0x61u8, 0x74u8, 0x65u8, 0x6cu8, 0x6cu8, 0x69u8, 0x74u8, 0x65u8, 0x20u8, 0x65u8, + 0x70u8, 0x68u8, 0x65u8, 0x6du8, 0x65u8, 0x72u8, 0x69u8, 0x73u8, 0x20u8, 0x66u8, 0x69u8, + 0x6cu8, 0x65u8, 0x73u8, 0x20u8, 0x61u8, 0x72u8, 0x65u8, 0x20u8, 0x61u8, 0x76u8, 0x61u8, + 0x69u8, 0x6cu8, 0x61u8, 0x62u8, 0x6cu8, 0x65u8, 0x20u8, 0x66u8, 0x72u8, 0x6fu8, 0x6du8, + 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x4eu8, 0x41u8, 0x49u8, 0x46u8, 0x20u8, 0x73u8, + 0x65u8, 0x72u8, 0x76u8, 0x65u8, 0x72u8, 0x20u8, 0x68u8, 0x65u8, 0x72u8, 0x65u8, 0x3au8, + 0x00u8, 0x68u8, 0x74u8, 0x74u8, 0x70u8, 0x3au8, 0x2fu8, 0x2fu8, 0x6eu8, 0x61u8, 0x69u8, + 0x66u8, 0x2eu8, 0x6au8, 0x70u8, 0x6cu8, 0x2eu8, 0x6eu8, 0x61u8, 0x73u8, 0x61u8, 0x2eu8, + 0x67u8, 0x6fu8, 0x76u8, 0x2fu8, 0x70u8, 0x75u8, 0x62u8, 0x2fu8, 0x6eu8, 0x61u8, 0x69u8, + 0x66u8, 0x2fu8, 0x67u8, 0x65u8, 0x6eu8, 0x65u8, 0x72u8, 0x69u8, 0x63u8, 0x5fu8, 0x6bu8, + 0x65u8, 0x72u8, 0x6eu8, 0x65u8, 0x6cu8, 0x73u8, 0x2fu8, 0x73u8, 0x70u8, 0x6bu8, 0x2fu8, + 0x73u8, 0x61u8, 0x74u8, 0x65u8, 0x6cu8, 0x6cu8, 0x69u8, 0x74u8, 0x65u8, 0x73u8, 0x2fu8, + 0x00u8, 0x00u8, 0x00u8, 0x44u8, 0x65u8, 0x74u8, 0x61u8, 0x69u8, 0x6cu8, 0x73u8, 0x20u8, + 0x61u8, 0x62u8, 0x6fu8, 0x75u8, 0x74u8, 0x20u8, 0x53u8, 0x50u8, 0x49u8, 0x43u8, 0x45u8, + 0x20u8, 0x70u8, 0x6cu8, 0x61u8, 0x6eu8, 0x65u8, 0x74u8, 0x20u8, 0x61u8, 0x6eu8, 0x64u8, + 0x20u8, 0x73u8, 0x61u8, 0x74u8, 0x65u8, 0x6cu8, 0x6cu8, 0x69u8, 0x74u8, 0x65u8, 0x20u8, + 0x65u8, 0x70u8, 0x68u8, 0x65u8, 0x6du8, 0x65u8, 0x72u8, 0x69u8, 0x73u8, 0x20u8, 0x66u8, + 0x69u8, 0x6cu8, 0x65u8, 0x73u8, 0x2cu8, 0x20u8, 0x6bu8, 0x6eu8, 0x6fu8, 0x77u8, 0x6eu8, + 0x20u8, 0x61u8, 0x73u8, 0x20u8, 0x53u8, 0x50u8, 0x4bu8, 0x20u8, 0x66u8, 0x69u8, 0x6cu8, + 0x65u8, 0x73u8, 0x2cu8, 0x20u8, 0x69u8, 0x6eu8, 0x63u8, 0x6cu8, 0x75u8, 0x64u8, 0x69u8, + 0x6eu8, 0x67u8, 0x00u8, 0x68u8, 0x6fu8, 0x77u8, 0x20u8, 0x74u8, 0x6fu8, 0x20u8, 0x72u8, + 0x65u8, 0x61u8, 0x64u8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x6du8, 0x20u8, 0x75u8, 0x73u8, + 0x69u8, 0x6eu8, 0x67u8, 0x20u8, 0x53u8, 0x50u8, 0x49u8, 0x43u8, 0x45u8, 0x20u8, 0x54u8, + 0x6fu8, 0x6fu8, 0x6cu8, 0x6bu8, 0x69u8, 0x74u8, 0x20u8, 0x73u8, 0x6fu8, 0x66u8, 0x74u8, + 0x77u8, 0x61u8, 0x72u8, 0x65u8, 0x2cu8, 0x20u8, 0x6du8, 0x61u8, 0x79u8, 0x20u8, 0x62u8, + 0x65u8, 0x20u8, 0x66u8, 0x6fu8, 0x75u8, 0x6eu8, 0x64u8, 0x20u8, 0x69u8, 0x6eu8, 0x20u8, + 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x53u8, 0x50u8, 0x4bu8, 0x20u8, 0x74u8, 0x75u8, 0x74u8, + 0x6fu8, 0x72u8, 0x69u8, 0x61u8, 0x6cu8, 0x20u8, 0x28u8, 0x50u8, 0x44u8, 0x46u8, 0x20u8, + 0x66u8, 0x69u8, 0x6cu8, 0x65u8, 0x00u8, 0x6eu8, 0x61u8, 0x6du8, 0x65u8, 0x20u8, 0x69u8, + 0x73u8, 0x20u8, 0x22u8, 0x31u8, 0x39u8, 0x5fu8, 0x73u8, 0x70u8, 0x6bu8, 0x22u8, 0x29u8, + 0x20u8, 0x61u8, 0x76u8, 0x61u8, 0x69u8, 0x6cu8, 0x61u8, 0x62u8, 0x6cu8, 0x65u8, 0x20u8, + 0x66u8, 0x72u8, 0x6fu8, 0x6du8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x4eu8, 0x41u8, + 0x49u8, 0x46u8, 0x20u8, 0x77u8, 0x65u8, 0x62u8, 0x73u8, 0x69u8, 0x74u8, 0x65u8, 0x20u8, + 0x28u8, 0x68u8, 0x74u8, 0x74u8, 0x70u8, 0x3au8, 0x2fu8, 0x2fu8, 0x6eu8, 0x61u8, 0x69u8, + 0x66u8, 0x2eu8, 0x6au8, 0x70u8, 0x6cu8, 0x2eu8, 0x6eu8, 0x61u8, 0x73u8, 0x61u8, 0x2eu8, + 0x67u8, 0x6fu8, 0x76u8, 0x2fu8, 0x74u8, 0x75u8, 0x74u8, 0x6fu8, 0x72u8, 0x69u8, 0x61u8, + 0x6cu8, 0x73u8, 0x2eu8, 0x68u8, 0x74u8, 0x6du8, 0x6cu8, 0x29u8, 0x2eu8, 0x00u8, 0x00u8, + 0x00u8, 0x04u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x2cu8, 0x40u8, 0x00u8, 0x00u8, 0x00u8, 0xa6u8, 0x71u8, 0x73u8, + 0x0au8, 0xc2u8, 0x00u8, 0x00u8, 0x00u8, 0x2du8, 0xf0u8, 0x1au8, 0x13u8, 0x42u8, 0x01u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, + 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x81u8, 0x02u8, 0x00u8, 0x00u8, 0xc4u8, 0xbau8, 0x21u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xa6u8, 0x71u8, 0x73u8, 0x0au8, 0xc2u8, 0x00u8, 0x00u8, + 0x00u8, 0x2du8, 0xf0u8, 0x1au8, 0x13u8, 0x42u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, + 0xc5u8, 0xbau8, 0x21u8, 0x00u8, 0xc8u8, 0xfdu8, 0x2du8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0xa6u8, 0x71u8, 0x73u8, 0x0au8, 0xc2u8, 0x00u8, 0x00u8, 0x00u8, 0x2du8, 0xf0u8, 0x1au8, + 0x13u8, 0x42u8, 0x03u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, + 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0xc9u8, 0xfdu8, 0x2du8, 0x00u8, + 0xa4u8, 0xb3u8, 0x3du8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xa6u8, 0x71u8, 0x73u8, 0x0au8, + 0xc2u8, 0x00u8, 0x00u8, 0x00u8, 0x2du8, 0xf0u8, 0x1au8, 0x13u8, 0x42u8, 0x04u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x02u8, + 0x00u8, 0x00u8, 0x00u8, 0xa5u8, 0xb3u8, 0x3du8, 0x00u8, 0x4cu8, 0x68u8, 0x44u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0xa6u8, 0x71u8, 0x73u8, 0x0au8, 0xc2u8, 0x00u8, 0x00u8, 0x00u8, + 0x2du8, 0xf0u8, 0x1au8, 0x13u8, 0x42u8, 0x05u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x4du8, + 0x68u8, 0x44u8, 0x00u8, 0x88u8, 0x63u8, 0x49u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xa6u8, + 0x71u8, 0x73u8, 0x0au8, 0xc2u8, 0x00u8, 0x00u8, 0x00u8, 0x2du8, 0xf0u8, 0x1au8, 0x13u8, + 0x42u8, 0x06u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, 0x00u8, + 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x89u8, 0x63u8, 0x49u8, 0x00u8, 0xa0u8, + 0xcbu8, 0x4du8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xa6u8, 0x71u8, 0x73u8, 0x0au8, 0xc2u8, + 0x00u8, 0x00u8, 0x00u8, 0x2du8, 0xf0u8, 0x1au8, 0x13u8, 0x42u8, 0x07u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, + 0x00u8, 0x00u8, 0xa1u8, 0xcbu8, 0x4du8, 0x00u8, 0x94u8, 0xa0u8, 0x51u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0xa6u8, 0x71u8, 0x73u8, 0x0au8, 0xc2u8, 0x00u8, 0x00u8, 0x00u8, 0x2du8, + 0xf0u8, 0x1au8, 0x13u8, 0x42u8, 0x08u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x95u8, 0xa0u8, + 0x51u8, 0x00u8, 0x88u8, 0x75u8, 0x55u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xa6u8, 0x71u8, + 0x73u8, 0x0au8, 0xc2u8, 0x00u8, 0x00u8, 0x00u8, 0x2du8, 0xf0u8, 0x1au8, 0x13u8, 0x42u8, + 0x09u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, + 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x89u8, 0x75u8, 0x55u8, 0x00u8, 0x7cu8, 0x4au8, + 0x59u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xa6u8, 0x71u8, 0x73u8, 0x0au8, 0xc2u8, 0x00u8, + 0x00u8, 0x00u8, 0x2du8, 0xf0u8, 0x1au8, 0x13u8, 0x42u8, 0x0au8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, + 0x00u8, 0x7du8, 0x4au8, 0x59u8, 0x00u8, 0xc8u8, 0xb3u8, 0x66u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0xa6u8, 0x71u8, 0x73u8, 0x0au8, 0xc2u8, 0x00u8, 0x00u8, 0x00u8, 0x2du8, 0xf0u8, + 0x1au8, 0x13u8, 0x42u8, 0x2du8, 0x01u8, 0x00u8, 0x00u8, 0x03u8, 0x00u8, 0x00u8, 0x00u8, + 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0xc9u8, 0xb3u8, 0x66u8, + 0x00u8, 0x2cu8, 0x8bu8, 0xa5u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xa6u8, 0x71u8, 0x73u8, + 0x0au8, 0xc2u8, 0x00u8, 0x00u8, 0x00u8, 0x2du8, 0xf0u8, 0x1au8, 0x13u8, 0x42u8, 0x8fu8, + 0x01u8, 0x00u8, 0x00u8, 0x03u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, + 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x2du8, 0x8bu8, 0xa5u8, 0x00u8, 0x90u8, 0x62u8, 0xe4u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xa6u8, 0x71u8, 0x73u8, 0x0au8, 0xc2u8, 0x00u8, 0x00u8, + 0x00u8, 0x2du8, 0xf0u8, 0x1au8, 0x13u8, 0x42u8, 0xc7u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, + 0x00u8, 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, + 0x91u8, 0x62u8, 0xe4u8, 0x00u8, 0x9cu8, 0x62u8, 0xe4u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0xa6u8, 0x71u8, 0x73u8, 0x0au8, 0xc2u8, 0x00u8, 0x00u8, 0x00u8, 0x2du8, 0xf0u8, 0x1au8, + 0x13u8, 0x42u8, 0x2bu8, 0x01u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, + 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x9du8, 0x62u8, 0xe4u8, 0x00u8, + 0xa8u8, 0x62u8, 0xe4u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x44u8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, + 0x4cu8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x44u8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4cu8, 0x45u8, 0x2du8, 0x30u8, + 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2du8, 0x30u8, + 0x34u8, 0x33u8, 0x30u8, 0x4cu8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4cu8, + 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, + 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4cu8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, + 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, + 0x33u8, 0x30u8, 0x4cu8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4cu8, 0x45u8, + 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, + 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4cu8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, + 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, + 0x30u8, 0x4cu8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x44u8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4cu8, 0x45u8, 0x2du8, + 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2du8, + 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4cu8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, + 0x4cu8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x44u8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4cu8, 0x45u8, 0x2du8, 0x30u8, + 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2du8, 0x30u8, + 0x34u8, 0x33u8, 0x30u8, 0x4cu8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + ]; + + const SUMMARY_RECORD: [u8; 2048] = [ + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x2cu8, 0x40u8, 0x00u8, 0x00u8, 0x00u8, 0xa6u8, 0x71u8, 0x73u8, 0x0au8, 0xc2u8, 0x00u8, + 0x00u8, 0x00u8, 0x2du8, 0xf0u8, 0x1au8, 0x13u8, 0x42u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, + 0x00u8, 0x81u8, 0x02u8, 0x00u8, 0x00u8, 0xc4u8, 0xbau8, 0x21u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0xa6u8, 0x71u8, 0x73u8, 0x0au8, 0xc2u8, 0x00u8, 0x00u8, 0x00u8, 0x2du8, 0xf0u8, + 0x1au8, 0x13u8, 0x42u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0xc5u8, 0xbau8, 0x21u8, + 0x00u8, 0xc8u8, 0xfdu8, 0x2du8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xa6u8, 0x71u8, 0x73u8, + 0x0au8, 0xc2u8, 0x00u8, 0x00u8, 0x00u8, 0x2du8, 0xf0u8, 0x1au8, 0x13u8, 0x42u8, 0x03u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, + 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0xc9u8, 0xfdu8, 0x2du8, 0x00u8, 0xa4u8, 0xb3u8, 0x3du8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xa6u8, 0x71u8, 0x73u8, 0x0au8, 0xc2u8, 0x00u8, 0x00u8, + 0x00u8, 0x2du8, 0xf0u8, 0x1au8, 0x13u8, 0x42u8, 0x04u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, + 0xa5u8, 0xb3u8, 0x3du8, 0x00u8, 0x4cu8, 0x68u8, 0x44u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0xa6u8, 0x71u8, 0x73u8, 0x0au8, 0xc2u8, 0x00u8, 0x00u8, 0x00u8, 0x2du8, 0xf0u8, 0x1au8, + 0x13u8, 0x42u8, 0x05u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, + 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x4du8, 0x68u8, 0x44u8, 0x00u8, + 0x88u8, 0x63u8, 0x49u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xa6u8, 0x71u8, 0x73u8, 0x0au8, + 0xc2u8, 0x00u8, 0x00u8, 0x00u8, 0x2du8, 0xf0u8, 0x1au8, 0x13u8, 0x42u8, 0x06u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x02u8, + 0x00u8, 0x00u8, 0x00u8, 0x89u8, 0x63u8, 0x49u8, 0x00u8, 0xa0u8, 0xcbu8, 0x4du8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0xa6u8, 0x71u8, 0x73u8, 0x0au8, 0xc2u8, 0x00u8, 0x00u8, 0x00u8, + 0x2du8, 0xf0u8, 0x1au8, 0x13u8, 0x42u8, 0x07u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0xa1u8, + 0xcbu8, 0x4du8, 0x00u8, 0x94u8, 0xa0u8, 0x51u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xa6u8, + 0x71u8, 0x73u8, 0x0au8, 0xc2u8, 0x00u8, 0x00u8, 0x00u8, 0x2du8, 0xf0u8, 0x1au8, 0x13u8, + 0x42u8, 0x08u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, 0x00u8, + 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x95u8, 0xa0u8, 0x51u8, 0x00u8, 0x88u8, + 0x75u8, 0x55u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xa6u8, 0x71u8, 0x73u8, 0x0au8, 0xc2u8, + 0x00u8, 0x00u8, 0x00u8, 0x2du8, 0xf0u8, 0x1au8, 0x13u8, 0x42u8, 0x09u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, + 0x00u8, 0x00u8, 0x89u8, 0x75u8, 0x55u8, 0x00u8, 0x7cu8, 0x4au8, 0x59u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0xa6u8, 0x71u8, 0x73u8, 0x0au8, 0xc2u8, 0x00u8, 0x00u8, 0x00u8, 0x2du8, + 0xf0u8, 0x1au8, 0x13u8, 0x42u8, 0x0au8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x7du8, 0x4au8, + 0x59u8, 0x00u8, 0xc8u8, 0xb3u8, 0x66u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xa6u8, 0x71u8, + 0x73u8, 0x0au8, 0xc2u8, 0x00u8, 0x00u8, 0x00u8, 0x2du8, 0xf0u8, 0x1au8, 0x13u8, 0x42u8, + 0x2du8, 0x01u8, 0x00u8, 0x00u8, 0x03u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, + 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0xc9u8, 0xb3u8, 0x66u8, 0x00u8, 0x2cu8, 0x8bu8, + 0xa5u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xa6u8, 0x71u8, 0x73u8, 0x0au8, 0xc2u8, 0x00u8, + 0x00u8, 0x00u8, 0x2du8, 0xf0u8, 0x1au8, 0x13u8, 0x42u8, 0x8fu8, 0x01u8, 0x00u8, 0x00u8, + 0x03u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, + 0x00u8, 0x2du8, 0x8bu8, 0xa5u8, 0x00u8, 0x90u8, 0x62u8, 0xe4u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0xa6u8, 0x71u8, 0x73u8, 0x0au8, 0xc2u8, 0x00u8, 0x00u8, 0x00u8, 0x2du8, 0xf0u8, + 0x1au8, 0x13u8, 0x42u8, 0xc7u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, + 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x91u8, 0x62u8, 0xe4u8, + 0x00u8, 0x9cu8, 0x62u8, 0xe4u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xa6u8, 0x71u8, 0x73u8, + 0x0au8, 0xc2u8, 0x00u8, 0x00u8, 0x00u8, 0x2du8, 0xf0u8, 0x1au8, 0x13u8, 0x42u8, 0x2bu8, + 0x01u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, + 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x9du8, 0x62u8, 0xe4u8, 0x00u8, 0xa8u8, 0x62u8, 0xe4u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x44u8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4cu8, 0x45u8, 0x2du8, + 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2du8, + 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4cu8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, + 0x4cu8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x44u8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4cu8, 0x45u8, 0x2du8, 0x30u8, + 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2du8, 0x30u8, + 0x34u8, 0x33u8, 0x30u8, 0x4cu8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4cu8, + 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, + 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4cu8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, + 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, + 0x33u8, 0x30u8, 0x4cu8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4cu8, 0x45u8, + 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, + 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4cu8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, + 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, + 0x30u8, 0x4cu8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x44u8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4cu8, 0x45u8, 0x2du8, + 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2du8, + 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4cu8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, + 0x4cu8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, + ]; + const COMMENT_AREA_SEGMENT: [u8; 2048] = [ 0x00u8, 0x00u8, 0x53u8, 0x65u8, 0x70u8, 0x74u8, 0x65u8, 0x6du8, 0x62u8, 0x65u8, 0x72u8, 0x20u8, 0x30u8, 0x33u8, 0x2cu8, 0x20u8, 0x32u8, 0x30u8, 0x31u8, 0x33u8, 0x00u8, 0x43u8, @@ -344,53 +1378,6 @@ fn test_parse_comment_area() { 0x00u8, 0x00u8, ]; - let (unparsed_string, comment) = - parse_comment_area(&COMMENT_AREA_SEGMENT, 2).expect("Comment area parsing should succeed"); - - assert_eq!(unparsed_string.len(), 0); - - assert_eq!( - r#"September 03, 2013 -C. Acton - -JPL's Solar System Dynamics Group has released two new planetary/lunar ephemerides, -named DE430 and DE431. - -DE430 is now considered the official export lunar/planetary ephemeris, suitable for -all users/uses. It's approximate time span is 1550 JAN 01 to 2650 JAN 22. - -If a longer time span is needed, DE431 may be used, except that the lunar ephemeris -portion is of relatively poor accuracy outside of the time span covered by DE430. -The time span covered by DE431 is approximately 13202 B.C. to 17191 A.D. Because de431 -is so long, leading to a huge file, it has been split into two parts having the -approximagte time spans of: - - 13202 B.C. to 0 - 0 to 17191 A.D. - -More details about these ephemeris files are contained in accompanying documentation -available on the NAIF server: http://naif.jpl.nasa.gov/pub/naif/generic_kernels/spk/planets/ - - -Special note regarding Mars: starting with this DE file the location of Mars' mass center -(NAIF ID = 499) is *NOT* included; only the Mars system barycenter (ID = 4) is present. -The offset between Mars' mass center and the Mars' system barycenter in DE403 is quite small ---about 20 cm.--so most SPICE users could use the Mars system barycenter in place of the -Mars mass center. However, if you wish/need to have the Mars mass center available to your -program, you'll need to load a Mars satellite ephemeris file such as "mar097.bsp" in addition -to DE430. Satellite ephemeris files are available from the NAIF server here: -http://naif.jpl.nasa.gov/pub/naif/generic_kernels/spk/satellites/ - - -Details about SPICE planet and satellite ephemeris files, known as SPK files, including -how to read them using SPICE Toolkit software, may be found in the SPK tutorial (PDF file -name is "19_spk") available from the NAIF website (http://naif.jpl.nasa.gov/tutorials.html)."#, - comment - ); -} - -#[test] -fn test_parse_file_record() { // NASA NAIF spy returns the following values for the file record bytes below // ================================================================== // File Architecture : DAF @@ -500,22 +1487,4 @@ fn test_parse_file_record() { 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, ]; - - let (unparsed_string, file_record) = - parse_file_record(&FILE_RECORD_SEGMENT).expect("File record parsing should succeed"); - - assert_eq!(unparsed_string.len(), 0); - - assert_eq!(file_record.locidw, "DAF/SPK"); - assert_eq!(file_record.nd, 2); - assert_eq!(file_record.ni, 6); - assert_eq!(file_record.locifn, "NIO2SPK"); - assert_eq!(file_record.fward, 4); - assert_eq!(file_record.bward, 4); - assert_eq!(file_record.free, 14967465); - assert_eq!(file_record.locfmt, "LTL-IEEE"); - assert_eq!( - file_record.ftpstr, - b"FTPSTR:\r:\n:\r\n:\r\x00:\x81:\x10\xce:ENDFTP" - ); } From 62bde3643163d62d8b81aeac4e72e000ea84f02c Mon Sep 17 00:00:00 2001 From: Andrei Zisu Date: Wed, 5 Apr 2023 23:48:53 +0200 Subject: [PATCH 05/27] Use char instead of str Recommended by clippy --- crates/lox_core/src/ephemeris/daf_spk/parser.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/lox_core/src/ephemeris/daf_spk/parser.rs b/crates/lox_core/src/ephemeris/daf_spk/parser.rs index 9d9204a8..cacd3a65 100644 --- a/crates/lox_core/src/ephemeris/daf_spk/parser.rs +++ b/crates/lox_core/src/ephemeris/daf_spk/parser.rs @@ -144,7 +144,7 @@ pub fn parse_comment_area(input: &[u8], comment_areas_count: u32) -> nom::IResul }; let comment_record_content = - String::from_utf8_lossy(comment_record_content).replace("\0", "\n"); + String::from_utf8_lossy(comment_record_content).replace('\0', "\n"); comment_area.push_str(&comment_record_content) } From 9d40cc108a7a2803328b996a3809aa0684aa5f62 Mon Sep 17 00:00:00 2001 From: Andrei Zisu Date: Sat, 14 Oct 2023 17:52:38 +0200 Subject: [PATCH 06/27] Pass the count via the summary record --- crates/lox_core/src/ephemeris/daf_spk/parser.rs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/crates/lox_core/src/ephemeris/daf_spk/parser.rs b/crates/lox_core/src/ephemeris/daf_spk/parser.rs index cacd3a65..7aa08c72 100644 --- a/crates/lox_core/src/ephemeris/daf_spk/parser.rs +++ b/crates/lox_core/src/ephemeris/daf_spk/parser.rs @@ -33,6 +33,7 @@ pub struct Summary { #[derive(Debug, PartialEq)] pub struct SummaryRecord { pub next: u32, + pub count: u32, pub summaries: Vec, } @@ -204,7 +205,14 @@ pub fn parse_summary_and_name_record_pair( }); } - Ok((&[], SummaryRecord { next, summaries })) + Ok(( + &[], + SummaryRecord { + next, + count: nsum, + summaries, + }, + )) } pub fn parse_all_summary_and_name_record_pairs( @@ -272,6 +280,7 @@ mod test { // @TODO Find out if these values are correct by comparing to other libs SummaryRecord { next: 0, + count: 14, summaries: vec![ Summary { name: "DE-0430LE-0430".to_string().to_string(), From ae9abab618d1315de7249b40a84c8d23473dc807 Mon Sep 17 00:00:00 2001 From: Andrei Zisu Date: Sat, 14 Oct 2023 17:53:34 +0200 Subject: [PATCH 07/27] Make the offset parametric --- crates/lox_core/src/ephemeris/daf_spk/parser.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/lox_core/src/ephemeris/daf_spk/parser.rs b/crates/lox_core/src/ephemeris/daf_spk/parser.rs index 7aa08c72..62f5c082 100644 --- a/crates/lox_core/src/ephemeris/daf_spk/parser.rs +++ b/crates/lox_core/src/ephemeris/daf_spk/parser.rs @@ -161,7 +161,7 @@ pub fn parse_summary_and_name_record_pair( ni: u32, ) -> nom::IResult<&[u8], SummaryRecord> { let summary_record_input = input; - let mut name_record_input = &input[1024..]; + let mut name_record_input = &input[RECORD_SIZE as usize..]; let nc = 8 * (nd + (ni + 1) / 2); From c8bded4de6077b27befc6290d8ce159445143caa Mon Sep 17 00:00:00 2001 From: Andrei Zisu Date: Sun, 15 Oct 2023 21:16:03 +0200 Subject: [PATCH 08/27] Clarify which parts are DAF-only --- .../lox_core/src/ephemeris/daf_spk/parser.rs | 119 +++++++++--------- 1 file changed, 61 insertions(+), 58 deletions(-) diff --git a/crates/lox_core/src/ephemeris/daf_spk/parser.rs b/crates/lox_core/src/ephemeris/daf_spk/parser.rs index 62f5c082..6175f0a7 100644 --- a/crates/lox_core/src/ephemeris/daf_spk/parser.rs +++ b/crates/lox_core/src/ephemeris/daf_spk/parser.rs @@ -3,7 +3,7 @@ use nom::error::ErrorKind; const RECORD_SIZE: u32 = 1024; #[derive(Debug, PartialEq)] -pub struct FileRecord { +pub struct DafFileRecord { pub locidw: String, pub nd: u32, pub ni: u32, @@ -18,32 +18,32 @@ pub struct FileRecord { } #[derive(Debug, PartialEq)] -pub struct Components { +pub struct DafComponents { pub double_precision_components: Vec, pub integer_components: Vec, } #[derive(Debug, PartialEq)] -pub struct Summary { +pub struct DafSummary { pub name: String, - pub components: Components, + pub components: DafComponents, } #[derive(Debug, PartialEq)] -pub struct SummaryRecord { +pub struct DafSummaryRecord { pub next: u32, pub count: u32, - pub summaries: Vec, + pub summaries: Vec, } #[derive(Debug, PartialEq)] pub struct SPK { - pub file_record: FileRecord, + pub file_record: DafFileRecord, pub comment: String, } -pub fn parse_file_record(input: &[u8]) -> nom::IResult<&[u8], FileRecord> { +pub fn parse_daf_file_record(input: &[u8]) -> nom::IResult<&[u8], DafFileRecord> { // 1. LOCIDW (8 charactersu8, 8 bytes): An identification word (`DAF/xxxx'). // The 'xxxx' substring is a string of four characters or less indicating the // type of data stored in the DAF file. This is used by the SPICELIB @@ -102,7 +102,7 @@ pub fn parse_file_record(input: &[u8]) -> nom::IResult<&[u8], FileRecord> { // should be safe. Ok(( input, - FileRecord { + DafFileRecord { locidw: String::from_utf8_lossy(locidw).trim().to_string(), nd, ni, @@ -118,7 +118,10 @@ pub fn parse_file_record(input: &[u8]) -> nom::IResult<&[u8], FileRecord> { )) } -pub fn parse_comment_area(input: &[u8], comment_areas_count: u32) -> nom::IResult<&[u8], String> { +pub fn parse_daf_comment_area( + input: &[u8], + comment_areas_count: u32, +) -> nom::IResult<&[u8], String> { // This function is definetely not optimal as there are several allocations at // different points but this is not a hot data path. let mut comment_area = String::new(); @@ -155,11 +158,11 @@ pub fn parse_comment_area(input: &[u8], comment_areas_count: u32) -> nom::IResul Ok((input_cursor, comment_area)) } -pub fn parse_summary_and_name_record_pair( +pub fn parse_daf_summary_and_name_record_pair( input: &[u8], nd: u32, ni: u32, -) -> nom::IResult<&[u8], SummaryRecord> { +) -> nom::IResult<&[u8], DafSummaryRecord> { let summary_record_input = input; let mut name_record_input = &input[RECORD_SIZE as usize..]; @@ -196,9 +199,9 @@ pub fn parse_summary_and_name_record_pair( let name; (name_record_input, name) = nom::bytes::complete::take(nc)(name_record_input)?; - summaries.push(Summary { + summaries.push(DafSummary { name: String::from_utf8_lossy(name).trim().to_string(), - components: Components { + components: DafComponents { double_precision_components, integer_components, }, @@ -207,7 +210,7 @@ pub fn parse_summary_and_name_record_pair( Ok(( &[], - SummaryRecord { + DafSummaryRecord { next, count: nsum, summaries, @@ -220,7 +223,7 @@ pub fn parse_all_summary_and_name_record_pairs( nd: u32, ni: u32, fward: u32, -) -> nom::IResult<&[u8], Vec> { +) -> nom::IResult<&[u8], Vec> { let mut all_summary_records = Vec::new(); let mut next = fward; @@ -231,7 +234,7 @@ pub fn parse_all_summary_and_name_record_pairs( let summary_and_name_record_pair = &input[start..end]; let (_, summaries_record) = - parse_summary_and_name_record_pair(summary_and_name_record_pair, nd, ni)?; + parse_daf_summary_and_name_record_pair(summary_and_name_record_pair, nd, ni)?; next = summaries_record.next; @@ -252,9 +255,9 @@ pub fn parse_daf_spk(full_input: &[u8]) -> nom::IResult<&[u8], SPK> { let input_cursor = full_input; - let (input_cursor, file_record) = parse_file_record(input_cursor)?; + let (input_cursor, file_record) = parse_daf_file_record(input_cursor)?; - let (_, comment) = parse_comment_area(input_cursor, file_record.fward - 2)?; + let (_, comment) = parse_daf_comment_area(input_cursor, file_record.fward - 2)?; let (_, all_summaries) = parse_all_summary_and_name_record_pairs( full_input, @@ -276,15 +279,15 @@ pub fn parse_daf_spk(full_input: &[u8]) -> nom::IResult<&[u8], SPK> { mod test { use super::*; - fn get_expected_summary_record() -> SummaryRecord { + fn get_expected_summary_record() -> DafSummaryRecord { // @TODO Find out if these values are correct by comparing to other libs - SummaryRecord { + DafSummaryRecord { next: 0, count: 14, summaries: vec![ - Summary { + DafSummary { name: "DE-0430LE-0430".to_string().to_string(), - components: Components { + components: DafComponents { double_precision_components: vec![-14200747200.0, 20514081600.0], integer_components: vec![ 1, @@ -296,9 +299,9 @@ mod test { ], }, }, - Summary { + DafSummary { name: "DE-0430LE-0430".to_string(), - components: Components { + components: DafComponents { double_precision_components: vec![ 4.2439915824e-314, 8.341616384367734e-308, @@ -313,9 +316,9 @@ mod test { ], }, }, - Summary { + DafSummary { name: "DE-0430LE-0430".to_string(), - components: Components { + components: DafComponents { double_precision_components: vec![20514081600.0, 2e-323], integer_components: vec![ 8589934593, @@ -327,9 +330,9 @@ mod test { ], }, }, - Summary { + DafSummary { name: "DE-0430LE-0430".to_string(), - components: Components { + components: DafComponents { double_precision_components: vec![2.8245970871090138e-307, -14200747200.0], integer_components: vec![ 4761178849910194176, @@ -341,9 +344,9 @@ mod test { ], }, }, - Summary { + DafSummary { name: "DE-0430LE-0430".to_string(), - components: Components { + components: DafComponents { double_precision_components: vec![3.5e-323, 4.2439915824e-314], integer_components: vec![ 22976030634265505, @@ -355,9 +358,9 @@ mod test { ], }, }, - Summary { + DafSummary { name: "DE-0430LE-0430".to_string(), - components: Components { + components: DafComponents { double_precision_components: vec![-14200747200.0, 20514081600.0], integer_components: vec![ 9, @@ -369,9 +372,9 @@ mod test { ], }, }, - Summary { + DafSummary { name: "DE-0430LE-0430".to_string(), - components: Components { + components: DafComponents { double_precision_components: vec![ 4.2439915824e-314, 1.0102845736390232e-306, @@ -386,9 +389,9 @@ mod test { ], }, }, - Summary { + DafSummary { name: "DE-0430LE-0430".to_string(), - components: Components { + components: DafComponents { double_precision_components: vec![20514081600.0, 6.36598757e-314], integer_components: vec![ 8589934593, @@ -400,9 +403,9 @@ mod test { ], }, }, - Summary { + DafSummary { name: "DE-0430LE-0430".to_string(), - components: Components { + components: DafComponents { double_precision_components: vec![2.3223582656725217e-304, -14200747200.0], integer_components: vec![ 4761178849910194176, @@ -414,37 +417,37 @@ mod test { ], }, }, - Summary { + DafSummary { name: "DE-0430LE-0430".to_string(), - components: Components { + components: DafComponents { double_precision_components: vec![0.0, 0.0], integer_components: vec![0, 0, 0, 0, 0, 0], }, }, - Summary { + DafSummary { name: "DE-0430LE-0430".to_string(), - components: Components { + components: DafComponents { double_precision_components: vec![0.0, 0.0], integer_components: vec![0, 0, 0, 0, 0, 0], }, }, - Summary { + DafSummary { name: "DE-0430LE-0430".to_string(), - components: Components { + components: DafComponents { double_precision_components: vec![0.0, 0.0], integer_components: vec![0, 0, 0, 0, 0, 0], }, }, - Summary { + DafSummary { name: "DE-0430LE-0430".to_string(), - components: Components { + components: DafComponents { double_precision_components: vec![0.0, 0.0], integer_components: vec![0, 0, 0, 0, 0, 0], }, }, - Summary { + DafSummary { name: "DE-0430LE-0430".to_string(), - components: Components { + components: DafComponents { double_precision_components: vec![0.0, 0.0], integer_components: vec![0, 0, 0, 0, 0, 0], }, @@ -457,22 +460,22 @@ mod test { fn test_parse_all_summary_and_name_record_pairs() { let (_, all_summary_records) = parse_all_summary_and_name_record_pairs(&FILE_CONTENTS, 2, 6, 4) - .expect("Summary record parsing should succeed"); + .expect("DafSummary record parsing should succeed"); assert_eq!(all_summary_records, vec![get_expected_summary_record()]); } #[test] - fn test_parse_summary_and_name_record_pair() { - let (_, summary_record) = parse_summary_and_name_record_pair(&SUMMARY_RECORD, 2, 6) - .expect("Summary record parsing should succeed"); + fn test_parse_daf_summary_and_name_record_pair() { + let (_, summary_record) = parse_daf_summary_and_name_record_pair(&SUMMARY_RECORD, 2, 6) + .expect("DafSummary record parsing should succeed"); assert_eq!(summary_record, get_expected_summary_record()); } #[test] - fn test_parse_comment_area() { - let (unparsed_string, comment) = parse_comment_area(&COMMENT_AREA_SEGMENT, 2) + fn test_parse_daf_comment_area() { + let (unparsed_string, comment) = parse_daf_comment_area(&COMMENT_AREA_SEGMENT, 2) .expect("Comment area parsing should succeed"); assert_eq!(unparsed_string.len(), 0); @@ -518,9 +521,9 @@ name is "19_spk") available from the NAIF website (http://naif.jpl.nasa.gov/tuto } #[test] - fn test_parse_file_record() { - let (unparsed_string, file_record) = - parse_file_record(&FILE_RECORD_SEGMENT).expect("File record parsing should succeed"); + fn test_parse_daf_file_record() { + let (unparsed_string, file_record) = parse_daf_file_record(&FILE_RECORD_SEGMENT) + .expect("File record parsing should succeed"); assert_eq!(unparsed_string.len(), 0); From e9143d86820b8810f57af6f38ae4ca2a07428ecf Mon Sep 17 00:00:00 2001 From: Andrei Zisu Date: Sun, 15 Oct 2023 21:31:56 +0200 Subject: [PATCH 09/27] Fix integer components type --- .../lox_core/src/ephemeris/daf_spk/parser.rs | 127 ++++-------------- 1 file changed, 29 insertions(+), 98 deletions(-) diff --git a/crates/lox_core/src/ephemeris/daf_spk/parser.rs b/crates/lox_core/src/ephemeris/daf_spk/parser.rs index 6175f0a7..98bf0145 100644 --- a/crates/lox_core/src/ephemeris/daf_spk/parser.rs +++ b/crates/lox_core/src/ephemeris/daf_spk/parser.rs @@ -20,7 +20,7 @@ pub struct DafFileRecord { #[derive(Debug, PartialEq)] pub struct DafComponents { pub double_precision_components: Vec, - pub integer_components: Vec, + pub integer_components: Vec, } #[derive(Debug, PartialEq)] @@ -192,7 +192,7 @@ pub fn parse_daf_summary_and_name_record_pair( let integer_components; (summary_record_input, integer_components) = - nom::multi::many_m_n(ni as usize, ni as usize, nom::number::complete::le_i64)( + nom::multi::many_m_n(ni as usize, ni as usize, nom::number::complete::le_i32)( summary_record_input, )?; @@ -286,170 +286,101 @@ mod test { count: 14, summaries: vec![ DafSummary { - name: "DE-0430LE-0430".to_string().to_string(), + name: "DE-0430LE-0430".to_string(), components: DafComponents { double_precision_components: vec![-14200747200.0, 20514081600.0], - integer_components: vec![ - 1, - 8589934593, - 9494025207808641, - -4464629148630908928, - 4761178849910194176, - 2, - ], + integer_components: vec![1, 0, 1, 2, 641, 2210500], }, }, DafSummary { name: "DE-0430LE-0430".to_string(), components: DafComponents { - double_precision_components: vec![ - 4.2439915824e-314, - 8.341616384367734e-308, - ], - integer_components: vec![ - -4464629148630908928, - 4761178849910194176, - 3, - 8589934593, - 17367490538372553, - -4464629148630908928, - ], + double_precision_components: vec![-14200747200.0, 20514081600.0], + integer_components: vec![2, 0, 1, 2, 2210501, 3014088], }, }, DafSummary { name: "DE-0430LE-0430".to_string(), components: DafComponents { - double_precision_components: vec![20514081600.0, 2e-323], - integer_components: vec![ - 8589934593, - 19254974047171493, - -4464629148630908928, - 4761178849910194176, - 5, - 8589934593, - ], + double_precision_components: vec![-14200747200.0, 20514081600.0], + integer_components: vec![3, 0, 1, 2, 3014089, 4043684], }, }, DafSummary { name: "DE-0430LE-0430".to_string(), components: DafComponents { - double_precision_components: vec![2.8245970871090138e-307, -14200747200.0], - integer_components: vec![ - 4761178849910194176, - 6, - 8589934593, - 21897461266736009, - -4464629148630908928, - 4761178849910194176, - ], + double_precision_components: vec![-14200747200.0, 20514081600.0], + integer_components: vec![4, 0, 1, 2, 4043685, 4483148], }, }, DafSummary { name: "DE-0430LE-0430".to_string(), components: DafComponents { - double_precision_components: vec![3.5e-323, 4.2439915824e-314], - integer_components: vec![ - 22976030634265505, - -4464629148630908928, - 4761178849910194176, - 8, - 8589934593, - 24054600001757333, - ], + double_precision_components: vec![-14200747200.0, 20514081600.0], + integer_components: vec![5, 0, 1, 2, 4483149, 4809608], }, }, DafSummary { name: "DE-0430LE-0430".to_string(), components: DafComponents { double_precision_components: vec![-14200747200.0, 20514081600.0], - integer_components: vec![ - 9, - 8589934593, - 25133169369249161, - -4464629148630908928, - 4761178849910194176, - 10, - ], + integer_components: vec![6, 0, 1, 2, 4809609, 5098400], }, }, DafSummary { name: "DE-0430LE-0430".to_string(), components: DafComponents { - double_precision_components: vec![ - 4.2439915824e-314, - 1.0102845736390232e-306, - ], - integer_components: vec![ - -4464629148630908928, - 4761178849910194176, - 12884902189, - 8589934593, - 46596392258810825, - -4464629148630908928, - ], + double_precision_components: vec![-14200747200.0, 20514081600.0], + integer_components: vec![7, 0, 1, 2, 5098401, 5349524], }, }, DafSummary { name: "DE-0430LE-0430".to_string(), components: DafComponents { - double_precision_components: vec![20514081600.0, 6.36598757e-314], - integer_components: vec![ - 8589934593, - 64284665315691309, - -4464629148630908928, - 4761178849910194176, - 4294967495, - 8589934593, - ], + double_precision_components: vec![-14200747200.0, 20514081600.0], + integer_components: vec![8, 0, 1, 2, 5349525, 5600648], }, }, DafSummary { name: "DE-0430LE-0430".to_string(), components: DafComponents { - double_precision_components: vec![2.3223582656725217e-304, -14200747200.0], - integer_components: vec![ - 4761178849910194176, - 8589934891, - 8589934593, - 64284768399024797, - 0, - 0, - ], + double_precision_components: vec![-14200747200.0, 20514081600.0], + integer_components: vec![9, 0, 1, 2, 5600649, 5851772], }, }, DafSummary { name: "DE-0430LE-0430".to_string(), components: DafComponents { - double_precision_components: vec![0.0, 0.0], - integer_components: vec![0, 0, 0, 0, 0, 0], + double_precision_components: vec![-14200747200.0, 20514081600.0], + integer_components: vec![10, 0, 1, 2, 5851773, 6730696], }, }, DafSummary { name: "DE-0430LE-0430".to_string(), components: DafComponents { - double_precision_components: vec![0.0, 0.0], - integer_components: vec![0, 0, 0, 0, 0, 0], + double_precision_components: vec![-14200747200.0, 20514081600.0], + integer_components: vec![301, 3, 1, 2, 6730697, 10849068], }, }, DafSummary { name: "DE-0430LE-0430".to_string(), components: DafComponents { - double_precision_components: vec![0.0, 0.0], - integer_components: vec![0, 0, 0, 0, 0, 0], + double_precision_components: vec![-14200747200.0, 20514081600.0], + integer_components: vec![399, 3, 1, 2, 10849069, 14967440], }, }, DafSummary { name: "DE-0430LE-0430".to_string(), components: DafComponents { - double_precision_components: vec![0.0, 0.0], - integer_components: vec![0, 0, 0, 0, 0, 0], + double_precision_components: vec![-14200747200.0, 20514081600.0], + integer_components: vec![199, 1, 1, 2, 14967441, 14967452], }, }, DafSummary { name: "DE-0430LE-0430".to_string(), components: DafComponents { - double_precision_components: vec![0.0, 0.0], - integer_components: vec![0, 0, 0, 0, 0, 0], + double_precision_components: vec![-14200747200.0, 20514081600.0], + integer_components: vec![299, 2, 1, 2, 14967453, 14967464], }, }, ], From 627b49dbf2a81df2454faef32a69c5d6f8346a94 Mon Sep 17 00:00:00 2001 From: Andrei Zisu Date: Sun, 15 Oct 2023 23:49:53 +0200 Subject: [PATCH 10/27] Parse DAF summary into SPK segment --- .../lox_core/src/ephemeris/daf_spk/parser.rs | 381 ++++++++++++++++-- 1 file changed, 341 insertions(+), 40 deletions(-) diff --git a/crates/lox_core/src/ephemeris/daf_spk/parser.rs b/crates/lox_core/src/ephemeris/daf_spk/parser.rs index 98bf0145..5aad4d64 100644 --- a/crates/lox_core/src/ephemeris/daf_spk/parser.rs +++ b/crates/lox_core/src/ephemeris/daf_spk/parser.rs @@ -1,4 +1,5 @@ -use nom::error::ErrorKind; +use nom::{error::ErrorKind, number::complete::double, Err}; +use num::integer; const RECORD_SIZE: u32 = 1024; @@ -30,6 +31,60 @@ pub struct DafSummary { pub components: DafComponents, } +#[derive(Debug, PartialEq)] +pub enum DafSpkError { + // The data type integer value does not match the ones in the spec + InvalidSpkSegmentDataType, + // The number of DAF components does not match the SPK specification + UnexpectedNumberOfComponents, +} + +#[derive(Debug, PartialEq)] + +pub struct SpkSegment { + pub name: String, + // In J2000 epoch + pub initial_epoch: f64, + // In J2000 epoch + pub final_epoch: f64, + // NAIF id of the target + pub target_id: i32, + // NAIF id of the center + pub center_id: i32, + // NAIF id of the reference frame + pub reference_frame_id: i32, + pub data_type: i32, + pub initial_address: i32, + pub final_address: i32, +} + +impl SpkSegment { + pub fn from_daf_summary(summary: &DafSummary) -> Result { + let double_precision_components = &summary.components.double_precision_components; + let integer_components = &summary.components.integer_components; + + if double_precision_components.len() != 2 { + return Err(DafSpkError::UnexpectedNumberOfComponents); + } + + if integer_components.len() != 6 { + return Err(DafSpkError::UnexpectedNumberOfComponents); + } + + Ok(SpkSegment { + name: summary.name.clone(), + initial_epoch: double_precision_components[0], + final_epoch: double_precision_components[1], + target_id: integer_components[0], + center_id: integer_components[1], + reference_frame_id: integer_components[2], + data_type: integer_components[3], + initial_address: integer_components[4], + final_address: integer_components[5], + }) + } +} + #[derive(Debug, PartialEq)] pub struct DafSummaryRecord { pub next: u32, @@ -41,6 +96,7 @@ pub struct DafSummaryRecord { pub struct SPK { pub file_record: DafFileRecord, pub comment: String, + pub segments: Vec, } pub fn parse_daf_file_record(input: &[u8]) -> nom::IResult<&[u8], DafFileRecord> { @@ -266,11 +322,27 @@ pub fn parse_daf_spk(full_input: &[u8]) -> nom::IResult<&[u8], SPK> { file_record.fward, )?; + let segments = all_summaries + .iter() + .map(|summary_record| { + summary_record + .summaries + .iter() + .map(SpkSegment::from_daf_summary) + .collect::, DafSpkError>>() + }) + .collect::, DafSpkError>>() + .expect("Bla") //@TODO + .into_iter() + .flatten() + .collect::<_>(); + Ok(( - full_input, //@TODO + full_input, SPK { file_record, comment, + segments, }, )) } @@ -279,6 +351,261 @@ pub fn parse_daf_spk(full_input: &[u8]) -> nom::IResult<&[u8], SPK> { mod test { use super::*; + fn get_expected_comment_string() -> String { + r#"September 03, 2013 +C. Acton + +JPL's Solar System Dynamics Group has released two new planetary/lunar ephemerides, +named DE430 and DE431. + +DE430 is now considered the official export lunar/planetary ephemeris, suitable for +all users/uses. It's approximate time span is 1550 JAN 01 to 2650 JAN 22. + +If a longer time span is needed, DE431 may be used, except that the lunar ephemeris +portion is of relatively poor accuracy outside of the time span covered by DE430. +The time span covered by DE431 is approximately 13202 B.C. to 17191 A.D. Because de431 +is so long, leading to a huge file, it has been split into two parts having the +approximagte time spans of: + + 13202 B.C. to 0 + 0 to 17191 A.D. + +More details about these ephemeris files are contained in accompanying documentation +available on the NAIF server: http://naif.jpl.nasa.gov/pub/naif/generic_kernels/spk/planets/ + + +Special note regarding Mars: starting with this DE file the location of Mars' mass center +(NAIF ID = 499) is *NOT* included; only the Mars system barycenter (ID = 4) is present. +The offset between Mars' mass center and the Mars' system barycenter in DE403 is quite small +--about 20 cm.--so most SPICE users could use the Mars system barycenter in place of the +Mars mass center. However, if you wish/need to have the Mars mass center available to your +program, you'll need to load a Mars satellite ephemeris file such as "mar097.bsp" in addition +to DE430. Satellite ephemeris files are available from the NAIF server here: +http://naif.jpl.nasa.gov/pub/naif/generic_kernels/spk/satellites/ + + +Details about SPICE planet and satellite ephemeris files, known as SPK files, including +how to read them using SPICE Toolkit software, may be found in the SPK tutorial (PDF file +name is "19_spk") available from the NAIF website (http://naif.jpl.nasa.gov/tutorials.html)."# + .to_string() + } + + fn get_expected_spk() -> SPK { + SPK { + file_record: DafFileRecord { + locidw: "DAF/SPK".to_string(), + nd: 2, + ni: 6, + locifn: "NIO2SPK".to_string(), + fward: 4, + bward: 4, + free: 14967465, + locfmt: "LTL-IEEE".to_string(), + prenul: vec![ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, + ], + ftpstr: vec![ + 70, 84, 80, 83, 84, 82, 58, 13, 58, 10, 58, 13, 10, 58, 13, 0, 58, 129, 58, 16, + 206, 58, 69, 78, 68, 70, 84, 80, + ], + pstnul: vec![ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], + }, + comment: get_expected_comment_string(), + segments: vec![ + SpkSegment { + name: "DE-0430LE-0430".to_string(), + initial_epoch: -14200747200.0, + final_epoch: 20514081600.0, + target_id: 1, + center_id: 0, + reference_frame_id: 1, + data_type: 2, + initial_address: 641, + final_address: 2210500, + }, + SpkSegment { + name: "DE-0430LE-0430".to_string(), + initial_epoch: -14200747200.0, + final_epoch: 20514081600.0, + target_id: 2, + center_id: 0, + reference_frame_id: 1, + data_type: 2, + initial_address: 2210501, + final_address: 3014088, + }, + SpkSegment { + name: "DE-0430LE-0430".to_string(), + initial_epoch: -14200747200.0, + final_epoch: 20514081600.0, + target_id: 3, + center_id: 0, + reference_frame_id: 1, + data_type: 2, + initial_address: 3014089, + final_address: 4043684, + }, + SpkSegment { + name: "DE-0430LE-0430".to_string(), + initial_epoch: -14200747200.0, + final_epoch: 20514081600.0, + target_id: 4, + center_id: 0, + reference_frame_id: 1, + data_type: 2, + initial_address: 4043685, + final_address: 4483148, + }, + SpkSegment { + name: "DE-0430LE-0430".to_string(), + initial_epoch: -14200747200.0, + final_epoch: 20514081600.0, + target_id: 5, + center_id: 0, + reference_frame_id: 1, + data_type: 2, + initial_address: 4483149, + final_address: 4809608, + }, + SpkSegment { + name: "DE-0430LE-0430".to_string(), + initial_epoch: -14200747200.0, + final_epoch: 20514081600.0, + target_id: 6, + center_id: 0, + reference_frame_id: 1, + data_type: 2, + initial_address: 4809609, + final_address: 5098400, + }, + SpkSegment { + name: "DE-0430LE-0430".to_string(), + initial_epoch: -14200747200.0, + final_epoch: 20514081600.0, + target_id: 7, + center_id: 0, + reference_frame_id: 1, + data_type: 2, + initial_address: 5098401, + final_address: 5349524, + }, + SpkSegment { + name: "DE-0430LE-0430".to_string(), + initial_epoch: -14200747200.0, + final_epoch: 20514081600.0, + target_id: 8, + center_id: 0, + reference_frame_id: 1, + data_type: 2, + initial_address: 5349525, + final_address: 5600648, + }, + SpkSegment { + name: "DE-0430LE-0430".to_string(), + initial_epoch: -14200747200.0, + final_epoch: 20514081600.0, + target_id: 9, + center_id: 0, + reference_frame_id: 1, + data_type: 2, + initial_address: 5600649, + final_address: 5851772, + }, + SpkSegment { + name: "DE-0430LE-0430".to_string(), + initial_epoch: -14200747200.0, + final_epoch: 20514081600.0, + target_id: 10, + center_id: 0, + reference_frame_id: 1, + data_type: 2, + initial_address: 5851773, + final_address: 6730696, + }, + SpkSegment { + name: "DE-0430LE-0430".to_string(), + initial_epoch: -14200747200.0, + final_epoch: 20514081600.0, + target_id: 301, + center_id: 3, + reference_frame_id: 1, + data_type: 2, + initial_address: 6730697, + final_address: 10849068, + }, + SpkSegment { + name: "DE-0430LE-0430".to_string(), + initial_epoch: -14200747200.0, + final_epoch: 20514081600.0, + target_id: 399, + center_id: 3, + reference_frame_id: 1, + data_type: 2, + initial_address: 10849069, + final_address: 14967440, + }, + SpkSegment { + name: "DE-0430LE-0430".to_string(), + initial_epoch: -14200747200.0, + final_epoch: 20514081600.0, + target_id: 199, + center_id: 1, + reference_frame_id: 1, + data_type: 2, + initial_address: 14967441, + final_address: 14967452, + }, + SpkSegment { + name: "DE-0430LE-0430".to_string(), + initial_epoch: -14200747200.0, + final_epoch: 20514081600.0, + target_id: 299, + center_id: 2, + reference_frame_id: 1, + data_type: 2, + initial_address: 14967453, + final_address: 14967464, + }, + ], + } + } + fn get_expected_summary_record() -> DafSummaryRecord { // @TODO Find out if these values are correct by comparing to other libs DafSummaryRecord { @@ -411,44 +738,7 @@ mod test { assert_eq!(unparsed_string.len(), 0); - assert_eq!( - r#"September 03, 2013 -C. Acton - -JPL's Solar System Dynamics Group has released two new planetary/lunar ephemerides, -named DE430 and DE431. - -DE430 is now considered the official export lunar/planetary ephemeris, suitable for -all users/uses. It's approximate time span is 1550 JAN 01 to 2650 JAN 22. - -If a longer time span is needed, DE431 may be used, except that the lunar ephemeris -portion is of relatively poor accuracy outside of the time span covered by DE430. -The time span covered by DE431 is approximately 13202 B.C. to 17191 A.D. Because de431 -is so long, leading to a huge file, it has been split into two parts having the -approximagte time spans of: - - 13202 B.C. to 0 - 0 to 17191 A.D. - -More details about these ephemeris files are contained in accompanying documentation -available on the NAIF server: http://naif.jpl.nasa.gov/pub/naif/generic_kernels/spk/planets/ - - -Special note regarding Mars: starting with this DE file the location of Mars' mass center -(NAIF ID = 499) is *NOT* included; only the Mars system barycenter (ID = 4) is present. -The offset between Mars' mass center and the Mars' system barycenter in DE403 is quite small ---about 20 cm.--so most SPICE users could use the Mars system barycenter in place of the -Mars mass center. However, if you wish/need to have the Mars mass center available to your -program, you'll need to load a Mars satellite ephemeris file such as "mar097.bsp" in addition -to DE430. Satellite ephemeris files are available from the NAIF server here: -http://naif.jpl.nasa.gov/pub/naif/generic_kernels/spk/satellites/ - - -Details about SPICE planet and satellite ephemeris files, known as SPK files, including -how to read them using SPICE Toolkit software, may be found in the SPK tutorial (PDF file -name is "19_spk") available from the NAIF website (http://naif.jpl.nasa.gov/tutorials.html)."#, - comment - ); + assert_eq!(get_expected_comment_string(), comment); } #[test] @@ -472,6 +762,17 @@ name is "19_spk") available from the NAIF website (http://naif.jpl.nasa.gov/tuto ); } + #[test] + fn test_parse_daf_spk() { + let spk = parse_daf_spk(&FILE_CONTENTS); + + assert!(spk.is_ok()); + + if let Ok((_, spk)) = spk { + assert_eq!(spk, get_expected_spk()); + } + } + const FILE_CONTENTS: [u8; 5120] = [ 0x44u8, 0x41u8, 0x46u8, 0x2Fu8, 0x53u8, 0x50u8, 0x4Bu8, 0x20u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x06u8, 0x00u8, 0x00u8, 0x00u8, 0x4Eu8, 0x49u8, 0x4Fu8, 0x32u8, 0x53u8, 0x50u8, From 2d509d37a8a407c35253c111b43668bf0ba8b886 Mon Sep 17 00:00:00 2001 From: Andrei Zisu Date: Sun, 15 Oct 2023 23:51:37 +0200 Subject: [PATCH 11/27] Fix case for Spk type --- crates/lox_core/src/ephemeris/daf_spk/parser.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/crates/lox_core/src/ephemeris/daf_spk/parser.rs b/crates/lox_core/src/ephemeris/daf_spk/parser.rs index 5aad4d64..264b6f37 100644 --- a/crates/lox_core/src/ephemeris/daf_spk/parser.rs +++ b/crates/lox_core/src/ephemeris/daf_spk/parser.rs @@ -93,7 +93,7 @@ pub struct DafSummaryRecord { } #[derive(Debug, PartialEq)] -pub struct SPK { +pub struct Spk { pub file_record: DafFileRecord, pub comment: String, pub segments: Vec, @@ -304,7 +304,7 @@ pub fn parse_all_summary_and_name_record_pairs( Ok((&[], all_summary_records)) } -pub fn parse_daf_spk(full_input: &[u8]) -> nom::IResult<&[u8], SPK> { +pub fn parse_daf_spk(full_input: &[u8]) -> nom::IResult<&[u8], Spk> { // - https://naif.jpl.nasa.gov/pub/naif/toolkit_docs/C/req/daf.html // - https://naif.jpl.nasa.gov/pub/naif/toolkit_docs/C/req/spk.html // - https://naif.jpl.nasa.gov/pub/naif/toolkit_docs/Tutorials/office/individual_docs/42_making_an_spk.pptx @@ -339,7 +339,7 @@ pub fn parse_daf_spk(full_input: &[u8]) -> nom::IResult<&[u8], SPK> { Ok(( full_input, - SPK { + Spk { file_record, comment, segments, @@ -390,8 +390,8 @@ name is "19_spk") available from the NAIF website (http://naif.jpl.nasa.gov/tuto .to_string() } - fn get_expected_spk() -> SPK { - SPK { + fn get_expected_spk() -> Spk { + Spk { file_record: DafFileRecord { locidw: "DAF/SPK".to_string(), nd: 2, From 359b81d53397adda5f042754e9d3c04a5003f3ab Mon Sep 17 00:00:00 2001 From: Andrei Zisu Date: Sun, 15 Oct 2023 23:52:20 +0200 Subject: [PATCH 12/27] Remove unused imports --- crates/lox_core/src/ephemeris/daf_spk/parser.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/crates/lox_core/src/ephemeris/daf_spk/parser.rs b/crates/lox_core/src/ephemeris/daf_spk/parser.rs index 264b6f37..65426aa2 100644 --- a/crates/lox_core/src/ephemeris/daf_spk/parser.rs +++ b/crates/lox_core/src/ephemeris/daf_spk/parser.rs @@ -1,5 +1,4 @@ -use nom::{error::ErrorKind, number::complete::double, Err}; -use num::integer; +use nom::error::ErrorKind; const RECORD_SIZE: u32 = 1024; From 250e723b298aaed83b5094f2fc488bc9cdde911a Mon Sep 17 00:00:00 2001 From: Andrei Zisu Date: Sun, 15 Oct 2023 23:53:19 +0200 Subject: [PATCH 13/27] Move expected data after the test code --- .../lox_core/src/ephemeris/daf_spk/parser.rs | 118 +++++++++--------- 1 file changed, 59 insertions(+), 59 deletions(-) diff --git a/crates/lox_core/src/ephemeris/daf_spk/parser.rs b/crates/lox_core/src/ephemeris/daf_spk/parser.rs index 65426aa2..209ef2eb 100644 --- a/crates/lox_core/src/ephemeris/daf_spk/parser.rs +++ b/crates/lox_core/src/ephemeris/daf_spk/parser.rs @@ -350,6 +350,65 @@ pub fn parse_daf_spk(full_input: &[u8]) -> nom::IResult<&[u8], Spk> { mod test { use super::*; + #[test] + fn test_parse_all_summary_and_name_record_pairs() { + let (_, all_summary_records) = + parse_all_summary_and_name_record_pairs(&FILE_CONTENTS, 2, 6, 4) + .expect("DafSummary record parsing should succeed"); + + assert_eq!(all_summary_records, vec![get_expected_summary_record()]); + } + + #[test] + fn test_parse_daf_summary_and_name_record_pair() { + let (_, summary_record) = parse_daf_summary_and_name_record_pair(&SUMMARY_RECORD, 2, 6) + .expect("DafSummary record parsing should succeed"); + + assert_eq!(summary_record, get_expected_summary_record()); + } + + #[test] + fn test_parse_daf_comment_area() { + let (unparsed_string, comment) = parse_daf_comment_area(&COMMENT_AREA_SEGMENT, 2) + .expect("Comment area parsing should succeed"); + + assert_eq!(unparsed_string.len(), 0); + + assert_eq!(get_expected_comment_string(), comment); + } + + #[test] + fn test_parse_daf_file_record() { + let (unparsed_string, file_record) = parse_daf_file_record(&FILE_RECORD_SEGMENT) + .expect("File record parsing should succeed"); + + assert_eq!(unparsed_string.len(), 0); + + assert_eq!(file_record.locidw, "DAF/SPK"); + assert_eq!(file_record.nd, 2); + assert_eq!(file_record.ni, 6); + assert_eq!(file_record.locifn, "NIO2SPK"); + assert_eq!(file_record.fward, 4); + assert_eq!(file_record.bward, 4); + assert_eq!(file_record.free, 14967465); + assert_eq!(file_record.locfmt, "LTL-IEEE"); + assert_eq!( + file_record.ftpstr, + b"FTPSTR:\r:\n:\r\n:\r\x00:\x81:\x10\xce:ENDFTP" + ); + } + + #[test] + fn test_parse_daf_spk() { + let spk = parse_daf_spk(&FILE_CONTENTS); + + assert!(spk.is_ok()); + + if let Ok((_, spk)) = spk { + assert_eq!(spk, get_expected_spk()); + } + } + fn get_expected_comment_string() -> String { r#"September 03, 2013 C. Acton @@ -713,65 +772,6 @@ name is "19_spk") available from the NAIF website (http://naif.jpl.nasa.gov/tuto } } - #[test] - fn test_parse_all_summary_and_name_record_pairs() { - let (_, all_summary_records) = - parse_all_summary_and_name_record_pairs(&FILE_CONTENTS, 2, 6, 4) - .expect("DafSummary record parsing should succeed"); - - assert_eq!(all_summary_records, vec![get_expected_summary_record()]); - } - - #[test] - fn test_parse_daf_summary_and_name_record_pair() { - let (_, summary_record) = parse_daf_summary_and_name_record_pair(&SUMMARY_RECORD, 2, 6) - .expect("DafSummary record parsing should succeed"); - - assert_eq!(summary_record, get_expected_summary_record()); - } - - #[test] - fn test_parse_daf_comment_area() { - let (unparsed_string, comment) = parse_daf_comment_area(&COMMENT_AREA_SEGMENT, 2) - .expect("Comment area parsing should succeed"); - - assert_eq!(unparsed_string.len(), 0); - - assert_eq!(get_expected_comment_string(), comment); - } - - #[test] - fn test_parse_daf_file_record() { - let (unparsed_string, file_record) = parse_daf_file_record(&FILE_RECORD_SEGMENT) - .expect("File record parsing should succeed"); - - assert_eq!(unparsed_string.len(), 0); - - assert_eq!(file_record.locidw, "DAF/SPK"); - assert_eq!(file_record.nd, 2); - assert_eq!(file_record.ni, 6); - assert_eq!(file_record.locifn, "NIO2SPK"); - assert_eq!(file_record.fward, 4); - assert_eq!(file_record.bward, 4); - assert_eq!(file_record.free, 14967465); - assert_eq!(file_record.locfmt, "LTL-IEEE"); - assert_eq!( - file_record.ftpstr, - b"FTPSTR:\r:\n:\r\n:\r\x00:\x81:\x10\xce:ENDFTP" - ); - } - - #[test] - fn test_parse_daf_spk() { - let spk = parse_daf_spk(&FILE_CONTENTS); - - assert!(spk.is_ok()); - - if let Ok((_, spk)) = spk { - assert_eq!(spk, get_expected_spk()); - } - } - const FILE_CONTENTS: [u8; 5120] = [ 0x44u8, 0x41u8, 0x46u8, 0x2Fu8, 0x53u8, 0x50u8, 0x4Bu8, 0x20u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x06u8, 0x00u8, 0x00u8, 0x00u8, 0x4Eu8, 0x49u8, 0x4Fu8, 0x32u8, 0x53u8, 0x50u8, From 4df03ff4dadf94d440e668c0bcf2f5456e91a4dd Mon Sep 17 00:00:00 2001 From: Andrei Zisu Date: Mon, 16 Oct 2023 23:00:38 +0200 Subject: [PATCH 14/27] Implement endianness support --- .../lox_core/src/ephemeris/daf_spk/parser.rs | 134 ++++++++++++------ 1 file changed, 94 insertions(+), 40 deletions(-) diff --git a/crates/lox_core/src/ephemeris/daf_spk/parser.rs b/crates/lox_core/src/ephemeris/daf_spk/parser.rs index 209ef2eb..9a3158c1 100644 --- a/crates/lox_core/src/ephemeris/daf_spk/parser.rs +++ b/crates/lox_core/src/ephemeris/daf_spk/parser.rs @@ -98,7 +98,35 @@ pub struct Spk { pub segments: Vec, } -pub fn parse_daf_file_record(input: &[u8]) -> nom::IResult<&[u8], DafFileRecord> { +pub fn parse_daf_file_record_endianness( + input: &[u8], +) -> nom::IResult<&[u8], nom::number::Endianness> { + // 8. LOCFMT ( 8 charactersu8, 8 bytes): The character string that indicates the + // numeric binary format of the DAF. The string has value either "LTL-IEEE" + // or "BIG-IEEE." [Address 88] + let (_, locfmt) = nom::branch::alt(( + nom::bytes::complete::tag("LTL-IEEE"), + nom::bytes::complete::tag("BIG-IEEE"), + ))(&input[88..])?; + + // We know the loc strings are ASCII in the spec, so parsing them as utf-8 + // should be safe. + let locfmt = String::from_utf8_lossy(locfmt).trim().to_string(); + + let endianness = match locfmt.as_str() { + "LTL-IEEE" => nom::number::Endianness::Little, + "BIG-IEEE" => nom::number::Endianness::Big, + _ => unreachable!(), + }; + + Ok((input, endianness)) +} + +pub fn parse_daf_file_record( + input: &[u8], +) -> nom::IResult<&[u8], (nom::number::Endianness, DafFileRecord)> { + let (_, endianness) = parse_daf_file_record_endianness(input)?; + // 1. LOCIDW (8 charactersu8, 8 bytes): An identification word (`DAF/xxxx'). // The 'xxxx' substring is a string of four characters or less indicating the // type of data stored in the DAF file. This is used by the SPICELIB @@ -110,11 +138,11 @@ pub fn parse_daf_file_record(input: &[u8]) -> nom::IResult<&[u8], DafFileRecord> // 2. ND ( 1 integeru8, 4 bytes): The number of double precision components in // each array summary. [Address 8] - let (input, nd) = nom::number::complete::le_u32(input)?; + let (input, nd) = nom::number::complete::u32(endianness)(input)?; // 3. NI ( 1 integeru8, 4 bytes): The number of integer components in each array // summary. [Address 12] - let (input, ni) = nom::number::complete::le_u32(input)?; + let (input, ni) = nom::number::complete::u32(endianness)(input)?; // 4. LOCIFN (60 charactersu8, 60 bytes): The internal name or description of // the array file. [Address 16] @@ -122,16 +150,16 @@ pub fn parse_daf_file_record(input: &[u8]) -> nom::IResult<&[u8], DafFileRecord> // 5. FWARD ( 1 integeru8, 4 bytes): The record number of the initial summary // record in the file. [Address 76] - let (input, fward) = nom::number::complete::le_u32(input)?; + let (input, fward) = nom::number::complete::u32(endianness)(input)?; // 6. BWARD ( 1 integeru8, 4 bytes): The record number of the final summary // record in the file. [Address 80] - let (input, bward) = nom::number::complete::le_u32(input)?; + let (input, bward) = nom::number::complete::u32(endianness)(input)?; // 7. FREE ( 1 integeru8, 4 bytes): The first free address in the file. This is // the address at which the first element of the next array to be added to // the file will be stored. [Address 84] - let (input, free) = nom::number::complete::le_u32(input)?; + let (input, free) = nom::number::complete::u32(endianness)(input)?; // 8. LOCFMT ( 8 charactersu8, 8 bytes): The character string that indicates the // numeric binary format of the DAF. The string has value either "LTL-IEEE" @@ -157,19 +185,22 @@ pub fn parse_daf_file_record(input: &[u8]) -> nom::IResult<&[u8], DafFileRecord> // should be safe. Ok(( input, - DafFileRecord { - locidw: String::from_utf8_lossy(locidw).trim().to_string(), - nd, - ni, - locifn: String::from_utf8_lossy(locifn).trim().to_string(), - fward, - bward, - free, - locfmt: String::from_utf8_lossy(locfmt).trim().to_string(), - prenul: prenul.to_owned(), - ftpstr: ftpstr.to_owned(), - pstnul: pstnul.to_owned(), - }, + ( + endianness, + DafFileRecord { + locidw: String::from_utf8_lossy(locidw).trim().to_string(), + nd, + ni, + locifn: String::from_utf8_lossy(locifn).trim().to_string(), + fward, + bward, + free, + locfmt: String::from_utf8_lossy(locfmt).trim().to_string(), + prenul: prenul.to_owned(), + ftpstr: ftpstr.to_owned(), + pstnul: pstnul.to_owned(), + }, + ), )) } @@ -215,6 +246,7 @@ pub fn parse_daf_comment_area( pub fn parse_daf_summary_and_name_record_pair( input: &[u8], + endianness: nom::number::Endianness, nd: u32, ni: u32, ) -> nom::IResult<&[u8], DafSummaryRecord> { @@ -227,29 +259,33 @@ pub fn parse_daf_summary_and_name_record_pair( // 1. The record number of the next summary record in the file. (Zero if this is // the final summary record.) - let (summary_record_input, next) = nom::number::complete::le_f64(summary_record_input)?; + let (summary_record_input, next) = + nom::number::complete::f64(endianness)(summary_record_input)?; let next = next as u32; // 2. The record number of the previous summary record in the file. (Zero if // this is the initial summary record.) - let (summary_record_input, _) = nom::number::complete::le_f64(summary_record_input)?; + let (summary_record_input, _) = nom::number::complete::f64(endianness)(summary_record_input)?; // 3. The number of summaries stored in this record. - let (mut summary_record_input, nsum) = nom::number::complete::le_f64(summary_record_input)?; + let (mut summary_record_input, nsum) = + nom::number::complete::f64(endianness)(summary_record_input)?; let nsum = nsum as u32; for _ in 0..nsum { let double_precision_components; - (summary_record_input, double_precision_components) = - nom::multi::many_m_n(nd as usize, nd as usize, nom::number::complete::le_f64)( - summary_record_input, - )?; + (summary_record_input, double_precision_components) = nom::multi::many_m_n( + nd as usize, + nd as usize, + nom::number::complete::f64(endianness), + )(summary_record_input)?; let integer_components; - (summary_record_input, integer_components) = - nom::multi::many_m_n(ni as usize, ni as usize, nom::number::complete::le_i32)( - summary_record_input, - )?; + (summary_record_input, integer_components) = nom::multi::many_m_n( + ni as usize, + ni as usize, + nom::number::complete::i32(endianness), + )(summary_record_input)?; let name; (name_record_input, name) = nom::bytes::complete::take(nc)(name_record_input)?; @@ -275,6 +311,7 @@ pub fn parse_daf_summary_and_name_record_pair( pub fn parse_all_summary_and_name_record_pairs( input: &[u8], + endianness: nom::number::Endianness, nd: u32, ni: u32, fward: u32, @@ -288,8 +325,12 @@ pub fn parse_all_summary_and_name_record_pairs( let summary_and_name_record_pair = &input[start..end]; - let (_, summaries_record) = - parse_daf_summary_and_name_record_pair(summary_and_name_record_pair, nd, ni)?; + let (_, summaries_record) = parse_daf_summary_and_name_record_pair( + summary_and_name_record_pair, + endianness, + nd, + ni, + )?; next = summaries_record.next; @@ -310,12 +351,13 @@ pub fn parse_daf_spk(full_input: &[u8]) -> nom::IResult<&[u8], Spk> { let input_cursor = full_input; - let (input_cursor, file_record) = parse_daf_file_record(input_cursor)?; + let (input_cursor, (endianness, file_record)) = parse_daf_file_record(input_cursor)?; let (_, comment) = parse_daf_comment_area(input_cursor, file_record.fward - 2)?; let (_, all_summaries) = parse_all_summary_and_name_record_pairs( full_input, + endianness, file_record.nd, file_record.ni, file_record.fward, @@ -352,17 +394,27 @@ mod test { #[test] fn test_parse_all_summary_and_name_record_pairs() { - let (_, all_summary_records) = - parse_all_summary_and_name_record_pairs(&FILE_CONTENTS, 2, 6, 4) - .expect("DafSummary record parsing should succeed"); + let (_, all_summary_records) = parse_all_summary_and_name_record_pairs( + &FILE_CONTENTS, + nom::number::Endianness::Little, + 2, + 6, + 4, + ) + .expect("DafSummary record parsing should succeed"); assert_eq!(all_summary_records, vec![get_expected_summary_record()]); } #[test] fn test_parse_daf_summary_and_name_record_pair() { - let (_, summary_record) = parse_daf_summary_and_name_record_pair(&SUMMARY_RECORD, 2, 6) - .expect("DafSummary record parsing should succeed"); + let (_, summary_record) = parse_daf_summary_and_name_record_pair( + &SUMMARY_RECORD, + nom::number::Endianness::Little, + 2, + 6, + ) + .expect("DafSummary record parsing should succeed"); assert_eq!(summary_record, get_expected_summary_record()); } @@ -379,11 +431,13 @@ mod test { #[test] fn test_parse_daf_file_record() { - let (unparsed_string, file_record) = parse_daf_file_record(&FILE_RECORD_SEGMENT) - .expect("File record parsing should succeed"); + let (unparsed_string, (endianness, file_record)) = + parse_daf_file_record(&FILE_RECORD_SEGMENT) + .expect("File record parsing should succeed"); assert_eq!(unparsed_string.len(), 0); + assert_eq!(endianness, nom::number::Endianness::Little); assert_eq!(file_record.locidw, "DAF/SPK"); assert_eq!(file_record.nd, 2); assert_eq!(file_record.ni, 6); From ea74c458054c2d88e8720f66daeb076f116d3f1d Mon Sep 17 00:00:00 2001 From: Andrei Zisu Date: Mon, 16 Oct 2023 23:19:41 +0200 Subject: [PATCH 15/27] Improve error flow --- .../lox_core/src/ephemeris/daf_spk/parser.rs | 32 ++++++++++--------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/crates/lox_core/src/ephemeris/daf_spk/parser.rs b/crates/lox_core/src/ephemeris/daf_spk/parser.rs index 9a3158c1..0bd91a20 100644 --- a/crates/lox_core/src/ephemeris/daf_spk/parser.rs +++ b/crates/lox_core/src/ephemeris/daf_spk/parser.rs @@ -36,6 +36,9 @@ pub enum DafSpkError { InvalidSpkSegmentDataType, // The number of DAF components does not match the SPK specification UnexpectedNumberOfComponents, + UnableToParseSummaries, + UnableToParseFileRecord, + UnableToParseCommentArea, } #[derive(Debug, PartialEq)] @@ -344,16 +347,18 @@ pub fn parse_all_summary_and_name_record_pairs( Ok((&[], all_summary_records)) } -pub fn parse_daf_spk(full_input: &[u8]) -> nom::IResult<&[u8], Spk> { +pub fn parse_daf_spk(full_input: &[u8]) -> Result { // - https://naif.jpl.nasa.gov/pub/naif/toolkit_docs/C/req/daf.html // - https://naif.jpl.nasa.gov/pub/naif/toolkit_docs/C/req/spk.html // - https://naif.jpl.nasa.gov/pub/naif/toolkit_docs/Tutorials/office/individual_docs/42_making_an_spk.pptx let input_cursor = full_input; - let (input_cursor, (endianness, file_record)) = parse_daf_file_record(input_cursor)?; + let (input_cursor, (endianness, file_record)) = + parse_daf_file_record(input_cursor).map_err(|_| DafSpkError::UnableToParseFileRecord)?; - let (_, comment) = parse_daf_comment_area(input_cursor, file_record.fward - 2)?; + let (_, comment) = parse_daf_comment_area(input_cursor, file_record.fward - 2) + .map_err(|_| DafSpkError::UnableToParseCommentArea)?; let (_, all_summaries) = parse_all_summary_and_name_record_pairs( full_input, @@ -361,7 +366,8 @@ pub fn parse_daf_spk(full_input: &[u8]) -> nom::IResult<&[u8], Spk> { file_record.nd, file_record.ni, file_record.fward, - )?; + ) + .map_err(|_| DafSpkError::UnableToParseSummaries)?; let segments = all_summaries .iter() @@ -372,20 +378,16 @@ pub fn parse_daf_spk(full_input: &[u8]) -> nom::IResult<&[u8], Spk> { .map(SpkSegment::from_daf_summary) .collect::, DafSpkError>>() }) - .collect::, DafSpkError>>() - .expect("Bla") //@TODO + .collect::, DafSpkError>>()? .into_iter() .flatten() .collect::<_>(); - Ok(( - full_input, - Spk { - file_record, - comment, - segments, - }, - )) + Ok(Spk { + file_record, + comment, + segments, + }) } #[cfg(test)] @@ -458,7 +460,7 @@ mod test { assert!(spk.is_ok()); - if let Ok((_, spk)) = spk { + if let Ok(spk) = spk { assert_eq!(spk, get_expected_spk()); } } From b4318fbc9882fe293f36c364ae0882a56c5b5df0 Mon Sep 17 00:00:00 2001 From: Andrei Zisu Date: Tue, 31 Oct 2023 21:59:30 +0100 Subject: [PATCH 16/27] Implement SPK type 2 segment parsing --- .../lox_core/src/ephemeris/daf_spk/parser.rs | 269 +++++++++++++----- 1 file changed, 196 insertions(+), 73 deletions(-) diff --git a/crates/lox_core/src/ephemeris/daf_spk/parser.rs b/crates/lox_core/src/ephemeris/daf_spk/parser.rs index 0bd91a20..a30f4953 100644 --- a/crates/lox_core/src/ephemeris/daf_spk/parser.rs +++ b/crates/lox_core/src/ephemeris/daf_spk/parser.rs @@ -1,4 +1,7 @@ -use nom::error::ErrorKind; +use nom::{error::ErrorKind, ToUsize}; + +use nom::bytes::complete as nb; +use nom::number::complete as nn; const RECORD_SIZE: u32 = 1024; @@ -28,6 +31,8 @@ pub struct DafComponents { pub struct DafSummary { pub name: String, pub components: DafComponents, + pub initial_address: usize, + pub final_address: usize, } #[derive(Debug, PartialEq)] @@ -36,13 +41,29 @@ pub enum DafSpkError { InvalidSpkSegmentDataType, // The number of DAF components does not match the SPK specification UnexpectedNumberOfComponents, - UnableToParseSummaries, - UnableToParseFileRecord, - UnableToParseCommentArea, + UnableToParse, + UnsupportedSpkArrayType { data_type: i32 }, } #[derive(Debug, PartialEq)] +pub struct SpkType2Record { + x: Vec, + y: Vec, + z: Vec, +} + +#[derive(Debug, PartialEq)] +pub enum SpkArray { + Type2 { + records: Vec, + init: u32, + intlen: u32, + rsize: u32, + n: u32, + }, +} +#[derive(Debug, PartialEq)] pub struct SpkSegment { pub name: String, // In J2000 epoch @@ -56,35 +77,9 @@ pub struct SpkSegment { // NAIF id of the reference frame pub reference_frame_id: i32, pub data_type: i32, - pub initial_address: i32, - pub final_address: i32, -} - -impl SpkSegment { - pub fn from_daf_summary(summary: &DafSummary) -> Result { - let double_precision_components = &summary.components.double_precision_components; - let integer_components = &summary.components.integer_components; - - if double_precision_components.len() != 2 { - return Err(DafSpkError::UnexpectedNumberOfComponents); - } - - if integer_components.len() != 6 { - return Err(DafSpkError::UnexpectedNumberOfComponents); - } - - Ok(SpkSegment { - name: summary.name.clone(), - initial_epoch: double_precision_components[0], - final_epoch: double_precision_components[1], - target_id: integer_components[0], - center_id: integer_components[1], - reference_frame_id: integer_components[2], - data_type: integer_components[3], - initial_address: integer_components[4], - final_address: integer_components[5], - }) - } + pub initial_address: usize, + pub final_address: usize, + pub data: SpkArray, } #[derive(Debug, PartialEq)] @@ -107,10 +102,7 @@ pub fn parse_daf_file_record_endianness( // 8. LOCFMT ( 8 charactersu8, 8 bytes): The character string that indicates the // numeric binary format of the DAF. The string has value either "LTL-IEEE" // or "BIG-IEEE." [Address 88] - let (_, locfmt) = nom::branch::alt(( - nom::bytes::complete::tag("LTL-IEEE"), - nom::bytes::complete::tag("BIG-IEEE"), - ))(&input[88..])?; + let (_, locfmt) = nom::branch::alt((nb::tag("LTL-IEEE"), nb::tag("BIG-IEEE")))(&input[88..])?; // We know the loc strings are ASCII in the spec, so parsing them as utf-8 // should be safe. @@ -137,52 +129,52 @@ pub fn parse_daf_file_record( // merely a direct access file with the same record length. When // a DAF is openedu8, an error signals if this keyword is not present. [Address // 0] - let (input, locidw) = nom::bytes::complete::take(8u32)(input)?; + let (input, locidw) = nb::take(8u32)(input)?; // 2. ND ( 1 integeru8, 4 bytes): The number of double precision components in // each array summary. [Address 8] - let (input, nd) = nom::number::complete::u32(endianness)(input)?; + let (input, nd) = nn::u32(endianness)(input)?; // 3. NI ( 1 integeru8, 4 bytes): The number of integer components in each array // summary. [Address 12] - let (input, ni) = nom::number::complete::u32(endianness)(input)?; + let (input, ni) = nn::u32(endianness)(input)?; // 4. LOCIFN (60 charactersu8, 60 bytes): The internal name or description of // the array file. [Address 16] - let (input, locifn) = nom::bytes::complete::take(60u32)(input)?; + let (input, locifn) = nb::take(60u32)(input)?; // 5. FWARD ( 1 integeru8, 4 bytes): The record number of the initial summary // record in the file. [Address 76] - let (input, fward) = nom::number::complete::u32(endianness)(input)?; + let (input, fward) = nn::u32(endianness)(input)?; // 6. BWARD ( 1 integeru8, 4 bytes): The record number of the final summary // record in the file. [Address 80] - let (input, bward) = nom::number::complete::u32(endianness)(input)?; + let (input, bward) = nn::u32(endianness)(input)?; // 7. FREE ( 1 integeru8, 4 bytes): The first free address in the file. This is // the address at which the first element of the next array to be added to // the file will be stored. [Address 84] - let (input, free) = nom::number::complete::u32(endianness)(input)?; + let (input, free) = nn::u32(endianness)(input)?; // 8. LOCFMT ( 8 charactersu8, 8 bytes): The character string that indicates the // numeric binary format of the DAF. The string has value either "LTL-IEEE" // or "BIG-IEEE." [Address 88] - let (input, locfmt) = nom::bytes::complete::take(8u32)(input)?; + let (input, locfmt) = nb::take(8u32)(input)?; // 9. PRENUL ( 603 charactersu8, 603 bytes): A block of nulls to pad between the // last character of LOCFMT and the first character of FTPSTR to keep FTPSTR // at character 700 (address 699) in a 1024 byte record. [Address 96] - let (input, prenul) = nom::bytes::complete::take(603u32)(input)?; + let (input, prenul) = nb::take(603u32)(input)?; // 10. FTPSTR ( 28 charactersu8, 28 bytes): The FTP validation string. // This string is assembled using components returned from the SPICELIB private // routine ZZFTPSTR. [Address 699] - let (input, ftpstr) = nom::bytes::complete::take(28u32)(input)?; + let (input, ftpstr) = nb::take(28u32)(input)?; // 11. PSTNUL ( 297 charactersu8, 297 bytes): A block of nulls to pad from the // last character of FTPSTR to the end of the file record. Note: this value // enforces the length of the file record as 1024 bytes. [Address 727] - let (input, pstnul) = nom::bytes::complete::take(297u32)(input)?; + let (input, pstnul) = nb::take(297u32)(input)?; // We know the loc strings are ASCII in the spec, so parsing them as utf-8 // should be safe. @@ -218,12 +210,11 @@ pub fn parse_daf_comment_area( let mut input_cursor = input; for _ in 0..comment_areas_count { let comment_areas; - (input_cursor, comment_areas) = nom::bytes::complete::take(RECORD_SIZE)(input_cursor)?; + (input_cursor, comment_areas) = nb::take(RECORD_SIZE)(input_cursor)?; - let (_, comment_record_content) = nom::bytes::complete::take(1000u32)(comment_areas)?; + let (_, comment_record_content) = nb::take(1000u32)(comment_areas)?; - let comment_record_content = - match nom::bytes::complete::take_until("\x04")(comment_record_content) { + let comment_record_content = match nb::take_until("\x04")(comment_record_content) { Ok((_, content_to_end_of_transmission_char)) => content_to_end_of_transmission_char, Err(error) => match error { // This is one ugly error type. What we're saying here is, if we can't @@ -262,36 +253,44 @@ pub fn parse_daf_summary_and_name_record_pair( // 1. The record number of the next summary record in the file. (Zero if this is // the final summary record.) - let (summary_record_input, next) = - nom::number::complete::f64(endianness)(summary_record_input)?; + let (summary_record_input, next) = nn::f64(endianness)(summary_record_input)?; let next = next as u32; // 2. The record number of the previous summary record in the file. (Zero if // this is the initial summary record.) - let (summary_record_input, _) = nom::number::complete::f64(endianness)(summary_record_input)?; + let (summary_record_input, _) = nn::f64(endianness)(summary_record_input)?; // 3. The number of summaries stored in this record. - let (mut summary_record_input, nsum) = - nom::number::complete::f64(endianness)(summary_record_input)?; + let (mut summary_record_input, nsum) = nn::f64(endianness)(summary_record_input)?; let nsum = nsum as u32; for _ in 0..nsum { let double_precision_components; - (summary_record_input, double_precision_components) = nom::multi::many_m_n( - nd as usize, - nd as usize, - nom::number::complete::f64(endianness), - )(summary_record_input)?; + (summary_record_input, double_precision_components) = + nom::multi::many_m_n(nd as usize, nd as usize, nn::f64(endianness))( + summary_record_input, + )?; + + // The initial and final addresses of an array are always the values of the + // final two integer components of the summary for the array. + assert!(ni >= 2, "A correct DAF file has NI >= 2"); + let component_count_without_addresses = ni - 2; let integer_components; (summary_record_input, integer_components) = nom::multi::many_m_n( - ni as usize, - ni as usize, - nom::number::complete::i32(endianness), + component_count_without_addresses as usize, + component_count_without_addresses as usize, + nn::i32(endianness), )(summary_record_input)?; + let initial_address; + (summary_record_input, initial_address) = nn::u32(endianness)(summary_record_input)?; + + let final_address; + (summary_record_input, final_address) = nn::u32(endianness)(summary_record_input)?; + let name; - (name_record_input, name) = nom::bytes::complete::take(nc)(name_record_input)?; + (name_record_input, name) = nb::take(nc)(name_record_input)?; summaries.push(DafSummary { name: String::from_utf8_lossy(name).trim().to_string(), @@ -299,6 +298,8 @@ pub fn parse_daf_summary_and_name_record_pair( double_precision_components, integer_components, }, + initial_address: initial_address.to_usize(), + final_address: final_address.to_usize(), }); } @@ -354,11 +355,9 @@ pub fn parse_daf_spk(full_input: &[u8]) -> Result { let input_cursor = full_input; - let (input_cursor, (endianness, file_record)) = - parse_daf_file_record(input_cursor).map_err(|_| DafSpkError::UnableToParseFileRecord)?; + let (input_cursor, (endianness, file_record)) = parse_daf_file_record(input_cursor)?; - let (_, comment) = parse_daf_comment_area(input_cursor, file_record.fward - 2) - .map_err(|_| DafSpkError::UnableToParseCommentArea)?; + let (_, comment) = parse_daf_comment_area(input_cursor, file_record.fward - 2)?; let (_, all_summaries) = parse_all_summary_and_name_record_pairs( full_input, @@ -366,8 +365,7 @@ pub fn parse_daf_spk(full_input: &[u8]) -> Result { file_record.nd, file_record.ni, file_record.fward, - ) - .map_err(|_| DafSpkError::UnableToParseSummaries)?; + )?; let segments = all_summaries .iter() @@ -375,7 +373,7 @@ pub fn parse_daf_spk(full_input: &[u8]) -> Result { summary_record .summaries .iter() - .map(SpkSegment::from_daf_summary) + .map(|summary| parse_spk_segment(summary, full_input, endianness)) .collect::, DafSpkError>>() }) .collect::, DafSpkError>>()? @@ -390,6 +388,131 @@ pub fn parse_daf_spk(full_input: &[u8]) -> Result { }) } +impl From> for DafSpkError { + fn from(_: nom::error::Error) -> Self { + DafSpkError::UnableToParse + } +} + +impl From> for DafSpkError { + fn from(_: nom::Err) -> Self { + DafSpkError::UnableToParse + } +} + +pub fn parse_spk_segment( + summary: &DafSummary, + full_input: &[u8], + endianness: nom::number::Endianness, +) -> Result { + let double_precision_components = &summary.components.double_precision_components; + let integer_components = &summary.components.integer_components; + + if double_precision_components.len() != 2 { + return Err(DafSpkError::UnexpectedNumberOfComponents); + } + + // The 2 is for initial address and final address + if integer_components.len() + 2 != 6 { + return Err(DafSpkError::UnexpectedNumberOfComponents); + } + + let data_type = summary.components.integer_components[3]; + let initial_address = summary.initial_address; + let final_address = summary.final_address; + + let data = match data_type { + 2 => { + let size_of_f64 = std::mem::size_of::(); + + // Words are 1-indexed + let start_word = initial_address - 1; + let initial_byte_address = start_word * size_of_f64; + + let final_word = final_address; + let final_byte_address = final_word * size_of_f64; + + let directory_initial_address = final_byte_address - 4 * size_of_f64; + let directory_data = &full_input[directory_initial_address..final_byte_address]; + + let f64_parser = nn::f64::<&[u8], nom::error::Error<_>>(endianness); + + let (directory_data, init) = f64_parser(directory_data)?; + let (directory_data, intlen) = f64_parser(directory_data)?; + let (directory_data, rsize) = f64_parser(directory_data)?; + let (_, n) = f64_parser(directory_data)?; + + let init = init as u32; + let intlen = intlen as u32; + let rsize = rsize as u32; + let n = n as u32; + + let degree_of_polynomial = (rsize - 2) / 3; + + let mut segment_data = &full_input[initial_byte_address..final_byte_address]; + + let mut records: Vec = Vec::with_capacity(n as usize); + + for _ in 0..n { + // MID and RADIUS seem to be generally ignored in the industry + (segment_data, _) = f64_parser(segment_data)?; + (segment_data, _) = f64_parser(segment_data)?; + + // Possibly not the most efficient way of parsing since this can likely trigger + // tons of allocations + let x_coeff; + (segment_data, x_coeff) = nom::multi::many_m_n( + degree_of_polynomial as usize, + degree_of_polynomial as usize, + f64_parser, + )(segment_data)?; + + let y_coeff; + (segment_data, y_coeff) = nom::multi::many_m_n( + degree_of_polynomial as usize, + degree_of_polynomial as usize, + f64_parser, + )(segment_data)?; + + let z_coeff; + (segment_data, z_coeff) = nom::multi::many_m_n( + degree_of_polynomial as usize, + degree_of_polynomial as usize, + f64_parser, + )(segment_data)?; + + records.push(SpkType2Record { + x: x_coeff, + y: y_coeff, + z: z_coeff, + }); + } + + SpkArray::Type2 { + records, + init, + intlen, + rsize, + n, + } + } + _ => return Err(DafSpkError::UnsupportedSpkArrayType { data_type }), + }; + + Ok(SpkSegment { + name: summary.name.clone(), + initial_epoch: double_precision_components[0], + final_epoch: double_precision_components[1], + target_id: integer_components[0], + center_id: integer_components[1], + reference_frame_id: integer_components[2], + data_type: integer_components[3], + initial_address: summary.initial_address, + final_address: summary.final_address, + data, + }) +} + #[cfg(test)] mod test { use super::*; From 35cfb0657bdf5d95b408c5feb507d9dc0bc70682 Mon Sep 17 00:00:00 2001 From: Andrei Zisu Date: Fri, 3 Nov 2023 21:12:25 +0100 Subject: [PATCH 17/27] Transform all the test segments to uppercase --- .../lox_core/src/ephemeris/daf_spk/parser.rs | 932 +++++++++--------- 1 file changed, 466 insertions(+), 466 deletions(-) diff --git a/crates/lox_core/src/ephemeris/daf_spk/parser.rs b/crates/lox_core/src/ephemeris/daf_spk/parser.rs index a30f4953..79d396ee 100644 --- a/crates/lox_core/src/ephemeris/daf_spk/parser.rs +++ b/crates/lox_core/src/ephemeris/daf_spk/parser.rs @@ -215,17 +215,17 @@ pub fn parse_daf_comment_area( let (_, comment_record_content) = nb::take(1000u32)(comment_areas)?; let comment_record_content = match nb::take_until("\x04")(comment_record_content) { - Ok((_, content_to_end_of_transmission_char)) => content_to_end_of_transmission_char, - Err(error) => match error { - // This is one ugly error type. What we're saying here is, if we can't - // find the end of transmission character, just return the whole thing. - nom::Err::Error(nom::error::Error { - input: _, - code: ErrorKind::TakeUntil, - }) => comment_record_content, - _ => Err(error)?, - }, - }; + Ok((_, content_to_end_of_transmission_char)) => content_to_end_of_transmission_char, + Err(error) => match error { + // This is one ugly error type. What we're saying here is, if we can't + // find the end of transmission character, just return the whole thing. + nom::Err::Error(nom::error::Error { + input: _, + code: ErrorKind::TakeUntil, + }) => comment_record_content, + _ => Err(error)?, + }, + }; let comment_record_content = String::from_utf8_lossy(comment_record_content).replace('\0', "\n"); @@ -1045,177 +1045,177 @@ name is "19_spk") available from the NAIF website (http://naif.jpl.nasa.gov/tuto 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x53u8, 0x65u8, 0x70u8, 0x74u8, 0x65u8, 0x6du8, 0x62u8, 0x65u8, - 0x72u8, 0x20u8, 0x30u8, 0x33u8, 0x2cu8, 0x20u8, 0x32u8, 0x30u8, 0x31u8, 0x33u8, 0x00u8, - 0x43u8, 0x2eu8, 0x20u8, 0x41u8, 0x63u8, 0x74u8, 0x6fu8, 0x6eu8, 0x00u8, 0x00u8, 0x4au8, - 0x50u8, 0x4cu8, 0x27u8, 0x73u8, 0x20u8, 0x53u8, 0x6fu8, 0x6cu8, 0x61u8, 0x72u8, 0x20u8, - 0x53u8, 0x79u8, 0x73u8, 0x74u8, 0x65u8, 0x6du8, 0x20u8, 0x44u8, 0x79u8, 0x6eu8, 0x61u8, - 0x6du8, 0x69u8, 0x63u8, 0x73u8, 0x20u8, 0x47u8, 0x72u8, 0x6fu8, 0x75u8, 0x70u8, 0x20u8, - 0x68u8, 0x61u8, 0x73u8, 0x20u8, 0x72u8, 0x65u8, 0x6cu8, 0x65u8, 0x61u8, 0x73u8, 0x65u8, - 0x64u8, 0x20u8, 0x74u8, 0x77u8, 0x6fu8, 0x20u8, 0x6eu8, 0x65u8, 0x77u8, 0x20u8, 0x70u8, - 0x6cu8, 0x61u8, 0x6eu8, 0x65u8, 0x74u8, 0x61u8, 0x72u8, 0x79u8, 0x2fu8, 0x6cu8, 0x75u8, - 0x6eu8, 0x61u8, 0x72u8, 0x20u8, 0x65u8, 0x70u8, 0x68u8, 0x65u8, 0x6du8, 0x65u8, 0x72u8, - 0x69u8, 0x64u8, 0x65u8, 0x73u8, 0x2cu8, 0x00u8, 0x6eu8, 0x61u8, 0x6du8, 0x65u8, 0x64u8, - 0x20u8, 0x44u8, 0x45u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x61u8, 0x6eu8, 0x64u8, 0x20u8, - 0x44u8, 0x45u8, 0x34u8, 0x33u8, 0x31u8, 0x2eu8, 0x00u8, 0x00u8, 0x44u8, 0x45u8, 0x34u8, - 0x33u8, 0x30u8, 0x20u8, 0x69u8, 0x73u8, 0x20u8, 0x6eu8, 0x6fu8, 0x77u8, 0x20u8, 0x63u8, - 0x6fu8, 0x6eu8, 0x73u8, 0x69u8, 0x64u8, 0x65u8, 0x72u8, 0x65u8, 0x64u8, 0x20u8, 0x74u8, - 0x68u8, 0x65u8, 0x20u8, 0x6fu8, 0x66u8, 0x66u8, 0x69u8, 0x63u8, 0x69u8, 0x61u8, 0x6cu8, - 0x20u8, 0x65u8, 0x78u8, 0x70u8, 0x6fu8, 0x72u8, 0x74u8, 0x20u8, 0x6cu8, 0x75u8, 0x6eu8, - 0x61u8, 0x72u8, 0x2fu8, 0x70u8, 0x6cu8, 0x61u8, 0x6eu8, 0x65u8, 0x74u8, 0x61u8, 0x72u8, - 0x79u8, 0x20u8, 0x65u8, 0x70u8, 0x68u8, 0x65u8, 0x6du8, 0x65u8, 0x72u8, 0x69u8, 0x73u8, - 0x2cu8, 0x20u8, 0x73u8, 0x75u8, 0x69u8, 0x74u8, 0x61u8, 0x62u8, 0x6cu8, 0x65u8, 0x20u8, - 0x66u8, 0x6fu8, 0x72u8, 0x00u8, 0x61u8, 0x6cu8, 0x6cu8, 0x20u8, 0x75u8, 0x73u8, 0x65u8, - 0x72u8, 0x73u8, 0x2fu8, 0x75u8, 0x73u8, 0x65u8, 0x73u8, 0x2eu8, 0x20u8, 0x49u8, 0x74u8, - 0x27u8, 0x73u8, 0x20u8, 0x61u8, 0x70u8, 0x70u8, 0x72u8, 0x6fu8, 0x78u8, 0x69u8, 0x6du8, - 0x61u8, 0x74u8, 0x65u8, 0x20u8, 0x74u8, 0x69u8, 0x6du8, 0x65u8, 0x20u8, 0x73u8, 0x70u8, - 0x61u8, 0x6eu8, 0x20u8, 0x69u8, 0x73u8, 0x20u8, 0x31u8, 0x35u8, 0x35u8, 0x30u8, 0x20u8, - 0x4au8, 0x41u8, 0x4eu8, 0x20u8, 0x30u8, 0x31u8, 0x20u8, 0x74u8, 0x6fu8, 0x20u8, 0x32u8, - 0x36u8, 0x35u8, 0x30u8, 0x20u8, 0x4au8, 0x41u8, 0x4eu8, 0x20u8, 0x32u8, 0x32u8, 0x2eu8, - 0x00u8, 0x00u8, 0x49u8, 0x66u8, 0x20u8, 0x61u8, 0x20u8, 0x6cu8, 0x6fu8, 0x6eu8, 0x67u8, - 0x65u8, 0x72u8, 0x20u8, 0x74u8, 0x69u8, 0x6du8, 0x65u8, 0x20u8, 0x73u8, 0x70u8, 0x61u8, - 0x6eu8, 0x20u8, 0x69u8, 0x73u8, 0x20u8, 0x6eu8, 0x65u8, 0x65u8, 0x64u8, 0x65u8, 0x64u8, - 0x2cu8, 0x20u8, 0x44u8, 0x45u8, 0x34u8, 0x33u8, 0x31u8, 0x20u8, 0x6du8, 0x61u8, 0x79u8, - 0x20u8, 0x62u8, 0x65u8, 0x20u8, 0x75u8, 0x73u8, 0x65u8, 0x64u8, 0x2cu8, 0x20u8, 0x65u8, + 0x00u8, 0x00u8, 0x00u8, 0x53u8, 0x65u8, 0x70u8, 0x74u8, 0x65u8, 0x6Du8, 0x62u8, 0x65u8, + 0x72u8, 0x20u8, 0x30u8, 0x33u8, 0x2Cu8, 0x20u8, 0x32u8, 0x30u8, 0x31u8, 0x33u8, 0x00u8, + 0x43u8, 0x2Eu8, 0x20u8, 0x41u8, 0x63u8, 0x74u8, 0x6Fu8, 0x6Eu8, 0x00u8, 0x00u8, 0x4Au8, + 0x50u8, 0x4Cu8, 0x27u8, 0x73u8, 0x20u8, 0x53u8, 0x6Fu8, 0x6Cu8, 0x61u8, 0x72u8, 0x20u8, + 0x53u8, 0x79u8, 0x73u8, 0x74u8, 0x65u8, 0x6Du8, 0x20u8, 0x44u8, 0x79u8, 0x6Eu8, 0x61u8, + 0x6Du8, 0x69u8, 0x63u8, 0x73u8, 0x20u8, 0x47u8, 0x72u8, 0x6Fu8, 0x75u8, 0x70u8, 0x20u8, + 0x68u8, 0x61u8, 0x73u8, 0x20u8, 0x72u8, 0x65u8, 0x6Cu8, 0x65u8, 0x61u8, 0x73u8, 0x65u8, + 0x64u8, 0x20u8, 0x74u8, 0x77u8, 0x6Fu8, 0x20u8, 0x6Eu8, 0x65u8, 0x77u8, 0x20u8, 0x70u8, + 0x6Cu8, 0x61u8, 0x6Eu8, 0x65u8, 0x74u8, 0x61u8, 0x72u8, 0x79u8, 0x2Fu8, 0x6Cu8, 0x75u8, + 0x6Eu8, 0x61u8, 0x72u8, 0x20u8, 0x65u8, 0x70u8, 0x68u8, 0x65u8, 0x6Du8, 0x65u8, 0x72u8, + 0x69u8, 0x64u8, 0x65u8, 0x73u8, 0x2Cu8, 0x00u8, 0x6Eu8, 0x61u8, 0x6Du8, 0x65u8, 0x64u8, + 0x20u8, 0x44u8, 0x45u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x61u8, 0x6Eu8, 0x64u8, 0x20u8, + 0x44u8, 0x45u8, 0x34u8, 0x33u8, 0x31u8, 0x2Eu8, 0x00u8, 0x00u8, 0x44u8, 0x45u8, 0x34u8, + 0x33u8, 0x30u8, 0x20u8, 0x69u8, 0x73u8, 0x20u8, 0x6Eu8, 0x6Fu8, 0x77u8, 0x20u8, 0x63u8, + 0x6Fu8, 0x6Eu8, 0x73u8, 0x69u8, 0x64u8, 0x65u8, 0x72u8, 0x65u8, 0x64u8, 0x20u8, 0x74u8, + 0x68u8, 0x65u8, 0x20u8, 0x6Fu8, 0x66u8, 0x66u8, 0x69u8, 0x63u8, 0x69u8, 0x61u8, 0x6Cu8, + 0x20u8, 0x65u8, 0x78u8, 0x70u8, 0x6Fu8, 0x72u8, 0x74u8, 0x20u8, 0x6Cu8, 0x75u8, 0x6Eu8, + 0x61u8, 0x72u8, 0x2Fu8, 0x70u8, 0x6Cu8, 0x61u8, 0x6Eu8, 0x65u8, 0x74u8, 0x61u8, 0x72u8, + 0x79u8, 0x20u8, 0x65u8, 0x70u8, 0x68u8, 0x65u8, 0x6Du8, 0x65u8, 0x72u8, 0x69u8, 0x73u8, + 0x2Cu8, 0x20u8, 0x73u8, 0x75u8, 0x69u8, 0x74u8, 0x61u8, 0x62u8, 0x6Cu8, 0x65u8, 0x20u8, + 0x66u8, 0x6Fu8, 0x72u8, 0x00u8, 0x61u8, 0x6Cu8, 0x6Cu8, 0x20u8, 0x75u8, 0x73u8, 0x65u8, + 0x72u8, 0x73u8, 0x2Fu8, 0x75u8, 0x73u8, 0x65u8, 0x73u8, 0x2Eu8, 0x20u8, 0x49u8, 0x74u8, + 0x27u8, 0x73u8, 0x20u8, 0x61u8, 0x70u8, 0x70u8, 0x72u8, 0x6Fu8, 0x78u8, 0x69u8, 0x6Du8, + 0x61u8, 0x74u8, 0x65u8, 0x20u8, 0x74u8, 0x69u8, 0x6Du8, 0x65u8, 0x20u8, 0x73u8, 0x70u8, + 0x61u8, 0x6Eu8, 0x20u8, 0x69u8, 0x73u8, 0x20u8, 0x31u8, 0x35u8, 0x35u8, 0x30u8, 0x20u8, + 0x4Au8, 0x41u8, 0x4Eu8, 0x20u8, 0x30u8, 0x31u8, 0x20u8, 0x74u8, 0x6Fu8, 0x20u8, 0x32u8, + 0x36u8, 0x35u8, 0x30u8, 0x20u8, 0x4Au8, 0x41u8, 0x4Eu8, 0x20u8, 0x32u8, 0x32u8, 0x2Eu8, + 0x00u8, 0x00u8, 0x49u8, 0x66u8, 0x20u8, 0x61u8, 0x20u8, 0x6Cu8, 0x6Fu8, 0x6Eu8, 0x67u8, + 0x65u8, 0x72u8, 0x20u8, 0x74u8, 0x69u8, 0x6Du8, 0x65u8, 0x20u8, 0x73u8, 0x70u8, 0x61u8, + 0x6Eu8, 0x20u8, 0x69u8, 0x73u8, 0x20u8, 0x6Eu8, 0x65u8, 0x65u8, 0x64u8, 0x65u8, 0x64u8, + 0x2Cu8, 0x20u8, 0x44u8, 0x45u8, 0x34u8, 0x33u8, 0x31u8, 0x20u8, 0x6Du8, 0x61u8, 0x79u8, + 0x20u8, 0x62u8, 0x65u8, 0x20u8, 0x75u8, 0x73u8, 0x65u8, 0x64u8, 0x2Cu8, 0x20u8, 0x65u8, 0x78u8, 0x63u8, 0x65u8, 0x70u8, 0x74u8, 0x20u8, 0x74u8, 0x68u8, 0x61u8, 0x74u8, 0x20u8, - 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x6cu8, 0x75u8, 0x6eu8, 0x61u8, 0x72u8, 0x20u8, 0x65u8, - 0x70u8, 0x68u8, 0x65u8, 0x6du8, 0x65u8, 0x72u8, 0x69u8, 0x73u8, 0x00u8, 0x70u8, 0x6fu8, - 0x72u8, 0x74u8, 0x69u8, 0x6fu8, 0x6eu8, 0x20u8, 0x69u8, 0x73u8, 0x20u8, 0x6fu8, 0x66u8, - 0x20u8, 0x72u8, 0x65u8, 0x6cu8, 0x61u8, 0x74u8, 0x69u8, 0x76u8, 0x65u8, 0x6cu8, 0x79u8, - 0x20u8, 0x70u8, 0x6fu8, 0x6fu8, 0x72u8, 0x20u8, 0x61u8, 0x63u8, 0x63u8, 0x75u8, 0x72u8, - 0x61u8, 0x63u8, 0x79u8, 0x20u8, 0x6fu8, 0x75u8, 0x74u8, 0x73u8, 0x69u8, 0x64u8, 0x65u8, - 0x20u8, 0x6fu8, 0x66u8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x74u8, 0x69u8, 0x6du8, - 0x65u8, 0x20u8, 0x73u8, 0x70u8, 0x61u8, 0x6eu8, 0x20u8, 0x63u8, 0x6fu8, 0x76u8, 0x65u8, + 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x6Cu8, 0x75u8, 0x6Eu8, 0x61u8, 0x72u8, 0x20u8, 0x65u8, + 0x70u8, 0x68u8, 0x65u8, 0x6Du8, 0x65u8, 0x72u8, 0x69u8, 0x73u8, 0x00u8, 0x70u8, 0x6Fu8, + 0x72u8, 0x74u8, 0x69u8, 0x6Fu8, 0x6Eu8, 0x20u8, 0x69u8, 0x73u8, 0x20u8, 0x6Fu8, 0x66u8, + 0x20u8, 0x72u8, 0x65u8, 0x6Cu8, 0x61u8, 0x74u8, 0x69u8, 0x76u8, 0x65u8, 0x6Cu8, 0x79u8, + 0x20u8, 0x70u8, 0x6Fu8, 0x6Fu8, 0x72u8, 0x20u8, 0x61u8, 0x63u8, 0x63u8, 0x75u8, 0x72u8, + 0x61u8, 0x63u8, 0x79u8, 0x20u8, 0x6Fu8, 0x75u8, 0x74u8, 0x73u8, 0x69u8, 0x64u8, 0x65u8, + 0x20u8, 0x6Fu8, 0x66u8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x74u8, 0x69u8, 0x6Du8, + 0x65u8, 0x20u8, 0x73u8, 0x70u8, 0x61u8, 0x6Eu8, 0x20u8, 0x63u8, 0x6Fu8, 0x76u8, 0x65u8, 0x72u8, 0x65u8, 0x64u8, 0x20u8, 0x62u8, 0x79u8, 0x20u8, 0x44u8, 0x45u8, 0x34u8, 0x33u8, - 0x30u8, 0x2eu8, 0x00u8, 0x54u8, 0x68u8, 0x65u8, 0x20u8, 0x74u8, 0x69u8, 0x6du8, 0x65u8, - 0x20u8, 0x73u8, 0x70u8, 0x61u8, 0x6eu8, 0x20u8, 0x63u8, 0x6fu8, 0x76u8, 0x65u8, 0x72u8, + 0x30u8, 0x2Eu8, 0x00u8, 0x54u8, 0x68u8, 0x65u8, 0x20u8, 0x74u8, 0x69u8, 0x6Du8, 0x65u8, + 0x20u8, 0x73u8, 0x70u8, 0x61u8, 0x6Eu8, 0x20u8, 0x63u8, 0x6Fu8, 0x76u8, 0x65u8, 0x72u8, 0x65u8, 0x64u8, 0x20u8, 0x62u8, 0x79u8, 0x20u8, 0x44u8, 0x45u8, 0x34u8, 0x33u8, 0x31u8, - 0x20u8, 0x69u8, 0x73u8, 0x20u8, 0x61u8, 0x70u8, 0x70u8, 0x72u8, 0x6fu8, 0x78u8, 0x69u8, - 0x6du8, 0x61u8, 0x74u8, 0x65u8, 0x6cu8, 0x79u8, 0x20u8, 0x31u8, 0x33u8, 0x32u8, 0x30u8, - 0x32u8, 0x20u8, 0x42u8, 0x2eu8, 0x43u8, 0x2eu8, 0x20u8, 0x74u8, 0x6fu8, 0x20u8, 0x31u8, - 0x37u8, 0x31u8, 0x39u8, 0x31u8, 0x20u8, 0x41u8, 0x2eu8, 0x44u8, 0x2eu8, 0x20u8, 0x42u8, + 0x20u8, 0x69u8, 0x73u8, 0x20u8, 0x61u8, 0x70u8, 0x70u8, 0x72u8, 0x6Fu8, 0x78u8, 0x69u8, + 0x6Du8, 0x61u8, 0x74u8, 0x65u8, 0x6Cu8, 0x79u8, 0x20u8, 0x31u8, 0x33u8, 0x32u8, 0x30u8, + 0x32u8, 0x20u8, 0x42u8, 0x2Eu8, 0x43u8, 0x2Eu8, 0x20u8, 0x74u8, 0x6Fu8, 0x20u8, 0x31u8, + 0x37u8, 0x31u8, 0x39u8, 0x31u8, 0x20u8, 0x41u8, 0x2Eu8, 0x44u8, 0x2Eu8, 0x20u8, 0x42u8, 0x65u8, 0x63u8, 0x61u8, 0x75u8, 0x73u8, 0x65u8, 0x20u8, 0x64u8, 0x65u8, 0x34u8, 0x33u8, - 0x31u8, 0x00u8, 0x69u8, 0x73u8, 0x20u8, 0x73u8, 0x6fu8, 0x20u8, 0x6cu8, 0x6fu8, 0x6eu8, - 0x67u8, 0x2cu8, 0x20u8, 0x6cu8, 0x65u8, 0x61u8, 0x64u8, 0x69u8, 0x6eu8, 0x67u8, 0x20u8, - 0x74u8, 0x6fu8, 0x20u8, 0x61u8, 0x20u8, 0x68u8, 0x75u8, 0x67u8, 0x65u8, 0x20u8, 0x66u8, - 0x69u8, 0x6cu8, 0x65u8, 0x2cu8, 0x20u8, 0x69u8, 0x74u8, 0x20u8, 0x68u8, 0x61u8, 0x73u8, - 0x20u8, 0x62u8, 0x65u8, 0x65u8, 0x6eu8, 0x20u8, 0x73u8, 0x70u8, 0x6cu8, 0x69u8, 0x74u8, - 0x20u8, 0x69u8, 0x6eu8, 0x74u8, 0x6fu8, 0x20u8, 0x74u8, 0x77u8, 0x6fu8, 0x20u8, 0x70u8, - 0x61u8, 0x72u8, 0x74u8, 0x73u8, 0x20u8, 0x68u8, 0x61u8, 0x76u8, 0x69u8, 0x6eu8, 0x67u8, - 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x00u8, 0x61u8, 0x70u8, 0x70u8, 0x72u8, 0x6fu8, 0x78u8, - 0x69u8, 0x6du8, 0x61u8, 0x67u8, 0x74u8, 0x65u8, 0x20u8, 0x74u8, 0x69u8, 0x6du8, 0x65u8, - 0x20u8, 0x73u8, 0x70u8, 0x61u8, 0x6eu8, 0x73u8, 0x20u8, 0x6fu8, 0x66u8, 0x3au8, 0x00u8, + 0x31u8, 0x00u8, 0x69u8, 0x73u8, 0x20u8, 0x73u8, 0x6Fu8, 0x20u8, 0x6Cu8, 0x6Fu8, 0x6Eu8, + 0x67u8, 0x2Cu8, 0x20u8, 0x6Cu8, 0x65u8, 0x61u8, 0x64u8, 0x69u8, 0x6Eu8, 0x67u8, 0x20u8, + 0x74u8, 0x6Fu8, 0x20u8, 0x61u8, 0x20u8, 0x68u8, 0x75u8, 0x67u8, 0x65u8, 0x20u8, 0x66u8, + 0x69u8, 0x6Cu8, 0x65u8, 0x2Cu8, 0x20u8, 0x69u8, 0x74u8, 0x20u8, 0x68u8, 0x61u8, 0x73u8, + 0x20u8, 0x62u8, 0x65u8, 0x65u8, 0x6Eu8, 0x20u8, 0x73u8, 0x70u8, 0x6Cu8, 0x69u8, 0x74u8, + 0x20u8, 0x69u8, 0x6Eu8, 0x74u8, 0x6Fu8, 0x20u8, 0x74u8, 0x77u8, 0x6Fu8, 0x20u8, 0x70u8, + 0x61u8, 0x72u8, 0x74u8, 0x73u8, 0x20u8, 0x68u8, 0x61u8, 0x76u8, 0x69u8, 0x6Eu8, 0x67u8, + 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x00u8, 0x61u8, 0x70u8, 0x70u8, 0x72u8, 0x6Fu8, 0x78u8, + 0x69u8, 0x6Du8, 0x61u8, 0x67u8, 0x74u8, 0x65u8, 0x20u8, 0x74u8, 0x69u8, 0x6Du8, 0x65u8, + 0x20u8, 0x73u8, 0x70u8, 0x61u8, 0x6Eu8, 0x73u8, 0x20u8, 0x6Fu8, 0x66u8, 0x3Au8, 0x00u8, 0x00u8, 0x20u8, 0x20u8, 0x20u8, 0x31u8, 0x33u8, 0x32u8, 0x30u8, 0x32u8, 0x20u8, 0x42u8, - 0x2eu8, 0x43u8, 0x2eu8, 0x20u8, 0x74u8, 0x6fu8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x2Eu8, 0x43u8, 0x2Eu8, 0x20u8, 0x74u8, 0x6Fu8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x30u8, 0x00u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x30u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x74u8, 0x6fu8, 0x20u8, 0x31u8, 0x37u8, 0x31u8, - 0x39u8, 0x31u8, 0x20u8, 0x41u8, 0x2eu8, 0x44u8, 0x2eu8, 0x00u8, 0x00u8, 0x4du8, 0x6fu8, - 0x72u8, 0x65u8, 0x20u8, 0x64u8, 0x65u8, 0x74u8, 0x61u8, 0x69u8, 0x6cu8, 0x73u8, 0x20u8, - 0x61u8, 0x62u8, 0x6fu8, 0x75u8, 0x74u8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x73u8, 0x65u8, - 0x20u8, 0x65u8, 0x70u8, 0x68u8, 0x65u8, 0x6du8, 0x65u8, 0x72u8, 0x69u8, 0x73u8, 0x20u8, - 0x66u8, 0x69u8, 0x6cu8, 0x65u8, 0x73u8, 0x20u8, 0x61u8, 0x72u8, 0x65u8, 0x20u8, 0x63u8, - 0x6fu8, 0x6eu8, 0x74u8, 0x61u8, 0x69u8, 0x6eu8, 0x65u8, 0x64u8, 0x20u8, 0x69u8, 0x6eu8, - 0x20u8, 0x61u8, 0x63u8, 0x63u8, 0x6fu8, 0x6du8, 0x70u8, 0x61u8, 0x6eu8, 0x79u8, 0x69u8, - 0x6eu8, 0x67u8, 0x20u8, 0x64u8, 0x6fu8, 0x63u8, 0x75u8, 0x6du8, 0x65u8, 0x6eu8, 0x74u8, - 0x61u8, 0x74u8, 0x69u8, 0x6fu8, 0x6eu8, 0x00u8, 0x61u8, 0x76u8, 0x61u8, 0x69u8, 0x6cu8, - 0x61u8, 0x62u8, 0x6cu8, 0x65u8, 0x20u8, 0x6fu8, 0x6eu8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, - 0x20u8, 0x4eu8, 0x41u8, 0x49u8, 0x46u8, 0x20u8, 0x73u8, 0x65u8, 0x72u8, 0x76u8, 0x65u8, - 0x72u8, 0x3au8, 0x20u8, 0x20u8, 0x68u8, 0x74u8, 0x74u8, 0x70u8, 0x3au8, 0x2fu8, 0x2fu8, - 0x6eu8, 0x61u8, 0x69u8, 0x66u8, 0x2eu8, 0x6au8, 0x70u8, 0x6cu8, 0x2eu8, 0x6eu8, 0x61u8, - 0x73u8, 0x61u8, 0x2eu8, 0x67u8, 0x6fu8, 0x76u8, 0x2fu8, 0x70u8, 0x75u8, 0x62u8, 0x2fu8, - 0x6eu8, 0x61u8, 0x69u8, 0x66u8, 0x2fu8, 0x67u8, 0x65u8, 0x6eu8, 0x65u8, 0x72u8, 0x69u8, - 0x63u8, 0x5fu8, 0x6bu8, 0x65u8, 0x72u8, 0x6eu8, 0x65u8, 0x6cu8, 0x73u8, 0x2fu8, 0x73u8, - 0x70u8, 0x6bu8, 0x2fu8, 0x70u8, 0x6cu8, 0x61u8, 0x6eu8, 0x65u8, 0x74u8, 0x73u8, 0x2fu8, - 0x00u8, 0x00u8, 0x00u8, 0x53u8, 0x70u8, 0x65u8, 0x63u8, 0x69u8, 0x61u8, 0x6cu8, 0x20u8, - 0x6eu8, 0x6fu8, 0x74u8, 0x65u8, 0x20u8, 0x72u8, 0x65u8, 0x67u8, 0x61u8, 0x72u8, 0x64u8, - 0x69u8, 0x6eu8, 0x67u8, 0x20u8, 0x4du8, 0x61u8, 0x72u8, 0x73u8, 0x3au8, 0x20u8, 0x20u8, - 0x73u8, 0x74u8, 0x61u8, 0x72u8, 0x74u8, 0x69u8, 0x6eu8, 0x67u8, 0x20u8, 0x77u8, 0x69u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x74u8, 0x6Fu8, 0x20u8, 0x31u8, 0x37u8, 0x31u8, + 0x39u8, 0x31u8, 0x20u8, 0x41u8, 0x2Eu8, 0x44u8, 0x2Eu8, 0x00u8, 0x00u8, 0x4Du8, 0x6Fu8, + 0x72u8, 0x65u8, 0x20u8, 0x64u8, 0x65u8, 0x74u8, 0x61u8, 0x69u8, 0x6Cu8, 0x73u8, 0x20u8, + 0x61u8, 0x62u8, 0x6Fu8, 0x75u8, 0x74u8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x73u8, 0x65u8, + 0x20u8, 0x65u8, 0x70u8, 0x68u8, 0x65u8, 0x6Du8, 0x65u8, 0x72u8, 0x69u8, 0x73u8, 0x20u8, + 0x66u8, 0x69u8, 0x6Cu8, 0x65u8, 0x73u8, 0x20u8, 0x61u8, 0x72u8, 0x65u8, 0x20u8, 0x63u8, + 0x6Fu8, 0x6Eu8, 0x74u8, 0x61u8, 0x69u8, 0x6Eu8, 0x65u8, 0x64u8, 0x20u8, 0x69u8, 0x6Eu8, + 0x20u8, 0x61u8, 0x63u8, 0x63u8, 0x6Fu8, 0x6Du8, 0x70u8, 0x61u8, 0x6Eu8, 0x79u8, 0x69u8, + 0x6Eu8, 0x67u8, 0x20u8, 0x64u8, 0x6Fu8, 0x63u8, 0x75u8, 0x6Du8, 0x65u8, 0x6Eu8, 0x74u8, + 0x61u8, 0x74u8, 0x69u8, 0x6Fu8, 0x6Eu8, 0x00u8, 0x61u8, 0x76u8, 0x61u8, 0x69u8, 0x6Cu8, + 0x61u8, 0x62u8, 0x6Cu8, 0x65u8, 0x20u8, 0x6Fu8, 0x6Eu8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, + 0x20u8, 0x4Eu8, 0x41u8, 0x49u8, 0x46u8, 0x20u8, 0x73u8, 0x65u8, 0x72u8, 0x76u8, 0x65u8, + 0x72u8, 0x3Au8, 0x20u8, 0x20u8, 0x68u8, 0x74u8, 0x74u8, 0x70u8, 0x3Au8, 0x2Fu8, 0x2Fu8, + 0x6Eu8, 0x61u8, 0x69u8, 0x66u8, 0x2Eu8, 0x6Au8, 0x70u8, 0x6Cu8, 0x2Eu8, 0x6Eu8, 0x61u8, + 0x73u8, 0x61u8, 0x2Eu8, 0x67u8, 0x6Fu8, 0x76u8, 0x2Fu8, 0x70u8, 0x75u8, 0x62u8, 0x2Fu8, + 0x6Eu8, 0x61u8, 0x69u8, 0x66u8, 0x2Fu8, 0x67u8, 0x65u8, 0x6Eu8, 0x65u8, 0x72u8, 0x69u8, + 0x63u8, 0x5Fu8, 0x6Bu8, 0x65u8, 0x72u8, 0x6Eu8, 0x65u8, 0x6Cu8, 0x73u8, 0x2Fu8, 0x73u8, + 0x70u8, 0x6Bu8, 0x2Fu8, 0x70u8, 0x6Cu8, 0x61u8, 0x6Eu8, 0x65u8, 0x74u8, 0x73u8, 0x2Fu8, + 0x00u8, 0x00u8, 0x00u8, 0x53u8, 0x70u8, 0x65u8, 0x63u8, 0x69u8, 0x61u8, 0x6Cu8, 0x20u8, + 0x6Eu8, 0x6Fu8, 0x74u8, 0x65u8, 0x20u8, 0x72u8, 0x65u8, 0x67u8, 0x61u8, 0x72u8, 0x64u8, + 0x69u8, 0x6Eu8, 0x67u8, 0x20u8, 0x4Du8, 0x61u8, 0x72u8, 0x73u8, 0x3Au8, 0x20u8, 0x20u8, + 0x73u8, 0x74u8, 0x61u8, 0x72u8, 0x74u8, 0x69u8, 0x6Eu8, 0x67u8, 0x20u8, 0x77u8, 0x69u8, 0x74u8, 0x68u8, 0x20u8, 0x74u8, 0x68u8, 0x69u8, 0x73u8, 0x20u8, 0x44u8, 0x45u8, 0x20u8, - 0x66u8, 0x69u8, 0x6cu8, 0x65u8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x6cu8, 0x6fu8, - 0x63u8, 0x61u8, 0x74u8, 0x69u8, 0x6fu8, 0x6eu8, 0x20u8, 0x6fu8, 0x66u8, 0x20u8, 0x4du8, - 0x61u8, 0x72u8, 0x73u8, 0x27u8, 0x20u8, 0x6du8, 0x61u8, 0x73u8, 0x73u8, 0x20u8, 0x63u8, - 0x65u8, 0x6eu8, 0x74u8, 0x65u8, 0x72u8, 0x00u8, 0x28u8, 0x4eu8, 0x41u8, 0x49u8, 0x46u8, - 0x20u8, 0x49u8, 0x44u8, 0x20u8, 0x3du8, 0x20u8, 0x34u8, 0x39u8, 0x39u8, 0x29u8, 0x20u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x69u8, 0x73u8, 0x20u8, 0x2au8, 0x4eu8, 0x4fu8, 0x54u8, 0x2au8, 0x20u8, - 0x69u8, 0x6eu8, 0x63u8, 0x6cu8, 0x75u8, 0x64u8, 0x65u8, 0x64u8, 0x3bu8, 0x20u8, 0x6fu8, - 0x6eu8, 0x6cu8, 0x79u8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x4du8, 0x61u8, 0x72u8, - 0x73u8, 0x20u8, 0x73u8, 0x79u8, 0x73u8, 0x74u8, 0x65u8, 0x6du8, 0x20u8, 0x62u8, 0x61u8, - 0x72u8, 0x79u8, 0x63u8, 0x65u8, 0x6eu8, 0x74u8, 0x65u8, 0x72u8, 0x20u8, 0x28u8, 0x49u8, - 0x44u8, 0x20u8, 0x3du8, 0x20u8, 0x34u8, 0x29u8, 0x20u8, 0x69u8, 0x73u8, 0x20u8, 0x70u8, - 0x72u8, 0x65u8, 0x73u8, 0x65u8, 0x6eu8, 0x74u8, 0x2eu8, 0x00u8, 0x54u8, 0x68u8, 0x65u8, - 0x20u8, 0x6fu8, 0x66u8, 0x66u8, 0x73u8, 0x65u8, 0x74u8, 0x20u8, 0x62u8, 0x65u8, 0x74u8, - 0x77u8, 0x65u8, 0x65u8, 0x6eu8, 0x20u8, 0x4du8, 0x61u8, 0x72u8, 0x73u8, 0x27u8, 0x20u8, - 0x6du8, 0x61u8, 0x73u8, 0x73u8, 0x20u8, 0x63u8, 0x65u8, 0x6eu8, 0x74u8, 0x65u8, 0x72u8, - 0x20u8, 0x61u8, 0x6eu8, 0x64u8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x4du8, 0x61u8, - 0x72u8, 0x73u8, 0x27u8, 0x20u8, 0x73u8, 0x79u8, 0x73u8, 0x74u8, 0x65u8, 0x6du8, 0x20u8, - 0x62u8, 0x61u8, 0x72u8, 0x79u8, 0x63u8, 0x65u8, 0x6eu8, 0x74u8, 0x65u8, 0x72u8, 0x20u8, - 0x69u8, 0x6eu8, 0x20u8, 0x44u8, 0x45u8, 0x34u8, 0x30u8, 0x33u8, 0x20u8, 0x69u8, 0x73u8, - 0x20u8, 0x71u8, 0x75u8, 0x69u8, 0x74u8, 0x65u8, 0x20u8, 0x73u8, 0x6du8, 0x61u8, 0x6cu8, - 0x6cu8, 0x00u8, 0x2du8, 0x2du8, 0x61u8, 0x62u8, 0x6fu8, 0x75u8, 0x74u8, 0x20u8, 0x32u8, - 0x30u8, 0x20u8, 0x63u8, 0x6du8, 0x2eu8, 0x2du8, 0x2du8, 0x73u8, 0x6fu8, 0x20u8, 0x6du8, - 0x6fu8, 0x73u8, 0x74u8, 0x20u8, 0x53u8, 0x50u8, 0x49u8, 0x43u8, 0x45u8, 0x20u8, 0x75u8, - 0x73u8, 0x65u8, 0x72u8, 0x73u8, 0x20u8, 0x63u8, 0x6fu8, 0x75u8, 0x6cu8, 0x64u8, 0x20u8, - 0x75u8, 0x73u8, 0x65u8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x4du8, 0x61u8, 0x72u8, - 0x73u8, 0x20u8, 0x73u8, 0x79u8, 0x73u8, 0x74u8, 0x65u8, 0x6du8, 0x20u8, 0x62u8, 0x61u8, - 0x72u8, 0x79u8, 0x63u8, 0x65u8, 0x6eu8, 0x74u8, 0x65u8, 0x72u8, 0x20u8, 0x69u8, 0x6eu8, - 0x20u8, 0x70u8, 0x6cu8, 0x61u8, 0x63u8, 0x65u8, 0x20u8, 0x6fu8, 0x66u8, 0x20u8, 0x74u8, - 0x68u8, 0x65u8, 0x00u8, 0x4du8, 0x61u8, 0x72u8, 0x73u8, 0x20u8, 0x6du8, 0x61u8, 0x73u8, - 0x73u8, 0x20u8, 0x63u8, 0x65u8, 0x6eu8, 0x74u8, 0x65u8, 0x72u8, 0x2eu8, 0x20u8, 0x48u8, - 0x6fu8, 0x77u8, 0x65u8, 0x76u8, 0x65u8, 0x72u8, 0x2cu8, 0x20u8, 0x69u8, 0x66u8, 0x20u8, - 0x79u8, 0x6fu8, 0x75u8, 0x20u8, 0x77u8, 0x69u8, 0x73u8, 0x68u8, 0x2fu8, 0x6eu8, 0x65u8, - 0x65u8, 0x64u8, 0x20u8, 0x74u8, 0x6fu8, 0x20u8, 0x68u8, 0x61u8, 0x76u8, 0x65u8, 0x20u8, - 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x4du8, 0x61u8, 0x72u8, 0x73u8, 0x20u8, 0x6du8, 0x61u8, - 0x73u8, 0x73u8, 0x20u8, 0x63u8, 0x65u8, 0x6eu8, 0x74u8, 0x65u8, 0x72u8, 0x20u8, 0x61u8, - 0x76u8, 0x61u8, 0x69u8, 0x6cu8, 0x61u8, 0x62u8, 0x6cu8, 0x65u8, 0x20u8, 0x74u8, 0x6fu8, - 0x20u8, 0x79u8, 0x6fu8, 0x75u8, 0x72u8, 0x00u8, 0x70u8, 0x72u8, 0x6fu8, 0x67u8, 0x72u8, - 0x61u8, 0x6du8, 0x2cu8, 0x20u8, 0x79u8, 0x6fu8, 0x75u8, 0x27u8, 0x6cu8, 0x6cu8, 0x20u8, - 0x6eu8, 0x65u8, 0x65u8, 0x64u8, 0x20u8, 0x74u8, 0x6fu8, 0x20u8, 0x6cu8, 0x6fu8, 0x61u8, - 0x64u8, 0x20u8, 0x61u8, 0x20u8, 0x4du8, 0x61u8, 0x72u8, 0x73u8, 0x20u8, 0x73u8, 0x61u8, - 0x74u8, 0x65u8, 0x6cu8, 0x6cu8, 0x69u8, 0x74u8, 0x65u8, 0x20u8, 0x65u8, 0x70u8, 0x68u8, - 0x65u8, 0x6du8, 0x65u8, 0x72u8, 0x69u8, 0x73u8, 0x20u8, 0x66u8, 0x69u8, 0x6cu8, 0x65u8, - 0x20u8, 0x73u8, 0x75u8, 0x63u8, 0x68u8, 0x20u8, 0x61u8, 0x73u8, 0x20u8, 0x22u8, 0x6du8, - 0x61u8, 0x72u8, 0x30u8, 0x39u8, 0x37u8, 0x2eu8, 0x62u8, 0x73u8, 0x70u8, 0x22u8, 0x20u8, - 0x69u8, 0x6eu8, 0x20u8, 0x61u8, 0x64u8, 0x64u8, 0x69u8, 0x74u8, 0x69u8, 0x6fu8, 0x6eu8, - 0x00u8, 0x74u8, 0x6fu8, 0x20u8, 0x44u8, 0x45u8, 0x34u8, 0x33u8, 0x30u8, 0x2eu8, 0x20u8, - 0x53u8, 0x61u8, 0x74u8, 0x65u8, 0x6cu8, 0x6cu8, 0x69u8, 0x74u8, 0x65u8, 0x20u8, 0x65u8, - 0x70u8, 0x68u8, 0x65u8, 0x6du8, 0x65u8, 0x72u8, 0x69u8, 0x73u8, 0x20u8, 0x66u8, 0x69u8, - 0x6cu8, 0x65u8, 0x73u8, 0x20u8, 0x61u8, 0x72u8, 0x65u8, 0x20u8, 0x61u8, 0x76u8, 0x61u8, - 0x69u8, 0x6cu8, 0x61u8, 0x62u8, 0x6cu8, 0x65u8, 0x20u8, 0x66u8, 0x72u8, 0x6fu8, 0x6du8, - 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x4eu8, 0x41u8, 0x49u8, 0x46u8, 0x20u8, 0x73u8, - 0x65u8, 0x72u8, 0x76u8, 0x65u8, 0x72u8, 0x20u8, 0x68u8, 0x65u8, 0x72u8, 0x65u8, 0x3au8, - 0x00u8, 0x68u8, 0x74u8, 0x74u8, 0x70u8, 0x3au8, 0x2fu8, 0x2fu8, 0x6eu8, 0x61u8, 0x69u8, - 0x66u8, 0x2eu8, 0x6au8, 0x70u8, 0x6cu8, 0x2eu8, 0x6eu8, 0x61u8, 0x73u8, 0x61u8, 0x2eu8, - 0x67u8, 0x6fu8, 0x76u8, 0x2fu8, 0x70u8, 0x75u8, 0x62u8, 0x2fu8, 0x6eu8, 0x61u8, 0x69u8, - 0x66u8, 0x2fu8, 0x67u8, 0x65u8, 0x6eu8, 0x65u8, 0x72u8, 0x69u8, 0x63u8, 0x5fu8, 0x6bu8, - 0x65u8, 0x72u8, 0x6eu8, 0x65u8, 0x6cu8, 0x73u8, 0x2fu8, 0x73u8, 0x70u8, 0x6bu8, 0x2fu8, - 0x73u8, 0x61u8, 0x74u8, 0x65u8, 0x6cu8, 0x6cu8, 0x69u8, 0x74u8, 0x65u8, 0x73u8, 0x2fu8, - 0x00u8, 0x00u8, 0x00u8, 0x44u8, 0x65u8, 0x74u8, 0x61u8, 0x69u8, 0x6cu8, 0x73u8, 0x20u8, - 0x61u8, 0x62u8, 0x6fu8, 0x75u8, 0x74u8, 0x20u8, 0x53u8, 0x50u8, 0x49u8, 0x43u8, 0x45u8, - 0x20u8, 0x70u8, 0x6cu8, 0x61u8, 0x6eu8, 0x65u8, 0x74u8, 0x20u8, 0x61u8, 0x6eu8, 0x64u8, - 0x20u8, 0x73u8, 0x61u8, 0x74u8, 0x65u8, 0x6cu8, 0x6cu8, 0x69u8, 0x74u8, 0x65u8, 0x20u8, - 0x65u8, 0x70u8, 0x68u8, 0x65u8, 0x6du8, 0x65u8, 0x72u8, 0x69u8, 0x73u8, 0x20u8, 0x66u8, - 0x69u8, 0x6cu8, 0x65u8, 0x73u8, 0x2cu8, 0x20u8, 0x6bu8, 0x6eu8, 0x6fu8, 0x77u8, 0x6eu8, - 0x20u8, 0x61u8, 0x73u8, 0x20u8, 0x53u8, 0x50u8, 0x4bu8, 0x20u8, 0x66u8, 0x69u8, 0x6cu8, - 0x65u8, 0x73u8, 0x2cu8, 0x20u8, 0x69u8, 0x6eu8, 0x63u8, 0x6cu8, 0x75u8, 0x64u8, 0x69u8, - 0x6eu8, 0x67u8, 0x00u8, 0x68u8, 0x6fu8, 0x77u8, 0x20u8, 0x74u8, 0x6fu8, 0x20u8, 0x72u8, - 0x65u8, 0x61u8, 0x64u8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x6du8, 0x20u8, 0x75u8, 0x73u8, - 0x69u8, 0x6eu8, 0x67u8, 0x20u8, 0x53u8, 0x50u8, 0x49u8, 0x43u8, 0x45u8, 0x20u8, 0x54u8, - 0x6fu8, 0x6fu8, 0x6cu8, 0x6bu8, 0x69u8, 0x74u8, 0x20u8, 0x73u8, 0x6fu8, 0x66u8, 0x74u8, - 0x77u8, 0x61u8, 0x72u8, 0x65u8, 0x2cu8, 0x20u8, 0x6du8, 0x61u8, 0x79u8, 0x20u8, 0x62u8, - 0x65u8, 0x20u8, 0x66u8, 0x6fu8, 0x75u8, 0x6eu8, 0x64u8, 0x20u8, 0x69u8, 0x6eu8, 0x20u8, - 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x53u8, 0x50u8, 0x4bu8, 0x20u8, 0x74u8, 0x75u8, 0x74u8, - 0x6fu8, 0x72u8, 0x69u8, 0x61u8, 0x6cu8, 0x20u8, 0x28u8, 0x50u8, 0x44u8, 0x46u8, 0x20u8, - 0x66u8, 0x69u8, 0x6cu8, 0x65u8, 0x00u8, 0x6eu8, 0x61u8, 0x6du8, 0x65u8, 0x20u8, 0x69u8, - 0x73u8, 0x20u8, 0x22u8, 0x31u8, 0x39u8, 0x5fu8, 0x73u8, 0x70u8, 0x6bu8, 0x22u8, 0x29u8, - 0x20u8, 0x61u8, 0x76u8, 0x61u8, 0x69u8, 0x6cu8, 0x61u8, 0x62u8, 0x6cu8, 0x65u8, 0x20u8, - 0x66u8, 0x72u8, 0x6fu8, 0x6du8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x4eu8, 0x41u8, + 0x66u8, 0x69u8, 0x6Cu8, 0x65u8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x6Cu8, 0x6Fu8, + 0x63u8, 0x61u8, 0x74u8, 0x69u8, 0x6Fu8, 0x6Eu8, 0x20u8, 0x6Fu8, 0x66u8, 0x20u8, 0x4Du8, + 0x61u8, 0x72u8, 0x73u8, 0x27u8, 0x20u8, 0x6Du8, 0x61u8, 0x73u8, 0x73u8, 0x20u8, 0x63u8, + 0x65u8, 0x6Eu8, 0x74u8, 0x65u8, 0x72u8, 0x00u8, 0x28u8, 0x4Eu8, 0x41u8, 0x49u8, 0x46u8, + 0x20u8, 0x49u8, 0x44u8, 0x20u8, 0x3Du8, 0x20u8, 0x34u8, 0x39u8, 0x39u8, 0x29u8, 0x20u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x69u8, 0x73u8, 0x20u8, 0x2Au8, 0x4Eu8, 0x4Fu8, 0x54u8, 0x2Au8, 0x20u8, + 0x69u8, 0x6Eu8, 0x63u8, 0x6Cu8, 0x75u8, 0x64u8, 0x65u8, 0x64u8, 0x3Bu8, 0x20u8, 0x6Fu8, + 0x6Eu8, 0x6Cu8, 0x79u8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x4Du8, 0x61u8, 0x72u8, + 0x73u8, 0x20u8, 0x73u8, 0x79u8, 0x73u8, 0x74u8, 0x65u8, 0x6Du8, 0x20u8, 0x62u8, 0x61u8, + 0x72u8, 0x79u8, 0x63u8, 0x65u8, 0x6Eu8, 0x74u8, 0x65u8, 0x72u8, 0x20u8, 0x28u8, 0x49u8, + 0x44u8, 0x20u8, 0x3Du8, 0x20u8, 0x34u8, 0x29u8, 0x20u8, 0x69u8, 0x73u8, 0x20u8, 0x70u8, + 0x72u8, 0x65u8, 0x73u8, 0x65u8, 0x6Eu8, 0x74u8, 0x2Eu8, 0x00u8, 0x54u8, 0x68u8, 0x65u8, + 0x20u8, 0x6Fu8, 0x66u8, 0x66u8, 0x73u8, 0x65u8, 0x74u8, 0x20u8, 0x62u8, 0x65u8, 0x74u8, + 0x77u8, 0x65u8, 0x65u8, 0x6Eu8, 0x20u8, 0x4Du8, 0x61u8, 0x72u8, 0x73u8, 0x27u8, 0x20u8, + 0x6Du8, 0x61u8, 0x73u8, 0x73u8, 0x20u8, 0x63u8, 0x65u8, 0x6Eu8, 0x74u8, 0x65u8, 0x72u8, + 0x20u8, 0x61u8, 0x6Eu8, 0x64u8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x4Du8, 0x61u8, + 0x72u8, 0x73u8, 0x27u8, 0x20u8, 0x73u8, 0x79u8, 0x73u8, 0x74u8, 0x65u8, 0x6Du8, 0x20u8, + 0x62u8, 0x61u8, 0x72u8, 0x79u8, 0x63u8, 0x65u8, 0x6Eu8, 0x74u8, 0x65u8, 0x72u8, 0x20u8, + 0x69u8, 0x6Eu8, 0x20u8, 0x44u8, 0x45u8, 0x34u8, 0x30u8, 0x33u8, 0x20u8, 0x69u8, 0x73u8, + 0x20u8, 0x71u8, 0x75u8, 0x69u8, 0x74u8, 0x65u8, 0x20u8, 0x73u8, 0x6Du8, 0x61u8, 0x6Cu8, + 0x6Cu8, 0x00u8, 0x2Du8, 0x2Du8, 0x61u8, 0x62u8, 0x6Fu8, 0x75u8, 0x74u8, 0x20u8, 0x32u8, + 0x30u8, 0x20u8, 0x63u8, 0x6Du8, 0x2Eu8, 0x2Du8, 0x2Du8, 0x73u8, 0x6Fu8, 0x20u8, 0x6Du8, + 0x6Fu8, 0x73u8, 0x74u8, 0x20u8, 0x53u8, 0x50u8, 0x49u8, 0x43u8, 0x45u8, 0x20u8, 0x75u8, + 0x73u8, 0x65u8, 0x72u8, 0x73u8, 0x20u8, 0x63u8, 0x6Fu8, 0x75u8, 0x6Cu8, 0x64u8, 0x20u8, + 0x75u8, 0x73u8, 0x65u8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x4Du8, 0x61u8, 0x72u8, + 0x73u8, 0x20u8, 0x73u8, 0x79u8, 0x73u8, 0x74u8, 0x65u8, 0x6Du8, 0x20u8, 0x62u8, 0x61u8, + 0x72u8, 0x79u8, 0x63u8, 0x65u8, 0x6Eu8, 0x74u8, 0x65u8, 0x72u8, 0x20u8, 0x69u8, 0x6Eu8, + 0x20u8, 0x70u8, 0x6Cu8, 0x61u8, 0x63u8, 0x65u8, 0x20u8, 0x6Fu8, 0x66u8, 0x20u8, 0x74u8, + 0x68u8, 0x65u8, 0x00u8, 0x4Du8, 0x61u8, 0x72u8, 0x73u8, 0x20u8, 0x6Du8, 0x61u8, 0x73u8, + 0x73u8, 0x20u8, 0x63u8, 0x65u8, 0x6Eu8, 0x74u8, 0x65u8, 0x72u8, 0x2Eu8, 0x20u8, 0x48u8, + 0x6Fu8, 0x77u8, 0x65u8, 0x76u8, 0x65u8, 0x72u8, 0x2Cu8, 0x20u8, 0x69u8, 0x66u8, 0x20u8, + 0x79u8, 0x6Fu8, 0x75u8, 0x20u8, 0x77u8, 0x69u8, 0x73u8, 0x68u8, 0x2Fu8, 0x6Eu8, 0x65u8, + 0x65u8, 0x64u8, 0x20u8, 0x74u8, 0x6Fu8, 0x20u8, 0x68u8, 0x61u8, 0x76u8, 0x65u8, 0x20u8, + 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x4Du8, 0x61u8, 0x72u8, 0x73u8, 0x20u8, 0x6Du8, 0x61u8, + 0x73u8, 0x73u8, 0x20u8, 0x63u8, 0x65u8, 0x6Eu8, 0x74u8, 0x65u8, 0x72u8, 0x20u8, 0x61u8, + 0x76u8, 0x61u8, 0x69u8, 0x6Cu8, 0x61u8, 0x62u8, 0x6Cu8, 0x65u8, 0x20u8, 0x74u8, 0x6Fu8, + 0x20u8, 0x79u8, 0x6Fu8, 0x75u8, 0x72u8, 0x00u8, 0x70u8, 0x72u8, 0x6Fu8, 0x67u8, 0x72u8, + 0x61u8, 0x6Du8, 0x2Cu8, 0x20u8, 0x79u8, 0x6Fu8, 0x75u8, 0x27u8, 0x6Cu8, 0x6Cu8, 0x20u8, + 0x6Eu8, 0x65u8, 0x65u8, 0x64u8, 0x20u8, 0x74u8, 0x6Fu8, 0x20u8, 0x6Cu8, 0x6Fu8, 0x61u8, + 0x64u8, 0x20u8, 0x61u8, 0x20u8, 0x4Du8, 0x61u8, 0x72u8, 0x73u8, 0x20u8, 0x73u8, 0x61u8, + 0x74u8, 0x65u8, 0x6Cu8, 0x6Cu8, 0x69u8, 0x74u8, 0x65u8, 0x20u8, 0x65u8, 0x70u8, 0x68u8, + 0x65u8, 0x6Du8, 0x65u8, 0x72u8, 0x69u8, 0x73u8, 0x20u8, 0x66u8, 0x69u8, 0x6Cu8, 0x65u8, + 0x20u8, 0x73u8, 0x75u8, 0x63u8, 0x68u8, 0x20u8, 0x61u8, 0x73u8, 0x20u8, 0x22u8, 0x6Du8, + 0x61u8, 0x72u8, 0x30u8, 0x39u8, 0x37u8, 0x2Eu8, 0x62u8, 0x73u8, 0x70u8, 0x22u8, 0x20u8, + 0x69u8, 0x6Eu8, 0x20u8, 0x61u8, 0x64u8, 0x64u8, 0x69u8, 0x74u8, 0x69u8, 0x6Fu8, 0x6Eu8, + 0x00u8, 0x74u8, 0x6Fu8, 0x20u8, 0x44u8, 0x45u8, 0x34u8, 0x33u8, 0x30u8, 0x2Eu8, 0x20u8, + 0x53u8, 0x61u8, 0x74u8, 0x65u8, 0x6Cu8, 0x6Cu8, 0x69u8, 0x74u8, 0x65u8, 0x20u8, 0x65u8, + 0x70u8, 0x68u8, 0x65u8, 0x6Du8, 0x65u8, 0x72u8, 0x69u8, 0x73u8, 0x20u8, 0x66u8, 0x69u8, + 0x6Cu8, 0x65u8, 0x73u8, 0x20u8, 0x61u8, 0x72u8, 0x65u8, 0x20u8, 0x61u8, 0x76u8, 0x61u8, + 0x69u8, 0x6Cu8, 0x61u8, 0x62u8, 0x6Cu8, 0x65u8, 0x20u8, 0x66u8, 0x72u8, 0x6Fu8, 0x6Du8, + 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x4Eu8, 0x41u8, 0x49u8, 0x46u8, 0x20u8, 0x73u8, + 0x65u8, 0x72u8, 0x76u8, 0x65u8, 0x72u8, 0x20u8, 0x68u8, 0x65u8, 0x72u8, 0x65u8, 0x3Au8, + 0x00u8, 0x68u8, 0x74u8, 0x74u8, 0x70u8, 0x3Au8, 0x2Fu8, 0x2Fu8, 0x6Eu8, 0x61u8, 0x69u8, + 0x66u8, 0x2Eu8, 0x6Au8, 0x70u8, 0x6Cu8, 0x2Eu8, 0x6Eu8, 0x61u8, 0x73u8, 0x61u8, 0x2Eu8, + 0x67u8, 0x6Fu8, 0x76u8, 0x2Fu8, 0x70u8, 0x75u8, 0x62u8, 0x2Fu8, 0x6Eu8, 0x61u8, 0x69u8, + 0x66u8, 0x2Fu8, 0x67u8, 0x65u8, 0x6Eu8, 0x65u8, 0x72u8, 0x69u8, 0x63u8, 0x5Fu8, 0x6Bu8, + 0x65u8, 0x72u8, 0x6Eu8, 0x65u8, 0x6Cu8, 0x73u8, 0x2Fu8, 0x73u8, 0x70u8, 0x6Bu8, 0x2Fu8, + 0x73u8, 0x61u8, 0x74u8, 0x65u8, 0x6Cu8, 0x6Cu8, 0x69u8, 0x74u8, 0x65u8, 0x73u8, 0x2Fu8, + 0x00u8, 0x00u8, 0x00u8, 0x44u8, 0x65u8, 0x74u8, 0x61u8, 0x69u8, 0x6Cu8, 0x73u8, 0x20u8, + 0x61u8, 0x62u8, 0x6Fu8, 0x75u8, 0x74u8, 0x20u8, 0x53u8, 0x50u8, 0x49u8, 0x43u8, 0x45u8, + 0x20u8, 0x70u8, 0x6Cu8, 0x61u8, 0x6Eu8, 0x65u8, 0x74u8, 0x20u8, 0x61u8, 0x6Eu8, 0x64u8, + 0x20u8, 0x73u8, 0x61u8, 0x74u8, 0x65u8, 0x6Cu8, 0x6Cu8, 0x69u8, 0x74u8, 0x65u8, 0x20u8, + 0x65u8, 0x70u8, 0x68u8, 0x65u8, 0x6Du8, 0x65u8, 0x72u8, 0x69u8, 0x73u8, 0x20u8, 0x66u8, + 0x69u8, 0x6Cu8, 0x65u8, 0x73u8, 0x2Cu8, 0x20u8, 0x6Bu8, 0x6Eu8, 0x6Fu8, 0x77u8, 0x6Eu8, + 0x20u8, 0x61u8, 0x73u8, 0x20u8, 0x53u8, 0x50u8, 0x4Bu8, 0x20u8, 0x66u8, 0x69u8, 0x6Cu8, + 0x65u8, 0x73u8, 0x2Cu8, 0x20u8, 0x69u8, 0x6Eu8, 0x63u8, 0x6Cu8, 0x75u8, 0x64u8, 0x69u8, + 0x6Eu8, 0x67u8, 0x00u8, 0x68u8, 0x6Fu8, 0x77u8, 0x20u8, 0x74u8, 0x6Fu8, 0x20u8, 0x72u8, + 0x65u8, 0x61u8, 0x64u8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x6Du8, 0x20u8, 0x75u8, 0x73u8, + 0x69u8, 0x6Eu8, 0x67u8, 0x20u8, 0x53u8, 0x50u8, 0x49u8, 0x43u8, 0x45u8, 0x20u8, 0x54u8, + 0x6Fu8, 0x6Fu8, 0x6Cu8, 0x6Bu8, 0x69u8, 0x74u8, 0x20u8, 0x73u8, 0x6Fu8, 0x66u8, 0x74u8, + 0x77u8, 0x61u8, 0x72u8, 0x65u8, 0x2Cu8, 0x20u8, 0x6Du8, 0x61u8, 0x79u8, 0x20u8, 0x62u8, + 0x65u8, 0x20u8, 0x66u8, 0x6Fu8, 0x75u8, 0x6Eu8, 0x64u8, 0x20u8, 0x69u8, 0x6Eu8, 0x20u8, + 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x53u8, 0x50u8, 0x4Bu8, 0x20u8, 0x74u8, 0x75u8, 0x74u8, + 0x6Fu8, 0x72u8, 0x69u8, 0x61u8, 0x6Cu8, 0x20u8, 0x28u8, 0x50u8, 0x44u8, 0x46u8, 0x20u8, + 0x66u8, 0x69u8, 0x6Cu8, 0x65u8, 0x00u8, 0x6Eu8, 0x61u8, 0x6Du8, 0x65u8, 0x20u8, 0x69u8, + 0x73u8, 0x20u8, 0x22u8, 0x31u8, 0x39u8, 0x5Fu8, 0x73u8, 0x70u8, 0x6Bu8, 0x22u8, 0x29u8, + 0x20u8, 0x61u8, 0x76u8, 0x61u8, 0x69u8, 0x6Cu8, 0x61u8, 0x62u8, 0x6Cu8, 0x65u8, 0x20u8, + 0x66u8, 0x72u8, 0x6Fu8, 0x6Du8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x4Eu8, 0x41u8, 0x49u8, 0x46u8, 0x20u8, 0x77u8, 0x65u8, 0x62u8, 0x73u8, 0x69u8, 0x74u8, 0x65u8, 0x20u8, - 0x28u8, 0x68u8, 0x74u8, 0x74u8, 0x70u8, 0x3au8, 0x2fu8, 0x2fu8, 0x6eu8, 0x61u8, 0x69u8, - 0x66u8, 0x2eu8, 0x6au8, 0x70u8, 0x6cu8, 0x2eu8, 0x6eu8, 0x61u8, 0x73u8, 0x61u8, 0x2eu8, - 0x67u8, 0x6fu8, 0x76u8, 0x2fu8, 0x74u8, 0x75u8, 0x74u8, 0x6fu8, 0x72u8, 0x69u8, 0x61u8, - 0x6cu8, 0x73u8, 0x2eu8, 0x68u8, 0x74u8, 0x6du8, 0x6cu8, 0x29u8, 0x2eu8, 0x00u8, 0x00u8, + 0x28u8, 0x68u8, 0x74u8, 0x74u8, 0x70u8, 0x3Au8, 0x2Fu8, 0x2Fu8, 0x6Eu8, 0x61u8, 0x69u8, + 0x66u8, 0x2Eu8, 0x6Au8, 0x70u8, 0x6Cu8, 0x2Eu8, 0x6Eu8, 0x61u8, 0x73u8, 0x61u8, 0x2Eu8, + 0x67u8, 0x6Fu8, 0x76u8, 0x2Fu8, 0x74u8, 0x75u8, 0x74u8, 0x6Fu8, 0x72u8, 0x69u8, 0x61u8, + 0x6Cu8, 0x73u8, 0x2Eu8, 0x68u8, 0x74u8, 0x6Du8, 0x6Cu8, 0x29u8, 0x2Eu8, 0x00u8, 0x00u8, 0x00u8, 0x04u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, @@ -1233,58 +1233,58 @@ name is "19_spk") available from the NAIF website (http://naif.jpl.nasa.gov/tuto 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x2cu8, 0x40u8, 0x00u8, 0x00u8, 0x00u8, 0xa6u8, 0x71u8, 0x73u8, - 0x0au8, 0xc2u8, 0x00u8, 0x00u8, 0x00u8, 0x2du8, 0xf0u8, 0x1au8, 0x13u8, 0x42u8, 0x01u8, + 0x00u8, 0x00u8, 0x00u8, 0x2Cu8, 0x40u8, 0x00u8, 0x00u8, 0x00u8, 0xA6u8, 0x71u8, 0x73u8, + 0x0Au8, 0xC2u8, 0x00u8, 0x00u8, 0x00u8, 0x2Du8, 0xF0u8, 0x1Au8, 0x13u8, 0x42u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, - 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x81u8, 0x02u8, 0x00u8, 0x00u8, 0xc4u8, 0xbau8, 0x21u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xa6u8, 0x71u8, 0x73u8, 0x0au8, 0xc2u8, 0x00u8, 0x00u8, - 0x00u8, 0x2du8, 0xf0u8, 0x1au8, 0x13u8, 0x42u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x81u8, 0x02u8, 0x00u8, 0x00u8, 0xC4u8, 0xBAu8, 0x21u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xA6u8, 0x71u8, 0x73u8, 0x0Au8, 0xC2u8, 0x00u8, 0x00u8, + 0x00u8, 0x2Du8, 0xF0u8, 0x1Au8, 0x13u8, 0x42u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, - 0xc5u8, 0xbau8, 0x21u8, 0x00u8, 0xc8u8, 0xfdu8, 0x2du8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0xa6u8, 0x71u8, 0x73u8, 0x0au8, 0xc2u8, 0x00u8, 0x00u8, 0x00u8, 0x2du8, 0xf0u8, 0x1au8, + 0xC5u8, 0xBAu8, 0x21u8, 0x00u8, 0xC8u8, 0xFDu8, 0x2Du8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0xA6u8, 0x71u8, 0x73u8, 0x0Au8, 0xC2u8, 0x00u8, 0x00u8, 0x00u8, 0x2Du8, 0xF0u8, 0x1Au8, 0x13u8, 0x42u8, 0x03u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, - 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0xc9u8, 0xfdu8, 0x2du8, 0x00u8, - 0xa4u8, 0xb3u8, 0x3du8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xa6u8, 0x71u8, 0x73u8, 0x0au8, - 0xc2u8, 0x00u8, 0x00u8, 0x00u8, 0x2du8, 0xf0u8, 0x1au8, 0x13u8, 0x42u8, 0x04u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0xC9u8, 0xFDu8, 0x2Du8, 0x00u8, + 0xA4u8, 0xB3u8, 0x3Du8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xA6u8, 0x71u8, 0x73u8, 0x0Au8, + 0xC2u8, 0x00u8, 0x00u8, 0x00u8, 0x2Du8, 0xF0u8, 0x1Au8, 0x13u8, 0x42u8, 0x04u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x02u8, - 0x00u8, 0x00u8, 0x00u8, 0xa5u8, 0xb3u8, 0x3du8, 0x00u8, 0x4cu8, 0x68u8, 0x44u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0xa6u8, 0x71u8, 0x73u8, 0x0au8, 0xc2u8, 0x00u8, 0x00u8, 0x00u8, - 0x2du8, 0xf0u8, 0x1au8, 0x13u8, 0x42u8, 0x05u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x4du8, - 0x68u8, 0x44u8, 0x00u8, 0x88u8, 0x63u8, 0x49u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xa6u8, - 0x71u8, 0x73u8, 0x0au8, 0xc2u8, 0x00u8, 0x00u8, 0x00u8, 0x2du8, 0xf0u8, 0x1au8, 0x13u8, + 0x00u8, 0x00u8, 0x00u8, 0xA5u8, 0xB3u8, 0x3Du8, 0x00u8, 0x4Cu8, 0x68u8, 0x44u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0xA6u8, 0x71u8, 0x73u8, 0x0Au8, 0xC2u8, 0x00u8, 0x00u8, 0x00u8, + 0x2Du8, 0xF0u8, 0x1Au8, 0x13u8, 0x42u8, 0x05u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x4Du8, + 0x68u8, 0x44u8, 0x00u8, 0x88u8, 0x63u8, 0x49u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xA6u8, + 0x71u8, 0x73u8, 0x0Au8, 0xC2u8, 0x00u8, 0x00u8, 0x00u8, 0x2Du8, 0xF0u8, 0x1Au8, 0x13u8, 0x42u8, 0x06u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, 0x00u8, - 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x89u8, 0x63u8, 0x49u8, 0x00u8, 0xa0u8, - 0xcbu8, 0x4du8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xa6u8, 0x71u8, 0x73u8, 0x0au8, 0xc2u8, - 0x00u8, 0x00u8, 0x00u8, 0x2du8, 0xf0u8, 0x1au8, 0x13u8, 0x42u8, 0x07u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x89u8, 0x63u8, 0x49u8, 0x00u8, 0xA0u8, + 0xCBu8, 0x4Du8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xA6u8, 0x71u8, 0x73u8, 0x0Au8, 0xC2u8, + 0x00u8, 0x00u8, 0x00u8, 0x2Du8, 0xF0u8, 0x1Au8, 0x13u8, 0x42u8, 0x07u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, - 0x00u8, 0x00u8, 0xa1u8, 0xcbu8, 0x4du8, 0x00u8, 0x94u8, 0xa0u8, 0x51u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0xa6u8, 0x71u8, 0x73u8, 0x0au8, 0xc2u8, 0x00u8, 0x00u8, 0x00u8, 0x2du8, - 0xf0u8, 0x1au8, 0x13u8, 0x42u8, 0x08u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x95u8, 0xa0u8, - 0x51u8, 0x00u8, 0x88u8, 0x75u8, 0x55u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xa6u8, 0x71u8, - 0x73u8, 0x0au8, 0xc2u8, 0x00u8, 0x00u8, 0x00u8, 0x2du8, 0xf0u8, 0x1au8, 0x13u8, 0x42u8, + 0x00u8, 0x00u8, 0xA1u8, 0xCBu8, 0x4Du8, 0x00u8, 0x94u8, 0xA0u8, 0x51u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0xA6u8, 0x71u8, 0x73u8, 0x0Au8, 0xC2u8, 0x00u8, 0x00u8, 0x00u8, 0x2Du8, + 0xF0u8, 0x1Au8, 0x13u8, 0x42u8, 0x08u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x95u8, 0xA0u8, + 0x51u8, 0x00u8, 0x88u8, 0x75u8, 0x55u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xA6u8, 0x71u8, + 0x73u8, 0x0Au8, 0xC2u8, 0x00u8, 0x00u8, 0x00u8, 0x2Du8, 0xF0u8, 0x1Au8, 0x13u8, 0x42u8, 0x09u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, - 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x89u8, 0x75u8, 0x55u8, 0x00u8, 0x7cu8, 0x4au8, - 0x59u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xa6u8, 0x71u8, 0x73u8, 0x0au8, 0xc2u8, 0x00u8, - 0x00u8, 0x00u8, 0x2du8, 0xf0u8, 0x1au8, 0x13u8, 0x42u8, 0x0au8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x89u8, 0x75u8, 0x55u8, 0x00u8, 0x7Cu8, 0x4Au8, + 0x59u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xA6u8, 0x71u8, 0x73u8, 0x0Au8, 0xC2u8, 0x00u8, + 0x00u8, 0x00u8, 0x2Du8, 0xF0u8, 0x1Au8, 0x13u8, 0x42u8, 0x0Au8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, - 0x00u8, 0x7du8, 0x4au8, 0x59u8, 0x00u8, 0xc8u8, 0xb3u8, 0x66u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0xa6u8, 0x71u8, 0x73u8, 0x0au8, 0xc2u8, 0x00u8, 0x00u8, 0x00u8, 0x2du8, 0xf0u8, - 0x1au8, 0x13u8, 0x42u8, 0x2du8, 0x01u8, 0x00u8, 0x00u8, 0x03u8, 0x00u8, 0x00u8, 0x00u8, - 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0xc9u8, 0xb3u8, 0x66u8, - 0x00u8, 0x2cu8, 0x8bu8, 0xa5u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xa6u8, 0x71u8, 0x73u8, - 0x0au8, 0xc2u8, 0x00u8, 0x00u8, 0x00u8, 0x2du8, 0xf0u8, 0x1au8, 0x13u8, 0x42u8, 0x8fu8, + 0x00u8, 0x7Du8, 0x4Au8, 0x59u8, 0x00u8, 0xC8u8, 0xB3u8, 0x66u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0xA6u8, 0x71u8, 0x73u8, 0x0Au8, 0xC2u8, 0x00u8, 0x00u8, 0x00u8, 0x2Du8, 0xF0u8, + 0x1Au8, 0x13u8, 0x42u8, 0x2Du8, 0x01u8, 0x00u8, 0x00u8, 0x03u8, 0x00u8, 0x00u8, 0x00u8, + 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0xC9u8, 0xB3u8, 0x66u8, + 0x00u8, 0x2Cu8, 0x8Bu8, 0xA5u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xA6u8, 0x71u8, 0x73u8, + 0x0Au8, 0xC2u8, 0x00u8, 0x00u8, 0x00u8, 0x2Du8, 0xF0u8, 0x1Au8, 0x13u8, 0x42u8, 0x8Fu8, 0x01u8, 0x00u8, 0x00u8, 0x03u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, - 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x2du8, 0x8bu8, 0xa5u8, 0x00u8, 0x90u8, 0x62u8, 0xe4u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xa6u8, 0x71u8, 0x73u8, 0x0au8, 0xc2u8, 0x00u8, 0x00u8, - 0x00u8, 0x2du8, 0xf0u8, 0x1au8, 0x13u8, 0x42u8, 0xc7u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, + 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x2Du8, 0x8Bu8, 0xA5u8, 0x00u8, 0x90u8, 0x62u8, 0xE4u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xA6u8, 0x71u8, 0x73u8, 0x0Au8, 0xC2u8, 0x00u8, 0x00u8, + 0x00u8, 0x2Du8, 0xF0u8, 0x1Au8, 0x13u8, 0x42u8, 0xC7u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, - 0x91u8, 0x62u8, 0xe4u8, 0x00u8, 0x9cu8, 0x62u8, 0xe4u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0xa6u8, 0x71u8, 0x73u8, 0x0au8, 0xc2u8, 0x00u8, 0x00u8, 0x00u8, 0x2du8, 0xf0u8, 0x1au8, - 0x13u8, 0x42u8, 0x2bu8, 0x01u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, - 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x9du8, 0x62u8, 0xe4u8, 0x00u8, - 0xa8u8, 0x62u8, 0xe4u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x91u8, 0x62u8, 0xE4u8, 0x00u8, 0x9Cu8, 0x62u8, 0xE4u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0xA6u8, 0x71u8, 0x73u8, 0x0Au8, 0xC2u8, 0x00u8, 0x00u8, 0x00u8, 0x2Du8, 0xF0u8, 0x1Au8, + 0x13u8, 0x42u8, 0x2Bu8, 0x01u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, + 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x9Du8, 0x62u8, 0xE4u8, 0x00u8, + 0xA8u8, 0x62u8, 0xE4u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, @@ -1324,55 +1324,55 @@ name is "19_spk") available from the NAIF website (http://naif.jpl.nasa.gov/tuto 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x44u8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, - 0x4cu8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x44u8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, + 0x4Cu8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x44u8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4cu8, 0x45u8, 0x2du8, 0x30u8, + 0x44u8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4Cu8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2du8, 0x30u8, - 0x34u8, 0x33u8, 0x30u8, 0x4cu8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2Du8, 0x30u8, + 0x34u8, 0x33u8, 0x30u8, 0x4Cu8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4cu8, - 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4Cu8, + 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, - 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4cu8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, + 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4Cu8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, - 0x33u8, 0x30u8, 0x4cu8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, + 0x33u8, 0x30u8, 0x4Cu8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4cu8, 0x45u8, - 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4Cu8, 0x45u8, + 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, - 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4cu8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, + 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4Cu8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, - 0x30u8, 0x4cu8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, + 0x30u8, 0x4Cu8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x44u8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4cu8, 0x45u8, 0x2du8, + 0x20u8, 0x44u8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4Cu8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2du8, - 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4cu8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2Du8, + 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4Cu8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, - 0x4cu8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, + 0x4Cu8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x44u8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4cu8, 0x45u8, 0x2du8, 0x30u8, + 0x44u8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4Cu8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2du8, 0x30u8, - 0x34u8, 0x33u8, 0x30u8, 0x4cu8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2Du8, 0x30u8, + 0x34u8, 0x33u8, 0x30u8, 0x4Cu8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, @@ -1423,57 +1423,57 @@ name is "19_spk") available from the NAIF website (http://naif.jpl.nasa.gov/tuto const SUMMARY_RECORD: [u8; 2048] = [ 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x2cu8, 0x40u8, 0x00u8, 0x00u8, 0x00u8, 0xa6u8, 0x71u8, 0x73u8, 0x0au8, 0xc2u8, 0x00u8, - 0x00u8, 0x00u8, 0x2du8, 0xf0u8, 0x1au8, 0x13u8, 0x42u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, + 0x2Cu8, 0x40u8, 0x00u8, 0x00u8, 0x00u8, 0xA6u8, 0x71u8, 0x73u8, 0x0Au8, 0xC2u8, 0x00u8, + 0x00u8, 0x00u8, 0x2Du8, 0xF0u8, 0x1Au8, 0x13u8, 0x42u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, - 0x00u8, 0x81u8, 0x02u8, 0x00u8, 0x00u8, 0xc4u8, 0xbau8, 0x21u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0xa6u8, 0x71u8, 0x73u8, 0x0au8, 0xc2u8, 0x00u8, 0x00u8, 0x00u8, 0x2du8, 0xf0u8, - 0x1au8, 0x13u8, 0x42u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0xc5u8, 0xbau8, 0x21u8, - 0x00u8, 0xc8u8, 0xfdu8, 0x2du8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xa6u8, 0x71u8, 0x73u8, - 0x0au8, 0xc2u8, 0x00u8, 0x00u8, 0x00u8, 0x2du8, 0xf0u8, 0x1au8, 0x13u8, 0x42u8, 0x03u8, + 0x00u8, 0x81u8, 0x02u8, 0x00u8, 0x00u8, 0xC4u8, 0xBAu8, 0x21u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0xA6u8, 0x71u8, 0x73u8, 0x0Au8, 0xC2u8, 0x00u8, 0x00u8, 0x00u8, 0x2Du8, 0xF0u8, + 0x1Au8, 0x13u8, 0x42u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0xC5u8, 0xBAu8, 0x21u8, + 0x00u8, 0xC8u8, 0xFDu8, 0x2Du8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xA6u8, 0x71u8, 0x73u8, + 0x0Au8, 0xC2u8, 0x00u8, 0x00u8, 0x00u8, 0x2Du8, 0xF0u8, 0x1Au8, 0x13u8, 0x42u8, 0x03u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, - 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0xc9u8, 0xfdu8, 0x2du8, 0x00u8, 0xa4u8, 0xb3u8, 0x3du8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xa6u8, 0x71u8, 0x73u8, 0x0au8, 0xc2u8, 0x00u8, 0x00u8, - 0x00u8, 0x2du8, 0xf0u8, 0x1au8, 0x13u8, 0x42u8, 0x04u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0xC9u8, 0xFDu8, 0x2Du8, 0x00u8, 0xA4u8, 0xB3u8, 0x3Du8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xA6u8, 0x71u8, 0x73u8, 0x0Au8, 0xC2u8, 0x00u8, 0x00u8, + 0x00u8, 0x2Du8, 0xF0u8, 0x1Au8, 0x13u8, 0x42u8, 0x04u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, - 0xa5u8, 0xb3u8, 0x3du8, 0x00u8, 0x4cu8, 0x68u8, 0x44u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0xa6u8, 0x71u8, 0x73u8, 0x0au8, 0xc2u8, 0x00u8, 0x00u8, 0x00u8, 0x2du8, 0xf0u8, 0x1au8, + 0xA5u8, 0xB3u8, 0x3Du8, 0x00u8, 0x4Cu8, 0x68u8, 0x44u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0xA6u8, 0x71u8, 0x73u8, 0x0Au8, 0xC2u8, 0x00u8, 0x00u8, 0x00u8, 0x2Du8, 0xF0u8, 0x1Au8, 0x13u8, 0x42u8, 0x05u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, - 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x4du8, 0x68u8, 0x44u8, 0x00u8, - 0x88u8, 0x63u8, 0x49u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xa6u8, 0x71u8, 0x73u8, 0x0au8, - 0xc2u8, 0x00u8, 0x00u8, 0x00u8, 0x2du8, 0xf0u8, 0x1au8, 0x13u8, 0x42u8, 0x06u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x4Du8, 0x68u8, 0x44u8, 0x00u8, + 0x88u8, 0x63u8, 0x49u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xA6u8, 0x71u8, 0x73u8, 0x0Au8, + 0xC2u8, 0x00u8, 0x00u8, 0x00u8, 0x2Du8, 0xF0u8, 0x1Au8, 0x13u8, 0x42u8, 0x06u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x02u8, - 0x00u8, 0x00u8, 0x00u8, 0x89u8, 0x63u8, 0x49u8, 0x00u8, 0xa0u8, 0xcbu8, 0x4du8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0xa6u8, 0x71u8, 0x73u8, 0x0au8, 0xc2u8, 0x00u8, 0x00u8, 0x00u8, - 0x2du8, 0xf0u8, 0x1au8, 0x13u8, 0x42u8, 0x07u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0xa1u8, - 0xcbu8, 0x4du8, 0x00u8, 0x94u8, 0xa0u8, 0x51u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xa6u8, - 0x71u8, 0x73u8, 0x0au8, 0xc2u8, 0x00u8, 0x00u8, 0x00u8, 0x2du8, 0xf0u8, 0x1au8, 0x13u8, + 0x00u8, 0x00u8, 0x00u8, 0x89u8, 0x63u8, 0x49u8, 0x00u8, 0xA0u8, 0xCBu8, 0x4Du8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0xA6u8, 0x71u8, 0x73u8, 0x0Au8, 0xC2u8, 0x00u8, 0x00u8, 0x00u8, + 0x2Du8, 0xF0u8, 0x1Au8, 0x13u8, 0x42u8, 0x07u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0xA1u8, + 0xCBu8, 0x4Du8, 0x00u8, 0x94u8, 0xA0u8, 0x51u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xA6u8, + 0x71u8, 0x73u8, 0x0Au8, 0xC2u8, 0x00u8, 0x00u8, 0x00u8, 0x2Du8, 0xF0u8, 0x1Au8, 0x13u8, 0x42u8, 0x08u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, 0x00u8, - 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x95u8, 0xa0u8, 0x51u8, 0x00u8, 0x88u8, - 0x75u8, 0x55u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xa6u8, 0x71u8, 0x73u8, 0x0au8, 0xc2u8, - 0x00u8, 0x00u8, 0x00u8, 0x2du8, 0xf0u8, 0x1au8, 0x13u8, 0x42u8, 0x09u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x95u8, 0xA0u8, 0x51u8, 0x00u8, 0x88u8, + 0x75u8, 0x55u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xA6u8, 0x71u8, 0x73u8, 0x0Au8, 0xC2u8, + 0x00u8, 0x00u8, 0x00u8, 0x2Du8, 0xF0u8, 0x1Au8, 0x13u8, 0x42u8, 0x09u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, - 0x00u8, 0x00u8, 0x89u8, 0x75u8, 0x55u8, 0x00u8, 0x7cu8, 0x4au8, 0x59u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0xa6u8, 0x71u8, 0x73u8, 0x0au8, 0xc2u8, 0x00u8, 0x00u8, 0x00u8, 0x2du8, - 0xf0u8, 0x1au8, 0x13u8, 0x42u8, 0x0au8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x7du8, 0x4au8, - 0x59u8, 0x00u8, 0xc8u8, 0xb3u8, 0x66u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xa6u8, 0x71u8, - 0x73u8, 0x0au8, 0xc2u8, 0x00u8, 0x00u8, 0x00u8, 0x2du8, 0xf0u8, 0x1au8, 0x13u8, 0x42u8, - 0x2du8, 0x01u8, 0x00u8, 0x00u8, 0x03u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, - 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0xc9u8, 0xb3u8, 0x66u8, 0x00u8, 0x2cu8, 0x8bu8, - 0xa5u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xa6u8, 0x71u8, 0x73u8, 0x0au8, 0xc2u8, 0x00u8, - 0x00u8, 0x00u8, 0x2du8, 0xf0u8, 0x1au8, 0x13u8, 0x42u8, 0x8fu8, 0x01u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x89u8, 0x75u8, 0x55u8, 0x00u8, 0x7Cu8, 0x4Au8, 0x59u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0xA6u8, 0x71u8, 0x73u8, 0x0Au8, 0xC2u8, 0x00u8, 0x00u8, 0x00u8, 0x2Du8, + 0xF0u8, 0x1Au8, 0x13u8, 0x42u8, 0x0Au8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x7Du8, 0x4Au8, + 0x59u8, 0x00u8, 0xC8u8, 0xB3u8, 0x66u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xA6u8, 0x71u8, + 0x73u8, 0x0Au8, 0xC2u8, 0x00u8, 0x00u8, 0x00u8, 0x2Du8, 0xF0u8, 0x1Au8, 0x13u8, 0x42u8, + 0x2Du8, 0x01u8, 0x00u8, 0x00u8, 0x03u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, + 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0xC9u8, 0xB3u8, 0x66u8, 0x00u8, 0x2Cu8, 0x8Bu8, + 0xA5u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xA6u8, 0x71u8, 0x73u8, 0x0Au8, 0xC2u8, 0x00u8, + 0x00u8, 0x00u8, 0x2Du8, 0xF0u8, 0x1Au8, 0x13u8, 0x42u8, 0x8Fu8, 0x01u8, 0x00u8, 0x00u8, 0x03u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, - 0x00u8, 0x2du8, 0x8bu8, 0xa5u8, 0x00u8, 0x90u8, 0x62u8, 0xe4u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0xa6u8, 0x71u8, 0x73u8, 0x0au8, 0xc2u8, 0x00u8, 0x00u8, 0x00u8, 0x2du8, 0xf0u8, - 0x1au8, 0x13u8, 0x42u8, 0xc7u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, - 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x91u8, 0x62u8, 0xe4u8, - 0x00u8, 0x9cu8, 0x62u8, 0xe4u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xa6u8, 0x71u8, 0x73u8, - 0x0au8, 0xc2u8, 0x00u8, 0x00u8, 0x00u8, 0x2du8, 0xf0u8, 0x1au8, 0x13u8, 0x42u8, 0x2bu8, + 0x00u8, 0x2Du8, 0x8Bu8, 0xA5u8, 0x00u8, 0x90u8, 0x62u8, 0xE4u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0xA6u8, 0x71u8, 0x73u8, 0x0Au8, 0xC2u8, 0x00u8, 0x00u8, 0x00u8, 0x2Du8, 0xF0u8, + 0x1Au8, 0x13u8, 0x42u8, 0xC7u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, + 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x91u8, 0x62u8, 0xE4u8, + 0x00u8, 0x9Cu8, 0x62u8, 0xE4u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xA6u8, 0x71u8, 0x73u8, + 0x0Au8, 0xC2u8, 0x00u8, 0x00u8, 0x00u8, 0x2Du8, 0xF0u8, 0x1Au8, 0x13u8, 0x42u8, 0x2Bu8, 0x01u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, - 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x9du8, 0x62u8, 0xe4u8, 0x00u8, 0xa8u8, 0x62u8, 0xe4u8, + 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x9Du8, 0x62u8, 0xE4u8, 0x00u8, 0xA8u8, 0x62u8, 0xE4u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, @@ -1514,55 +1514,55 @@ name is "19_spk") available from the NAIF website (http://naif.jpl.nasa.gov/tuto 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x44u8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4cu8, 0x45u8, 0x2du8, + 0x00u8, 0x44u8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4Cu8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2du8, - 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4cu8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2Du8, + 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4Cu8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, - 0x4cu8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, + 0x4Cu8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x44u8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4cu8, 0x45u8, 0x2du8, 0x30u8, + 0x44u8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4Cu8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2du8, 0x30u8, - 0x34u8, 0x33u8, 0x30u8, 0x4cu8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2Du8, 0x30u8, + 0x34u8, 0x33u8, 0x30u8, 0x4Cu8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4cu8, - 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4Cu8, + 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, - 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4cu8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, + 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4Cu8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, - 0x33u8, 0x30u8, 0x4cu8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, + 0x33u8, 0x30u8, 0x4Cu8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4cu8, 0x45u8, - 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4Cu8, 0x45u8, + 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, - 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4cu8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, + 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4Cu8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, - 0x30u8, 0x4cu8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, + 0x30u8, 0x4Cu8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x44u8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4cu8, 0x45u8, 0x2du8, + 0x20u8, 0x44u8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4Cu8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2du8, - 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4cu8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2Du8, + 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4Cu8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, - 0x4cu8, 0x45u8, 0x2du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, + 0x4Cu8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, @@ -1611,177 +1611,177 @@ name is "19_spk") available from the NAIF website (http://naif.jpl.nasa.gov/tuto ]; const COMMENT_AREA_SEGMENT: [u8; 2048] = [ - 0x00u8, 0x00u8, 0x53u8, 0x65u8, 0x70u8, 0x74u8, 0x65u8, 0x6du8, 0x62u8, 0x65u8, 0x72u8, - 0x20u8, 0x30u8, 0x33u8, 0x2cu8, 0x20u8, 0x32u8, 0x30u8, 0x31u8, 0x33u8, 0x00u8, 0x43u8, - 0x2eu8, 0x20u8, 0x41u8, 0x63u8, 0x74u8, 0x6fu8, 0x6eu8, 0x00u8, 0x00u8, 0x4au8, 0x50u8, - 0x4cu8, 0x27u8, 0x73u8, 0x20u8, 0x53u8, 0x6fu8, 0x6cu8, 0x61u8, 0x72u8, 0x20u8, 0x53u8, - 0x79u8, 0x73u8, 0x74u8, 0x65u8, 0x6du8, 0x20u8, 0x44u8, 0x79u8, 0x6eu8, 0x61u8, 0x6du8, - 0x69u8, 0x63u8, 0x73u8, 0x20u8, 0x47u8, 0x72u8, 0x6fu8, 0x75u8, 0x70u8, 0x20u8, 0x68u8, - 0x61u8, 0x73u8, 0x20u8, 0x72u8, 0x65u8, 0x6cu8, 0x65u8, 0x61u8, 0x73u8, 0x65u8, 0x64u8, - 0x20u8, 0x74u8, 0x77u8, 0x6fu8, 0x20u8, 0x6eu8, 0x65u8, 0x77u8, 0x20u8, 0x70u8, 0x6cu8, - 0x61u8, 0x6eu8, 0x65u8, 0x74u8, 0x61u8, 0x72u8, 0x79u8, 0x2fu8, 0x6cu8, 0x75u8, 0x6eu8, - 0x61u8, 0x72u8, 0x20u8, 0x65u8, 0x70u8, 0x68u8, 0x65u8, 0x6du8, 0x65u8, 0x72u8, 0x69u8, - 0x64u8, 0x65u8, 0x73u8, 0x2cu8, 0x00u8, 0x6eu8, 0x61u8, 0x6du8, 0x65u8, 0x64u8, 0x20u8, - 0x44u8, 0x45u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x61u8, 0x6eu8, 0x64u8, 0x20u8, 0x44u8, - 0x45u8, 0x34u8, 0x33u8, 0x31u8, 0x2eu8, 0x00u8, 0x00u8, 0x44u8, 0x45u8, 0x34u8, 0x33u8, - 0x30u8, 0x20u8, 0x69u8, 0x73u8, 0x20u8, 0x6eu8, 0x6fu8, 0x77u8, 0x20u8, 0x63u8, 0x6fu8, - 0x6eu8, 0x73u8, 0x69u8, 0x64u8, 0x65u8, 0x72u8, 0x65u8, 0x64u8, 0x20u8, 0x74u8, 0x68u8, - 0x65u8, 0x20u8, 0x6fu8, 0x66u8, 0x66u8, 0x69u8, 0x63u8, 0x69u8, 0x61u8, 0x6cu8, 0x20u8, - 0x65u8, 0x78u8, 0x70u8, 0x6fu8, 0x72u8, 0x74u8, 0x20u8, 0x6cu8, 0x75u8, 0x6eu8, 0x61u8, - 0x72u8, 0x2fu8, 0x70u8, 0x6cu8, 0x61u8, 0x6eu8, 0x65u8, 0x74u8, 0x61u8, 0x72u8, 0x79u8, - 0x20u8, 0x65u8, 0x70u8, 0x68u8, 0x65u8, 0x6du8, 0x65u8, 0x72u8, 0x69u8, 0x73u8, 0x2cu8, - 0x20u8, 0x73u8, 0x75u8, 0x69u8, 0x74u8, 0x61u8, 0x62u8, 0x6cu8, 0x65u8, 0x20u8, 0x66u8, - 0x6fu8, 0x72u8, 0x00u8, 0x61u8, 0x6cu8, 0x6cu8, 0x20u8, 0x75u8, 0x73u8, 0x65u8, 0x72u8, - 0x73u8, 0x2fu8, 0x75u8, 0x73u8, 0x65u8, 0x73u8, 0x2eu8, 0x20u8, 0x49u8, 0x74u8, 0x27u8, - 0x73u8, 0x20u8, 0x61u8, 0x70u8, 0x70u8, 0x72u8, 0x6fu8, 0x78u8, 0x69u8, 0x6du8, 0x61u8, - 0x74u8, 0x65u8, 0x20u8, 0x74u8, 0x69u8, 0x6du8, 0x65u8, 0x20u8, 0x73u8, 0x70u8, 0x61u8, - 0x6eu8, 0x20u8, 0x69u8, 0x73u8, 0x20u8, 0x31u8, 0x35u8, 0x35u8, 0x30u8, 0x20u8, 0x4au8, - 0x41u8, 0x4eu8, 0x20u8, 0x30u8, 0x31u8, 0x20u8, 0x74u8, 0x6fu8, 0x20u8, 0x32u8, 0x36u8, - 0x35u8, 0x30u8, 0x20u8, 0x4au8, 0x41u8, 0x4eu8, 0x20u8, 0x32u8, 0x32u8, 0x2eu8, 0x00u8, - 0x00u8, 0x49u8, 0x66u8, 0x20u8, 0x61u8, 0x20u8, 0x6cu8, 0x6fu8, 0x6eu8, 0x67u8, 0x65u8, - 0x72u8, 0x20u8, 0x74u8, 0x69u8, 0x6du8, 0x65u8, 0x20u8, 0x73u8, 0x70u8, 0x61u8, 0x6eu8, - 0x20u8, 0x69u8, 0x73u8, 0x20u8, 0x6eu8, 0x65u8, 0x65u8, 0x64u8, 0x65u8, 0x64u8, 0x2cu8, - 0x20u8, 0x44u8, 0x45u8, 0x34u8, 0x33u8, 0x31u8, 0x20u8, 0x6du8, 0x61u8, 0x79u8, 0x20u8, - 0x62u8, 0x65u8, 0x20u8, 0x75u8, 0x73u8, 0x65u8, 0x64u8, 0x2cu8, 0x20u8, 0x65u8, 0x78u8, + 0x00u8, 0x00u8, 0x53u8, 0x65u8, 0x70u8, 0x74u8, 0x65u8, 0x6Du8, 0x62u8, 0x65u8, 0x72u8, + 0x20u8, 0x30u8, 0x33u8, 0x2Cu8, 0x20u8, 0x32u8, 0x30u8, 0x31u8, 0x33u8, 0x00u8, 0x43u8, + 0x2Eu8, 0x20u8, 0x41u8, 0x63u8, 0x74u8, 0x6Fu8, 0x6Eu8, 0x00u8, 0x00u8, 0x4Au8, 0x50u8, + 0x4Cu8, 0x27u8, 0x73u8, 0x20u8, 0x53u8, 0x6Fu8, 0x6Cu8, 0x61u8, 0x72u8, 0x20u8, 0x53u8, + 0x79u8, 0x73u8, 0x74u8, 0x65u8, 0x6Du8, 0x20u8, 0x44u8, 0x79u8, 0x6Eu8, 0x61u8, 0x6Du8, + 0x69u8, 0x63u8, 0x73u8, 0x20u8, 0x47u8, 0x72u8, 0x6Fu8, 0x75u8, 0x70u8, 0x20u8, 0x68u8, + 0x61u8, 0x73u8, 0x20u8, 0x72u8, 0x65u8, 0x6Cu8, 0x65u8, 0x61u8, 0x73u8, 0x65u8, 0x64u8, + 0x20u8, 0x74u8, 0x77u8, 0x6Fu8, 0x20u8, 0x6Eu8, 0x65u8, 0x77u8, 0x20u8, 0x70u8, 0x6Cu8, + 0x61u8, 0x6Eu8, 0x65u8, 0x74u8, 0x61u8, 0x72u8, 0x79u8, 0x2Fu8, 0x6Cu8, 0x75u8, 0x6Eu8, + 0x61u8, 0x72u8, 0x20u8, 0x65u8, 0x70u8, 0x68u8, 0x65u8, 0x6Du8, 0x65u8, 0x72u8, 0x69u8, + 0x64u8, 0x65u8, 0x73u8, 0x2Cu8, 0x00u8, 0x6Eu8, 0x61u8, 0x6Du8, 0x65u8, 0x64u8, 0x20u8, + 0x44u8, 0x45u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x61u8, 0x6Eu8, 0x64u8, 0x20u8, 0x44u8, + 0x45u8, 0x34u8, 0x33u8, 0x31u8, 0x2Eu8, 0x00u8, 0x00u8, 0x44u8, 0x45u8, 0x34u8, 0x33u8, + 0x30u8, 0x20u8, 0x69u8, 0x73u8, 0x20u8, 0x6Eu8, 0x6Fu8, 0x77u8, 0x20u8, 0x63u8, 0x6Fu8, + 0x6Eu8, 0x73u8, 0x69u8, 0x64u8, 0x65u8, 0x72u8, 0x65u8, 0x64u8, 0x20u8, 0x74u8, 0x68u8, + 0x65u8, 0x20u8, 0x6Fu8, 0x66u8, 0x66u8, 0x69u8, 0x63u8, 0x69u8, 0x61u8, 0x6Cu8, 0x20u8, + 0x65u8, 0x78u8, 0x70u8, 0x6Fu8, 0x72u8, 0x74u8, 0x20u8, 0x6Cu8, 0x75u8, 0x6Eu8, 0x61u8, + 0x72u8, 0x2Fu8, 0x70u8, 0x6Cu8, 0x61u8, 0x6Eu8, 0x65u8, 0x74u8, 0x61u8, 0x72u8, 0x79u8, + 0x20u8, 0x65u8, 0x70u8, 0x68u8, 0x65u8, 0x6Du8, 0x65u8, 0x72u8, 0x69u8, 0x73u8, 0x2Cu8, + 0x20u8, 0x73u8, 0x75u8, 0x69u8, 0x74u8, 0x61u8, 0x62u8, 0x6Cu8, 0x65u8, 0x20u8, 0x66u8, + 0x6Fu8, 0x72u8, 0x00u8, 0x61u8, 0x6Cu8, 0x6Cu8, 0x20u8, 0x75u8, 0x73u8, 0x65u8, 0x72u8, + 0x73u8, 0x2Fu8, 0x75u8, 0x73u8, 0x65u8, 0x73u8, 0x2Eu8, 0x20u8, 0x49u8, 0x74u8, 0x27u8, + 0x73u8, 0x20u8, 0x61u8, 0x70u8, 0x70u8, 0x72u8, 0x6Fu8, 0x78u8, 0x69u8, 0x6Du8, 0x61u8, + 0x74u8, 0x65u8, 0x20u8, 0x74u8, 0x69u8, 0x6Du8, 0x65u8, 0x20u8, 0x73u8, 0x70u8, 0x61u8, + 0x6Eu8, 0x20u8, 0x69u8, 0x73u8, 0x20u8, 0x31u8, 0x35u8, 0x35u8, 0x30u8, 0x20u8, 0x4Au8, + 0x41u8, 0x4Eu8, 0x20u8, 0x30u8, 0x31u8, 0x20u8, 0x74u8, 0x6Fu8, 0x20u8, 0x32u8, 0x36u8, + 0x35u8, 0x30u8, 0x20u8, 0x4Au8, 0x41u8, 0x4Eu8, 0x20u8, 0x32u8, 0x32u8, 0x2Eu8, 0x00u8, + 0x00u8, 0x49u8, 0x66u8, 0x20u8, 0x61u8, 0x20u8, 0x6Cu8, 0x6Fu8, 0x6Eu8, 0x67u8, 0x65u8, + 0x72u8, 0x20u8, 0x74u8, 0x69u8, 0x6Du8, 0x65u8, 0x20u8, 0x73u8, 0x70u8, 0x61u8, 0x6Eu8, + 0x20u8, 0x69u8, 0x73u8, 0x20u8, 0x6Eu8, 0x65u8, 0x65u8, 0x64u8, 0x65u8, 0x64u8, 0x2Cu8, + 0x20u8, 0x44u8, 0x45u8, 0x34u8, 0x33u8, 0x31u8, 0x20u8, 0x6Du8, 0x61u8, 0x79u8, 0x20u8, + 0x62u8, 0x65u8, 0x20u8, 0x75u8, 0x73u8, 0x65u8, 0x64u8, 0x2Cu8, 0x20u8, 0x65u8, 0x78u8, 0x63u8, 0x65u8, 0x70u8, 0x74u8, 0x20u8, 0x74u8, 0x68u8, 0x61u8, 0x74u8, 0x20u8, 0x74u8, - 0x68u8, 0x65u8, 0x20u8, 0x6cu8, 0x75u8, 0x6eu8, 0x61u8, 0x72u8, 0x20u8, 0x65u8, 0x70u8, - 0x68u8, 0x65u8, 0x6du8, 0x65u8, 0x72u8, 0x69u8, 0x73u8, 0x00u8, 0x70u8, 0x6fu8, 0x72u8, - 0x74u8, 0x69u8, 0x6fu8, 0x6eu8, 0x20u8, 0x69u8, 0x73u8, 0x20u8, 0x6fu8, 0x66u8, 0x20u8, - 0x72u8, 0x65u8, 0x6cu8, 0x61u8, 0x74u8, 0x69u8, 0x76u8, 0x65u8, 0x6cu8, 0x79u8, 0x20u8, - 0x70u8, 0x6fu8, 0x6fu8, 0x72u8, 0x20u8, 0x61u8, 0x63u8, 0x63u8, 0x75u8, 0x72u8, 0x61u8, - 0x63u8, 0x79u8, 0x20u8, 0x6fu8, 0x75u8, 0x74u8, 0x73u8, 0x69u8, 0x64u8, 0x65u8, 0x20u8, - 0x6fu8, 0x66u8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x74u8, 0x69u8, 0x6du8, 0x65u8, - 0x20u8, 0x73u8, 0x70u8, 0x61u8, 0x6eu8, 0x20u8, 0x63u8, 0x6fu8, 0x76u8, 0x65u8, 0x72u8, + 0x68u8, 0x65u8, 0x20u8, 0x6Cu8, 0x75u8, 0x6Eu8, 0x61u8, 0x72u8, 0x20u8, 0x65u8, 0x70u8, + 0x68u8, 0x65u8, 0x6Du8, 0x65u8, 0x72u8, 0x69u8, 0x73u8, 0x00u8, 0x70u8, 0x6Fu8, 0x72u8, + 0x74u8, 0x69u8, 0x6Fu8, 0x6Eu8, 0x20u8, 0x69u8, 0x73u8, 0x20u8, 0x6Fu8, 0x66u8, 0x20u8, + 0x72u8, 0x65u8, 0x6Cu8, 0x61u8, 0x74u8, 0x69u8, 0x76u8, 0x65u8, 0x6Cu8, 0x79u8, 0x20u8, + 0x70u8, 0x6Fu8, 0x6Fu8, 0x72u8, 0x20u8, 0x61u8, 0x63u8, 0x63u8, 0x75u8, 0x72u8, 0x61u8, + 0x63u8, 0x79u8, 0x20u8, 0x6Fu8, 0x75u8, 0x74u8, 0x73u8, 0x69u8, 0x64u8, 0x65u8, 0x20u8, + 0x6Fu8, 0x66u8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x74u8, 0x69u8, 0x6Du8, 0x65u8, + 0x20u8, 0x73u8, 0x70u8, 0x61u8, 0x6Eu8, 0x20u8, 0x63u8, 0x6Fu8, 0x76u8, 0x65u8, 0x72u8, 0x65u8, 0x64u8, 0x20u8, 0x62u8, 0x79u8, 0x20u8, 0x44u8, 0x45u8, 0x34u8, 0x33u8, 0x30u8, - 0x2eu8, 0x00u8, 0x54u8, 0x68u8, 0x65u8, 0x20u8, 0x74u8, 0x69u8, 0x6du8, 0x65u8, 0x20u8, - 0x73u8, 0x70u8, 0x61u8, 0x6eu8, 0x20u8, 0x63u8, 0x6fu8, 0x76u8, 0x65u8, 0x72u8, 0x65u8, + 0x2Eu8, 0x00u8, 0x54u8, 0x68u8, 0x65u8, 0x20u8, 0x74u8, 0x69u8, 0x6Du8, 0x65u8, 0x20u8, + 0x73u8, 0x70u8, 0x61u8, 0x6Eu8, 0x20u8, 0x63u8, 0x6Fu8, 0x76u8, 0x65u8, 0x72u8, 0x65u8, 0x64u8, 0x20u8, 0x62u8, 0x79u8, 0x20u8, 0x44u8, 0x45u8, 0x34u8, 0x33u8, 0x31u8, 0x20u8, - 0x69u8, 0x73u8, 0x20u8, 0x61u8, 0x70u8, 0x70u8, 0x72u8, 0x6fu8, 0x78u8, 0x69u8, 0x6du8, - 0x61u8, 0x74u8, 0x65u8, 0x6cu8, 0x79u8, 0x20u8, 0x31u8, 0x33u8, 0x32u8, 0x30u8, 0x32u8, - 0x20u8, 0x42u8, 0x2eu8, 0x43u8, 0x2eu8, 0x20u8, 0x74u8, 0x6fu8, 0x20u8, 0x31u8, 0x37u8, - 0x31u8, 0x39u8, 0x31u8, 0x20u8, 0x41u8, 0x2eu8, 0x44u8, 0x2eu8, 0x20u8, 0x42u8, 0x65u8, + 0x69u8, 0x73u8, 0x20u8, 0x61u8, 0x70u8, 0x70u8, 0x72u8, 0x6Fu8, 0x78u8, 0x69u8, 0x6Du8, + 0x61u8, 0x74u8, 0x65u8, 0x6Cu8, 0x79u8, 0x20u8, 0x31u8, 0x33u8, 0x32u8, 0x30u8, 0x32u8, + 0x20u8, 0x42u8, 0x2Eu8, 0x43u8, 0x2Eu8, 0x20u8, 0x74u8, 0x6Fu8, 0x20u8, 0x31u8, 0x37u8, + 0x31u8, 0x39u8, 0x31u8, 0x20u8, 0x41u8, 0x2Eu8, 0x44u8, 0x2Eu8, 0x20u8, 0x42u8, 0x65u8, 0x63u8, 0x61u8, 0x75u8, 0x73u8, 0x65u8, 0x20u8, 0x64u8, 0x65u8, 0x34u8, 0x33u8, 0x31u8, - 0x00u8, 0x69u8, 0x73u8, 0x20u8, 0x73u8, 0x6fu8, 0x20u8, 0x6cu8, 0x6fu8, 0x6eu8, 0x67u8, - 0x2cu8, 0x20u8, 0x6cu8, 0x65u8, 0x61u8, 0x64u8, 0x69u8, 0x6eu8, 0x67u8, 0x20u8, 0x74u8, - 0x6fu8, 0x20u8, 0x61u8, 0x20u8, 0x68u8, 0x75u8, 0x67u8, 0x65u8, 0x20u8, 0x66u8, 0x69u8, - 0x6cu8, 0x65u8, 0x2cu8, 0x20u8, 0x69u8, 0x74u8, 0x20u8, 0x68u8, 0x61u8, 0x73u8, 0x20u8, - 0x62u8, 0x65u8, 0x65u8, 0x6eu8, 0x20u8, 0x73u8, 0x70u8, 0x6cu8, 0x69u8, 0x74u8, 0x20u8, - 0x69u8, 0x6eu8, 0x74u8, 0x6fu8, 0x20u8, 0x74u8, 0x77u8, 0x6fu8, 0x20u8, 0x70u8, 0x61u8, - 0x72u8, 0x74u8, 0x73u8, 0x20u8, 0x68u8, 0x61u8, 0x76u8, 0x69u8, 0x6eu8, 0x67u8, 0x20u8, - 0x74u8, 0x68u8, 0x65u8, 0x00u8, 0x61u8, 0x70u8, 0x70u8, 0x72u8, 0x6fu8, 0x78u8, 0x69u8, - 0x6du8, 0x61u8, 0x67u8, 0x74u8, 0x65u8, 0x20u8, 0x74u8, 0x69u8, 0x6du8, 0x65u8, 0x20u8, - 0x73u8, 0x70u8, 0x61u8, 0x6eu8, 0x73u8, 0x20u8, 0x6fu8, 0x66u8, 0x3au8, 0x00u8, 0x00u8, - 0x20u8, 0x20u8, 0x20u8, 0x31u8, 0x33u8, 0x32u8, 0x30u8, 0x32u8, 0x20u8, 0x42u8, 0x2eu8, - 0x43u8, 0x2eu8, 0x20u8, 0x74u8, 0x6fu8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x30u8, + 0x00u8, 0x69u8, 0x73u8, 0x20u8, 0x73u8, 0x6Fu8, 0x20u8, 0x6Cu8, 0x6Fu8, 0x6Eu8, 0x67u8, + 0x2Cu8, 0x20u8, 0x6Cu8, 0x65u8, 0x61u8, 0x64u8, 0x69u8, 0x6Eu8, 0x67u8, 0x20u8, 0x74u8, + 0x6Fu8, 0x20u8, 0x61u8, 0x20u8, 0x68u8, 0x75u8, 0x67u8, 0x65u8, 0x20u8, 0x66u8, 0x69u8, + 0x6Cu8, 0x65u8, 0x2Cu8, 0x20u8, 0x69u8, 0x74u8, 0x20u8, 0x68u8, 0x61u8, 0x73u8, 0x20u8, + 0x62u8, 0x65u8, 0x65u8, 0x6Eu8, 0x20u8, 0x73u8, 0x70u8, 0x6Cu8, 0x69u8, 0x74u8, 0x20u8, + 0x69u8, 0x6Eu8, 0x74u8, 0x6Fu8, 0x20u8, 0x74u8, 0x77u8, 0x6Fu8, 0x20u8, 0x70u8, 0x61u8, + 0x72u8, 0x74u8, 0x73u8, 0x20u8, 0x68u8, 0x61u8, 0x76u8, 0x69u8, 0x6Eu8, 0x67u8, 0x20u8, + 0x74u8, 0x68u8, 0x65u8, 0x00u8, 0x61u8, 0x70u8, 0x70u8, 0x72u8, 0x6Fu8, 0x78u8, 0x69u8, + 0x6Du8, 0x61u8, 0x67u8, 0x74u8, 0x65u8, 0x20u8, 0x74u8, 0x69u8, 0x6Du8, 0x65u8, 0x20u8, + 0x73u8, 0x70u8, 0x61u8, 0x6Eu8, 0x73u8, 0x20u8, 0x6Fu8, 0x66u8, 0x3Au8, 0x00u8, 0x00u8, + 0x20u8, 0x20u8, 0x20u8, 0x31u8, 0x33u8, 0x32u8, 0x30u8, 0x32u8, 0x20u8, 0x42u8, 0x2Eu8, + 0x43u8, 0x2Eu8, 0x20u8, 0x74u8, 0x6Fu8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x30u8, 0x00u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x30u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x74u8, 0x6fu8, 0x20u8, 0x31u8, 0x37u8, 0x31u8, 0x39u8, - 0x31u8, 0x20u8, 0x41u8, 0x2eu8, 0x44u8, 0x2eu8, 0x00u8, 0x00u8, 0x4du8, 0x6fu8, 0x72u8, - 0x65u8, 0x20u8, 0x64u8, 0x65u8, 0x74u8, 0x61u8, 0x69u8, 0x6cu8, 0x73u8, 0x20u8, 0x61u8, - 0x62u8, 0x6fu8, 0x75u8, 0x74u8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x73u8, 0x65u8, 0x20u8, - 0x65u8, 0x70u8, 0x68u8, 0x65u8, 0x6du8, 0x65u8, 0x72u8, 0x69u8, 0x73u8, 0x20u8, 0x66u8, - 0x69u8, 0x6cu8, 0x65u8, 0x73u8, 0x20u8, 0x61u8, 0x72u8, 0x65u8, 0x20u8, 0x63u8, 0x6fu8, - 0x6eu8, 0x74u8, 0x61u8, 0x69u8, 0x6eu8, 0x65u8, 0x64u8, 0x20u8, 0x69u8, 0x6eu8, 0x20u8, - 0x61u8, 0x63u8, 0x63u8, 0x6fu8, 0x6du8, 0x70u8, 0x61u8, 0x6eu8, 0x79u8, 0x69u8, 0x6eu8, - 0x67u8, 0x20u8, 0x64u8, 0x6fu8, 0x63u8, 0x75u8, 0x6du8, 0x65u8, 0x6eu8, 0x74u8, 0x61u8, - 0x74u8, 0x69u8, 0x6fu8, 0x6eu8, 0x00u8, 0x61u8, 0x76u8, 0x61u8, 0x69u8, 0x6cu8, 0x61u8, - 0x62u8, 0x6cu8, 0x65u8, 0x20u8, 0x6fu8, 0x6eu8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x20u8, - 0x4eu8, 0x41u8, 0x49u8, 0x46u8, 0x20u8, 0x73u8, 0x65u8, 0x72u8, 0x76u8, 0x65u8, 0x72u8, - 0x3au8, 0x20u8, 0x20u8, 0x68u8, 0x74u8, 0x74u8, 0x70u8, 0x3au8, 0x2fu8, 0x2fu8, 0x6eu8, - 0x61u8, 0x69u8, 0x66u8, 0x2eu8, 0x6au8, 0x70u8, 0x6cu8, 0x2eu8, 0x6eu8, 0x61u8, 0x73u8, - 0x61u8, 0x2eu8, 0x67u8, 0x6fu8, 0x76u8, 0x2fu8, 0x70u8, 0x75u8, 0x62u8, 0x2fu8, 0x6eu8, - 0x61u8, 0x69u8, 0x66u8, 0x2fu8, 0x67u8, 0x65u8, 0x6eu8, 0x65u8, 0x72u8, 0x69u8, 0x63u8, - 0x5fu8, 0x6bu8, 0x65u8, 0x72u8, 0x6eu8, 0x65u8, 0x6cu8, 0x73u8, 0x2fu8, 0x73u8, 0x70u8, - 0x6bu8, 0x2fu8, 0x70u8, 0x6cu8, 0x61u8, 0x6eu8, 0x65u8, 0x74u8, 0x73u8, 0x2fu8, 0x00u8, - 0x00u8, 0x00u8, 0x53u8, 0x70u8, 0x65u8, 0x63u8, 0x69u8, 0x61u8, 0x6cu8, 0x20u8, 0x6eu8, - 0x6fu8, 0x74u8, 0x65u8, 0x20u8, 0x72u8, 0x65u8, 0x67u8, 0x61u8, 0x72u8, 0x64u8, 0x69u8, - 0x6eu8, 0x67u8, 0x20u8, 0x4du8, 0x61u8, 0x72u8, 0x73u8, 0x3au8, 0x20u8, 0x20u8, 0x73u8, - 0x74u8, 0x61u8, 0x72u8, 0x74u8, 0x69u8, 0x6eu8, 0x67u8, 0x20u8, 0x77u8, 0x69u8, 0x74u8, + 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x74u8, 0x6Fu8, 0x20u8, 0x31u8, 0x37u8, 0x31u8, 0x39u8, + 0x31u8, 0x20u8, 0x41u8, 0x2Eu8, 0x44u8, 0x2Eu8, 0x00u8, 0x00u8, 0x4Du8, 0x6Fu8, 0x72u8, + 0x65u8, 0x20u8, 0x64u8, 0x65u8, 0x74u8, 0x61u8, 0x69u8, 0x6Cu8, 0x73u8, 0x20u8, 0x61u8, + 0x62u8, 0x6Fu8, 0x75u8, 0x74u8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x73u8, 0x65u8, 0x20u8, + 0x65u8, 0x70u8, 0x68u8, 0x65u8, 0x6Du8, 0x65u8, 0x72u8, 0x69u8, 0x73u8, 0x20u8, 0x66u8, + 0x69u8, 0x6Cu8, 0x65u8, 0x73u8, 0x20u8, 0x61u8, 0x72u8, 0x65u8, 0x20u8, 0x63u8, 0x6Fu8, + 0x6Eu8, 0x74u8, 0x61u8, 0x69u8, 0x6Eu8, 0x65u8, 0x64u8, 0x20u8, 0x69u8, 0x6Eu8, 0x20u8, + 0x61u8, 0x63u8, 0x63u8, 0x6Fu8, 0x6Du8, 0x70u8, 0x61u8, 0x6Eu8, 0x79u8, 0x69u8, 0x6Eu8, + 0x67u8, 0x20u8, 0x64u8, 0x6Fu8, 0x63u8, 0x75u8, 0x6Du8, 0x65u8, 0x6Eu8, 0x74u8, 0x61u8, + 0x74u8, 0x69u8, 0x6Fu8, 0x6Eu8, 0x00u8, 0x61u8, 0x76u8, 0x61u8, 0x69u8, 0x6Cu8, 0x61u8, + 0x62u8, 0x6Cu8, 0x65u8, 0x20u8, 0x6Fu8, 0x6Eu8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x20u8, + 0x4Eu8, 0x41u8, 0x49u8, 0x46u8, 0x20u8, 0x73u8, 0x65u8, 0x72u8, 0x76u8, 0x65u8, 0x72u8, + 0x3Au8, 0x20u8, 0x20u8, 0x68u8, 0x74u8, 0x74u8, 0x70u8, 0x3Au8, 0x2Fu8, 0x2Fu8, 0x6Eu8, + 0x61u8, 0x69u8, 0x66u8, 0x2Eu8, 0x6Au8, 0x70u8, 0x6Cu8, 0x2Eu8, 0x6Eu8, 0x61u8, 0x73u8, + 0x61u8, 0x2Eu8, 0x67u8, 0x6Fu8, 0x76u8, 0x2Fu8, 0x70u8, 0x75u8, 0x62u8, 0x2Fu8, 0x6Eu8, + 0x61u8, 0x69u8, 0x66u8, 0x2Fu8, 0x67u8, 0x65u8, 0x6Eu8, 0x65u8, 0x72u8, 0x69u8, 0x63u8, + 0x5Fu8, 0x6Bu8, 0x65u8, 0x72u8, 0x6Eu8, 0x65u8, 0x6Cu8, 0x73u8, 0x2Fu8, 0x73u8, 0x70u8, + 0x6Bu8, 0x2Fu8, 0x70u8, 0x6Cu8, 0x61u8, 0x6Eu8, 0x65u8, 0x74u8, 0x73u8, 0x2Fu8, 0x00u8, + 0x00u8, 0x00u8, 0x53u8, 0x70u8, 0x65u8, 0x63u8, 0x69u8, 0x61u8, 0x6Cu8, 0x20u8, 0x6Eu8, + 0x6Fu8, 0x74u8, 0x65u8, 0x20u8, 0x72u8, 0x65u8, 0x67u8, 0x61u8, 0x72u8, 0x64u8, 0x69u8, + 0x6Eu8, 0x67u8, 0x20u8, 0x4Du8, 0x61u8, 0x72u8, 0x73u8, 0x3Au8, 0x20u8, 0x20u8, 0x73u8, + 0x74u8, 0x61u8, 0x72u8, 0x74u8, 0x69u8, 0x6Eu8, 0x67u8, 0x20u8, 0x77u8, 0x69u8, 0x74u8, 0x68u8, 0x20u8, 0x74u8, 0x68u8, 0x69u8, 0x73u8, 0x20u8, 0x44u8, 0x45u8, 0x20u8, 0x66u8, - 0x69u8, 0x6cu8, 0x65u8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x6cu8, 0x6fu8, 0x63u8, - 0x61u8, 0x74u8, 0x69u8, 0x6fu8, 0x6eu8, 0x20u8, 0x6fu8, 0x66u8, 0x20u8, 0x4du8, 0x61u8, - 0x72u8, 0x73u8, 0x27u8, 0x20u8, 0x6du8, 0x61u8, 0x73u8, 0x73u8, 0x20u8, 0x63u8, 0x65u8, - 0x6eu8, 0x74u8, 0x65u8, 0x72u8, 0x00u8, 0x28u8, 0x4eu8, 0x41u8, 0x49u8, 0x46u8, 0x20u8, - 0x49u8, 0x44u8, 0x20u8, 0x3du8, 0x20u8, 0x34u8, 0x39u8, 0x39u8, 0x29u8, 0x20u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x69u8, 0x73u8, 0x20u8, 0x2au8, 0x4eu8, 0x4fu8, 0x54u8, 0x2au8, 0x20u8, 0x69u8, - 0x6eu8, 0x63u8, 0x6cu8, 0x75u8, 0x64u8, 0x65u8, 0x64u8, 0x3bu8, 0x20u8, 0x6fu8, 0x6eu8, - 0x6cu8, 0x79u8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x4du8, 0x61u8, 0x72u8, 0x73u8, - 0x20u8, 0x73u8, 0x79u8, 0x73u8, 0x74u8, 0x65u8, 0x6du8, 0x20u8, 0x62u8, 0x61u8, 0x72u8, - 0x79u8, 0x63u8, 0x65u8, 0x6eu8, 0x74u8, 0x65u8, 0x72u8, 0x20u8, 0x28u8, 0x49u8, 0x44u8, - 0x20u8, 0x3du8, 0x20u8, 0x34u8, 0x29u8, 0x20u8, 0x69u8, 0x73u8, 0x20u8, 0x70u8, 0x72u8, - 0x65u8, 0x73u8, 0x65u8, 0x6eu8, 0x74u8, 0x2eu8, 0x00u8, 0x54u8, 0x68u8, 0x65u8, 0x20u8, - 0x6fu8, 0x66u8, 0x66u8, 0x73u8, 0x65u8, 0x74u8, 0x20u8, 0x62u8, 0x65u8, 0x74u8, 0x77u8, - 0x65u8, 0x65u8, 0x6eu8, 0x20u8, 0x4du8, 0x61u8, 0x72u8, 0x73u8, 0x27u8, 0x20u8, 0x6du8, - 0x61u8, 0x73u8, 0x73u8, 0x20u8, 0x63u8, 0x65u8, 0x6eu8, 0x74u8, 0x65u8, 0x72u8, 0x20u8, - 0x61u8, 0x6eu8, 0x64u8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x4du8, 0x61u8, 0x72u8, - 0x73u8, 0x27u8, 0x20u8, 0x73u8, 0x79u8, 0x73u8, 0x74u8, 0x65u8, 0x6du8, 0x20u8, 0x62u8, - 0x61u8, 0x72u8, 0x79u8, 0x63u8, 0x65u8, 0x6eu8, 0x74u8, 0x65u8, 0x72u8, 0x20u8, 0x69u8, - 0x6eu8, 0x20u8, 0x44u8, 0x45u8, 0x34u8, 0x30u8, 0x33u8, 0x20u8, 0x69u8, 0x73u8, 0x20u8, - 0x71u8, 0x75u8, 0x69u8, 0x74u8, 0x65u8, 0x20u8, 0x73u8, 0x6du8, 0x61u8, 0x6cu8, 0x6cu8, - 0x00u8, 0x2du8, 0x2du8, 0x61u8, 0x62u8, 0x6fu8, 0x75u8, 0x74u8, 0x20u8, 0x32u8, 0x30u8, - 0x20u8, 0x63u8, 0x6du8, 0x2eu8, 0x2du8, 0x2du8, 0x73u8, 0x6fu8, 0x20u8, 0x6du8, 0x6fu8, + 0x69u8, 0x6Cu8, 0x65u8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x6Cu8, 0x6Fu8, 0x63u8, + 0x61u8, 0x74u8, 0x69u8, 0x6Fu8, 0x6Eu8, 0x20u8, 0x6Fu8, 0x66u8, 0x20u8, 0x4Du8, 0x61u8, + 0x72u8, 0x73u8, 0x27u8, 0x20u8, 0x6Du8, 0x61u8, 0x73u8, 0x73u8, 0x20u8, 0x63u8, 0x65u8, + 0x6Eu8, 0x74u8, 0x65u8, 0x72u8, 0x00u8, 0x28u8, 0x4Eu8, 0x41u8, 0x49u8, 0x46u8, 0x20u8, + 0x49u8, 0x44u8, 0x20u8, 0x3Du8, 0x20u8, 0x34u8, 0x39u8, 0x39u8, 0x29u8, 0x20u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x69u8, 0x73u8, 0x20u8, 0x2Au8, 0x4Eu8, 0x4Fu8, 0x54u8, 0x2Au8, 0x20u8, 0x69u8, + 0x6Eu8, 0x63u8, 0x6Cu8, 0x75u8, 0x64u8, 0x65u8, 0x64u8, 0x3Bu8, 0x20u8, 0x6Fu8, 0x6Eu8, + 0x6Cu8, 0x79u8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x4Du8, 0x61u8, 0x72u8, 0x73u8, + 0x20u8, 0x73u8, 0x79u8, 0x73u8, 0x74u8, 0x65u8, 0x6Du8, 0x20u8, 0x62u8, 0x61u8, 0x72u8, + 0x79u8, 0x63u8, 0x65u8, 0x6Eu8, 0x74u8, 0x65u8, 0x72u8, 0x20u8, 0x28u8, 0x49u8, 0x44u8, + 0x20u8, 0x3Du8, 0x20u8, 0x34u8, 0x29u8, 0x20u8, 0x69u8, 0x73u8, 0x20u8, 0x70u8, 0x72u8, + 0x65u8, 0x73u8, 0x65u8, 0x6Eu8, 0x74u8, 0x2Eu8, 0x00u8, 0x54u8, 0x68u8, 0x65u8, 0x20u8, + 0x6Fu8, 0x66u8, 0x66u8, 0x73u8, 0x65u8, 0x74u8, 0x20u8, 0x62u8, 0x65u8, 0x74u8, 0x77u8, + 0x65u8, 0x65u8, 0x6Eu8, 0x20u8, 0x4Du8, 0x61u8, 0x72u8, 0x73u8, 0x27u8, 0x20u8, 0x6Du8, + 0x61u8, 0x73u8, 0x73u8, 0x20u8, 0x63u8, 0x65u8, 0x6Eu8, 0x74u8, 0x65u8, 0x72u8, 0x20u8, + 0x61u8, 0x6Eu8, 0x64u8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x4Du8, 0x61u8, 0x72u8, + 0x73u8, 0x27u8, 0x20u8, 0x73u8, 0x79u8, 0x73u8, 0x74u8, 0x65u8, 0x6Du8, 0x20u8, 0x62u8, + 0x61u8, 0x72u8, 0x79u8, 0x63u8, 0x65u8, 0x6Eu8, 0x74u8, 0x65u8, 0x72u8, 0x20u8, 0x69u8, + 0x6Eu8, 0x20u8, 0x44u8, 0x45u8, 0x34u8, 0x30u8, 0x33u8, 0x20u8, 0x69u8, 0x73u8, 0x20u8, + 0x71u8, 0x75u8, 0x69u8, 0x74u8, 0x65u8, 0x20u8, 0x73u8, 0x6Du8, 0x61u8, 0x6Cu8, 0x6Cu8, + 0x00u8, 0x2Du8, 0x2Du8, 0x61u8, 0x62u8, 0x6Fu8, 0x75u8, 0x74u8, 0x20u8, 0x32u8, 0x30u8, + 0x20u8, 0x63u8, 0x6Du8, 0x2Eu8, 0x2Du8, 0x2Du8, 0x73u8, 0x6Fu8, 0x20u8, 0x6Du8, 0x6Fu8, 0x73u8, 0x74u8, 0x20u8, 0x53u8, 0x50u8, 0x49u8, 0x43u8, 0x45u8, 0x20u8, 0x75u8, 0x73u8, - 0x65u8, 0x72u8, 0x73u8, 0x20u8, 0x63u8, 0x6fu8, 0x75u8, 0x6cu8, 0x64u8, 0x20u8, 0x75u8, - 0x73u8, 0x65u8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x4du8, 0x61u8, 0x72u8, 0x73u8, - 0x20u8, 0x73u8, 0x79u8, 0x73u8, 0x74u8, 0x65u8, 0x6du8, 0x20u8, 0x62u8, 0x61u8, 0x72u8, - 0x79u8, 0x63u8, 0x65u8, 0x6eu8, 0x74u8, 0x65u8, 0x72u8, 0x20u8, 0x69u8, 0x6eu8, 0x20u8, - 0x70u8, 0x6cu8, 0x61u8, 0x63u8, 0x65u8, 0x20u8, 0x6fu8, 0x66u8, 0x20u8, 0x74u8, 0x68u8, - 0x65u8, 0x00u8, 0x4du8, 0x61u8, 0x72u8, 0x73u8, 0x20u8, 0x6du8, 0x61u8, 0x73u8, 0x73u8, - 0x20u8, 0x63u8, 0x65u8, 0x6eu8, 0x74u8, 0x65u8, 0x72u8, 0x2eu8, 0x20u8, 0x48u8, 0x6fu8, - 0x77u8, 0x65u8, 0x76u8, 0x65u8, 0x72u8, 0x2cu8, 0x20u8, 0x69u8, 0x66u8, 0x20u8, 0x79u8, - 0x6fu8, 0x75u8, 0x20u8, 0x77u8, 0x69u8, 0x73u8, 0x68u8, 0x2fu8, 0x6eu8, 0x65u8, 0x65u8, - 0x64u8, 0x20u8, 0x74u8, 0x6fu8, 0x20u8, 0x68u8, 0x61u8, 0x76u8, 0x65u8, 0x20u8, 0x74u8, - 0x68u8, 0x65u8, 0x20u8, 0x4du8, 0x61u8, 0x72u8, 0x73u8, 0x20u8, 0x6du8, 0x61u8, 0x73u8, - 0x73u8, 0x20u8, 0x63u8, 0x65u8, 0x6eu8, 0x74u8, 0x65u8, 0x72u8, 0x20u8, 0x61u8, 0x76u8, - 0x61u8, 0x69u8, 0x6cu8, 0x61u8, 0x62u8, 0x6cu8, 0x65u8, 0x20u8, 0x74u8, 0x6fu8, 0x20u8, - 0x79u8, 0x6fu8, 0x75u8, 0x72u8, 0x00u8, 0x70u8, 0x72u8, 0x6fu8, 0x67u8, 0x72u8, 0x61u8, - 0x6du8, 0x2cu8, 0x20u8, 0x79u8, 0x6fu8, 0x75u8, 0x27u8, 0x6cu8, 0x6cu8, 0x20u8, 0x6eu8, - 0x65u8, 0x65u8, 0x64u8, 0x20u8, 0x74u8, 0x6fu8, 0x20u8, 0x6cu8, 0x6fu8, 0x61u8, 0x64u8, - 0x20u8, 0x61u8, 0x20u8, 0x4du8, 0x61u8, 0x72u8, 0x73u8, 0x20u8, 0x73u8, 0x61u8, 0x74u8, - 0x65u8, 0x6cu8, 0x6cu8, 0x69u8, 0x74u8, 0x65u8, 0x20u8, 0x65u8, 0x70u8, 0x68u8, 0x65u8, - 0x6du8, 0x65u8, 0x72u8, 0x69u8, 0x73u8, 0x20u8, 0x66u8, 0x69u8, 0x6cu8, 0x65u8, 0x20u8, - 0x73u8, 0x75u8, 0x63u8, 0x68u8, 0x20u8, 0x61u8, 0x73u8, 0x20u8, 0x22u8, 0x6du8, 0x61u8, - 0x72u8, 0x30u8, 0x39u8, 0x37u8, 0x2eu8, 0x62u8, 0x73u8, 0x70u8, 0x22u8, 0x20u8, 0x69u8, - 0x6eu8, 0x20u8, 0x61u8, 0x64u8, 0x64u8, 0x69u8, 0x74u8, 0x69u8, 0x6fu8, 0x6eu8, 0x00u8, - 0x74u8, 0x6fu8, 0x20u8, 0x44u8, 0x45u8, 0x34u8, 0x33u8, 0x30u8, 0x2eu8, 0x20u8, 0x53u8, - 0x61u8, 0x74u8, 0x65u8, 0x6cu8, 0x6cu8, 0x69u8, 0x74u8, 0x65u8, 0x20u8, 0x65u8, 0x70u8, - 0x68u8, 0x65u8, 0x6du8, 0x65u8, 0x72u8, 0x69u8, 0x73u8, 0x20u8, 0x66u8, 0x69u8, 0x6cu8, + 0x65u8, 0x72u8, 0x73u8, 0x20u8, 0x63u8, 0x6Fu8, 0x75u8, 0x6Cu8, 0x64u8, 0x20u8, 0x75u8, + 0x73u8, 0x65u8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x4Du8, 0x61u8, 0x72u8, 0x73u8, + 0x20u8, 0x73u8, 0x79u8, 0x73u8, 0x74u8, 0x65u8, 0x6Du8, 0x20u8, 0x62u8, 0x61u8, 0x72u8, + 0x79u8, 0x63u8, 0x65u8, 0x6Eu8, 0x74u8, 0x65u8, 0x72u8, 0x20u8, 0x69u8, 0x6Eu8, 0x20u8, + 0x70u8, 0x6Cu8, 0x61u8, 0x63u8, 0x65u8, 0x20u8, 0x6Fu8, 0x66u8, 0x20u8, 0x74u8, 0x68u8, + 0x65u8, 0x00u8, 0x4Du8, 0x61u8, 0x72u8, 0x73u8, 0x20u8, 0x6Du8, 0x61u8, 0x73u8, 0x73u8, + 0x20u8, 0x63u8, 0x65u8, 0x6Eu8, 0x74u8, 0x65u8, 0x72u8, 0x2Eu8, 0x20u8, 0x48u8, 0x6Fu8, + 0x77u8, 0x65u8, 0x76u8, 0x65u8, 0x72u8, 0x2Cu8, 0x20u8, 0x69u8, 0x66u8, 0x20u8, 0x79u8, + 0x6Fu8, 0x75u8, 0x20u8, 0x77u8, 0x69u8, 0x73u8, 0x68u8, 0x2Fu8, 0x6Eu8, 0x65u8, 0x65u8, + 0x64u8, 0x20u8, 0x74u8, 0x6Fu8, 0x20u8, 0x68u8, 0x61u8, 0x76u8, 0x65u8, 0x20u8, 0x74u8, + 0x68u8, 0x65u8, 0x20u8, 0x4Du8, 0x61u8, 0x72u8, 0x73u8, 0x20u8, 0x6Du8, 0x61u8, 0x73u8, + 0x73u8, 0x20u8, 0x63u8, 0x65u8, 0x6Eu8, 0x74u8, 0x65u8, 0x72u8, 0x20u8, 0x61u8, 0x76u8, + 0x61u8, 0x69u8, 0x6Cu8, 0x61u8, 0x62u8, 0x6Cu8, 0x65u8, 0x20u8, 0x74u8, 0x6Fu8, 0x20u8, + 0x79u8, 0x6Fu8, 0x75u8, 0x72u8, 0x00u8, 0x70u8, 0x72u8, 0x6Fu8, 0x67u8, 0x72u8, 0x61u8, + 0x6Du8, 0x2Cu8, 0x20u8, 0x79u8, 0x6Fu8, 0x75u8, 0x27u8, 0x6Cu8, 0x6Cu8, 0x20u8, 0x6Eu8, + 0x65u8, 0x65u8, 0x64u8, 0x20u8, 0x74u8, 0x6Fu8, 0x20u8, 0x6Cu8, 0x6Fu8, 0x61u8, 0x64u8, + 0x20u8, 0x61u8, 0x20u8, 0x4Du8, 0x61u8, 0x72u8, 0x73u8, 0x20u8, 0x73u8, 0x61u8, 0x74u8, + 0x65u8, 0x6Cu8, 0x6Cu8, 0x69u8, 0x74u8, 0x65u8, 0x20u8, 0x65u8, 0x70u8, 0x68u8, 0x65u8, + 0x6Du8, 0x65u8, 0x72u8, 0x69u8, 0x73u8, 0x20u8, 0x66u8, 0x69u8, 0x6Cu8, 0x65u8, 0x20u8, + 0x73u8, 0x75u8, 0x63u8, 0x68u8, 0x20u8, 0x61u8, 0x73u8, 0x20u8, 0x22u8, 0x6Du8, 0x61u8, + 0x72u8, 0x30u8, 0x39u8, 0x37u8, 0x2Eu8, 0x62u8, 0x73u8, 0x70u8, 0x22u8, 0x20u8, 0x69u8, + 0x6Eu8, 0x20u8, 0x61u8, 0x64u8, 0x64u8, 0x69u8, 0x74u8, 0x69u8, 0x6Fu8, 0x6Eu8, 0x00u8, + 0x74u8, 0x6Fu8, 0x20u8, 0x44u8, 0x45u8, 0x34u8, 0x33u8, 0x30u8, 0x2Eu8, 0x20u8, 0x53u8, + 0x61u8, 0x74u8, 0x65u8, 0x6Cu8, 0x6Cu8, 0x69u8, 0x74u8, 0x65u8, 0x20u8, 0x65u8, 0x70u8, + 0x68u8, 0x65u8, 0x6Du8, 0x65u8, 0x72u8, 0x69u8, 0x73u8, 0x20u8, 0x66u8, 0x69u8, 0x6Cu8, 0x65u8, 0x73u8, 0x20u8, 0x61u8, 0x72u8, 0x65u8, 0x20u8, 0x61u8, 0x76u8, 0x61u8, 0x69u8, - 0x6cu8, 0x61u8, 0x62u8, 0x6cu8, 0x65u8, 0x20u8, 0x66u8, 0x72u8, 0x6fu8, 0x6du8, 0x20u8, - 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x4eu8, 0x41u8, 0x49u8, 0x46u8, 0x20u8, 0x73u8, 0x65u8, - 0x72u8, 0x76u8, 0x65u8, 0x72u8, 0x20u8, 0x68u8, 0x65u8, 0x72u8, 0x65u8, 0x3au8, 0x00u8, - 0x68u8, 0x74u8, 0x74u8, 0x70u8, 0x3au8, 0x2fu8, 0x2fu8, 0x6eu8, 0x61u8, 0x69u8, 0x66u8, - 0x2eu8, 0x6au8, 0x70u8, 0x6cu8, 0x2eu8, 0x6eu8, 0x61u8, 0x73u8, 0x61u8, 0x2eu8, 0x67u8, - 0x6fu8, 0x76u8, 0x2fu8, 0x70u8, 0x75u8, 0x62u8, 0x2fu8, 0x6eu8, 0x61u8, 0x69u8, 0x66u8, - 0x2fu8, 0x67u8, 0x65u8, 0x6eu8, 0x65u8, 0x72u8, 0x69u8, 0x63u8, 0x5fu8, 0x6bu8, 0x65u8, - 0x72u8, 0x6eu8, 0x65u8, 0x6cu8, 0x73u8, 0x2fu8, 0x73u8, 0x70u8, 0x6bu8, 0x2fu8, 0x73u8, - 0x61u8, 0x74u8, 0x65u8, 0x6cu8, 0x6cu8, 0x69u8, 0x74u8, 0x65u8, 0x73u8, 0x2fu8, 0x00u8, - 0x00u8, 0x00u8, 0x44u8, 0x65u8, 0x74u8, 0x61u8, 0x69u8, 0x6cu8, 0x73u8, 0x20u8, 0x61u8, - 0x62u8, 0x6fu8, 0x75u8, 0x74u8, 0x20u8, 0x53u8, 0x50u8, 0x49u8, 0x43u8, 0x45u8, 0x20u8, - 0x70u8, 0x6cu8, 0x61u8, 0x6eu8, 0x65u8, 0x74u8, 0x20u8, 0x61u8, 0x6eu8, 0x64u8, 0x20u8, - 0x73u8, 0x61u8, 0x74u8, 0x65u8, 0x6cu8, 0x6cu8, 0x69u8, 0x74u8, 0x65u8, 0x20u8, 0x65u8, - 0x70u8, 0x68u8, 0x65u8, 0x6du8, 0x65u8, 0x72u8, 0x69u8, 0x73u8, 0x20u8, 0x66u8, 0x69u8, - 0x6cu8, 0x65u8, 0x73u8, 0x2cu8, 0x20u8, 0x6bu8, 0x6eu8, 0x6fu8, 0x77u8, 0x6eu8, 0x20u8, - 0x61u8, 0x73u8, 0x20u8, 0x53u8, 0x50u8, 0x4bu8, 0x20u8, 0x66u8, 0x69u8, 0x6cu8, 0x65u8, - 0x73u8, 0x2cu8, 0x20u8, 0x69u8, 0x6eu8, 0x63u8, 0x6cu8, 0x75u8, 0x64u8, 0x69u8, 0x6eu8, - 0x67u8, 0x00u8, 0x68u8, 0x6fu8, 0x77u8, 0x20u8, 0x74u8, 0x6fu8, 0x20u8, 0x72u8, 0x65u8, - 0x61u8, 0x64u8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x6du8, 0x20u8, 0x75u8, 0x73u8, 0x69u8, - 0x6eu8, 0x67u8, 0x20u8, 0x53u8, 0x50u8, 0x49u8, 0x43u8, 0x45u8, 0x20u8, 0x54u8, 0x6fu8, - 0x6fu8, 0x6cu8, 0x6bu8, 0x69u8, 0x74u8, 0x20u8, 0x73u8, 0x6fu8, 0x66u8, 0x74u8, 0x77u8, - 0x61u8, 0x72u8, 0x65u8, 0x2cu8, 0x20u8, 0x6du8, 0x61u8, 0x79u8, 0x20u8, 0x62u8, 0x65u8, - 0x20u8, 0x66u8, 0x6fu8, 0x75u8, 0x6eu8, 0x64u8, 0x20u8, 0x69u8, 0x6eu8, 0x20u8, 0x74u8, - 0x68u8, 0x65u8, 0x20u8, 0x53u8, 0x50u8, 0x4bu8, 0x20u8, 0x74u8, 0x75u8, 0x74u8, 0x6fu8, - 0x72u8, 0x69u8, 0x61u8, 0x6cu8, 0x20u8, 0x28u8, 0x50u8, 0x44u8, 0x46u8, 0x20u8, 0x66u8, - 0x69u8, 0x6cu8, 0x65u8, 0x00u8, 0x6eu8, 0x61u8, 0x6du8, 0x65u8, 0x20u8, 0x69u8, 0x73u8, - 0x20u8, 0x22u8, 0x31u8, 0x39u8, 0x5fu8, 0x73u8, 0x70u8, 0x6bu8, 0x22u8, 0x29u8, 0x20u8, - 0x61u8, 0x76u8, 0x61u8, 0x69u8, 0x6cu8, 0x61u8, 0x62u8, 0x6cu8, 0x65u8, 0x20u8, 0x66u8, - 0x72u8, 0x6fu8, 0x6du8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x4eu8, 0x41u8, 0x49u8, + 0x6Cu8, 0x61u8, 0x62u8, 0x6Cu8, 0x65u8, 0x20u8, 0x66u8, 0x72u8, 0x6Fu8, 0x6Du8, 0x20u8, + 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x4Eu8, 0x41u8, 0x49u8, 0x46u8, 0x20u8, 0x73u8, 0x65u8, + 0x72u8, 0x76u8, 0x65u8, 0x72u8, 0x20u8, 0x68u8, 0x65u8, 0x72u8, 0x65u8, 0x3Au8, 0x00u8, + 0x68u8, 0x74u8, 0x74u8, 0x70u8, 0x3Au8, 0x2Fu8, 0x2Fu8, 0x6Eu8, 0x61u8, 0x69u8, 0x66u8, + 0x2Eu8, 0x6Au8, 0x70u8, 0x6Cu8, 0x2Eu8, 0x6Eu8, 0x61u8, 0x73u8, 0x61u8, 0x2Eu8, 0x67u8, + 0x6Fu8, 0x76u8, 0x2Fu8, 0x70u8, 0x75u8, 0x62u8, 0x2Fu8, 0x6Eu8, 0x61u8, 0x69u8, 0x66u8, + 0x2Fu8, 0x67u8, 0x65u8, 0x6Eu8, 0x65u8, 0x72u8, 0x69u8, 0x63u8, 0x5Fu8, 0x6Bu8, 0x65u8, + 0x72u8, 0x6Eu8, 0x65u8, 0x6Cu8, 0x73u8, 0x2Fu8, 0x73u8, 0x70u8, 0x6Bu8, 0x2Fu8, 0x73u8, + 0x61u8, 0x74u8, 0x65u8, 0x6Cu8, 0x6Cu8, 0x69u8, 0x74u8, 0x65u8, 0x73u8, 0x2Fu8, 0x00u8, + 0x00u8, 0x00u8, 0x44u8, 0x65u8, 0x74u8, 0x61u8, 0x69u8, 0x6Cu8, 0x73u8, 0x20u8, 0x61u8, + 0x62u8, 0x6Fu8, 0x75u8, 0x74u8, 0x20u8, 0x53u8, 0x50u8, 0x49u8, 0x43u8, 0x45u8, 0x20u8, + 0x70u8, 0x6Cu8, 0x61u8, 0x6Eu8, 0x65u8, 0x74u8, 0x20u8, 0x61u8, 0x6Eu8, 0x64u8, 0x20u8, + 0x73u8, 0x61u8, 0x74u8, 0x65u8, 0x6Cu8, 0x6Cu8, 0x69u8, 0x74u8, 0x65u8, 0x20u8, 0x65u8, + 0x70u8, 0x68u8, 0x65u8, 0x6Du8, 0x65u8, 0x72u8, 0x69u8, 0x73u8, 0x20u8, 0x66u8, 0x69u8, + 0x6Cu8, 0x65u8, 0x73u8, 0x2Cu8, 0x20u8, 0x6Bu8, 0x6Eu8, 0x6Fu8, 0x77u8, 0x6Eu8, 0x20u8, + 0x61u8, 0x73u8, 0x20u8, 0x53u8, 0x50u8, 0x4Bu8, 0x20u8, 0x66u8, 0x69u8, 0x6Cu8, 0x65u8, + 0x73u8, 0x2Cu8, 0x20u8, 0x69u8, 0x6Eu8, 0x63u8, 0x6Cu8, 0x75u8, 0x64u8, 0x69u8, 0x6Eu8, + 0x67u8, 0x00u8, 0x68u8, 0x6Fu8, 0x77u8, 0x20u8, 0x74u8, 0x6Fu8, 0x20u8, 0x72u8, 0x65u8, + 0x61u8, 0x64u8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x6Du8, 0x20u8, 0x75u8, 0x73u8, 0x69u8, + 0x6Eu8, 0x67u8, 0x20u8, 0x53u8, 0x50u8, 0x49u8, 0x43u8, 0x45u8, 0x20u8, 0x54u8, 0x6Fu8, + 0x6Fu8, 0x6Cu8, 0x6Bu8, 0x69u8, 0x74u8, 0x20u8, 0x73u8, 0x6Fu8, 0x66u8, 0x74u8, 0x77u8, + 0x61u8, 0x72u8, 0x65u8, 0x2Cu8, 0x20u8, 0x6Du8, 0x61u8, 0x79u8, 0x20u8, 0x62u8, 0x65u8, + 0x20u8, 0x66u8, 0x6Fu8, 0x75u8, 0x6Eu8, 0x64u8, 0x20u8, 0x69u8, 0x6Eu8, 0x20u8, 0x74u8, + 0x68u8, 0x65u8, 0x20u8, 0x53u8, 0x50u8, 0x4Bu8, 0x20u8, 0x74u8, 0x75u8, 0x74u8, 0x6Fu8, + 0x72u8, 0x69u8, 0x61u8, 0x6Cu8, 0x20u8, 0x28u8, 0x50u8, 0x44u8, 0x46u8, 0x20u8, 0x66u8, + 0x69u8, 0x6Cu8, 0x65u8, 0x00u8, 0x6Eu8, 0x61u8, 0x6Du8, 0x65u8, 0x20u8, 0x69u8, 0x73u8, + 0x20u8, 0x22u8, 0x31u8, 0x39u8, 0x5Fu8, 0x73u8, 0x70u8, 0x6Bu8, 0x22u8, 0x29u8, 0x20u8, + 0x61u8, 0x76u8, 0x61u8, 0x69u8, 0x6Cu8, 0x61u8, 0x62u8, 0x6Cu8, 0x65u8, 0x20u8, 0x66u8, + 0x72u8, 0x6Fu8, 0x6Du8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x4Eu8, 0x41u8, 0x49u8, 0x46u8, 0x20u8, 0x77u8, 0x65u8, 0x62u8, 0x73u8, 0x69u8, 0x74u8, 0x65u8, 0x20u8, 0x28u8, - 0x68u8, 0x74u8, 0x74u8, 0x70u8, 0x3au8, 0x2fu8, 0x2fu8, 0x6eu8, 0x61u8, 0x69u8, 0x66u8, - 0x2eu8, 0x6au8, 0x70u8, 0x6cu8, 0x2eu8, 0x6eu8, 0x61u8, 0x73u8, 0x61u8, 0x2eu8, 0x67u8, - 0x6fu8, 0x76u8, 0x2fu8, 0x74u8, 0x75u8, 0x74u8, 0x6fu8, 0x72u8, 0x69u8, 0x61u8, 0x6cu8, - 0x73u8, 0x2eu8, 0x68u8, 0x74u8, 0x6du8, 0x6cu8, 0x29u8, 0x2eu8, 0x00u8, 0x00u8, 0x00u8, + 0x68u8, 0x74u8, 0x74u8, 0x70u8, 0x3Au8, 0x2Fu8, 0x2Fu8, 0x6Eu8, 0x61u8, 0x69u8, 0x66u8, + 0x2Eu8, 0x6Au8, 0x70u8, 0x6Cu8, 0x2Eu8, 0x6Eu8, 0x61u8, 0x73u8, 0x61u8, 0x2Eu8, 0x67u8, + 0x6Fu8, 0x76u8, 0x2Fu8, 0x74u8, 0x75u8, 0x74u8, 0x6Fu8, 0x72u8, 0x69u8, 0x61u8, 0x6Cu8, + 0x73u8, 0x2Eu8, 0x68u8, 0x74u8, 0x6Du8, 0x6Cu8, 0x29u8, 0x2Eu8, 0x00u8, 0x00u8, 0x00u8, 0x04u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, From 0322cc0be8baade46bcd87311faa5ca2e1ec7ce6 Mon Sep 17 00:00:00 2001 From: Andrei Zisu Date: Sat, 4 Nov 2023 01:22:47 +0100 Subject: [PATCH 18/27] Use as casting to keep the pattern --- crates/lox_core/src/ephemeris/daf_spk/parser.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/lox_core/src/ephemeris/daf_spk/parser.rs b/crates/lox_core/src/ephemeris/daf_spk/parser.rs index 79d396ee..72da6104 100644 --- a/crates/lox_core/src/ephemeris/daf_spk/parser.rs +++ b/crates/lox_core/src/ephemeris/daf_spk/parser.rs @@ -298,8 +298,8 @@ pub fn parse_daf_summary_and_name_record_pair( double_precision_components, integer_components, }, - initial_address: initial_address.to_usize(), - final_address: final_address.to_usize(), + initial_address: initial_address as usize, + final_address: final_address as usize, }); } From ad36110e8ea59052b8cced5bba9f093b75cacc5d Mon Sep 17 00:00:00 2001 From: Andrei Zisu Date: Sat, 4 Nov 2023 01:22:59 +0100 Subject: [PATCH 19/27] Clean-up unused import --- crates/lox_core/src/ephemeris/daf_spk/parser.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/lox_core/src/ephemeris/daf_spk/parser.rs b/crates/lox_core/src/ephemeris/daf_spk/parser.rs index 72da6104..700df217 100644 --- a/crates/lox_core/src/ephemeris/daf_spk/parser.rs +++ b/crates/lox_core/src/ephemeris/daf_spk/parser.rs @@ -1,4 +1,4 @@ -use nom::{error::ErrorKind, ToUsize}; +use nom::error::ErrorKind; use nom::bytes::complete as nb; use nom::number::complete as nn; From d94a365f6311eead2197791566b68e8e2f8d6efb Mon Sep 17 00:00:00 2001 From: Andrei Zisu Date: Sat, 4 Nov 2023 01:23:15 +0100 Subject: [PATCH 20/27] Update tests for SPK segment parsing --- .../lox_core/src/ephemeris/daf_spk/parser.rs | 1993 ++++++++++------- 1 file changed, 1240 insertions(+), 753 deletions(-) diff --git a/crates/lox_core/src/ephemeris/daf_spk/parser.rs b/crates/lox_core/src/ephemeris/daf_spk/parser.rs index 700df217..6c1c702c 100644 --- a/crates/lox_core/src/ephemeris/daf_spk/parser.rs +++ b/crates/lox_core/src/ephemeris/daf_spk/parser.rs @@ -534,7 +534,7 @@ mod test { #[test] fn test_parse_daf_summary_and_name_record_pair() { let (_, summary_record) = parse_daf_summary_and_name_record_pair( - &SUMMARY_RECORD, + &FILE_CONTENTS[3072..5120], nom::number::Endianness::Little, 2, 6, @@ -546,7 +546,7 @@ mod test { #[test] fn test_parse_daf_comment_area() { - let (unparsed_string, comment) = parse_daf_comment_area(&COMMENT_AREA_SEGMENT, 2) + let (unparsed_string, comment) = parse_daf_comment_area(&FILE_CONTENTS[1024..3072], 2) .expect("Comment area parsing should succeed"); assert_eq!(unparsed_string.len(), 0); @@ -557,7 +557,7 @@ mod test { #[test] fn test_parse_daf_file_record() { let (unparsed_string, (endianness, file_record)) = - parse_daf_file_record(&FILE_RECORD_SEGMENT) + parse_daf_file_record(&FILE_CONTENTS[..1024]) .expect("File record parsing should succeed"); assert_eq!(unparsed_string.len(), 0); @@ -588,6 +588,14 @@ mod test { } } + #[ignore] + #[test] + fn test_parse_daf_spk_file_is_ok() { + let contents = std::fs::read("de430.bsp").unwrap(); + + assert!(parse_daf_spk(&contents).is_ok()); + } + fn get_expected_comment_string() -> String { r#"September 03, 2013 C. Acton @@ -628,6 +636,7 @@ name is "19_spk") available from the NAIF website (http://naif.jpl.nasa.gov/tuto } fn get_expected_spk() -> Spk { + // Values confirmed with JPLEphem.jp and python-jplephem Spk { file_record: DafFileRecord { locidw: "DAF/SPK".to_string(), @@ -684,274 +693,777 @@ name is "19_spk") available from the NAIF website (http://naif.jpl.nasa.gov/tuto ], }, comment: get_expected_comment_string(), - segments: vec![ - SpkSegment { - name: "DE-0430LE-0430".to_string(), - initial_epoch: -14200747200.0, - final_epoch: 20514081600.0, - target_id: 1, - center_id: 0, - reference_frame_id: 1, - data_type: 2, - initial_address: 641, - final_address: 2210500, - }, - SpkSegment { - name: "DE-0430LE-0430".to_string(), - initial_epoch: -14200747200.0, - final_epoch: 20514081600.0, - target_id: 2, - center_id: 0, - reference_frame_id: 1, - data_type: 2, - initial_address: 2210501, - final_address: 3014088, - }, - SpkSegment { - name: "DE-0430LE-0430".to_string(), - initial_epoch: -14200747200.0, - final_epoch: 20514081600.0, - target_id: 3, - center_id: 0, - reference_frame_id: 1, - data_type: 2, - initial_address: 3014089, - final_address: 4043684, - }, - SpkSegment { - name: "DE-0430LE-0430".to_string(), - initial_epoch: -14200747200.0, - final_epoch: 20514081600.0, - target_id: 4, - center_id: 0, - reference_frame_id: 1, - data_type: 2, - initial_address: 4043685, - final_address: 4483148, - }, - SpkSegment { - name: "DE-0430LE-0430".to_string(), - initial_epoch: -14200747200.0, - final_epoch: 20514081600.0, - target_id: 5, - center_id: 0, - reference_frame_id: 1, - data_type: 2, - initial_address: 4483149, - final_address: 4809608, - }, - SpkSegment { - name: "DE-0430LE-0430".to_string(), - initial_epoch: -14200747200.0, - final_epoch: 20514081600.0, - target_id: 6, - center_id: 0, - reference_frame_id: 1, - data_type: 2, - initial_address: 4809609, - final_address: 5098400, - }, - SpkSegment { - name: "DE-0430LE-0430".to_string(), - initial_epoch: -14200747200.0, - final_epoch: 20514081600.0, - target_id: 7, - center_id: 0, - reference_frame_id: 1, - data_type: 2, - initial_address: 5098401, - final_address: 5349524, + segments: vec![SpkSegment { + name: "DE-0430LE-0430".to_string(), + initial_epoch: -14200747200.0, + final_epoch: 20514081600.0, + target_id: 1, + center_id: 0, + reference_frame_id: 1, + data_type: 2, + initial_address: 641, + final_address: 1280, + data: SpkArray::Type2 { + records: vec![ + SpkType2Record { + x: vec![ + -45337598.32712886, + -11420944.697258519, + 1231640.8337434675, + 13474.686621275972, + -4516.487838379613, + 255.92773698003953, + -0.6852704163869968, + -1.186289041290495, + 0.10359080691773931, + -0.0024450355914312806, + -0.00037984826619000424, + 4.866121203130994e-5, + -2.0940028772635746e-6, + -1.1128208160400393e-7, + ], + y: vec![ + 19369938.44656301, + -12637982.109486885, + -560491.1149804397, + 75269.27662838619, + -1778.1593562220773, + -139.11079477516455, + 18.589407873398255, + -0.8470749615056106, + -0.025136377951734054, + 0.006832845296274551, + -0.0004590535913385917, + 5.317851604321568e-7, + 2.763684192830889e-6, + -2.5800884045558593e-7, + ], + z: vec![ + 15085572.533729337, + -5541486.962461706, + -428280.81049458525, + 38734.16963615925, + -474.28100346732754, + -101.07262002208887, + 9.987607796726845, + -0.32728192683015445, + -0.024284067540919708, + 0.003901376147416767, + -0.00020497975331372796, + -4.825361414826083e-6, + 1.693948385546482e-6, + -1.2582686566933554e-7, + ], + }, + SpkType2Record { + x: vec![ + -58449569.351693176, + -1800097.6887639922, + 1107930.6023072726, + -24766.34259255632, + -809.5258644486346, + 99.12917700968808, + -6.248044618744813, + 0.21641713799729656, + 0.0016499751844322543, + -0.0009274510372131162, + 8.000372257212273e-5, + -3.9756072002001035e-6, + 6.145431105172551e-8, + 1.0008661455878206e-8, + ], + y: vec![ + -7935720.979204208, + -14086536.219809037, + 136926.39656623837, + 40936.67997869476, + -1916.2731958592562, + 54.90763068538223, + 0.9048995628056529, + -0.2509084134758946, + 0.019117773815199555, + -0.0008500801852717656, + 7.62770401533323e-6, + 2.5586829899051993e-6, + -2.753091189940317e-7, + 1.6453893506401273e-8, + ], + z: vec![ + 1898385.1942239169, + -7324265.976069875, + -43287.182419830104, + 24436.04346304577, + -937.1533465759844, + 18.88014753122729, + 1.1386722295041676, + -0.15655757537582016, + 0.010024257990951446, + -0.0003560607620357178, + -4.331049116694897e-6, + 1.7821740868686663e-6, + -1.5334346647775201e-7, + 7.655421689274075e-9, + ], + }, + SpkType2Record { + x: vec![ + -54210897.94074123, + 5761909.474302993, + 777406.6366812486, + -28073.762491013582, + 121.63964967772013, + 12.083715502838807, + -1.653002384389899, + 0.09122771149628371, + -0.0039806132479455955, + 0.00011090320124970714, + 3.208770532420429e-7, + -3.086111778410841e-7, + 2.5750271455539576e-8, + -1.1242975305362077e-9, + ], + y: vec![ + -33770751.31370555, + -11464200.40064359, + 480029.461654695, + 18778.161983893195, + -916.1483800707576, + 37.85101299123708, + -1.1948239135585854, + 0.009935203283866965, + 0.0016042528603672538, + -0.00016422253688236636, + 9.711085809982569e-6, + -4.246183965796327e-7, + 1.1851050800781965e-8, + 3.905894854894403e-10, + ], + z: vec![ + -12326047.807205081, + -6719455.6659584055, + 174427.62741919362, + 12963.860927714393, + -501.4481801676182, + 18.921171942332254, + -0.46377127345030145, + -0.004278716845379022, + 0.0012736474960823164, + -9.924063032619023e-5, + 5.146289420109514e-6, + -1.9415079840488192e-7, + 3.450896117737893e-9, + 1.819059570466293e-10, + ], + }, + SpkType2Record { + x: vec![ + -37505891.58733246, + 10674488.54339679, + 455040.0736010689, + -25695.24376738423, + 113.81703928594601, + -7.925717470323576, + -0.34514522809375564, + 0.0176780815965851, + -0.0010531956678777052, + 4.514322215422244e-5, + -1.4448248877522545e-6, + 4.147204966378829e-8, + 6.312482379064945e-10, + 8.266830416632963e-11, + ], + y: vec![ + -52289262.29241685, + -6923680.138903326, + 637750.5106004501, + 8767.195085224153, + -409.200548600714, + 14.79991761561071, + -0.7183818860227476, + 0.014210457550526053, + -0.00046859577877625294, + -7.592577392189398e-6, + 7.777434254709131e-7, + -6.121607354123216e-8, + 2.661451379451677e-9, + -9.745279166627787e-10, + ], + z: vec![ + -23956693.94508471, + -4813309.998691719, + 292402.5132673988, + 7374.247209604691, + -230.21909153218752, + 8.726464815796334, + -0.3469500588730363, + 0.005723849852140356, + -0.00013937389776502555, + -8.79098050520026e-6, + 5.661431511840274e-7, + -3.7012971681646134e-8, + 1.7275326074056334e-9, + 2.647744718956467e-12, + ], + }, + SpkType2Record { + x: vec![ + -13480566.556582376, + 13098038.480735628, + 151264.9806054996, + -25476.58030891933, + -101.92493293828662, + -12.889820450709234, + -0.13746956986424033, + 0.0021899860484605447, + -6.102771135850726e-5, + 2.0203914290812262e-5, + 1.2401306222838308e-7, + 3.414370315475422e-8, + 6.113933096711511e-11, + -6.847536309069575e-11, + ], + y: vec![ + -60768703.66295594, + -1495202.6867775493, + 710699.0281462192, + 3754.081219384137, + -262.7478808422509, + 0.5057165515555004, + -0.5501353335248234, + -0.0026423962154335386, + -0.0005747023559221212, + -4.427521182666183e-6, + -2.2608106711907944e-7, + -2.077889269902425e-9, + 1.9965534065395228e-9, + -1.7723130627533263e-10, + ], + z: vec![ + -31001044.578021735, + -2172196.746889192, + 363207.4374640283, + 4677.273311438741, + -129.4495768022601, + 1.6230758048764975, + -0.2790110353336393, + -0.0016393935905534595, + -0.0003001401197731395, + -4.483326811276608e-6, + -1.3281815174391787e-7, + -4.685709180488663e-9, + 2.0915798921278826e-10, + 1.0123566576788687e-10, + ], + }, + SpkType2Record { + x: vec![ + 12924374.015098413, + 13036921.776594413, + -173258.67460110967, + -29322.559968570153, + -385.65279580845936, + -14.886368014428252, + 0.032080021355132285, + 0.016287548681964924, + 0.0012033591743594745, + 6.5773094877564e-5, + 2.552075542282858e-6, + 8.678130515258873e-8, + 1.4424526593101816e-9, + 8.481561628175781e-11, + ], + y: vec![ + -57983909.45103208, + 4294940.852419956, + 728370.1715333756, + -1151.356513103967, + -402.2354970834203, + -15.867069239763726, + -0.9161278285877755, + -0.02488481245885575, + -0.0008160331389670967, + -2.3656137324417096e-6, + 9.062712071296104e-7, + 8.465577138535719e-8, + 4.27633127160829e-9, + 6.586099007446288e-10, + ], + z: vec![ + -32286857.994901855, + 922700.2004467127, + 406705.6026941626, + 2464.488245095452, + -174.0636949697199, + -6.900606389564812, + -0.4920339971160255, + -0.01498370326892611, + -0.00056161731076134, + -8.1665411304901e-6, + 2.1587896504329588e-7, + 3.615726588487529e-8, + 1.8867080135302315e-9, + 6.753822366729298e-11, + ], + }, + SpkType2Record { + x: vec![ + 36409830.50565798, + 10117327.079638528, + -571151.4194038364, + -37563.17926341247, + -603.7807025768652, + -1.2081752304636253, + 1.568028009732732, + 0.11981831128613148, + 0.006256803697846111, + 0.0002222552080839927, + 2.371661165742397e-6, + -4.1003984878706727e-7, + -4.246271385183673e-8, + -2.140884834622074e-9, + ], + y: vec![ + -43709674.23762289, + 9923967.547431879, + 660828.826202368, + -11606.941139804172, + -1009.6836691174926, + -48.710551192440604, + -1.870529516169376, + -0.031933651917395375, + 0.0016547091763384166, + 0.00023129741041829377, + 1.544835685314219e-5, + 7.233327555162387e-7, + 1.9237101443426504e-8, + -4.723400496382733e-10, + ], + z: vec![ + -27137646.95744377, + 4231773.3597003305, + 412454.2316412725, + -2247.364291950567, + -475.17709608369734, + -25.85553272787237, + -1.1623769344020758, + -0.029613442794534588, + 0.00022571479137512476, + 0.000100040492847673, + 7.990148218873311e-6, + 4.2883476302382474e-7, + 1.5763466794390723e-8, + -2.856720293690054e-10, + ], + }, + SpkType2Record { + x: vec![ + 50543722.086727604, + 3599931.8894646326, + -1069755.3628819815, + -43737.09886475732, + 164.97450012878275, + 105.40651375456635, + 8.55469813080309, + 0.36590467785850955, + 0.0007971678655988924, + -0.0013822344209006461, + -0.00013287000051370035, + -6.7162339643467585e-6, + -5.9391362124116395e-8, + 2.4000988068303212e-8, + ], + y: vec![ + -19269185.716454018, + 14288380.206906335, + 384319.4620373969, + -38037.15054279719, + -2420.636919948095, + -84.68688187104273, + 0.4731449232651164, + 0.33945733423292934, + 0.02848960090423228, + 0.0012747729527165339, + 1.2336704218421914e-6, + -5.356377894611242e-6, + -5.226237790409592e-7, + -2.723298390425405e-8, + ], + z: vec![ + -15583889.594508631, + 7244035.831173811, + 317312.37891250395, + -15697.124584282366, + -1308.4974377707993, + -56.23908543773916, + -0.645794473447411, + 0.14265082540796215, + 0.01511275828687557, + 0.0008250912189995393, + 1.4607793651668574e-5, + -2.1519526344664532e-6, + -2.720837114530803e-7, + -1.6915798221638822e-8, + ], + }, + SpkType2Record { + x: vec![ + 47715161.385413, + -6765836.899970185, + -1465606.5161023152, + -10581.87372964701, + 4807.211552791774, + 343.9710037358144, + 2.4246758636389076, + -1.648672697688401, + -0.14393165092324786, + -0.0016606957917306442, + 0.0007746124393387002, + 7.591369608267796e-5, + 1.2175945888890173e-6, + -4.1804046500567263e-7, + ], + y: vec![ + 10404753.329928415, + 14779071.692198437, + -344210.7030515934, + -84226.8052209682, + -2583.8778640813425, + 164.8115854848478, + 24.30539430978275, + 0.9842641323600833, + -0.061475986403702304, + -0.010940818407565325, + -0.0005148133372302519, + 2.851152275335745e-5, + 5.894372589974007e-6, + 3.1205490724883324e-7, + ], + z: vec![ + 542318.7750979952, + 8594088.428959873, + -29727.188744053525, + -43815.874113158745, + -1882.9667458416272, + 51.797012526487116, + 12.710013263635187, + 0.6981068201687447, + -0.017679892337270447, + -0.005661512737256319, + -0.0003559310741837079, + 7.237817810727936e-6, + 3.016221773585502e-6, + 2.105018407145734e-7, + ], + }, + SpkType2Record { + x: vec![ + 23270918.979379125, + -17256716.368954264, + -954598.9755969029, + 101869.74273592202, + 6770.864790225536, + -404.3473796217518, + -52.99753919509793, + 1.3691602972264172, + 0.43925632684682697, + 0.0018346172940959047, + -0.0036142809423915173, + -0.00012491773418058397, + 2.828142086444596e-5, + 2.02650433691657e-6, + ], + y: vec![ + 33815823.653189495, + 7748953.55497174, + -1386443.8244291213, + -67045.26641936596, + 6049.759734071041, + 507.3469545124919, + -24.538365698424087, + -4.219212112047788, + 0.06532388690975224, + 0.03561010180824766, + 0.0005128648992871837, + -0.000292314096541678, + -1.34486238229468e-5, + 2.252218889725443e-6, + ], + z: vec![ + 15597350.020431643, + 5945649.545798879, + -639309.6247786926, + -46457.66020202247, + 2516.0791556047075, + 313.07375838137585, + -7.524554482312445, + -2.394293188546936, + -0.011274242477285907, + 0.018801936763089475, + 0.0006530328448389293, + -0.00014280604054292342, + -1.0142372145929214e-5, + 9.883364952693398e-7, + ], + }, + SpkType2Record { + x: vec![ + -14302112.478480183, + -19069919.56448197, + 515204.77798256016, + 110060.69037873248, + -5580.825240276621, + -370.2192777295126, + 48.86063157915018, + 0.3433868526053941, + -0.3689733210882523, + 0.014424822977178191, + 0.0022704585183469296, + -0.00022821024420895437, + -8.276206806577387e-6, + 2.406031793142807e-6, + ], + y: vec![ + 37127769.12752547, + -4490458.993168776, + -1451652.0030301881, + 54873.151509303076, + 5639.915091025177, + -490.94873651444885, + -13.34508901391277, + 3.8672966862522746, + -0.07771483028641848, + -0.025988013547959172, + 0.0018455519765964191, + 0.00012668340451298506, + -2.1807579234944036e-5, + -2.723247702600162e-8, + ], + z: vec![ + 21309842.14818654, + -392529.49609443726, + -828409.079766861, + 17714.073679264868, + 3594.2903651668257, + -223.0038885814632, + -12.24827254781346, + 2.0267775252913185, + -0.002714236959790189, + -0.015376585582127298, + 0.0007460432824687185, + 9.15335244786352e-5, + -1.0761861493761696e-5, + -2.6722360449168746e-7, + ], + }, + SpkType2Record { + x: vec![ + -45350344.168980576, + -11383349.691344053, + 1232277.6392773716, + 13199.32536501195, + -4497.195208447304, + 255.87672676675095, + -0.8110886216898764, + -1.1737944602604822, + 0.10326061177793994, + -0.0025024315740898176, + -0.0003717686519532686, + 4.828213004613172e-5, + -2.1153006377942852e-6, + -1.0663734226988474e-7, + ], + y: vec![ + 19224804.86125569, + -12654718.156929357, + -557057.1528215639, + 75163.12522116388, + -1788.8134345085332, + -137.42397399685794, + 18.500243622033917, + -0.8501479177967093, + -0.0242070325118841, + 0.006763728015186381, + -0.00045897874910957024, + 1.0308151299535684e-6, + 2.714271798917107e-6, + -2.567848133727514e-7, + ], + z: vec![ + 15021167.722862277, + -5554404.770343297, + -426515.7808066775, + 38706.450957135254, + -481.9905832453785, + -100.1671973654519, + 9.95325478448965, + -0.33023485740428854, + -0.023753716920769462, + 0.003870542044050555, + -0.000205785685419332, + -4.519405769857414e-6, + 1.6694911193365625e-6, + -1.2542045425680128e-7, + ], + }, + SpkType2Record { + x: vec![ + -58389226.22256667, + -1766054.6052030046, + 1106801.4567413135, + -24817.014284937664, + -801.9509565938666, + 98.56190425937514, + -6.225307809265943, + 0.2166308405314536, + 0.0015235918031991618, + -0.0009154264174046048, + 7.934582987812358e-5, + -3.963710165920319e-6, + 6.36383573374082e-8, + 9.61362055440764e-9, + ], + y: vec![ + -8091714.337427627, + -14081973.652760211, + 138810.8374249616, + 40820.06424547664, + -1912.170569517239, + 54.99316570351528, + 0.8782851315752163, + -0.248596524127064, + 0.019001665693900285, + -0.000848901463675118, + 8.060030376793692e-6, + 2.5078948861037383e-6, + -2.7242476898255323e-7, + 1.594140293923078e-8, + ], + z: vec![ + 1820428.2065686637, + -7325448.793696021, + -42163.3093941699, + 24379.16666021187, + -935.7589059008715, + 18.985238953105736, + 1.1220799638909078, + -0.1553450736857643, + 0.009975562024603925, + -0.0003567131372449493, + -4.030172364414252e-6, + 1.7540449870050126e-6, + -1.5196790376014343e-7, + 7.630701672941777e-9, + ], + }, + SpkType2Record { + x: vec![ + -54092426.04345092, + 5785867.736703381, + 776112.1568083934, + -28066.908030287876, + 122.603506733156, + 11.932401912329652, + -1.6433261659736709, + 0.09074605157091184, + -0.003965601544184511, + 0.00011096505553262233, + 2.6781404333806733e-7, + -3.037968216179319e-7, + 2.6331227830238215e-8, + -1.1234198172382371e-9, + ], + y: vec![ + -33906193.5251241, + -11449057.168716598, + 480896.6728461073, + 18721.70710881851, + -913.2813372009165, + 37.743845357251814, + -1.193841007569472, + 0.010130659052011168, + 0.0015820668574517652, + -0.00016276915666452104, + 9.640528130514774e-6, + -4.225407856969625e-7, + 1.1030750057785568e-8, + 5.757999958318061e-10, + ], + z: vec![ + -12399228.667557947, + -6713934.131973944, + 175026.40877961094, + 12933.041421377007, + -500.02031568076006, + 18.87986386969098, + -0.46425983354010003, + -0.004124182287322653, + 0.0012602487340585295, + -9.846948384070477e-5, + 5.11380993449563e-6, + -1.9349486950740913e-7, + 3.218807864676213e-9, + 1.9331843287510842e-10, + ], + }, + ], + init: 0, + intlen: 691200, + rsize: 44, + n: 14, }, - SpkSegment { - name: "DE-0430LE-0430".to_string(), - initial_epoch: -14200747200.0, - final_epoch: 20514081600.0, - target_id: 8, - center_id: 0, - reference_frame_id: 1, - data_type: 2, - initial_address: 5349525, - final_address: 5600648, - }, - SpkSegment { - name: "DE-0430LE-0430".to_string(), - initial_epoch: -14200747200.0, - final_epoch: 20514081600.0, - target_id: 9, - center_id: 0, - reference_frame_id: 1, - data_type: 2, - initial_address: 5600649, - final_address: 5851772, - }, - SpkSegment { - name: "DE-0430LE-0430".to_string(), - initial_epoch: -14200747200.0, - final_epoch: 20514081600.0, - target_id: 10, - center_id: 0, - reference_frame_id: 1, - data_type: 2, - initial_address: 5851773, - final_address: 6730696, - }, - SpkSegment { - name: "DE-0430LE-0430".to_string(), - initial_epoch: -14200747200.0, - final_epoch: 20514081600.0, - target_id: 301, - center_id: 3, - reference_frame_id: 1, - data_type: 2, - initial_address: 6730697, - final_address: 10849068, - }, - SpkSegment { - name: "DE-0430LE-0430".to_string(), - initial_epoch: -14200747200.0, - final_epoch: 20514081600.0, - target_id: 399, - center_id: 3, - reference_frame_id: 1, - data_type: 2, - initial_address: 10849069, - final_address: 14967440, - }, - SpkSegment { - name: "DE-0430LE-0430".to_string(), - initial_epoch: -14200747200.0, - final_epoch: 20514081600.0, - target_id: 199, - center_id: 1, - reference_frame_id: 1, - data_type: 2, - initial_address: 14967441, - final_address: 14967452, - }, - SpkSegment { - name: "DE-0430LE-0430".to_string(), - initial_epoch: -14200747200.0, - final_epoch: 20514081600.0, - target_id: 299, - center_id: 2, - reference_frame_id: 1, - data_type: 2, - initial_address: 14967453, - final_address: 14967464, - }, - ], + }], } } fn get_expected_summary_record() -> DafSummaryRecord { - // @TODO Find out if these values are correct by comparing to other libs DafSummaryRecord { next: 0, - count: 14, - summaries: vec![ - DafSummary { - name: "DE-0430LE-0430".to_string(), - components: DafComponents { - double_precision_components: vec![-14200747200.0, 20514081600.0], - integer_components: vec![1, 0, 1, 2, 641, 2210500], - }, - }, - DafSummary { - name: "DE-0430LE-0430".to_string(), - components: DafComponents { - double_precision_components: vec![-14200747200.0, 20514081600.0], - integer_components: vec![2, 0, 1, 2, 2210501, 3014088], - }, - }, - DafSummary { - name: "DE-0430LE-0430".to_string(), - components: DafComponents { - double_precision_components: vec![-14200747200.0, 20514081600.0], - integer_components: vec![3, 0, 1, 2, 3014089, 4043684], - }, + count: 1, + summaries: vec![DafSummary { + name: "DE-0430LE-0430".to_string(), + components: DafComponents { + double_precision_components: vec![-14200747200.0, 20514081600.0], + integer_components: vec![1, 0, 1, 2], }, - DafSummary { - name: "DE-0430LE-0430".to_string(), - components: DafComponents { - double_precision_components: vec![-14200747200.0, 20514081600.0], - integer_components: vec![4, 0, 1, 2, 4043685, 4483148], - }, - }, - DafSummary { - name: "DE-0430LE-0430".to_string(), - components: DafComponents { - double_precision_components: vec![-14200747200.0, 20514081600.0], - integer_components: vec![5, 0, 1, 2, 4483149, 4809608], - }, - }, - DafSummary { - name: "DE-0430LE-0430".to_string(), - components: DafComponents { - double_precision_components: vec![-14200747200.0, 20514081600.0], - integer_components: vec![6, 0, 1, 2, 4809609, 5098400], - }, - }, - DafSummary { - name: "DE-0430LE-0430".to_string(), - components: DafComponents { - double_precision_components: vec![-14200747200.0, 20514081600.0], - integer_components: vec![7, 0, 1, 2, 5098401, 5349524], - }, - }, - DafSummary { - name: "DE-0430LE-0430".to_string(), - components: DafComponents { - double_precision_components: vec![-14200747200.0, 20514081600.0], - integer_components: vec![8, 0, 1, 2, 5349525, 5600648], - }, - }, - DafSummary { - name: "DE-0430LE-0430".to_string(), - components: DafComponents { - double_precision_components: vec![-14200747200.0, 20514081600.0], - integer_components: vec![9, 0, 1, 2, 5600649, 5851772], - }, - }, - DafSummary { - name: "DE-0430LE-0430".to_string(), - components: DafComponents { - double_precision_components: vec![-14200747200.0, 20514081600.0], - integer_components: vec![10, 0, 1, 2, 5851773, 6730696], - }, - }, - DafSummary { - name: "DE-0430LE-0430".to_string(), - components: DafComponents { - double_precision_components: vec![-14200747200.0, 20514081600.0], - integer_components: vec![301, 3, 1, 2, 6730697, 10849068], - }, - }, - DafSummary { - name: "DE-0430LE-0430".to_string(), - components: DafComponents { - double_precision_components: vec![-14200747200.0, 20514081600.0], - integer_components: vec![399, 3, 1, 2, 10849069, 14967440], - }, - }, - DafSummary { - name: "DE-0430LE-0430".to_string(), - components: DafComponents { - double_precision_components: vec![-14200747200.0, 20514081600.0], - integer_components: vec![199, 1, 1, 2, 14967441, 14967452], - }, - }, - DafSummary { - name: "DE-0430LE-0430".to_string(), - components: DafComponents { - double_precision_components: vec![-14200747200.0, 20514081600.0], - integer_components: vec![299, 2, 1, 2, 14967453, 14967464], - }, - }, - ], + initial_address: 641, + final_address: 1280, + }], + } + } + + #[ignore] + #[test] + fn create_file_contents_array() { + // Use this function to generate the FILE_CONTENTS array below + + let mut contents = std::fs::read("de430.bsp").unwrap(); + + let size_of_u32: usize = std::mem::size_of::(); + let size_of_f64 = std::mem::size_of::(); + + // Override the segment count to just 1 to simplify testing + contents[3088..(3088 + size_of_f64)].copy_from_slice(&1f64.to_le_bytes()); + + // Override the final address so we can test with less data + let final_address = 1280usize; + contents[3132..(3132 + size_of_u32)].copy_from_slice(&(final_address as u32).to_le_bytes()); + + let final_index = final_address * size_of_f64; + let directory_data = &mut contents[final_index - 4 * size_of_f64..]; + + // Override the directory data so that the segment parser can find it + // We override n to be 14 instead of the original value + directory_data[..size_of_f64].copy_from_slice(&0f64.to_le_bytes()); // init + directory_data[size_of_f64..size_of_f64 * 2].copy_from_slice(&691200f64.to_le_bytes()); // intlen + directory_data[size_of_f64 * 2..size_of_f64 * 3].copy_from_slice(&44f64.to_le_bytes()); // rsize + directory_data[size_of_f64 * 3..size_of_f64 * 4].copy_from_slice(&14f64.to_le_bytes()); // n + + for item in contents.iter().take(10240) { + print!("0x{:02X}u8, ", item); } } - const FILE_CONTENTS: [u8; 5120] = [ + const FILE_CONTENTS: [u8; 10240] = [ 0x44u8, 0x41u8, 0x46u8, 0x2Fu8, 0x53u8, 0x50u8, 0x4Bu8, 0x20u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x06u8, 0x00u8, 0x00u8, 0x00u8, 0x4Eu8, 0x49u8, 0x4Fu8, 0x32u8, 0x53u8, 0x50u8, 0x4Bu8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, @@ -1233,10 +1745,10 @@ name is "19_spk") available from the NAIF website (http://naif.jpl.nasa.gov/tuto 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x2Cu8, 0x40u8, 0x00u8, 0x00u8, 0x00u8, 0xA6u8, 0x71u8, 0x73u8, + 0x00u8, 0x00u8, 0x00u8, 0xF0u8, 0x3Fu8, 0x00u8, 0x00u8, 0x00u8, 0xA6u8, 0x71u8, 0x73u8, 0x0Au8, 0xC2u8, 0x00u8, 0x00u8, 0x00u8, 0x2Du8, 0xF0u8, 0x1Au8, 0x13u8, 0x42u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, - 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x81u8, 0x02u8, 0x00u8, 0x00u8, 0xC4u8, 0xBAu8, 0x21u8, + 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x81u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x05u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xA6u8, 0x71u8, 0x73u8, 0x0Au8, 0xC2u8, 0x00u8, 0x00u8, 0x00u8, 0x2Du8, 0xF0u8, 0x1Au8, 0x13u8, 0x42u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, @@ -1417,496 +1929,471 @@ name is "19_spk") available from the NAIF website (http://naif.jpl.nasa.gov/tuto 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - ]; - - const SUMMARY_RECORD: [u8; 2048] = [ - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x2Cu8, 0x40u8, 0x00u8, 0x00u8, 0x00u8, 0xA6u8, 0x71u8, 0x73u8, 0x0Au8, 0xC2u8, 0x00u8, - 0x00u8, 0x00u8, 0x2Du8, 0xF0u8, 0x1Au8, 0x13u8, 0x42u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, - 0x00u8, 0x81u8, 0x02u8, 0x00u8, 0x00u8, 0xC4u8, 0xBAu8, 0x21u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0xA6u8, 0x71u8, 0x73u8, 0x0Au8, 0xC2u8, 0x00u8, 0x00u8, 0x00u8, 0x2Du8, 0xF0u8, - 0x1Au8, 0x13u8, 0x42u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0xC5u8, 0xBAu8, 0x21u8, - 0x00u8, 0xC8u8, 0xFDu8, 0x2Du8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xA6u8, 0x71u8, 0x73u8, - 0x0Au8, 0xC2u8, 0x00u8, 0x00u8, 0x00u8, 0x2Du8, 0xF0u8, 0x1Au8, 0x13u8, 0x42u8, 0x03u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, - 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0xC9u8, 0xFDu8, 0x2Du8, 0x00u8, 0xA4u8, 0xB3u8, 0x3Du8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xA6u8, 0x71u8, 0x73u8, 0x0Au8, 0xC2u8, 0x00u8, 0x00u8, - 0x00u8, 0x2Du8, 0xF0u8, 0x1Au8, 0x13u8, 0x42u8, 0x04u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, - 0xA5u8, 0xB3u8, 0x3Du8, 0x00u8, 0x4Cu8, 0x68u8, 0x44u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0xA6u8, 0x71u8, 0x73u8, 0x0Au8, 0xC2u8, 0x00u8, 0x00u8, 0x00u8, 0x2Du8, 0xF0u8, 0x1Au8, - 0x13u8, 0x42u8, 0x05u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, - 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x4Du8, 0x68u8, 0x44u8, 0x00u8, - 0x88u8, 0x63u8, 0x49u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xA6u8, 0x71u8, 0x73u8, 0x0Au8, - 0xC2u8, 0x00u8, 0x00u8, 0x00u8, 0x2Du8, 0xF0u8, 0x1Au8, 0x13u8, 0x42u8, 0x06u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x02u8, - 0x00u8, 0x00u8, 0x00u8, 0x89u8, 0x63u8, 0x49u8, 0x00u8, 0xA0u8, 0xCBu8, 0x4Du8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0xA6u8, 0x71u8, 0x73u8, 0x0Au8, 0xC2u8, 0x00u8, 0x00u8, 0x00u8, - 0x2Du8, 0xF0u8, 0x1Au8, 0x13u8, 0x42u8, 0x07u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0xA1u8, - 0xCBu8, 0x4Du8, 0x00u8, 0x94u8, 0xA0u8, 0x51u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xA6u8, - 0x71u8, 0x73u8, 0x0Au8, 0xC2u8, 0x00u8, 0x00u8, 0x00u8, 0x2Du8, 0xF0u8, 0x1Au8, 0x13u8, - 0x42u8, 0x08u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, 0x00u8, - 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x95u8, 0xA0u8, 0x51u8, 0x00u8, 0x88u8, - 0x75u8, 0x55u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xA6u8, 0x71u8, 0x73u8, 0x0Au8, 0xC2u8, - 0x00u8, 0x00u8, 0x00u8, 0x2Du8, 0xF0u8, 0x1Au8, 0x13u8, 0x42u8, 0x09u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, - 0x00u8, 0x00u8, 0x89u8, 0x75u8, 0x55u8, 0x00u8, 0x7Cu8, 0x4Au8, 0x59u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0xA6u8, 0x71u8, 0x73u8, 0x0Au8, 0xC2u8, 0x00u8, 0x00u8, 0x00u8, 0x2Du8, - 0xF0u8, 0x1Au8, 0x13u8, 0x42u8, 0x0Au8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x7Du8, 0x4Au8, - 0x59u8, 0x00u8, 0xC8u8, 0xB3u8, 0x66u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xA6u8, 0x71u8, - 0x73u8, 0x0Au8, 0xC2u8, 0x00u8, 0x00u8, 0x00u8, 0x2Du8, 0xF0u8, 0x1Au8, 0x13u8, 0x42u8, - 0x2Du8, 0x01u8, 0x00u8, 0x00u8, 0x03u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, - 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0xC9u8, 0xB3u8, 0x66u8, 0x00u8, 0x2Cu8, 0x8Bu8, - 0xA5u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xA6u8, 0x71u8, 0x73u8, 0x0Au8, 0xC2u8, 0x00u8, - 0x00u8, 0x00u8, 0x2Du8, 0xF0u8, 0x1Au8, 0x13u8, 0x42u8, 0x8Fu8, 0x01u8, 0x00u8, 0x00u8, - 0x03u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, - 0x00u8, 0x2Du8, 0x8Bu8, 0xA5u8, 0x00u8, 0x90u8, 0x62u8, 0xE4u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0xA6u8, 0x71u8, 0x73u8, 0x0Au8, 0xC2u8, 0x00u8, 0x00u8, 0x00u8, 0x2Du8, 0xF0u8, - 0x1Au8, 0x13u8, 0x42u8, 0xC7u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, - 0x01u8, 0x00u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x91u8, 0x62u8, 0xE4u8, - 0x00u8, 0x9Cu8, 0x62u8, 0xE4u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0xA6u8, 0x71u8, 0x73u8, - 0x0Au8, 0xC2u8, 0x00u8, 0x00u8, 0x00u8, 0x2Du8, 0xF0u8, 0x1Au8, 0x13u8, 0x42u8, 0x2Bu8, - 0x01u8, 0x00u8, 0x00u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x01u8, 0x00u8, 0x00u8, 0x00u8, - 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x9Du8, 0x62u8, 0xE4u8, 0x00u8, 0xA8u8, 0x62u8, 0xE4u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x44u8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4Cu8, 0x45u8, 0x2Du8, - 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2Du8, - 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4Cu8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, - 0x4Cu8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x44u8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4Cu8, 0x45u8, 0x2Du8, 0x30u8, - 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2Du8, 0x30u8, - 0x34u8, 0x33u8, 0x30u8, 0x4Cu8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4Cu8, - 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, - 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4Cu8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, - 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, - 0x33u8, 0x30u8, 0x4Cu8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4Cu8, 0x45u8, - 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, - 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4Cu8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, - 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, - 0x30u8, 0x4Cu8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x44u8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4Cu8, 0x45u8, 0x2Du8, - 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2Du8, - 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x4Cu8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x44u8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, - 0x4Cu8, 0x45u8, 0x2Du8, 0x30u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, - ]; - - const COMMENT_AREA_SEGMENT: [u8; 2048] = [ - 0x00u8, 0x00u8, 0x53u8, 0x65u8, 0x70u8, 0x74u8, 0x65u8, 0x6Du8, 0x62u8, 0x65u8, 0x72u8, - 0x20u8, 0x30u8, 0x33u8, 0x2Cu8, 0x20u8, 0x32u8, 0x30u8, 0x31u8, 0x33u8, 0x00u8, 0x43u8, - 0x2Eu8, 0x20u8, 0x41u8, 0x63u8, 0x74u8, 0x6Fu8, 0x6Eu8, 0x00u8, 0x00u8, 0x4Au8, 0x50u8, - 0x4Cu8, 0x27u8, 0x73u8, 0x20u8, 0x53u8, 0x6Fu8, 0x6Cu8, 0x61u8, 0x72u8, 0x20u8, 0x53u8, - 0x79u8, 0x73u8, 0x74u8, 0x65u8, 0x6Du8, 0x20u8, 0x44u8, 0x79u8, 0x6Eu8, 0x61u8, 0x6Du8, - 0x69u8, 0x63u8, 0x73u8, 0x20u8, 0x47u8, 0x72u8, 0x6Fu8, 0x75u8, 0x70u8, 0x20u8, 0x68u8, - 0x61u8, 0x73u8, 0x20u8, 0x72u8, 0x65u8, 0x6Cu8, 0x65u8, 0x61u8, 0x73u8, 0x65u8, 0x64u8, - 0x20u8, 0x74u8, 0x77u8, 0x6Fu8, 0x20u8, 0x6Eu8, 0x65u8, 0x77u8, 0x20u8, 0x70u8, 0x6Cu8, - 0x61u8, 0x6Eu8, 0x65u8, 0x74u8, 0x61u8, 0x72u8, 0x79u8, 0x2Fu8, 0x6Cu8, 0x75u8, 0x6Eu8, - 0x61u8, 0x72u8, 0x20u8, 0x65u8, 0x70u8, 0x68u8, 0x65u8, 0x6Du8, 0x65u8, 0x72u8, 0x69u8, - 0x64u8, 0x65u8, 0x73u8, 0x2Cu8, 0x00u8, 0x6Eu8, 0x61u8, 0x6Du8, 0x65u8, 0x64u8, 0x20u8, - 0x44u8, 0x45u8, 0x34u8, 0x33u8, 0x30u8, 0x20u8, 0x61u8, 0x6Eu8, 0x64u8, 0x20u8, 0x44u8, - 0x45u8, 0x34u8, 0x33u8, 0x31u8, 0x2Eu8, 0x00u8, 0x00u8, 0x44u8, 0x45u8, 0x34u8, 0x33u8, - 0x30u8, 0x20u8, 0x69u8, 0x73u8, 0x20u8, 0x6Eu8, 0x6Fu8, 0x77u8, 0x20u8, 0x63u8, 0x6Fu8, - 0x6Eu8, 0x73u8, 0x69u8, 0x64u8, 0x65u8, 0x72u8, 0x65u8, 0x64u8, 0x20u8, 0x74u8, 0x68u8, - 0x65u8, 0x20u8, 0x6Fu8, 0x66u8, 0x66u8, 0x69u8, 0x63u8, 0x69u8, 0x61u8, 0x6Cu8, 0x20u8, - 0x65u8, 0x78u8, 0x70u8, 0x6Fu8, 0x72u8, 0x74u8, 0x20u8, 0x6Cu8, 0x75u8, 0x6Eu8, 0x61u8, - 0x72u8, 0x2Fu8, 0x70u8, 0x6Cu8, 0x61u8, 0x6Eu8, 0x65u8, 0x74u8, 0x61u8, 0x72u8, 0x79u8, - 0x20u8, 0x65u8, 0x70u8, 0x68u8, 0x65u8, 0x6Du8, 0x65u8, 0x72u8, 0x69u8, 0x73u8, 0x2Cu8, - 0x20u8, 0x73u8, 0x75u8, 0x69u8, 0x74u8, 0x61u8, 0x62u8, 0x6Cu8, 0x65u8, 0x20u8, 0x66u8, - 0x6Fu8, 0x72u8, 0x00u8, 0x61u8, 0x6Cu8, 0x6Cu8, 0x20u8, 0x75u8, 0x73u8, 0x65u8, 0x72u8, - 0x73u8, 0x2Fu8, 0x75u8, 0x73u8, 0x65u8, 0x73u8, 0x2Eu8, 0x20u8, 0x49u8, 0x74u8, 0x27u8, - 0x73u8, 0x20u8, 0x61u8, 0x70u8, 0x70u8, 0x72u8, 0x6Fu8, 0x78u8, 0x69u8, 0x6Du8, 0x61u8, - 0x74u8, 0x65u8, 0x20u8, 0x74u8, 0x69u8, 0x6Du8, 0x65u8, 0x20u8, 0x73u8, 0x70u8, 0x61u8, - 0x6Eu8, 0x20u8, 0x69u8, 0x73u8, 0x20u8, 0x31u8, 0x35u8, 0x35u8, 0x30u8, 0x20u8, 0x4Au8, - 0x41u8, 0x4Eu8, 0x20u8, 0x30u8, 0x31u8, 0x20u8, 0x74u8, 0x6Fu8, 0x20u8, 0x32u8, 0x36u8, - 0x35u8, 0x30u8, 0x20u8, 0x4Au8, 0x41u8, 0x4Eu8, 0x20u8, 0x32u8, 0x32u8, 0x2Eu8, 0x00u8, - 0x00u8, 0x49u8, 0x66u8, 0x20u8, 0x61u8, 0x20u8, 0x6Cu8, 0x6Fu8, 0x6Eu8, 0x67u8, 0x65u8, - 0x72u8, 0x20u8, 0x74u8, 0x69u8, 0x6Du8, 0x65u8, 0x20u8, 0x73u8, 0x70u8, 0x61u8, 0x6Eu8, - 0x20u8, 0x69u8, 0x73u8, 0x20u8, 0x6Eu8, 0x65u8, 0x65u8, 0x64u8, 0x65u8, 0x64u8, 0x2Cu8, - 0x20u8, 0x44u8, 0x45u8, 0x34u8, 0x33u8, 0x31u8, 0x20u8, 0x6Du8, 0x61u8, 0x79u8, 0x20u8, - 0x62u8, 0x65u8, 0x20u8, 0x75u8, 0x73u8, 0x65u8, 0x64u8, 0x2Cu8, 0x20u8, 0x65u8, 0x78u8, - 0x63u8, 0x65u8, 0x70u8, 0x74u8, 0x20u8, 0x74u8, 0x68u8, 0x61u8, 0x74u8, 0x20u8, 0x74u8, - 0x68u8, 0x65u8, 0x20u8, 0x6Cu8, 0x75u8, 0x6Eu8, 0x61u8, 0x72u8, 0x20u8, 0x65u8, 0x70u8, - 0x68u8, 0x65u8, 0x6Du8, 0x65u8, 0x72u8, 0x69u8, 0x73u8, 0x00u8, 0x70u8, 0x6Fu8, 0x72u8, - 0x74u8, 0x69u8, 0x6Fu8, 0x6Eu8, 0x20u8, 0x69u8, 0x73u8, 0x20u8, 0x6Fu8, 0x66u8, 0x20u8, - 0x72u8, 0x65u8, 0x6Cu8, 0x61u8, 0x74u8, 0x69u8, 0x76u8, 0x65u8, 0x6Cu8, 0x79u8, 0x20u8, - 0x70u8, 0x6Fu8, 0x6Fu8, 0x72u8, 0x20u8, 0x61u8, 0x63u8, 0x63u8, 0x75u8, 0x72u8, 0x61u8, - 0x63u8, 0x79u8, 0x20u8, 0x6Fu8, 0x75u8, 0x74u8, 0x73u8, 0x69u8, 0x64u8, 0x65u8, 0x20u8, - 0x6Fu8, 0x66u8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x74u8, 0x69u8, 0x6Du8, 0x65u8, - 0x20u8, 0x73u8, 0x70u8, 0x61u8, 0x6Eu8, 0x20u8, 0x63u8, 0x6Fu8, 0x76u8, 0x65u8, 0x72u8, - 0x65u8, 0x64u8, 0x20u8, 0x62u8, 0x79u8, 0x20u8, 0x44u8, 0x45u8, 0x34u8, 0x33u8, 0x30u8, - 0x2Eu8, 0x00u8, 0x54u8, 0x68u8, 0x65u8, 0x20u8, 0x74u8, 0x69u8, 0x6Du8, 0x65u8, 0x20u8, - 0x73u8, 0x70u8, 0x61u8, 0x6Eu8, 0x20u8, 0x63u8, 0x6Fu8, 0x76u8, 0x65u8, 0x72u8, 0x65u8, - 0x64u8, 0x20u8, 0x62u8, 0x79u8, 0x20u8, 0x44u8, 0x45u8, 0x34u8, 0x33u8, 0x31u8, 0x20u8, - 0x69u8, 0x73u8, 0x20u8, 0x61u8, 0x70u8, 0x70u8, 0x72u8, 0x6Fu8, 0x78u8, 0x69u8, 0x6Du8, - 0x61u8, 0x74u8, 0x65u8, 0x6Cu8, 0x79u8, 0x20u8, 0x31u8, 0x33u8, 0x32u8, 0x30u8, 0x32u8, - 0x20u8, 0x42u8, 0x2Eu8, 0x43u8, 0x2Eu8, 0x20u8, 0x74u8, 0x6Fu8, 0x20u8, 0x31u8, 0x37u8, - 0x31u8, 0x39u8, 0x31u8, 0x20u8, 0x41u8, 0x2Eu8, 0x44u8, 0x2Eu8, 0x20u8, 0x42u8, 0x65u8, - 0x63u8, 0x61u8, 0x75u8, 0x73u8, 0x65u8, 0x20u8, 0x64u8, 0x65u8, 0x34u8, 0x33u8, 0x31u8, - 0x00u8, 0x69u8, 0x73u8, 0x20u8, 0x73u8, 0x6Fu8, 0x20u8, 0x6Cu8, 0x6Fu8, 0x6Eu8, 0x67u8, - 0x2Cu8, 0x20u8, 0x6Cu8, 0x65u8, 0x61u8, 0x64u8, 0x69u8, 0x6Eu8, 0x67u8, 0x20u8, 0x74u8, - 0x6Fu8, 0x20u8, 0x61u8, 0x20u8, 0x68u8, 0x75u8, 0x67u8, 0x65u8, 0x20u8, 0x66u8, 0x69u8, - 0x6Cu8, 0x65u8, 0x2Cu8, 0x20u8, 0x69u8, 0x74u8, 0x20u8, 0x68u8, 0x61u8, 0x73u8, 0x20u8, - 0x62u8, 0x65u8, 0x65u8, 0x6Eu8, 0x20u8, 0x73u8, 0x70u8, 0x6Cu8, 0x69u8, 0x74u8, 0x20u8, - 0x69u8, 0x6Eu8, 0x74u8, 0x6Fu8, 0x20u8, 0x74u8, 0x77u8, 0x6Fu8, 0x20u8, 0x70u8, 0x61u8, - 0x72u8, 0x74u8, 0x73u8, 0x20u8, 0x68u8, 0x61u8, 0x76u8, 0x69u8, 0x6Eu8, 0x67u8, 0x20u8, - 0x74u8, 0x68u8, 0x65u8, 0x00u8, 0x61u8, 0x70u8, 0x70u8, 0x72u8, 0x6Fu8, 0x78u8, 0x69u8, - 0x6Du8, 0x61u8, 0x67u8, 0x74u8, 0x65u8, 0x20u8, 0x74u8, 0x69u8, 0x6Du8, 0x65u8, 0x20u8, - 0x73u8, 0x70u8, 0x61u8, 0x6Eu8, 0x73u8, 0x20u8, 0x6Fu8, 0x66u8, 0x3Au8, 0x00u8, 0x00u8, - 0x20u8, 0x20u8, 0x20u8, 0x31u8, 0x33u8, 0x32u8, 0x30u8, 0x32u8, 0x20u8, 0x42u8, 0x2Eu8, - 0x43u8, 0x2Eu8, 0x20u8, 0x74u8, 0x6Fu8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x30u8, - 0x00u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x30u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x74u8, 0x6Fu8, 0x20u8, 0x31u8, 0x37u8, 0x31u8, 0x39u8, - 0x31u8, 0x20u8, 0x41u8, 0x2Eu8, 0x44u8, 0x2Eu8, 0x00u8, 0x00u8, 0x4Du8, 0x6Fu8, 0x72u8, - 0x65u8, 0x20u8, 0x64u8, 0x65u8, 0x74u8, 0x61u8, 0x69u8, 0x6Cu8, 0x73u8, 0x20u8, 0x61u8, - 0x62u8, 0x6Fu8, 0x75u8, 0x74u8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x73u8, 0x65u8, 0x20u8, - 0x65u8, 0x70u8, 0x68u8, 0x65u8, 0x6Du8, 0x65u8, 0x72u8, 0x69u8, 0x73u8, 0x20u8, 0x66u8, - 0x69u8, 0x6Cu8, 0x65u8, 0x73u8, 0x20u8, 0x61u8, 0x72u8, 0x65u8, 0x20u8, 0x63u8, 0x6Fu8, - 0x6Eu8, 0x74u8, 0x61u8, 0x69u8, 0x6Eu8, 0x65u8, 0x64u8, 0x20u8, 0x69u8, 0x6Eu8, 0x20u8, - 0x61u8, 0x63u8, 0x63u8, 0x6Fu8, 0x6Du8, 0x70u8, 0x61u8, 0x6Eu8, 0x79u8, 0x69u8, 0x6Eu8, - 0x67u8, 0x20u8, 0x64u8, 0x6Fu8, 0x63u8, 0x75u8, 0x6Du8, 0x65u8, 0x6Eu8, 0x74u8, 0x61u8, - 0x74u8, 0x69u8, 0x6Fu8, 0x6Eu8, 0x00u8, 0x61u8, 0x76u8, 0x61u8, 0x69u8, 0x6Cu8, 0x61u8, - 0x62u8, 0x6Cu8, 0x65u8, 0x20u8, 0x6Fu8, 0x6Eu8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x20u8, - 0x4Eu8, 0x41u8, 0x49u8, 0x46u8, 0x20u8, 0x73u8, 0x65u8, 0x72u8, 0x76u8, 0x65u8, 0x72u8, - 0x3Au8, 0x20u8, 0x20u8, 0x68u8, 0x74u8, 0x74u8, 0x70u8, 0x3Au8, 0x2Fu8, 0x2Fu8, 0x6Eu8, - 0x61u8, 0x69u8, 0x66u8, 0x2Eu8, 0x6Au8, 0x70u8, 0x6Cu8, 0x2Eu8, 0x6Eu8, 0x61u8, 0x73u8, - 0x61u8, 0x2Eu8, 0x67u8, 0x6Fu8, 0x76u8, 0x2Fu8, 0x70u8, 0x75u8, 0x62u8, 0x2Fu8, 0x6Eu8, - 0x61u8, 0x69u8, 0x66u8, 0x2Fu8, 0x67u8, 0x65u8, 0x6Eu8, 0x65u8, 0x72u8, 0x69u8, 0x63u8, - 0x5Fu8, 0x6Bu8, 0x65u8, 0x72u8, 0x6Eu8, 0x65u8, 0x6Cu8, 0x73u8, 0x2Fu8, 0x73u8, 0x70u8, - 0x6Bu8, 0x2Fu8, 0x70u8, 0x6Cu8, 0x61u8, 0x6Eu8, 0x65u8, 0x74u8, 0x73u8, 0x2Fu8, 0x00u8, - 0x00u8, 0x00u8, 0x53u8, 0x70u8, 0x65u8, 0x63u8, 0x69u8, 0x61u8, 0x6Cu8, 0x20u8, 0x6Eu8, - 0x6Fu8, 0x74u8, 0x65u8, 0x20u8, 0x72u8, 0x65u8, 0x67u8, 0x61u8, 0x72u8, 0x64u8, 0x69u8, - 0x6Eu8, 0x67u8, 0x20u8, 0x4Du8, 0x61u8, 0x72u8, 0x73u8, 0x3Au8, 0x20u8, 0x20u8, 0x73u8, - 0x74u8, 0x61u8, 0x72u8, 0x74u8, 0x69u8, 0x6Eu8, 0x67u8, 0x20u8, 0x77u8, 0x69u8, 0x74u8, - 0x68u8, 0x20u8, 0x74u8, 0x68u8, 0x69u8, 0x73u8, 0x20u8, 0x44u8, 0x45u8, 0x20u8, 0x66u8, - 0x69u8, 0x6Cu8, 0x65u8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x6Cu8, 0x6Fu8, 0x63u8, - 0x61u8, 0x74u8, 0x69u8, 0x6Fu8, 0x6Eu8, 0x20u8, 0x6Fu8, 0x66u8, 0x20u8, 0x4Du8, 0x61u8, - 0x72u8, 0x73u8, 0x27u8, 0x20u8, 0x6Du8, 0x61u8, 0x73u8, 0x73u8, 0x20u8, 0x63u8, 0x65u8, - 0x6Eu8, 0x74u8, 0x65u8, 0x72u8, 0x00u8, 0x28u8, 0x4Eu8, 0x41u8, 0x49u8, 0x46u8, 0x20u8, - 0x49u8, 0x44u8, 0x20u8, 0x3Du8, 0x20u8, 0x34u8, 0x39u8, 0x39u8, 0x29u8, 0x20u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x69u8, 0x73u8, 0x20u8, 0x2Au8, 0x4Eu8, 0x4Fu8, 0x54u8, 0x2Au8, 0x20u8, 0x69u8, - 0x6Eu8, 0x63u8, 0x6Cu8, 0x75u8, 0x64u8, 0x65u8, 0x64u8, 0x3Bu8, 0x20u8, 0x6Fu8, 0x6Eu8, - 0x6Cu8, 0x79u8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x4Du8, 0x61u8, 0x72u8, 0x73u8, - 0x20u8, 0x73u8, 0x79u8, 0x73u8, 0x74u8, 0x65u8, 0x6Du8, 0x20u8, 0x62u8, 0x61u8, 0x72u8, - 0x79u8, 0x63u8, 0x65u8, 0x6Eu8, 0x74u8, 0x65u8, 0x72u8, 0x20u8, 0x28u8, 0x49u8, 0x44u8, - 0x20u8, 0x3Du8, 0x20u8, 0x34u8, 0x29u8, 0x20u8, 0x69u8, 0x73u8, 0x20u8, 0x70u8, 0x72u8, - 0x65u8, 0x73u8, 0x65u8, 0x6Eu8, 0x74u8, 0x2Eu8, 0x00u8, 0x54u8, 0x68u8, 0x65u8, 0x20u8, - 0x6Fu8, 0x66u8, 0x66u8, 0x73u8, 0x65u8, 0x74u8, 0x20u8, 0x62u8, 0x65u8, 0x74u8, 0x77u8, - 0x65u8, 0x65u8, 0x6Eu8, 0x20u8, 0x4Du8, 0x61u8, 0x72u8, 0x73u8, 0x27u8, 0x20u8, 0x6Du8, - 0x61u8, 0x73u8, 0x73u8, 0x20u8, 0x63u8, 0x65u8, 0x6Eu8, 0x74u8, 0x65u8, 0x72u8, 0x20u8, - 0x61u8, 0x6Eu8, 0x64u8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x4Du8, 0x61u8, 0x72u8, - 0x73u8, 0x27u8, 0x20u8, 0x73u8, 0x79u8, 0x73u8, 0x74u8, 0x65u8, 0x6Du8, 0x20u8, 0x62u8, - 0x61u8, 0x72u8, 0x79u8, 0x63u8, 0x65u8, 0x6Eu8, 0x74u8, 0x65u8, 0x72u8, 0x20u8, 0x69u8, - 0x6Eu8, 0x20u8, 0x44u8, 0x45u8, 0x34u8, 0x30u8, 0x33u8, 0x20u8, 0x69u8, 0x73u8, 0x20u8, - 0x71u8, 0x75u8, 0x69u8, 0x74u8, 0x65u8, 0x20u8, 0x73u8, 0x6Du8, 0x61u8, 0x6Cu8, 0x6Cu8, - 0x00u8, 0x2Du8, 0x2Du8, 0x61u8, 0x62u8, 0x6Fu8, 0x75u8, 0x74u8, 0x20u8, 0x32u8, 0x30u8, - 0x20u8, 0x63u8, 0x6Du8, 0x2Eu8, 0x2Du8, 0x2Du8, 0x73u8, 0x6Fu8, 0x20u8, 0x6Du8, 0x6Fu8, - 0x73u8, 0x74u8, 0x20u8, 0x53u8, 0x50u8, 0x49u8, 0x43u8, 0x45u8, 0x20u8, 0x75u8, 0x73u8, - 0x65u8, 0x72u8, 0x73u8, 0x20u8, 0x63u8, 0x6Fu8, 0x75u8, 0x6Cu8, 0x64u8, 0x20u8, 0x75u8, - 0x73u8, 0x65u8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x4Du8, 0x61u8, 0x72u8, 0x73u8, - 0x20u8, 0x73u8, 0x79u8, 0x73u8, 0x74u8, 0x65u8, 0x6Du8, 0x20u8, 0x62u8, 0x61u8, 0x72u8, - 0x79u8, 0x63u8, 0x65u8, 0x6Eu8, 0x74u8, 0x65u8, 0x72u8, 0x20u8, 0x69u8, 0x6Eu8, 0x20u8, - 0x70u8, 0x6Cu8, 0x61u8, 0x63u8, 0x65u8, 0x20u8, 0x6Fu8, 0x66u8, 0x20u8, 0x74u8, 0x68u8, - 0x65u8, 0x00u8, 0x4Du8, 0x61u8, 0x72u8, 0x73u8, 0x20u8, 0x6Du8, 0x61u8, 0x73u8, 0x73u8, - 0x20u8, 0x63u8, 0x65u8, 0x6Eu8, 0x74u8, 0x65u8, 0x72u8, 0x2Eu8, 0x20u8, 0x48u8, 0x6Fu8, - 0x77u8, 0x65u8, 0x76u8, 0x65u8, 0x72u8, 0x2Cu8, 0x20u8, 0x69u8, 0x66u8, 0x20u8, 0x79u8, - 0x6Fu8, 0x75u8, 0x20u8, 0x77u8, 0x69u8, 0x73u8, 0x68u8, 0x2Fu8, 0x6Eu8, 0x65u8, 0x65u8, - 0x64u8, 0x20u8, 0x74u8, 0x6Fu8, 0x20u8, 0x68u8, 0x61u8, 0x76u8, 0x65u8, 0x20u8, 0x74u8, - 0x68u8, 0x65u8, 0x20u8, 0x4Du8, 0x61u8, 0x72u8, 0x73u8, 0x20u8, 0x6Du8, 0x61u8, 0x73u8, - 0x73u8, 0x20u8, 0x63u8, 0x65u8, 0x6Eu8, 0x74u8, 0x65u8, 0x72u8, 0x20u8, 0x61u8, 0x76u8, - 0x61u8, 0x69u8, 0x6Cu8, 0x61u8, 0x62u8, 0x6Cu8, 0x65u8, 0x20u8, 0x74u8, 0x6Fu8, 0x20u8, - 0x79u8, 0x6Fu8, 0x75u8, 0x72u8, 0x00u8, 0x70u8, 0x72u8, 0x6Fu8, 0x67u8, 0x72u8, 0x61u8, - 0x6Du8, 0x2Cu8, 0x20u8, 0x79u8, 0x6Fu8, 0x75u8, 0x27u8, 0x6Cu8, 0x6Cu8, 0x20u8, 0x6Eu8, - 0x65u8, 0x65u8, 0x64u8, 0x20u8, 0x74u8, 0x6Fu8, 0x20u8, 0x6Cu8, 0x6Fu8, 0x61u8, 0x64u8, - 0x20u8, 0x61u8, 0x20u8, 0x4Du8, 0x61u8, 0x72u8, 0x73u8, 0x20u8, 0x73u8, 0x61u8, 0x74u8, - 0x65u8, 0x6Cu8, 0x6Cu8, 0x69u8, 0x74u8, 0x65u8, 0x20u8, 0x65u8, 0x70u8, 0x68u8, 0x65u8, - 0x6Du8, 0x65u8, 0x72u8, 0x69u8, 0x73u8, 0x20u8, 0x66u8, 0x69u8, 0x6Cu8, 0x65u8, 0x20u8, - 0x73u8, 0x75u8, 0x63u8, 0x68u8, 0x20u8, 0x61u8, 0x73u8, 0x20u8, 0x22u8, 0x6Du8, 0x61u8, - 0x72u8, 0x30u8, 0x39u8, 0x37u8, 0x2Eu8, 0x62u8, 0x73u8, 0x70u8, 0x22u8, 0x20u8, 0x69u8, - 0x6Eu8, 0x20u8, 0x61u8, 0x64u8, 0x64u8, 0x69u8, 0x74u8, 0x69u8, 0x6Fu8, 0x6Eu8, 0x00u8, - 0x74u8, 0x6Fu8, 0x20u8, 0x44u8, 0x45u8, 0x34u8, 0x33u8, 0x30u8, 0x2Eu8, 0x20u8, 0x53u8, - 0x61u8, 0x74u8, 0x65u8, 0x6Cu8, 0x6Cu8, 0x69u8, 0x74u8, 0x65u8, 0x20u8, 0x65u8, 0x70u8, - 0x68u8, 0x65u8, 0x6Du8, 0x65u8, 0x72u8, 0x69u8, 0x73u8, 0x20u8, 0x66u8, 0x69u8, 0x6Cu8, - 0x65u8, 0x73u8, 0x20u8, 0x61u8, 0x72u8, 0x65u8, 0x20u8, 0x61u8, 0x76u8, 0x61u8, 0x69u8, - 0x6Cu8, 0x61u8, 0x62u8, 0x6Cu8, 0x65u8, 0x20u8, 0x66u8, 0x72u8, 0x6Fu8, 0x6Du8, 0x20u8, - 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x4Eu8, 0x41u8, 0x49u8, 0x46u8, 0x20u8, 0x73u8, 0x65u8, - 0x72u8, 0x76u8, 0x65u8, 0x72u8, 0x20u8, 0x68u8, 0x65u8, 0x72u8, 0x65u8, 0x3Au8, 0x00u8, - 0x68u8, 0x74u8, 0x74u8, 0x70u8, 0x3Au8, 0x2Fu8, 0x2Fu8, 0x6Eu8, 0x61u8, 0x69u8, 0x66u8, - 0x2Eu8, 0x6Au8, 0x70u8, 0x6Cu8, 0x2Eu8, 0x6Eu8, 0x61u8, 0x73u8, 0x61u8, 0x2Eu8, 0x67u8, - 0x6Fu8, 0x76u8, 0x2Fu8, 0x70u8, 0x75u8, 0x62u8, 0x2Fu8, 0x6Eu8, 0x61u8, 0x69u8, 0x66u8, - 0x2Fu8, 0x67u8, 0x65u8, 0x6Eu8, 0x65u8, 0x72u8, 0x69u8, 0x63u8, 0x5Fu8, 0x6Bu8, 0x65u8, - 0x72u8, 0x6Eu8, 0x65u8, 0x6Cu8, 0x73u8, 0x2Fu8, 0x73u8, 0x70u8, 0x6Bu8, 0x2Fu8, 0x73u8, - 0x61u8, 0x74u8, 0x65u8, 0x6Cu8, 0x6Cu8, 0x69u8, 0x74u8, 0x65u8, 0x73u8, 0x2Fu8, 0x00u8, - 0x00u8, 0x00u8, 0x44u8, 0x65u8, 0x74u8, 0x61u8, 0x69u8, 0x6Cu8, 0x73u8, 0x20u8, 0x61u8, - 0x62u8, 0x6Fu8, 0x75u8, 0x74u8, 0x20u8, 0x53u8, 0x50u8, 0x49u8, 0x43u8, 0x45u8, 0x20u8, - 0x70u8, 0x6Cu8, 0x61u8, 0x6Eu8, 0x65u8, 0x74u8, 0x20u8, 0x61u8, 0x6Eu8, 0x64u8, 0x20u8, - 0x73u8, 0x61u8, 0x74u8, 0x65u8, 0x6Cu8, 0x6Cu8, 0x69u8, 0x74u8, 0x65u8, 0x20u8, 0x65u8, - 0x70u8, 0x68u8, 0x65u8, 0x6Du8, 0x65u8, 0x72u8, 0x69u8, 0x73u8, 0x20u8, 0x66u8, 0x69u8, - 0x6Cu8, 0x65u8, 0x73u8, 0x2Cu8, 0x20u8, 0x6Bu8, 0x6Eu8, 0x6Fu8, 0x77u8, 0x6Eu8, 0x20u8, - 0x61u8, 0x73u8, 0x20u8, 0x53u8, 0x50u8, 0x4Bu8, 0x20u8, 0x66u8, 0x69u8, 0x6Cu8, 0x65u8, - 0x73u8, 0x2Cu8, 0x20u8, 0x69u8, 0x6Eu8, 0x63u8, 0x6Cu8, 0x75u8, 0x64u8, 0x69u8, 0x6Eu8, - 0x67u8, 0x00u8, 0x68u8, 0x6Fu8, 0x77u8, 0x20u8, 0x74u8, 0x6Fu8, 0x20u8, 0x72u8, 0x65u8, - 0x61u8, 0x64u8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x6Du8, 0x20u8, 0x75u8, 0x73u8, 0x69u8, - 0x6Eu8, 0x67u8, 0x20u8, 0x53u8, 0x50u8, 0x49u8, 0x43u8, 0x45u8, 0x20u8, 0x54u8, 0x6Fu8, - 0x6Fu8, 0x6Cu8, 0x6Bu8, 0x69u8, 0x74u8, 0x20u8, 0x73u8, 0x6Fu8, 0x66u8, 0x74u8, 0x77u8, - 0x61u8, 0x72u8, 0x65u8, 0x2Cu8, 0x20u8, 0x6Du8, 0x61u8, 0x79u8, 0x20u8, 0x62u8, 0x65u8, - 0x20u8, 0x66u8, 0x6Fu8, 0x75u8, 0x6Eu8, 0x64u8, 0x20u8, 0x69u8, 0x6Eu8, 0x20u8, 0x74u8, - 0x68u8, 0x65u8, 0x20u8, 0x53u8, 0x50u8, 0x4Bu8, 0x20u8, 0x74u8, 0x75u8, 0x74u8, 0x6Fu8, - 0x72u8, 0x69u8, 0x61u8, 0x6Cu8, 0x20u8, 0x28u8, 0x50u8, 0x44u8, 0x46u8, 0x20u8, 0x66u8, - 0x69u8, 0x6Cu8, 0x65u8, 0x00u8, 0x6Eu8, 0x61u8, 0x6Du8, 0x65u8, 0x20u8, 0x69u8, 0x73u8, - 0x20u8, 0x22u8, 0x31u8, 0x39u8, 0x5Fu8, 0x73u8, 0x70u8, 0x6Bu8, 0x22u8, 0x29u8, 0x20u8, - 0x61u8, 0x76u8, 0x61u8, 0x69u8, 0x6Cu8, 0x61u8, 0x62u8, 0x6Cu8, 0x65u8, 0x20u8, 0x66u8, - 0x72u8, 0x6Fu8, 0x6Du8, 0x20u8, 0x74u8, 0x68u8, 0x65u8, 0x20u8, 0x4Eu8, 0x41u8, 0x49u8, - 0x46u8, 0x20u8, 0x77u8, 0x65u8, 0x62u8, 0x73u8, 0x69u8, 0x74u8, 0x65u8, 0x20u8, 0x28u8, - 0x68u8, 0x74u8, 0x74u8, 0x70u8, 0x3Au8, 0x2Fu8, 0x2Fu8, 0x6Eu8, 0x61u8, 0x69u8, 0x66u8, - 0x2Eu8, 0x6Au8, 0x70u8, 0x6Cu8, 0x2Eu8, 0x6Eu8, 0x61u8, 0x73u8, 0x61u8, 0x2Eu8, 0x67u8, - 0x6Fu8, 0x76u8, 0x2Fu8, 0x74u8, 0x75u8, 0x74u8, 0x6Fu8, 0x72u8, 0x69u8, 0x61u8, 0x6Cu8, - 0x73u8, 0x2Eu8, 0x68u8, 0x74u8, 0x6Du8, 0x6Cu8, 0x29u8, 0x2Eu8, 0x00u8, 0x00u8, 0x00u8, - 0x04u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, - ]; - - // NASA NAIF spy returns the following values for the file record bytes below - // ================================================================== - // File Architecture : DAF - // Binary File Format : LTL-IEEE - // FTP Validation String : Present and Intact - // Internal File Name : NIO2SPK - // ID Word : DAF/SPK - // ND : 2 - // NI : 6 - // Forward Record Pointer : 4 - // Backward Record Pointer: 4 - // First Free Address : 14967465 - // ================================================================== - const FILE_RECORD_SEGMENT: [u8; 1024] = [ - 0x44u8, 0x41u8, 0x46u8, 0x2Fu8, 0x53u8, 0x50u8, 0x4Bu8, 0x20u8, 0x02u8, 0x00u8, 0x00u8, - 0x00u8, 0x06u8, 0x00u8, 0x00u8, 0x00u8, 0x4Eu8, 0x49u8, 0x4Fu8, 0x32u8, 0x53u8, 0x50u8, - 0x4Bu8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, - 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x04u8, - 0x00u8, 0x00u8, 0x00u8, 0x04u8, 0x00u8, 0x00u8, 0x00u8, 0xA9u8, 0x62u8, 0xE4u8, 0x00u8, - 0x4Cu8, 0x54u8, 0x4Cu8, 0x2Du8, 0x49u8, 0x45u8, 0x45u8, 0x45u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x46u8, 0x54u8, 0x50u8, 0x53u8, 0x54u8, - 0x52u8, 0x3Au8, 0x0Du8, 0x3Au8, 0x0Au8, 0x3Au8, 0x0Du8, 0x0Au8, 0x3Au8, 0x0Du8, 0x00u8, - 0x3Au8, 0x81u8, 0x3Au8, 0x10u8, 0xCEu8, 0x3Au8, 0x45u8, 0x4Eu8, 0x44u8, 0x46u8, 0x54u8, - 0x50u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, - 0x00u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x76u8, 0x47u8, 0x73u8, + 0x0Au8, 0xC2u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x18u8, 0x15u8, 0x41u8, 0xBCu8, + 0xF5u8, 0x9Du8, 0xF2u8, 0x5Fu8, 0x9Eu8, 0x85u8, 0xC1u8, 0x19u8, 0xF1u8, 0x4Fu8, 0x16u8, + 0xA2u8, 0xC8u8, 0x65u8, 0xC1u8, 0x3Eu8, 0x36u8, 0x70u8, 0xD5u8, 0x18u8, 0xCBu8, 0x32u8, + 0x41u8, 0x85u8, 0xBAu8, 0x34u8, 0xE3u8, 0x57u8, 0x51u8, 0xCAu8, 0x40u8, 0x2Cu8, 0xDEu8, + 0xF9u8, 0xE2u8, 0x7Cu8, 0xA4u8, 0xB1u8, 0xC0u8, 0xE8u8, 0x91u8, 0x76u8, 0x05u8, 0xB0u8, + 0xFDu8, 0x6Fu8, 0x40u8, 0xEFu8, 0x8Cu8, 0x69u8, 0x39u8, 0xBCu8, 0xEDu8, 0xE5u8, 0xBFu8, + 0x48u8, 0x22u8, 0xBFu8, 0x37u8, 0x0Au8, 0xFBu8, 0xF2u8, 0xBFu8, 0xBCu8, 0xC0u8, 0xE0u8, + 0x57u8, 0xEDu8, 0x84u8, 0xBAu8, 0x3Fu8, 0x08u8, 0x5Bu8, 0xE3u8, 0x7Cu8, 0x9Cu8, 0x07u8, + 0x64u8, 0xBFu8, 0x1Du8, 0x6Au8, 0x77u8, 0xE1u8, 0xCBu8, 0xE4u8, 0x38u8, 0xBFu8, 0x55u8, + 0xCDu8, 0x99u8, 0x83u8, 0x32u8, 0x83u8, 0x09u8, 0x3Fu8, 0x4Cu8, 0x0Eu8, 0x8Eu8, 0x41u8, + 0xD6u8, 0x90u8, 0xC1u8, 0xBEu8, 0x8Eu8, 0xABu8, 0x3Eu8, 0x15u8, 0x3Fu8, 0xDFu8, 0x7Du8, + 0xBEu8, 0x41u8, 0x1Fu8, 0x25u8, 0x27u8, 0xFDu8, 0x78u8, 0x72u8, 0x41u8, 0xA4u8, 0xEAu8, + 0x80u8, 0xC3u8, 0xE3u8, 0x1Au8, 0x68u8, 0xC1u8, 0x58u8, 0xB7u8, 0xDEu8, 0x3Au8, 0xD6u8, + 0x1Au8, 0x21u8, 0xC1u8, 0xFDu8, 0xE2u8, 0x11u8, 0x6Du8, 0x54u8, 0x60u8, 0xF2u8, 0x40u8, + 0xF2u8, 0x08u8, 0x47u8, 0x2Eu8, 0xA3u8, 0xC8u8, 0x9Bu8, 0xC0u8, 0xC8u8, 0xFCu8, 0x7Bu8, + 0xA1u8, 0x8Bu8, 0x63u8, 0x61u8, 0xC0u8, 0x1Bu8, 0x40u8, 0x34u8, 0x6Fu8, 0xE3u8, 0x96u8, + 0x32u8, 0x40u8, 0x72u8, 0xAAu8, 0x1Du8, 0xF3u8, 0x3Cu8, 0x1Bu8, 0xEBu8, 0xBFu8, 0x5Cu8, + 0x6Au8, 0xF8u8, 0xC4u8, 0x59u8, 0xBDu8, 0x99u8, 0xBFu8, 0x50u8, 0xC6u8, 0x60u8, 0xF1u8, + 0xC1u8, 0xFCu8, 0x7Bu8, 0x3Fu8, 0x1Du8, 0xF9u8, 0x72u8, 0x29u8, 0xA4u8, 0x15u8, 0x3Eu8, + 0xBFu8, 0x25u8, 0xA1u8, 0x4Bu8, 0xEFu8, 0xFFu8, 0xD7u8, 0xA1u8, 0x3Eu8, 0xFCu8, 0x05u8, + 0xE8u8, 0x73u8, 0xF7u8, 0x2Eu8, 0xC7u8, 0x3Eu8, 0x03u8, 0xFBu8, 0x6Eu8, 0xE1u8, 0x8Eu8, + 0x50u8, 0x91u8, 0xBEu8, 0x8Cu8, 0x4Fu8, 0x14u8, 0x91u8, 0x00u8, 0xC6u8, 0x6Cu8, 0x41u8, + 0xFCu8, 0xF8u8, 0x98u8, 0xBDu8, 0x9Bu8, 0x23u8, 0x55u8, 0xC1u8, 0xE5u8, 0x4Au8, 0xF2u8, + 0x3Du8, 0xE3u8, 0x23u8, 0x1Au8, 0xC1u8, 0x86u8, 0xCFu8, 0xA8u8, 0x6Du8, 0xC5u8, 0xE9u8, + 0xE2u8, 0x40u8, 0xC0u8, 0xE3u8, 0x7Du8, 0xFDu8, 0x7Eu8, 0xA4u8, 0x7Du8, 0xC0u8, 0x04u8, + 0xFAu8, 0x72u8, 0xCEu8, 0xA5u8, 0x44u8, 0x59u8, 0xC0u8, 0xCEu8, 0x6Eu8, 0xA8u8, 0xBAu8, + 0xA7u8, 0xF9u8, 0x23u8, 0x40u8, 0x16u8, 0xACu8, 0x13u8, 0xE5u8, 0x2Fu8, 0xF2u8, 0xD4u8, + 0xBFu8, 0x7Du8, 0xC1u8, 0x9Bu8, 0x2Fu8, 0xECu8, 0xDDu8, 0x98u8, 0xBFu8, 0x96u8, 0x34u8, + 0xCDu8, 0x5Eu8, 0xC7u8, 0xF5u8, 0x6Fu8, 0x3Fu8, 0x72u8, 0x46u8, 0x74u8, 0xACu8, 0xFAu8, + 0xDDu8, 0x2Au8, 0xBFu8, 0x72u8, 0xF4u8, 0xF6u8, 0x3Eu8, 0x31u8, 0x3Du8, 0xD4u8, 0xBEu8, + 0x6Eu8, 0xE9u8, 0x5Eu8, 0xF2u8, 0x73u8, 0x6Bu8, 0xBCu8, 0x3Eu8, 0x1Bu8, 0xBAu8, 0xABu8, + 0xD0u8, 0x60u8, 0xE3u8, 0x80u8, 0xBEu8, 0x00u8, 0x00u8, 0x00u8, 0x16u8, 0xF3u8, 0x72u8, + 0x0Au8, 0xC2u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x18u8, 0x15u8, 0x41u8, 0x83u8, + 0x44u8, 0xD0u8, 0x0Au8, 0xF5u8, 0xDEu8, 0x8Bu8, 0xC1u8, 0x45u8, 0xD6u8, 0x52u8, 0xB0u8, + 0xA1u8, 0x77u8, 0x3Bu8, 0xC1u8, 0x36u8, 0xCFu8, 0x30u8, 0x9Au8, 0xDAu8, 0xE7u8, 0x30u8, + 0x41u8, 0x50u8, 0x54u8, 0x09u8, 0xEDu8, 0x95u8, 0x2Fu8, 0xD8u8, 0xC0u8, 0x1Eu8, 0x88u8, + 0x6Bu8, 0xF8u8, 0x34u8, 0x4Cu8, 0x89u8, 0xC0u8, 0x58u8, 0x00u8, 0xA6u8, 0x6Fu8, 0x44u8, + 0xC8u8, 0x58u8, 0x40u8, 0xBFu8, 0xD4u8, 0x95u8, 0x68u8, 0xFFu8, 0xFDu8, 0x18u8, 0xC0u8, + 0xF0u8, 0x03u8, 0xFFu8, 0x88u8, 0x8Eu8, 0xB3u8, 0xCBu8, 0x3Fu8, 0xAAu8, 0xCEu8, 0x34u8, + 0x5Du8, 0x7Fu8, 0x08u8, 0x5Bu8, 0x3Fu8, 0xF6u8, 0xEAu8, 0xCDu8, 0xEFu8, 0x05u8, 0x64u8, + 0x4Eu8, 0xBFu8, 0x20u8, 0x04u8, 0xEFu8, 0x7Cu8, 0xF5u8, 0xF8u8, 0x14u8, 0x3Fu8, 0x12u8, + 0x92u8, 0x05u8, 0x96u8, 0xC6u8, 0xACu8, 0xD0u8, 0xBEu8, 0x23u8, 0x55u8, 0x5Au8, 0xACu8, + 0x1Bu8, 0x7Fu8, 0x70u8, 0x3Eu8, 0x46u8, 0x7Eu8, 0x06u8, 0xE0u8, 0x51u8, 0x7Eu8, 0x45u8, + 0x3Eu8, 0x20u8, 0x48u8, 0xABu8, 0x3Eu8, 0xBAu8, 0x45u8, 0x5Eu8, 0xC1u8, 0xF6u8, 0xACu8, + 0x08u8, 0x07u8, 0x31u8, 0xDEu8, 0x6Au8, 0xC1u8, 0x84u8, 0xEBu8, 0x2Au8, 0x2Cu8, 0xF3u8, + 0xB6u8, 0x00u8, 0x41u8, 0xFFu8, 0xADu8, 0x62u8, 0xC2u8, 0x15u8, 0xFDu8, 0xE3u8, 0x40u8, + 0xA2u8, 0xC3u8, 0xA7u8, 0xC0u8, 0x17u8, 0xF1u8, 0x9Du8, 0xC0u8, 0x08u8, 0x48u8, 0x07u8, + 0x3Eu8, 0x2Du8, 0x74u8, 0x4Bu8, 0x40u8, 0x7Eu8, 0x47u8, 0x8Du8, 0xEDu8, 0xEFu8, 0xF4u8, + 0xECu8, 0x3Fu8, 0xC5u8, 0xE4u8, 0x8Au8, 0x29u8, 0xE2u8, 0x0Eu8, 0xD0u8, 0xBFu8, 0x89u8, + 0x03u8, 0x3Cu8, 0x15u8, 0x9Cu8, 0x93u8, 0x93u8, 0x3Fu8, 0xBAu8, 0xC7u8, 0x1Fu8, 0x4Cu8, + 0xFDu8, 0xDAu8, 0x4Bu8, 0xBFu8, 0xB4u8, 0x96u8, 0x84u8, 0x50u8, 0x2Fu8, 0xFEu8, 0xDFu8, + 0x3Eu8, 0x96u8, 0x2Bu8, 0x7Fu8, 0xD9u8, 0xBAu8, 0x76u8, 0xC5u8, 0x3Eu8, 0x68u8, 0xA5u8, + 0x6Du8, 0x4Fu8, 0xC6u8, 0x79u8, 0x92u8, 0xBEu8, 0xF8u8, 0x29u8, 0xA8u8, 0xD2u8, 0xCFu8, + 0xAAu8, 0x51u8, 0x3Eu8, 0x9Bu8, 0xA8u8, 0xB8u8, 0x31u8, 0x91u8, 0xF7u8, 0x3Cu8, 0x41u8, + 0xC8u8, 0xEDu8, 0x77u8, 0x7Eu8, 0x9Au8, 0xF0u8, 0x5Bu8, 0xC1u8, 0x8Eu8, 0x1Cu8, 0x62u8, + 0xD6u8, 0xE5u8, 0x22u8, 0xE5u8, 0xC0u8, 0x0Bu8, 0x3Au8, 0x19u8, 0xC8u8, 0x02u8, 0xDDu8, + 0xD7u8, 0x40u8, 0x74u8, 0x06u8, 0xC5u8, 0x0Du8, 0x3Au8, 0x49u8, 0x8Du8, 0xC0u8, 0xBFu8, + 0x46u8, 0x3Eu8, 0x59u8, 0x51u8, 0xE1u8, 0x32u8, 0x40u8, 0x45u8, 0x57u8, 0x29u8, 0x5Fu8, + 0x00u8, 0x38u8, 0xF2u8, 0x3Fu8, 0xE0u8, 0x10u8, 0x17u8, 0x21u8, 0x14u8, 0x0Au8, 0xC4u8, + 0xBFu8, 0x53u8, 0x05u8, 0xE7u8, 0x21u8, 0x99u8, 0x87u8, 0x84u8, 0x3Fu8, 0x04u8, 0x95u8, + 0x0Du8, 0x54u8, 0xB5u8, 0x55u8, 0x37u8, 0xBFu8, 0x25u8, 0x48u8, 0x50u8, 0xB7u8, 0x6Du8, + 0x2Au8, 0xD2u8, 0xBEu8, 0x4Du8, 0x7Fu8, 0x98u8, 0x21u8, 0x61u8, 0xE6u8, 0xBDu8, 0x3Eu8, + 0x69u8, 0x94u8, 0x3Eu8, 0x65u8, 0xD7u8, 0x94u8, 0x84u8, 0xBEu8, 0x9Bu8, 0x2Eu8, 0x23u8, + 0xD2u8, 0x9Cu8, 0x70u8, 0x40u8, 0x3Eu8, 0x00u8, 0x00u8, 0x00u8, 0xB6u8, 0x9Eu8, 0x72u8, + 0x0Au8, 0xC2u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x18u8, 0x15u8, 0x41u8, 0x57u8, + 0xA3u8, 0x86u8, 0x8Fu8, 0x8Au8, 0xD9u8, 0x89u8, 0xC1u8, 0xF1u8, 0xFAu8, 0x5Au8, 0x5Eu8, + 0xDDu8, 0xFAu8, 0x55u8, 0x41u8, 0xA9u8, 0x15u8, 0xFBu8, 0x45u8, 0x7Du8, 0xB9u8, 0x27u8, + 0x41u8, 0xB5u8, 0x1Bu8, 0xA7u8, 0xCCu8, 0x70u8, 0x6Au8, 0xDBu8, 0xC0u8, 0x1Du8, 0xADu8, + 0x33u8, 0x05u8, 0xF0u8, 0x68u8, 0x5Eu8, 0x40u8, 0xC4u8, 0xB8u8, 0x25u8, 0xC2u8, 0xDCu8, + 0x2Au8, 0x28u8, 0x40u8, 0x5Bu8, 0xA2u8, 0xD2u8, 0xA0u8, 0xB2u8, 0x72u8, 0xFAu8, 0xBFu8, + 0xE7u8, 0x8Eu8, 0x5Du8, 0x05u8, 0xB3u8, 0x5Au8, 0xB7u8, 0x3Fu8, 0xD8u8, 0xB9u8, 0x7Cu8, + 0xBBu8, 0xF9u8, 0x4Du8, 0x70u8, 0xBFu8, 0x14u8, 0x98u8, 0x53u8, 0x7Du8, 0x96u8, 0x12u8, + 0x1Du8, 0x3Fu8, 0x28u8, 0x68u8, 0x5Au8, 0x34u8, 0xA0u8, 0x88u8, 0x95u8, 0x3Eu8, 0x2Cu8, + 0xC2u8, 0x61u8, 0x50u8, 0xE6u8, 0xB5u8, 0x94u8, 0xBEu8, 0xC3u8, 0x38u8, 0xBAu8, 0x43u8, + 0x2Eu8, 0xA6u8, 0x5Bu8, 0x3Eu8, 0x32u8, 0x05u8, 0x22u8, 0x7Cu8, 0xB6u8, 0x50u8, 0x13u8, + 0xBEu8, 0x0Eu8, 0x78u8, 0x82u8, 0xFAu8, 0x67u8, 0x1Au8, 0x80u8, 0xC1u8, 0x82u8, 0x12u8, + 0xD2u8, 0x0Cu8, 0xC1u8, 0xDDu8, 0x65u8, 0xC1u8, 0x24u8, 0x02u8, 0xBCu8, 0xD8u8, 0x75u8, + 0x4Cu8, 0x1Du8, 0x41u8, 0xF0u8, 0xB0u8, 0xF1u8, 0x5Du8, 0x8Au8, 0x56u8, 0xD2u8, 0x40u8, + 0x42u8, 0xFAu8, 0xE3u8, 0xE1u8, 0x2Fu8, 0xA1u8, 0x8Cu8, 0xC0u8, 0xCDu8, 0xEAu8, 0x62u8, + 0xFEu8, 0xEDu8, 0xECu8, 0x42u8, 0x40u8, 0xDBu8, 0x67u8, 0x13u8, 0xAEu8, 0xFFu8, 0x1Du8, + 0xF3u8, 0xBFu8, 0xB2u8, 0x70u8, 0x77u8, 0x69u8, 0xE8u8, 0x58u8, 0x84u8, 0x3Fu8, 0x11u8, + 0x78u8, 0x77u8, 0x64u8, 0xB9u8, 0x48u8, 0x5Au8, 0x3Fu8, 0x68u8, 0xA8u8, 0xB0u8, 0xD9u8, + 0x64u8, 0x86u8, 0x25u8, 0xBFu8, 0x9Cu8, 0x66u8, 0x86u8, 0x78u8, 0x99u8, 0x5Du8, 0xE4u8, + 0x3Eu8, 0x91u8, 0x15u8, 0x27u8, 0x75u8, 0xE3u8, 0x7Eu8, 0x9Cu8, 0xBEu8, 0x1Cu8, 0x47u8, + 0xC3u8, 0x1Fu8, 0x2Fu8, 0x73u8, 0x49u8, 0x3Eu8, 0x1Fu8, 0x4Au8, 0x4Bu8, 0xA9u8, 0x52u8, + 0xD7u8, 0xFAu8, 0x3Du8, 0xC0u8, 0x9Fu8, 0xD4u8, 0xF9u8, 0x93u8, 0x82u8, 0x67u8, 0xC1u8, + 0x01u8, 0x10u8, 0x9Fu8, 0xEAu8, 0xF7u8, 0xA1u8, 0x59u8, 0xC1u8, 0xACu8, 0x5Au8, 0xF4u8, + 0x04u8, 0xDDu8, 0x4Au8, 0x05u8, 0x41u8, 0xC5u8, 0x1Cu8, 0xE1u8, 0x32u8, 0xEEu8, 0x51u8, + 0xC9u8, 0x40u8, 0x2Du8, 0xAAu8, 0xF7u8, 0xBEu8, 0x2Bu8, 0x57u8, 0x7Fu8, 0xC0u8, 0x51u8, + 0x4Fu8, 0xA6u8, 0xECu8, 0xD1u8, 0xEBu8, 0x32u8, 0x40u8, 0xB8u8, 0xC5u8, 0x12u8, 0xB5u8, + 0x6Du8, 0xAEu8, 0xDDu8, 0xBFu8, 0xD4u8, 0x48u8, 0xB7u8, 0x4Eu8, 0x8Fu8, 0x86u8, 0x71u8, + 0xBFu8, 0xBEu8, 0x56u8, 0xE8u8, 0x95u8, 0x10u8, 0xDEu8, 0x54u8, 0x3Fu8, 0xC8u8, 0x42u8, + 0xF7u8, 0x0Bu8, 0xEDu8, 0x03u8, 0x1Au8, 0xBFu8, 0xD6u8, 0xFBu8, 0xAAu8, 0x43u8, 0xC9u8, + 0x95u8, 0xD5u8, 0x3Eu8, 0xDEu8, 0xC9u8, 0xACu8, 0x7Bu8, 0xF8u8, 0x0Eu8, 0x8Au8, 0xBEu8, + 0xD0u8, 0xBCu8, 0x09u8, 0xCFu8, 0x99u8, 0xA4u8, 0x2Du8, 0x3Eu8, 0x7Bu8, 0xEAu8, 0x63u8, + 0x33u8, 0x3Fu8, 0x00u8, 0xE9u8, 0x3Du8, 0x00u8, 0x00u8, 0x00u8, 0x56u8, 0x4Au8, 0x72u8, + 0x0Au8, 0xC2u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x18u8, 0x15u8, 0x41u8, 0x5Cu8, + 0xDBu8, 0xB2u8, 0x1Cu8, 0x5Bu8, 0xE2u8, 0x81u8, 0xC1u8, 0xAAu8, 0x81u8, 0x63u8, 0x11u8, + 0x27u8, 0x5Cu8, 0x64u8, 0x41u8, 0x20u8, 0x14u8, 0x5Eu8, 0x4Bu8, 0x00u8, 0xC6u8, 0x1Bu8, + 0x41u8, 0xC6u8, 0x83u8, 0xE2u8, 0x99u8, 0xCFu8, 0x17u8, 0xD9u8, 0xC0u8, 0xDCu8, 0x2Bu8, + 0x25u8, 0x5Fu8, 0x4Au8, 0x74u8, 0x5Cu8, 0x40u8, 0xA0u8, 0x80u8, 0xD1u8, 0x47u8, 0xEFu8, + 0xB3u8, 0x1Fu8, 0xC0u8, 0xFBu8, 0x1Eu8, 0xC2u8, 0x02u8, 0xDCu8, 0x16u8, 0xD6u8, 0xBFu8, + 0x78u8, 0xDFu8, 0x40u8, 0xF9u8, 0x33u8, 0x1Au8, 0x92u8, 0x3Fu8, 0x04u8, 0xE9u8, 0xC9u8, + 0x3Cu8, 0x6Cu8, 0x41u8, 0x51u8, 0xBFu8, 0xA4u8, 0x07u8, 0x64u8, 0x4Du8, 0x05u8, 0xABu8, + 0x07u8, 0x3Fu8, 0xF8u8, 0x8Bu8, 0xA1u8, 0xC3u8, 0x79u8, 0x3Du8, 0xB8u8, 0xBEu8, 0x65u8, + 0x02u8, 0xD3u8, 0x06u8, 0xE0u8, 0x43u8, 0x66u8, 0x3Eu8, 0x3Au8, 0x21u8, 0x1Du8, 0xAAu8, + 0x84u8, 0xB0u8, 0x05u8, 0x3Eu8, 0xE1u8, 0xAFu8, 0x7Du8, 0xC6u8, 0x43u8, 0xB9u8, 0xD6u8, + 0x3Du8, 0xA5u8, 0xDEu8, 0x56u8, 0x72u8, 0xF7u8, 0xEEu8, 0x88u8, 0xC1u8, 0xC7u8, 0xCAu8, + 0xE3u8, 0x08u8, 0x68u8, 0x69u8, 0x5Au8, 0xC1u8, 0x15u8, 0x6Cu8, 0x6Du8, 0x05u8, 0x6Du8, + 0x76u8, 0x23u8, 0x41u8, 0xD6u8, 0x78u8, 0x8Du8, 0xF8u8, 0x98u8, 0x1Fu8, 0xC1u8, 0x40u8, + 0x34u8, 0x15u8, 0x73u8, 0x72u8, 0x35u8, 0x93u8, 0x79u8, 0xC0u8, 0xA8u8, 0x15u8, 0x3Du8, + 0xCDu8, 0x8Eu8, 0x99u8, 0x2Du8, 0x40u8, 0x40u8, 0x35u8, 0x50u8, 0x02u8, 0xFCu8, 0xFCu8, + 0xE6u8, 0xBFu8, 0xB1u8, 0x90u8, 0x86u8, 0x53u8, 0x5Fu8, 0x1Au8, 0x8Du8, 0x3Fu8, 0xECu8, + 0xC1u8, 0x7Du8, 0x8Bu8, 0xBBu8, 0xB5u8, 0x3Eu8, 0xBFu8, 0xBAu8, 0xFBu8, 0x28u8, 0xC8u8, + 0x77u8, 0xD8u8, 0xDFu8, 0xBEu8, 0x44u8, 0x80u8, 0x24u8, 0xE1u8, 0xC3u8, 0x18u8, 0xAAu8, + 0x3Eu8, 0xE1u8, 0x47u8, 0xFDu8, 0x8Du8, 0xBCu8, 0x6Eu8, 0x70u8, 0xBEu8, 0x90u8, 0xBBu8, + 0x1Au8, 0xEEu8, 0x97u8, 0xDCu8, 0x26u8, 0x3Eu8, 0x5Bu8, 0x74u8, 0xFDu8, 0xE3u8, 0x04u8, + 0xBEu8, 0x10u8, 0xBEu8, 0x25u8, 0x11u8, 0x1Fu8, 0x5Fu8, 0xCDu8, 0xD8u8, 0x76u8, 0xC1u8, + 0xACu8, 0x90u8, 0xEAu8, 0x7Fu8, 0x7Fu8, 0x5Cu8, 0x52u8, 0xC1u8, 0x10u8, 0xF8u8, 0x95u8, + 0x0Du8, 0xCAu8, 0xD8u8, 0x11u8, 0x41u8, 0x68u8, 0xEFu8, 0x20u8, 0x49u8, 0x3Fu8, 0xCEu8, + 0xBCu8, 0x40u8, 0x6Eu8, 0xB2u8, 0x3Eu8, 0xCCu8, 0x02u8, 0xC7u8, 0x6Cu8, 0xC0u8, 0x70u8, + 0x14u8, 0x43u8, 0x32u8, 0xF3u8, 0x73u8, 0x21u8, 0x40u8, 0x28u8, 0x1Eu8, 0x0Du8, 0x05u8, + 0x6Eu8, 0x34u8, 0xD6u8, 0xBFu8, 0xFAu8, 0x27u8, 0xC1u8, 0x3Eu8, 0xE4u8, 0x71u8, 0x77u8, + 0x3Fu8, 0xC4u8, 0xF7u8, 0x66u8, 0xAAu8, 0x9Cu8, 0x44u8, 0x22u8, 0xBFu8, 0xE3u8, 0xE1u8, + 0x1Eu8, 0x29u8, 0x9Fu8, 0x6Fu8, 0xE2u8, 0xBEu8, 0x6Bu8, 0xBEu8, 0x96u8, 0xF4u8, 0x21u8, + 0xFFu8, 0xA2u8, 0x3Eu8, 0x21u8, 0x59u8, 0xF2u8, 0x2Au8, 0x06u8, 0xDFu8, 0x63u8, 0xBEu8, + 0x13u8, 0x33u8, 0x3Fu8, 0xCDu8, 0xC4u8, 0xADu8, 0x1Du8, 0x3Eu8, 0x06u8, 0xF6u8, 0x9Fu8, + 0xE9u8, 0x30u8, 0x4Au8, 0x87u8, 0x3Du8, 0x00u8, 0x00u8, 0x00u8, 0xF6u8, 0xF5u8, 0x71u8, + 0x0Au8, 0xC2u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x18u8, 0x15u8, 0x41u8, 0xD8u8, + 0x85u8, 0xCFu8, 0xD1u8, 0x4Eu8, 0xB6u8, 0x69u8, 0xC1u8, 0xAFu8, 0x2Fu8, 0x62u8, 0xCFu8, + 0x86u8, 0xFBu8, 0x68u8, 0x41u8, 0x38u8, 0xB2u8, 0x47u8, 0xD8u8, 0x07u8, 0x77u8, 0x02u8, + 0x41u8, 0x86u8, 0x05u8, 0xC8u8, 0x23u8, 0x25u8, 0xE1u8, 0xD8u8, 0xC0u8, 0xCAu8, 0x3Bu8, + 0xECu8, 0x19u8, 0x32u8, 0x7Bu8, 0x59u8, 0xC0u8, 0x5Eu8, 0x37u8, 0xCEu8, 0x8Bu8, 0x96u8, + 0xC7u8, 0x29u8, 0xC0u8, 0x79u8, 0x8Cu8, 0x61u8, 0x55u8, 0x9Au8, 0x98u8, 0xC1u8, 0xBFu8, + 0xFDu8, 0x62u8, 0x9Eu8, 0xCEu8, 0xBBu8, 0xF0u8, 0x61u8, 0x3Fu8, 0x47u8, 0xB9u8, 0x0Au8, + 0x32u8, 0x00u8, 0xFFu8, 0x0Fu8, 0xBFu8, 0x0Du8, 0x87u8, 0x07u8, 0x6Bu8, 0x72u8, 0x2Fu8, + 0xF5u8, 0x3Eu8, 0xFFu8, 0x9Fu8, 0x6Bu8, 0x6Eu8, 0x0Eu8, 0xA5u8, 0x80u8, 0x3Eu8, 0xBDu8, + 0x0Eu8, 0x9Cu8, 0xC1u8, 0xACu8, 0x54u8, 0x62u8, 0x3Eu8, 0x6Eu8, 0x0Bu8, 0xCCu8, 0x45u8, + 0x4Cu8, 0xCEu8, 0xD0u8, 0x3Du8, 0x2Cu8, 0x75u8, 0x92u8, 0x7Au8, 0x86u8, 0xD2u8, 0xD2u8, + 0xBDu8, 0xD8u8, 0xBBu8, 0x4Du8, 0xFDu8, 0x0Du8, 0xFAu8, 0x8Cu8, 0xC1u8, 0x4Au8, 0xA7u8, + 0xD0u8, 0xAFu8, 0xA2u8, 0xD0u8, 0x36u8, 0xC1u8, 0x66u8, 0x2Eu8, 0x69u8, 0x0Eu8, 0x56u8, + 0xB0u8, 0x25u8, 0x41u8, 0x57u8, 0x4Du8, 0x96u8, 0x95u8, 0x29u8, 0x54u8, 0xADu8, 0x40u8, + 0x5Cu8, 0xECu8, 0xE6u8, 0x51u8, 0xF7u8, 0x6Bu8, 0x70u8, 0xC0u8, 0xB8u8, 0x41u8, 0x3Fu8, + 0x7Au8, 0xD4u8, 0x2Eu8, 0xE0u8, 0x3Fu8, 0x14u8, 0x9Fu8, 0x3Bu8, 0x6Au8, 0xB5u8, 0x9Au8, + 0xE1u8, 0xBFu8, 0x63u8, 0xEFu8, 0x81u8, 0xAAu8, 0x81u8, 0xA5u8, 0x65u8, 0xBFu8, 0x7Du8, + 0x5Eu8, 0x6Cu8, 0xE9u8, 0xF3u8, 0xD4u8, 0x42u8, 0xBFu8, 0xBBu8, 0xB8u8, 0x71u8, 0xC1u8, + 0x03u8, 0x92u8, 0xD2u8, 0xBEu8, 0x7Bu8, 0x06u8, 0xD1u8, 0x18u8, 0x16u8, 0x58u8, 0x8Eu8, + 0xBEu8, 0x61u8, 0xCBu8, 0xEEu8, 0xAAu8, 0x53u8, 0xD9u8, 0x21u8, 0xBEu8, 0xE9u8, 0xDAu8, + 0xAFu8, 0xA5u8, 0x77u8, 0x26u8, 0x21u8, 0x3Eu8, 0xBCu8, 0xBAu8, 0x96u8, 0xB0u8, 0xC5u8, + 0x5Bu8, 0xE8u8, 0xBDu8, 0xB8u8, 0x93u8, 0x3Fu8, 0x49u8, 0x9Du8, 0x90u8, 0x7Du8, 0xC1u8, + 0xA7u8, 0x10u8, 0x9Au8, 0x5Fu8, 0x92u8, 0x92u8, 0x40u8, 0xC1u8, 0xFBu8, 0x91u8, 0xF6u8, + 0xBFu8, 0x1Du8, 0x2Bu8, 0x16u8, 0x41u8, 0x04u8, 0x0Bu8, 0xBDu8, 0xF7u8, 0x45u8, 0x45u8, + 0xB2u8, 0x40u8, 0xEBu8, 0xD7u8, 0xE3u8, 0xEEu8, 0x62u8, 0x2Eu8, 0x60u8, 0xC0u8, 0x96u8, + 0xF9u8, 0xCDu8, 0x55u8, 0x1Eu8, 0xF8u8, 0xF9u8, 0x3Fu8, 0x09u8, 0xCAu8, 0xFEu8, 0x19u8, + 0x51u8, 0xDBu8, 0xD1u8, 0xBFu8, 0x8Fu8, 0x28u8, 0xD4u8, 0x76u8, 0x1Du8, 0xDCu8, 0x5Au8, + 0xBFu8, 0xF4u8, 0x13u8, 0xA7u8, 0xFFu8, 0x83u8, 0xABu8, 0x33u8, 0xBFu8, 0xFAu8, 0x94u8, + 0x72u8, 0x7Du8, 0xEFu8, 0xCDu8, 0xD2u8, 0xBEu8, 0x62u8, 0xD9u8, 0x59u8, 0xD1u8, 0x98u8, + 0xD3u8, 0x81u8, 0xBEu8, 0x41u8, 0x4Eu8, 0xE8u8, 0xE1u8, 0xFDu8, 0x1Fu8, 0x34u8, 0xBEu8, + 0x3Au8, 0x5Cu8, 0x3Fu8, 0xAFu8, 0x17u8, 0xBFu8, 0xECu8, 0x3Du8, 0xD3u8, 0x50u8, 0x63u8, + 0xA0u8, 0xD3u8, 0xD3u8, 0xDBu8, 0x3Du8, 0x00u8, 0x00u8, 0x00u8, 0x96u8, 0xA1u8, 0x71u8, + 0x0Au8, 0xC2u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x18u8, 0x15u8, 0x41u8, 0xABu8, + 0xAFu8, 0x7Bu8, 0xC0u8, 0xBAu8, 0xA6u8, 0x68u8, 0x41u8, 0x87u8, 0xDCu8, 0xD9u8, 0x38u8, + 0xAFu8, 0xDDu8, 0x68u8, 0x41u8, 0x3Fu8, 0x44u8, 0x95u8, 0x65u8, 0x55u8, 0x26u8, 0x05u8, + 0xC1u8, 0xE6u8, 0x69u8, 0x86u8, 0xD6u8, 0xA3u8, 0xA2u8, 0xDCu8, 0xC0u8, 0xC8u8, 0x84u8, + 0x04u8, 0xDAu8, 0x71u8, 0x1Au8, 0x78u8, 0xC0u8, 0x2Du8, 0x61u8, 0x44u8, 0x07u8, 0xD2u8, + 0xC5u8, 0x2Du8, 0xC0u8, 0x6Au8, 0x8Au8, 0x26u8, 0xE5u8, 0xCAu8, 0x6Cu8, 0xA0u8, 0x3Fu8, + 0x03u8, 0x27u8, 0xAFu8, 0xE3u8, 0xAEu8, 0xADu8, 0x90u8, 0x3Fu8, 0xCAu8, 0x58u8, 0x26u8, + 0x13u8, 0x41u8, 0xB7u8, 0x53u8, 0x3Fu8, 0x7Fu8, 0x66u8, 0x73u8, 0x2Au8, 0xF5u8, 0x3Du8, + 0x11u8, 0x3Fu8, 0xB3u8, 0xF8u8, 0xE9u8, 0x5Du8, 0x8Au8, 0x68u8, 0xC5u8, 0x3Eu8, 0xBEu8, + 0x44u8, 0x8Cu8, 0xDDu8, 0x90u8, 0x4Bu8, 0x77u8, 0x3Eu8, 0x5Bu8, 0xF2u8, 0x92u8, 0x50u8, + 0xF9u8, 0xC7u8, 0x18u8, 0x3Eu8, 0xFDu8, 0x39u8, 0xC0u8, 0x4Fu8, 0x5Eu8, 0x50u8, 0xD7u8, + 0x3Du8, 0xB5u8, 0xB6u8, 0x9Bu8, 0x2Bu8, 0x1Du8, 0xA6u8, 0x8Bu8, 0xC1u8, 0x6Eu8, 0x0Cu8, + 0x8Eu8, 0x36u8, 0x47u8, 0x62u8, 0x50u8, 0x41u8, 0xFDu8, 0x38u8, 0xD3u8, 0x57u8, 0x64u8, + 0x3Au8, 0x26u8, 0x41u8, 0x89u8, 0x68u8, 0xC5u8, 0x11u8, 0x6Du8, 0xFDu8, 0x91u8, 0xC0u8, + 0x7Fu8, 0xF9u8, 0x96u8, 0x98u8, 0xC4u8, 0x23u8, 0x79u8, 0xC0u8, 0x3Au8, 0x4Eu8, 0xD8u8, + 0x7Fu8, 0xF0u8, 0xBBu8, 0x2Fu8, 0xC0u8, 0xFFu8, 0xADu8, 0xD7u8, 0x4Eu8, 0xEBu8, 0x50u8, + 0xEDu8, 0xBFu8, 0xDCu8, 0x25u8, 0xB6u8, 0x7Eu8, 0x67u8, 0x7Bu8, 0x99u8, 0xBFu8, 0x8Bu8, + 0xF1u8, 0x78u8, 0xD2u8, 0x61u8, 0xBDu8, 0x4Au8, 0xBFu8, 0x85u8, 0x6Au8, 0x1Fu8, 0xE7u8, + 0x1Du8, 0xD8u8, 0xC3u8, 0xBEu8, 0x7Cu8, 0x37u8, 0xD7u8, 0x75u8, 0xCFu8, 0x68u8, 0xAEu8, + 0x3Eu8, 0x60u8, 0x42u8, 0x77u8, 0x14u8, 0x80u8, 0xB9u8, 0x76u8, 0x3Eu8, 0x51u8, 0xC2u8, + 0xBDu8, 0x3Eu8, 0xE0u8, 0x5Du8, 0x32u8, 0x3Eu8, 0x50u8, 0x94u8, 0xDBu8, 0xA6u8, 0x31u8, + 0xA1u8, 0x06u8, 0x3Eu8, 0x35u8, 0x1Eu8, 0xEBu8, 0x9Fu8, 0x88u8, 0xCAu8, 0x7Eu8, 0xC1u8, + 0x97u8, 0xF3u8, 0xA0u8, 0x66u8, 0x98u8, 0x28u8, 0x2Cu8, 0x41u8, 0x97u8, 0xA8u8, 0x28u8, + 0x69u8, 0xC6u8, 0xD2u8, 0x18u8, 0x41u8, 0xCCu8, 0xDAu8, 0x42u8, 0xFBu8, 0xF9u8, 0x40u8, + 0xA3u8, 0x40u8, 0xBCu8, 0x7Bu8, 0x08u8, 0xCAu8, 0x09u8, 0xC2u8, 0x65u8, 0xC0u8, 0x7Eu8, + 0xFFu8, 0xB6u8, 0x8Fu8, 0x38u8, 0x9Au8, 0x1Bu8, 0xC0u8, 0x11u8, 0x8Bu8, 0x88u8, 0x29u8, + 0x7Cu8, 0x7Du8, 0xDFu8, 0xBFu8, 0xDBu8, 0xA2u8, 0x1Au8, 0x9Cu8, 0xC6u8, 0xAFu8, 0x8Eu8, + 0xBFu8, 0xBAu8, 0x6Cu8, 0xC5u8, 0xFDu8, 0x2Fu8, 0x67u8, 0x42u8, 0xBFu8, 0xB2u8, 0x5Cu8, + 0xD0u8, 0xDDu8, 0x60u8, 0x20u8, 0xE1u8, 0xBEu8, 0xC2u8, 0x57u8, 0x43u8, 0x75u8, 0x8Bu8, + 0xF9u8, 0x8Cu8, 0x3Eu8, 0xA4u8, 0xEBu8, 0x54u8, 0xB2u8, 0x6Au8, 0x69u8, 0x63u8, 0x3Eu8, + 0x78u8, 0xD1u8, 0x36u8, 0x30u8, 0xEAu8, 0x34u8, 0x20u8, 0x3Eu8, 0x94u8, 0xBEu8, 0xCBu8, + 0x79u8, 0x94u8, 0x90u8, 0xD2u8, 0x3Du8, 0x00u8, 0x00u8, 0x00u8, 0x36u8, 0x4Du8, 0x71u8, + 0x0Au8, 0xC2u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x18u8, 0x15u8, 0x41u8, 0x69u8, + 0x96u8, 0x0Bu8, 0x34u8, 0x8Fu8, 0x5Cu8, 0x81u8, 0x41u8, 0x19u8, 0x66u8, 0x8Cu8, 0xE2u8, + 0x19u8, 0x4Cu8, 0x63u8, 0x41u8, 0x82u8, 0x19u8, 0xBCu8, 0xD6u8, 0x1Eu8, 0x6Eu8, 0x21u8, + 0xC1u8, 0xBEu8, 0x9Fu8, 0x86u8, 0xBCu8, 0x65u8, 0x57u8, 0xE2u8, 0xC0u8, 0x50u8, 0x1Cu8, + 0xFEu8, 0xE0u8, 0x3Eu8, 0xDEu8, 0x82u8, 0xC0u8, 0x46u8, 0xDBu8, 0xEAu8, 0x8Cu8, 0xAFu8, + 0x54u8, 0xF3u8, 0xBFu8, 0x90u8, 0x39u8, 0xD0u8, 0x89u8, 0xA4u8, 0x16u8, 0xF9u8, 0x3Fu8, + 0xFDu8, 0x95u8, 0x6Fu8, 0xB0u8, 0x69u8, 0xACu8, 0xBEu8, 0x3Fu8, 0x16u8, 0xE6u8, 0x27u8, + 0xF4u8, 0xBBu8, 0xA0u8, 0x79u8, 0x3Fu8, 0x17u8, 0x87u8, 0x3Eu8, 0xB3u8, 0xA5u8, 0x21u8, + 0x2Du8, 0x3Fu8, 0xD3u8, 0x4Au8, 0xB2u8, 0x83u8, 0x1Au8, 0xE5u8, 0xC3u8, 0x3Eu8, 0x60u8, + 0x16u8, 0x8Du8, 0x53u8, 0x6Eu8, 0x84u8, 0x9Bu8, 0xBEu8, 0xCCu8, 0x7Fu8, 0x8Fu8, 0xECu8, + 0x07u8, 0xCCu8, 0x66u8, 0xBEu8, 0x69u8, 0x1Eu8, 0x97u8, 0x04u8, 0xDBu8, 0x63u8, 0x22u8, + 0xBEu8, 0xD4u8, 0xA6u8, 0xE6u8, 0x51u8, 0xA7u8, 0xD7u8, 0x84u8, 0xC1u8, 0xDCu8, 0x8Fu8, + 0x84u8, 0xF1u8, 0xAFu8, 0xEDu8, 0x62u8, 0x41u8, 0x2Du8, 0xFFu8, 0x03u8, 0xA7u8, 0xB9u8, + 0x2Au8, 0x24u8, 0x41u8, 0xF1u8, 0xE3u8, 0x44u8, 0x77u8, 0x78u8, 0xABu8, 0xC6u8, 0xC0u8, + 0x54u8, 0xA7u8, 0x83u8, 0x27u8, 0x78u8, 0x8Du8, 0x8Fu8, 0xC0u8, 0x46u8, 0xD5u8, 0x6Au8, + 0x57u8, 0xF3u8, 0x5Au8, 0x48u8, 0xC0u8, 0x1Cu8, 0x67u8, 0xA2u8, 0x5Bu8, 0xB0u8, 0xEDu8, + 0xFDu8, 0xBFu8, 0x1Eu8, 0x0Eu8, 0x41u8, 0x8Du8, 0x9Bu8, 0x59u8, 0xA0u8, 0xBFu8, 0xEFu8, + 0x30u8, 0xFEu8, 0x72u8, 0x5Au8, 0x1Cu8, 0x5Bu8, 0x3Fu8, 0xD5u8, 0x72u8, 0x75u8, 0xA0u8, + 0x0Du8, 0x51u8, 0x2Eu8, 0x3Fu8, 0x31u8, 0x4Cu8, 0xD7u8, 0xFFu8, 0xE2u8, 0x32u8, 0xF0u8, + 0x3Eu8, 0x5Au8, 0xA6u8, 0x06u8, 0x8Du8, 0x61u8, 0x45u8, 0xA8u8, 0x3Eu8, 0x26u8, 0xB8u8, + 0x91u8, 0xABu8, 0xDAu8, 0xA7u8, 0x54u8, 0x3Eu8, 0x21u8, 0x86u8, 0x5Bu8, 0x3Cu8, 0xBFu8, + 0x3Au8, 0x00u8, 0xBEu8, 0x8Fu8, 0xB0u8, 0x51u8, 0xEFu8, 0x66u8, 0xE1u8, 0x79u8, 0xC1u8, + 0x89u8, 0x54u8, 0x05u8, 0x57u8, 0x97u8, 0x24u8, 0x50u8, 0x41u8, 0xA7u8, 0x5Eu8, 0x33u8, + 0xEDu8, 0x98u8, 0x2Cu8, 0x19u8, 0x41u8, 0xC3u8, 0x7Bu8, 0x79u8, 0x84u8, 0xBAu8, 0x8Eu8, + 0xA1u8, 0xC0u8, 0xADu8, 0xFBu8, 0xB3u8, 0x62u8, 0xD5u8, 0xB2u8, 0x7Du8, 0xC0u8, 0x97u8, + 0xDEu8, 0x5Eu8, 0x31u8, 0x04u8, 0xDBu8, 0x39u8, 0xC0u8, 0x40u8, 0x1Bu8, 0x6Eu8, 0x8Eu8, + 0x18u8, 0x99u8, 0xF2u8, 0xBFu8, 0xDEu8, 0x47u8, 0x4Cu8, 0x81u8, 0xFCu8, 0x52u8, 0x9Eu8, + 0xBFu8, 0xADu8, 0x20u8, 0x5Bu8, 0x4Bu8, 0xBBu8, 0x95u8, 0x2Du8, 0x3Fu8, 0x6Bu8, 0xAFu8, + 0x89u8, 0x94u8, 0x9Au8, 0x39u8, 0x1Au8, 0x3Fu8, 0x46u8, 0x4Eu8, 0xFAu8, 0x9Bu8, 0xADu8, + 0xC1u8, 0xE0u8, 0x3Eu8, 0x84u8, 0x49u8, 0xBDu8, 0x3Bu8, 0x53u8, 0xC7u8, 0x9Cu8, 0x3Eu8, + 0xD7u8, 0xA2u8, 0xB9u8, 0x5Cu8, 0x07u8, 0xEDu8, 0x50u8, 0x3Eu8, 0xB4u8, 0x98u8, 0xECu8, + 0x71u8, 0x98u8, 0xA1u8, 0xF3u8, 0xBDu8, 0x00u8, 0x00u8, 0x00u8, 0xD6u8, 0xF8u8, 0x70u8, + 0x0Au8, 0xC2u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x18u8, 0x15u8, 0x41u8, 0x3Eu8, + 0x9Eu8, 0xB1u8, 0x50u8, 0xE3u8, 0x19u8, 0x88u8, 0x41u8, 0x22u8, 0xFAu8, 0xD9u8, 0xF1u8, + 0x1Du8, 0x77u8, 0x4Bu8, 0x41u8, 0x63u8, 0xD5u8, 0xE5u8, 0x5Cu8, 0xBBu8, 0x52u8, 0x30u8, + 0xC1u8, 0x6Du8, 0x6Cu8, 0xE6u8, 0x29u8, 0x23u8, 0x5Bu8, 0xE5u8, 0xC0u8, 0x3Bu8, 0xE2u8, + 0xE4u8, 0x1Au8, 0x2Fu8, 0x9Fu8, 0x64u8, 0x40u8, 0x25u8, 0x4Fu8, 0x44u8, 0x52u8, 0x04u8, + 0x5Au8, 0x5Au8, 0x40u8, 0x38u8, 0xE7u8, 0xB5u8, 0x64u8, 0x01u8, 0x1Cu8, 0x21u8, 0x40u8, + 0x04u8, 0xC4u8, 0x36u8, 0x74u8, 0xFBu8, 0x6Au8, 0xD7u8, 0x3Fu8, 0x3Eu8, 0xF7u8, 0xC1u8, + 0xF4u8, 0x20u8, 0x1Fu8, 0x4Au8, 0x3Fu8, 0x4Bu8, 0xEBu8, 0x85u8, 0xE8u8, 0x82u8, 0xA5u8, + 0x56u8, 0xBFu8, 0xFEu8, 0x46u8, 0x18u8, 0x9Du8, 0x60u8, 0x6Au8, 0x21u8, 0xBFu8, 0x18u8, + 0xA9u8, 0xACu8, 0x55u8, 0x80u8, 0x2Bu8, 0xDCu8, 0xBEu8, 0xA0u8, 0x92u8, 0xA9u8, 0xC8u8, + 0xAFu8, 0xE2u8, 0x6Fu8, 0xBEu8, 0x57u8, 0x09u8, 0xAFu8, 0x63u8, 0x57u8, 0xC5u8, 0x59u8, + 0x3Eu8, 0x7Du8, 0x98u8, 0x76u8, 0x1Bu8, 0x64u8, 0x60u8, 0x72u8, 0xC1u8, 0x09u8, 0xFAu8, + 0x9Eu8, 0x86u8, 0xBFu8, 0x40u8, 0x6Bu8, 0x41u8, 0xD5u8, 0x54u8, 0x20u8, 0xD9u8, 0xFDu8, + 0x74u8, 0x17u8, 0x41u8, 0xD3u8, 0x20u8, 0x3Fu8, 0xD1u8, 0xA4u8, 0x92u8, 0xE2u8, 0xC0u8, + 0x7Au8, 0x16u8, 0x5Fu8, 0x1Au8, 0x46u8, 0xE9u8, 0xA2u8, 0xC0u8, 0x01u8, 0x16u8, 0x61u8, + 0xDFu8, 0xF5u8, 0x2Bu8, 0x55u8, 0xC0u8, 0x71u8, 0x4Bu8, 0xECu8, 0xA4u8, 0x01u8, 0x48u8, + 0xDEu8, 0x3Fu8, 0xCAu8, 0xBCu8, 0x3Au8, 0x41u8, 0xABu8, 0xB9u8, 0xD5u8, 0x3Fu8, 0xA9u8, + 0x9Au8, 0xA3u8, 0xC0u8, 0x60u8, 0x2Cu8, 0x9Du8, 0x3Fu8, 0xADu8, 0x50u8, 0x12u8, 0x09u8, + 0xC9u8, 0xE2u8, 0x54u8, 0x3Fu8, 0x35u8, 0xB4u8, 0x41u8, 0xF9u8, 0x92u8, 0xB2u8, 0xB4u8, + 0x3Eu8, 0x32u8, 0xE8u8, 0xC8u8, 0xF1u8, 0x5Du8, 0x77u8, 0xD6u8, 0xBEu8, 0x02u8, 0x67u8, + 0x11u8, 0xD8u8, 0x4Du8, 0x89u8, 0xA1u8, 0xBEu8, 0x77u8, 0x4Eu8, 0xA7u8, 0xE0u8, 0xBEu8, + 0x3Du8, 0x5Du8, 0xBEu8, 0xF7u8, 0x36u8, 0x06u8, 0x33u8, 0x52u8, 0xB9u8, 0x6Du8, 0xC1u8, + 0xA4u8, 0xF3u8, 0x31u8, 0xF5u8, 0x40u8, 0xA2u8, 0x5Bu8, 0x41u8, 0xB2u8, 0xA3u8, 0x01u8, + 0x84u8, 0x01u8, 0x5Eu8, 0x13u8, 0x41u8, 0x2Eu8, 0xB5u8, 0x60u8, 0xF2u8, 0x8Fu8, 0xA8u8, + 0xCEu8, 0xC0u8, 0x83u8, 0xB5u8, 0x53u8, 0x60u8, 0xFDu8, 0x71u8, 0x94u8, 0xC0u8, 0x10u8, + 0x05u8, 0x04u8, 0x5Au8, 0x9Au8, 0x1Eu8, 0x4Cu8, 0xC0u8, 0x0Cu8, 0x9Du8, 0xECu8, 0x2Bu8, + 0x59u8, 0xAAu8, 0xE4u8, 0xBFu8, 0x00u8, 0xF3u8, 0xEFu8, 0xDAu8, 0x61u8, 0x42u8, 0xC2u8, + 0x3Fu8, 0x99u8, 0x80u8, 0xC1u8, 0x14u8, 0x70u8, 0xF3u8, 0x8Eu8, 0x3Fu8, 0xF3u8, 0x07u8, + 0xA2u8, 0xE6u8, 0x5Du8, 0x09u8, 0x4Bu8, 0x3Fu8, 0x29u8, 0xB8u8, 0x3Cu8, 0xDFu8, 0x7Fu8, + 0xA2u8, 0xEEu8, 0x3Eu8, 0xDAu8, 0x9Du8, 0xD5u8, 0x78u8, 0x48u8, 0x0Du8, 0xC2u8, 0xBEu8, + 0x09u8, 0xE0u8, 0x60u8, 0xD1u8, 0x5Cu8, 0x42u8, 0x92u8, 0xBEu8, 0x48u8, 0x45u8, 0x45u8, + 0x7Au8, 0xC7u8, 0x29u8, 0x52u8, 0xBEu8, 0x00u8, 0x00u8, 0x00u8, 0x76u8, 0xA4u8, 0x70u8, + 0x0Au8, 0xC2u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x18u8, 0x15u8, 0x41u8, 0x69u8, + 0x53u8, 0x15u8, 0xCBu8, 0x9Au8, 0xC0u8, 0x86u8, 0x41u8, 0x8Cu8, 0x1Cu8, 0x99u8, 0x39u8, + 0x43u8, 0xCFu8, 0x59u8, 0xC1u8, 0x05u8, 0x48u8, 0x1Fu8, 0x84u8, 0x06u8, 0x5Du8, 0x36u8, + 0xC1u8, 0xBAu8, 0x81u8, 0x5Fu8, 0xD6u8, 0xEFu8, 0xAAu8, 0xC4u8, 0xC0u8, 0x0Cu8, 0xE2u8, + 0x52u8, 0x28u8, 0x36u8, 0xC7u8, 0xB2u8, 0x40u8, 0xDEu8, 0x99u8, 0x36u8, 0x3Bu8, 0x89u8, + 0x7Fu8, 0x75u8, 0x40u8, 0x5Au8, 0xD6u8, 0x8Du8, 0x75u8, 0xBCu8, 0x65u8, 0x03u8, 0x40u8, + 0x91u8, 0x13u8, 0x66u8, 0x9Fu8, 0xF6u8, 0x60u8, 0xFAu8, 0xBFu8, 0xBBu8, 0x8Du8, 0xC9u8, + 0x32u8, 0x5Au8, 0x6Cu8, 0xC2u8, 0xBFu8, 0x85u8, 0x37u8, 0x4Du8, 0x87u8, 0x76u8, 0x35u8, + 0x5Bu8, 0xBFu8, 0x92u8, 0x52u8, 0x09u8, 0x8Cu8, 0xEBu8, 0x61u8, 0x49u8, 0x3Fu8, 0xFFu8, + 0x90u8, 0x33u8, 0x5Eu8, 0x7Bu8, 0xE6u8, 0x13u8, 0x3Fu8, 0x4Cu8, 0xF1u8, 0x8Cu8, 0x68u8, + 0x87u8, 0x6Du8, 0xB4u8, 0x3Eu8, 0xB5u8, 0x38u8, 0x9Bu8, 0x68u8, 0xE1u8, 0x0Du8, 0x9Cu8, + 0xBEu8, 0x09u8, 0xC6u8, 0x8Eu8, 0x2Au8, 0x72u8, 0xD8u8, 0x63u8, 0x41u8, 0x56u8, 0x7Du8, + 0x26u8, 0xF6u8, 0x57u8, 0x30u8, 0x6Cu8, 0x41u8, 0xC4u8, 0xC1u8, 0xECu8, 0xCFu8, 0x4Au8, + 0x02u8, 0x15u8, 0xC1u8, 0xC8u8, 0x61u8, 0x2Fu8, 0xE2u8, 0x2Cu8, 0x90u8, 0xF4u8, 0xC0u8, + 0x66u8, 0x9Fu8, 0x66u8, 0x77u8, 0xC1u8, 0x2Fu8, 0xA4u8, 0xC0u8, 0x8Cu8, 0x6Au8, 0x1Fu8, + 0x82u8, 0xF8u8, 0x99u8, 0x64u8, 0x40u8, 0xC2u8, 0xE6u8, 0x4Cu8, 0x52u8, 0x2Eu8, 0x4Eu8, + 0x38u8, 0x40u8, 0x8Fu8, 0x98u8, 0x63u8, 0x7Eu8, 0x17u8, 0x7Fu8, 0xEFu8, 0x3Fu8, 0x6Cu8, + 0xBDu8, 0x2Fu8, 0xCEu8, 0xC7u8, 0x79u8, 0xAFu8, 0xBFu8, 0xBBu8, 0x07u8, 0x04u8, 0xCAu8, + 0x23u8, 0x68u8, 0x86u8, 0xBFu8, 0x31u8, 0x9Cu8, 0x35u8, 0x39u8, 0x91u8, 0xDEu8, 0x40u8, + 0xBFu8, 0x39u8, 0xC9u8, 0xAFu8, 0xECu8, 0x80u8, 0xE5u8, 0xFDu8, 0x3Eu8, 0xC2u8, 0x28u8, + 0xDFu8, 0xCCu8, 0x08u8, 0xB9u8, 0xD8u8, 0x3Eu8, 0x98u8, 0x51u8, 0x00u8, 0xFFu8, 0x0Fu8, + 0xF1u8, 0x94u8, 0x3Eu8, 0xF9u8, 0xA4u8, 0xD9u8, 0x8Cu8, 0xDDu8, 0x8Cu8, 0x20u8, 0x41u8, + 0x0Eu8, 0x0Au8, 0xBAu8, 0x0Du8, 0x55u8, 0x64u8, 0x60u8, 0x41u8, 0x4Du8, 0xF0u8, 0x61u8, + 0x14u8, 0xCCu8, 0x07u8, 0xDDu8, 0xC0u8, 0xBAu8, 0x28u8, 0xBCu8, 0xF8u8, 0xFBu8, 0x64u8, + 0xE5u8, 0xC0u8, 0x55u8, 0x35u8, 0x9Fu8, 0xF2u8, 0xDDu8, 0x6Bu8, 0x9Du8, 0xC0u8, 0xDBu8, + 0xE1u8, 0xA7u8, 0x81u8, 0x04u8, 0xE6u8, 0x49u8, 0x40u8, 0x26u8, 0x14u8, 0xC6u8, 0xDBu8, + 0x86u8, 0x6Bu8, 0x29u8, 0x40u8, 0x71u8, 0xA8u8, 0x37u8, 0x1Du8, 0xE4u8, 0x56u8, 0xE6u8, + 0x3Fu8, 0x6Bu8, 0xA0u8, 0x8Au8, 0x7Du8, 0xADu8, 0x1Au8, 0x92u8, 0xBFu8, 0xE0u8, 0xA4u8, + 0xD6u8, 0xC0u8, 0x86u8, 0x30u8, 0x77u8, 0xBFu8, 0x3Cu8, 0x75u8, 0xC0u8, 0x52u8, 0x88u8, + 0x53u8, 0x37u8, 0xBFu8, 0xC0u8, 0x7Au8, 0xEDu8, 0x35u8, 0x8Cu8, 0x5Bu8, 0xDEu8, 0x3Eu8, + 0x09u8, 0xB1u8, 0xBCu8, 0x74u8, 0x49u8, 0x4Du8, 0xC9u8, 0x3Eu8, 0x12u8, 0x94u8, 0xB3u8, + 0xC5u8, 0xC9u8, 0x40u8, 0x8Cu8, 0x3Eu8, 0x00u8, 0x00u8, 0x00u8, 0x16u8, 0x50u8, 0x70u8, + 0x0Au8, 0xC2u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x18u8, 0x15u8, 0x41u8, 0x72u8, + 0x89u8, 0xABu8, 0x6Fu8, 0x60u8, 0x31u8, 0x76u8, 0x41u8, 0x96u8, 0x3Cu8, 0xE7u8, 0xC5u8, + 0x10u8, 0x75u8, 0x70u8, 0xC1u8, 0xF0u8, 0x6Fu8, 0x81u8, 0xF3u8, 0xCDu8, 0x21u8, 0x2Du8, + 0xC1u8, 0xEAu8, 0x0Fu8, 0x3Fu8, 0xE2u8, 0xDBu8, 0xDEu8, 0xF8u8, 0x40u8, 0x94u8, 0x68u8, + 0xE4u8, 0x62u8, 0xDDu8, 0x72u8, 0xBAu8, 0x40u8, 0x89u8, 0x2Bu8, 0xEFu8, 0xDDu8, 0x8Eu8, + 0x45u8, 0x79u8, 0xC0u8, 0x3Eu8, 0xB6u8, 0x45u8, 0x5Du8, 0xAFu8, 0x7Fu8, 0x4Au8, 0xC0u8, + 0x0Au8, 0x1Bu8, 0xB9u8, 0xA0u8, 0x14u8, 0xE8u8, 0xF5u8, 0x3Fu8, 0xBBu8, 0x90u8, 0x97u8, + 0x91u8, 0xC6u8, 0x1Cu8, 0xDCu8, 0x3Fu8, 0x23u8, 0x27u8, 0xD8u8, 0x51u8, 0xF1u8, 0x0Eu8, + 0x5Eu8, 0x3Fu8, 0x72u8, 0xADu8, 0x46u8, 0x4Eu8, 0xB2u8, 0x9Bu8, 0x6Du8, 0xBFu8, 0xA1u8, + 0x74u8, 0x7Eu8, 0x2Au8, 0x8Bu8, 0x5Fu8, 0x20u8, 0xBFu8, 0x83u8, 0xA0u8, 0x72u8, 0x71u8, + 0xBCu8, 0xA7u8, 0xFDu8, 0x3Eu8, 0x39u8, 0xD1u8, 0x84u8, 0x8Au8, 0xE2u8, 0xFFu8, 0xC0u8, + 0x3Eu8, 0x6Au8, 0xBBu8, 0x39u8, 0x7Du8, 0xE8u8, 0x1Fu8, 0x80u8, 0x41u8, 0x30u8, 0xA8u8, + 0x84u8, 0x63u8, 0x56u8, 0x8Fu8, 0x5Du8, 0x41u8, 0x72u8, 0xC9u8, 0x0Du8, 0xD3u8, 0xCBu8, + 0x27u8, 0x35u8, 0xC1u8, 0xFDu8, 0xF3u8, 0x40u8, 0x43u8, 0x54u8, 0x5Eu8, 0xF0u8, 0xC0u8, + 0xC7u8, 0x9Cu8, 0xEEu8, 0x7Du8, 0xC2u8, 0xA1u8, 0xB7u8, 0x40u8, 0xA3u8, 0xC5u8, 0x2Cu8, + 0x20u8, 0x8Du8, 0xB5u8, 0x7Fu8, 0x40u8, 0x08u8, 0x05u8, 0x9Cu8, 0x55u8, 0xD2u8, 0x89u8, + 0x38u8, 0xC0u8, 0x83u8, 0x87u8, 0xD0u8, 0x23u8, 0x79u8, 0xE0u8, 0x10u8, 0xC0u8, 0x0Au8, + 0xCCu8, 0xECu8, 0xF5u8, 0x10u8, 0xB9u8, 0xB0u8, 0x3Fu8, 0x33u8, 0xE9u8, 0x58u8, 0xBDu8, + 0x7Cu8, 0x3Bu8, 0xA2u8, 0x3Fu8, 0x57u8, 0x49u8, 0x1Fu8, 0xFCu8, 0x38u8, 0xCEu8, 0x40u8, + 0x3Fu8, 0xE8u8, 0x43u8, 0x1Cu8, 0x7Cu8, 0x37u8, 0x28u8, 0x33u8, 0xBFu8, 0x9Fu8, 0x56u8, + 0xABu8, 0xC8u8, 0x2Cu8, 0x34u8, 0xECu8, 0xBEu8, 0xC3u8, 0x31u8, 0xC4u8, 0x6Du8, 0x9Au8, + 0xE4u8, 0xC2u8, 0x3Eu8, 0x43u8, 0x60u8, 0xA7u8, 0xC0u8, 0xE4u8, 0xBFu8, 0x6Du8, 0x41u8, + 0x6Cu8, 0x5Eu8, 0xEEu8, 0x62u8, 0x4Cu8, 0xAEu8, 0x56u8, 0x41u8, 0x28u8, 0xFEu8, 0xE2u8, + 0x3Fu8, 0x9Bu8, 0x82u8, 0x23u8, 0xC1u8, 0xE8u8, 0xFDu8, 0x5Fu8, 0x20u8, 0x35u8, 0xAFu8, + 0xE6u8, 0xC0u8, 0x07u8, 0x5Bu8, 0x15u8, 0x87u8, 0x28u8, 0xA8u8, 0xA3u8, 0x40u8, 0x0Bu8, + 0xBDu8, 0x44u8, 0x1Du8, 0x2Eu8, 0x91u8, 0x73u8, 0x40u8, 0x37u8, 0x02u8, 0x6Au8, 0xCFu8, + 0x24u8, 0x19u8, 0x1Eu8, 0xC0u8, 0xD9u8, 0xC1u8, 0xEEu8, 0x2Fu8, 0x83u8, 0x27u8, 0x03u8, + 0xC0u8, 0xB7u8, 0x22u8, 0xD1u8, 0x35u8, 0xF3u8, 0x16u8, 0x87u8, 0xBFu8, 0x59u8, 0xE7u8, + 0xFEu8, 0x9Du8, 0xD0u8, 0x40u8, 0x93u8, 0x3Fu8, 0x60u8, 0x2Au8, 0x1Cu8, 0x5Bu8, 0x09u8, + 0x66u8, 0x45u8, 0x3Fu8, 0xB5u8, 0xEBu8, 0x2Fu8, 0x8Cu8, 0xC6u8, 0xB7u8, 0x22u8, 0xBFu8, + 0x92u8, 0x1Eu8, 0x72u8, 0x03u8, 0x25u8, 0x45u8, 0xE5u8, 0xBEu8, 0x90u8, 0xFCu8, 0xFCu8, + 0x77u8, 0xDFu8, 0x94u8, 0xB0u8, 0x3Eu8, 0x00u8, 0x00u8, 0x00u8, 0xB6u8, 0xFBu8, 0x6Fu8, + 0x0Au8, 0xC2u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x18u8, 0x15u8, 0x41u8, 0xACu8, + 0xB5u8, 0x4Fu8, 0x0Fu8, 0x74u8, 0x47u8, 0x6Bu8, 0xC1u8, 0x3Fu8, 0x1Eu8, 0x08u8, 0xF9u8, + 0xBDu8, 0x2Fu8, 0x72u8, 0xC1u8, 0xD3u8, 0x75u8, 0xA7u8, 0x1Cu8, 0x13u8, 0x72u8, 0x1Fu8, + 0x41u8, 0xDEu8, 0x91u8, 0xCAu8, 0x0Bu8, 0xCBu8, 0xDEu8, 0xFAu8, 0x40u8, 0x6Eu8, 0x5Fu8, + 0xF2u8, 0x42u8, 0xD3u8, 0xCCu8, 0xB5u8, 0xC0u8, 0xF7u8, 0x4Fu8, 0x5Du8, 0x29u8, 0x82u8, + 0x23u8, 0x77u8, 0xC0u8, 0x6Cu8, 0x2Du8, 0xF3u8, 0x2Cu8, 0x29u8, 0x6Eu8, 0x48u8, 0x40u8, + 0x31u8, 0x42u8, 0x74u8, 0xD9u8, 0x0Cu8, 0xFAu8, 0xD5u8, 0x3Fu8, 0x4Eu8, 0xEAu8, 0xCAu8, + 0x46u8, 0x42u8, 0x9Du8, 0xD7u8, 0xBFu8, 0x89u8, 0x24u8, 0x80u8, 0xF7u8, 0xC2u8, 0x8Au8, + 0x8Du8, 0x3Fu8, 0xCDu8, 0xC6u8, 0xA9u8, 0x22u8, 0x7Fu8, 0x99u8, 0x62u8, 0x3Fu8, 0x75u8, + 0xB2u8, 0x2Bu8, 0x12u8, 0x77u8, 0xE9u8, 0x2Du8, 0xBFu8, 0x42u8, 0x49u8, 0xC4u8, 0x33u8, + 0x41u8, 0x5Bu8, 0xE1u8, 0xBEu8, 0xECu8, 0x50u8, 0x78u8, 0xF7u8, 0xE9u8, 0x2Eu8, 0xC4u8, + 0x3Eu8, 0x13u8, 0x2Cu8, 0x05u8, 0xC9u8, 0x32u8, 0xB4u8, 0x81u8, 0x41u8, 0xC5u8, 0x13u8, + 0x90u8, 0xBFu8, 0x36u8, 0x21u8, 0x51u8, 0xC1u8, 0x1Fu8, 0x96u8, 0xC6u8, 0x00u8, 0x84u8, + 0x26u8, 0x36u8, 0xC1u8, 0xB8u8, 0x09u8, 0x2Au8, 0xD9u8, 0x24u8, 0xCBu8, 0xEAu8, 0x40u8, + 0x00u8, 0xCAu8, 0x67u8, 0x43u8, 0xEAu8, 0x07u8, 0xB6u8, 0x40u8, 0x43u8, 0xE1u8, 0x56u8, + 0x06u8, 0x2Eu8, 0xAFu8, 0x7Eu8, 0xC0u8, 0xB0u8, 0xEDu8, 0xD9u8, 0x81u8, 0xAFu8, 0xB0u8, + 0x2Au8, 0xC0u8, 0xC1u8, 0x0Fu8, 0xBBu8, 0x3Eu8, 0x39u8, 0xF0u8, 0x0Eu8, 0x40u8, 0x3Au8, + 0x8Eu8, 0x7Eu8, 0x7Eu8, 0x1Eu8, 0xE5u8, 0xB3u8, 0xBFu8, 0x15u8, 0x20u8, 0x1Bu8, 0x11u8, + 0x9Au8, 0x9Cu8, 0x9Au8, 0xBFu8, 0x10u8, 0xB2u8, 0x7Bu8, 0x58u8, 0xCEu8, 0x3Cu8, 0x5Eu8, + 0x3Fu8, 0x92u8, 0xD6u8, 0x9Du8, 0x28u8, 0xCAu8, 0x9Au8, 0x20u8, 0x3Fu8, 0xB6u8, 0x58u8, + 0x14u8, 0x6Fu8, 0xEDu8, 0xDDu8, 0xF6u8, 0xBEu8, 0xECu8, 0xF4u8, 0x8Bu8, 0x35u8, 0x9Bu8, + 0x3Du8, 0x5Du8, 0xBEu8, 0xD9u8, 0xF8u8, 0x5Eu8, 0x22u8, 0x99u8, 0x52u8, 0x74u8, 0x41u8, + 0x1Fu8, 0x2Eu8, 0x00u8, 0xFCu8, 0x45u8, 0xF5u8, 0x17u8, 0xC1u8, 0xB7u8, 0x33u8, 0xD7u8, + 0x28u8, 0xF2u8, 0x47u8, 0x29u8, 0xC1u8, 0x40u8, 0x3Cu8, 0x29u8, 0xB7u8, 0x84u8, 0x4Cu8, + 0xD1u8, 0x40u8, 0xD4u8, 0x3Eu8, 0xBEu8, 0xAAu8, 0x94u8, 0x14u8, 0xACu8, 0x40u8, 0xCBu8, + 0x46u8, 0xF2u8, 0xDAu8, 0x1Fu8, 0xE0u8, 0x6Bu8, 0xC0u8, 0xF2u8, 0xB4u8, 0x52u8, 0x94u8, + 0x1Du8, 0x7Fu8, 0x28u8, 0xC0u8, 0xF7u8, 0x26u8, 0x9Bu8, 0x22u8, 0xD7u8, 0x36u8, 0x00u8, + 0x40u8, 0xA5u8, 0x84u8, 0x3Au8, 0xDFu8, 0x2Au8, 0x3Cu8, 0x66u8, 0xBFu8, 0x85u8, 0x55u8, + 0x98u8, 0x61u8, 0xC2u8, 0x7Du8, 0x8Fu8, 0xBFu8, 0x0Fu8, 0x03u8, 0xF3u8, 0xBFu8, 0x43u8, + 0x72u8, 0x48u8, 0x3Fu8, 0xF0u8, 0x78u8, 0xFBu8, 0xF9u8, 0xB5u8, 0xFEu8, 0x17u8, 0x3Fu8, + 0x73u8, 0x3Cu8, 0x2Au8, 0xFBu8, 0xBAu8, 0x91u8, 0xE6u8, 0xBEu8, 0x5Du8, 0x41u8, 0x67u8, + 0xD7u8, 0xDDu8, 0xEEu8, 0x91u8, 0xBEu8, 0x00u8, 0x00u8, 0x00u8, 0x56u8, 0xA7u8, 0x6Fu8, + 0x0Au8, 0xC2u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x18u8, 0x15u8, 0x41u8, 0x7Du8, + 0x12u8, 0x5Au8, 0x41u8, 0xEEu8, 0x9Fu8, 0x85u8, 0xC1u8, 0x90u8, 0x7Du8, 0x1Fu8, 0xB6u8, + 0x46u8, 0xB6u8, 0x65u8, 0xC1u8, 0x8Cu8, 0xAEu8, 0xA7u8, 0xA3u8, 0x95u8, 0xCDu8, 0x32u8, + 0x41u8, 0xCBu8, 0x8Au8, 0x8Fu8, 0xA5u8, 0xA9u8, 0xC7u8, 0xC9u8, 0x40u8, 0x13u8, 0x49u8, + 0x2Eu8, 0xF9u8, 0x31u8, 0x91u8, 0xB1u8, 0xC0u8, 0x24u8, 0xD7u8, 0x4Au8, 0x25u8, 0x0Eu8, + 0xFCu8, 0x6Fu8, 0x40u8, 0x81u8, 0x1Au8, 0x0Au8, 0x20u8, 0x70u8, 0xF4u8, 0xE9u8, 0xBFu8, + 0x44u8, 0xB7u8, 0x30u8, 0xB3u8, 0xDCu8, 0xC7u8, 0xF2u8, 0xBFu8, 0xBCu8, 0x1Bu8, 0x8Du8, + 0x96u8, 0x49u8, 0x6Fu8, 0xBAu8, 0x3Fu8, 0x22u8, 0x9Eu8, 0xADu8, 0xB8u8, 0xFAu8, 0x7Fu8, + 0x64u8, 0xBFu8, 0x5Au8, 0x4Cu8, 0xAAu8, 0x33u8, 0x3Eu8, 0x5Du8, 0x38u8, 0xBFu8, 0xD1u8, + 0x34u8, 0x32u8, 0x5Bu8, 0x51u8, 0x50u8, 0x09u8, 0x3Fu8, 0xE2u8, 0x2Cu8, 0xE1u8, 0xD2u8, + 0x92u8, 0xBEu8, 0xC1u8, 0xBEu8, 0x22u8, 0x12u8, 0xE9u8, 0xF6u8, 0x0Fu8, 0xA0u8, 0x7Cu8, + 0xBEu8, 0x0Cu8, 0xB4u8, 0xC7u8, 0x4Du8, 0x8Eu8, 0x55u8, 0x72u8, 0x41u8, 0xB7u8, 0x90u8, + 0x05u8, 0xC5u8, 0x0Fu8, 0x23u8, 0x68u8, 0xC1u8, 0xC6u8, 0xA0u8, 0x3Eu8, 0x4Eu8, 0x02u8, + 0x00u8, 0x21u8, 0xC1u8, 0x3Au8, 0xE8u8, 0xE7u8, 0x00u8, 0xB2u8, 0x59u8, 0xF2u8, 0x40u8, + 0x5Au8, 0xCEu8, 0xF9u8, 0xF4u8, 0x40u8, 0xF3u8, 0x9Bu8, 0xC0u8, 0x7Fu8, 0x5Bu8, 0xEAu8, + 0x31u8, 0x91u8, 0x2Du8, 0x61u8, 0xC0u8, 0x13u8, 0xABu8, 0x4Cu8, 0xF7u8, 0x0Fu8, 0x80u8, + 0x32u8, 0x40u8, 0x2Eu8, 0x61u8, 0xF6u8, 0x67u8, 0x69u8, 0x34u8, 0xEBu8, 0xBFu8, 0xAEu8, + 0x12u8, 0xE3u8, 0x73u8, 0xBAu8, 0xC9u8, 0x98u8, 0xBFu8, 0xC5u8, 0xFCu8, 0xFCu8, 0x69u8, + 0x48u8, 0xB4u8, 0x7Bu8, 0x3Fu8, 0x64u8, 0x4Du8, 0x8Cu8, 0xB7u8, 0x62u8, 0x14u8, 0x3Eu8, + 0xBFu8, 0x21u8, 0x59u8, 0xB2u8, 0x38u8, 0x51u8, 0x4Bu8, 0xB1u8, 0x3Eu8, 0x8Eu8, 0x7Bu8, + 0xB1u8, 0xB3u8, 0xDAu8, 0xC4u8, 0xC6u8, 0x3Eu8, 0xA9u8, 0x79u8, 0x74u8, 0x8Du8, 0x87u8, + 0x3Bu8, 0x91u8, 0xBEu8, 0x12u8, 0xB0u8, 0x21u8, 0xF7u8, 0x8Du8, 0xA6u8, 0x6Cu8, 0x41u8, + 0xF9u8, 0x4Du8, 0x4Du8, 0x31u8, 0x39u8, 0x30u8, 0x55u8, 0xC1u8, 0x21u8, 0xC9u8, 0x8Bu8, + 0x1Fu8, 0x4Fu8, 0x08u8, 0x1Au8, 0xC1u8, 0x7Au8, 0xA8u8, 0x3Du8, 0x6Eu8, 0x4Eu8, 0xE6u8, + 0xE2u8, 0x40u8, 0xDCu8, 0x2Du8, 0xD1u8, 0x6Du8, 0xD9u8, 0x1Fu8, 0x7Eu8, 0xC0u8, 0xF8u8, + 0x25u8, 0x94u8, 0x5Cu8, 0xB3u8, 0x0Au8, 0x59u8, 0xC0u8, 0xF3u8, 0x46u8, 0xD8u8, 0x02u8, + 0x11u8, 0xE8u8, 0x23u8, 0x40u8, 0xBBu8, 0x3Du8, 0x23u8, 0x62u8, 0x91u8, 0x22u8, 0xD5u8, + 0xBFu8, 0x66u8, 0x24u8, 0x55u8, 0xF5u8, 0xE4u8, 0x52u8, 0x98u8, 0xBFu8, 0xD6u8, 0x57u8, + 0xE7u8, 0x6Fu8, 0x1Du8, 0xB5u8, 0x6Fu8, 0x3Fu8, 0xF1u8, 0x95u8, 0xE5u8, 0x93u8, 0x05u8, + 0xF9u8, 0x2Au8, 0xBFu8, 0x80u8, 0x43u8, 0x74u8, 0xCCu8, 0xACu8, 0xF4u8, 0xD2u8, 0xBEu8, + 0x76u8, 0x14u8, 0xEFu8, 0xE5u8, 0x68u8, 0x02u8, 0xBCu8, 0x3Eu8, 0xDFu8, 0x1Cu8, 0x87u8, + 0xFBu8, 0x69u8, 0xD5u8, 0x80u8, 0xBEu8, 0x00u8, 0x00u8, 0x00u8, 0xF6u8, 0x52u8, 0x6Fu8, + 0x0Au8, 0xC2u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x18u8, 0x15u8, 0x41u8, 0x09u8, + 0xD1u8, 0xC7u8, 0x51u8, 0x97u8, 0xD7u8, 0x8Bu8, 0xC1u8, 0x88u8, 0x95u8, 0xEEu8, 0x9Au8, + 0xA6u8, 0xF2u8, 0x3Au8, 0xC1u8, 0xACu8, 0xFFu8, 0xECu8, 0x74u8, 0x71u8, 0xE3u8, 0x30u8, + 0x41u8, 0x06u8, 0x5Fu8, 0x0Bu8, 0xEAu8, 0x40u8, 0x3Cu8, 0xD8u8, 0xC0u8, 0x95u8, 0x74u8, + 0x21u8, 0x8Fu8, 0x9Bu8, 0x0Fu8, 0x89u8, 0xC0u8, 0xF5u8, 0x5Fu8, 0x48u8, 0x3Du8, 0xF6u8, + 0xA3u8, 0x58u8, 0x40u8, 0x91u8, 0x52u8, 0x21u8, 0x17u8, 0xB7u8, 0xE6u8, 0x18u8, 0xC0u8, + 0x5Eu8, 0x9Cu8, 0xB1u8, 0x33u8, 0x8Fu8, 0xBAu8, 0xCBu8, 0x3Fu8, 0xF3u8, 0x81u8, 0xE6u8, + 0x3Du8, 0x68u8, 0xF6u8, 0x58u8, 0x3Fu8, 0xE4u8, 0xA3u8, 0x27u8, 0x43u8, 0x27u8, 0xFFu8, + 0x4Du8, 0xBFu8, 0x4Au8, 0x21u8, 0x44u8, 0xFAu8, 0xCEu8, 0xCCu8, 0x14u8, 0x3Fu8, 0x3Du8, + 0xF9u8, 0xA8u8, 0x5Au8, 0x00u8, 0xA0u8, 0xD0u8, 0xBEu8, 0x21u8, 0x27u8, 0x64u8, 0xD2u8, + 0x31u8, 0x15u8, 0x71u8, 0x3Eu8, 0xABu8, 0x74u8, 0x92u8, 0xCFu8, 0x24u8, 0xA5u8, 0x44u8, + 0x3Eu8, 0x0Cu8, 0x6Au8, 0x98u8, 0x95u8, 0x10u8, 0xDEu8, 0x5Eu8, 0xC1u8, 0x62u8, 0x69u8, + 0xE3u8, 0xB4u8, 0xF6u8, 0xDBu8, 0x6Au8, 0xC1u8, 0xB7u8, 0xDBu8, 0x0Bu8, 0xB3u8, 0xD6u8, + 0xF1u8, 0x00u8, 0x41u8, 0xA3u8, 0x87u8, 0x4Cu8, 0x0Eu8, 0x82u8, 0xEEu8, 0xE3u8, 0x40u8, + 0xF2u8, 0x88u8, 0xC6u8, 0xA9u8, 0xAEu8, 0xE0u8, 0x9Du8, 0xC0u8, 0xB1u8, 0x0Du8, 0xC4u8, + 0x0Du8, 0x20u8, 0x7Fu8, 0x4Bu8, 0x40u8, 0x2Eu8, 0xB7u8, 0x95u8, 0x6Bu8, 0xE9u8, 0x1Au8, + 0xECu8, 0x3Fu8, 0xB0u8, 0x33u8, 0x83u8, 0xCAu8, 0x02u8, 0xD2u8, 0xCFu8, 0xBFu8, 0x04u8, + 0x39u8, 0xE6u8, 0x32u8, 0x2Cu8, 0x75u8, 0x93u8, 0x3Fu8, 0x3Eu8, 0xCCu8, 0x12u8, 0x03u8, + 0x1Au8, 0xD1u8, 0x4Bu8, 0xBFu8, 0xC0u8, 0x0Bu8, 0xD3u8, 0x23u8, 0x32u8, 0xE7u8, 0xE0u8, + 0x3Eu8, 0x50u8, 0x54u8, 0x54u8, 0xCBu8, 0xA9u8, 0x09u8, 0xC5u8, 0x3Eu8, 0x6Eu8, 0xE2u8, + 0x04u8, 0xCEu8, 0x38u8, 0x48u8, 0x92u8, 0xBEu8, 0xC5u8, 0xF7u8, 0x58u8, 0x81u8, 0xF0u8, + 0x1Du8, 0x51u8, 0x3Eu8, 0x17u8, 0xAFu8, 0xE1u8, 0x34u8, 0x0Cu8, 0xC7u8, 0x3Bu8, 0x41u8, + 0x65u8, 0xEAu8, 0xCBu8, 0x32u8, 0xC2u8, 0xF1u8, 0x5Bu8, 0xC1u8, 0x29u8, 0x9Au8, 0x8Eu8, + 0xE6u8, 0x69u8, 0x96u8, 0xE4u8, 0xC0u8, 0xE2u8, 0x97u8, 0x8Fu8, 0xAAu8, 0xCAu8, 0xCEu8, + 0xD7u8, 0x40u8, 0xE0u8, 0xC7u8, 0x41u8, 0x3Du8, 0x12u8, 0x3Eu8, 0x8Du8, 0xC0u8, 0x9Cu8, + 0x55u8, 0xBAu8, 0x9Eu8, 0x38u8, 0xFCu8, 0x32u8, 0x40u8, 0x70u8, 0x88u8, 0xC6u8, 0x1Eu8, + 0x0Au8, 0xF4u8, 0xF1u8, 0x3Fu8, 0xD3u8, 0x9Bu8, 0x89u8, 0xEDu8, 0x58u8, 0xE2u8, 0xC3u8, + 0xBFu8, 0xC1u8, 0x38u8, 0x3Du8, 0x45u8, 0x11u8, 0x6Eu8, 0x84u8, 0x3Fu8, 0x3Au8, 0x68u8, + 0x2Eu8, 0x42u8, 0xA7u8, 0x60u8, 0x37u8, 0xBFu8, 0xA7u8, 0x75u8, 0x1Au8, 0x58u8, 0x5Du8, + 0xE7u8, 0xD0u8, 0xBEu8, 0xAAu8, 0xDEu8, 0xDDu8, 0xDBu8, 0x90u8, 0x6Du8, 0xBDu8, 0x3Eu8, + 0xEAu8, 0x8Bu8, 0x5Fu8, 0xD1u8, 0x93u8, 0x65u8, 0x84u8, 0xBEu8, 0xCAu8, 0xCAu8, 0xAFu8, + 0xC9u8, 0x05u8, 0x63u8, 0x40u8, 0x3Eu8, 0x00u8, 0x00u8, 0x00u8, 0x96u8, 0xFEu8, 0x6Eu8, + 0x0Au8, 0xC2u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x18u8, 0x15u8, 0x41u8, 0xCCu8, + 0xFCu8, 0x58u8, 0x50u8, 0x14u8, 0xCBu8, 0x89u8, 0xC1u8, 0xF0u8, 0x25u8, 0x26u8, 0xEFu8, + 0x42u8, 0x12u8, 0x56u8, 0x41u8, 0x93u8, 0x30u8, 0x49u8, 0x50u8, 0x60u8, 0xAFu8, 0x27u8, + 0x41u8, 0x8Du8, 0x11u8, 0x2Bu8, 0x1Du8, 0xBAu8, 0x68u8, 0xDBu8, 0xC0u8, 0x88u8, 0x74u8, + 0xB4u8, 0xDAu8, 0x9Fu8, 0xA6u8, 0x5Eu8, 0x40u8, 0x10u8, 0x5Eu8, 0x90u8, 0xC8u8, 0x63u8, + 0xDDu8, 0x27u8, 0x40u8, 0xAAu8, 0x49u8, 0xB8u8, 0x60u8, 0x10u8, 0x4Bu8, 0xFAu8, 0xBFu8, + 0x66u8, 0xFAu8, 0xBCu8, 0x1Bu8, 0x22u8, 0x3Bu8, 0xB7u8, 0x3Fu8, 0x3Au8, 0x51u8, 0x0Fu8, + 0x0Fu8, 0x3Cu8, 0x3Eu8, 0x70u8, 0xBFu8, 0x51u8, 0xF7u8, 0x56u8, 0x23u8, 0xBDu8, 0x16u8, + 0x1Du8, 0x3Fu8, 0xBFu8, 0x0Au8, 0x72u8, 0x9Eu8, 0x02u8, 0xF9u8, 0x91u8, 0x3Eu8, 0x88u8, + 0xA1u8, 0x28u8, 0x8Du8, 0x30u8, 0x63u8, 0x94u8, 0xBEu8, 0x57u8, 0xBCu8, 0x60u8, 0x6Fu8, + 0xDFu8, 0x45u8, 0x5Cu8, 0x3Eu8, 0x93u8, 0xB5u8, 0x7Fu8, 0x44u8, 0xDAu8, 0x4Cu8, 0x13u8, + 0xBEu8, 0x44u8, 0x74u8, 0x33u8, 0x8Cu8, 0xF0u8, 0x2Au8, 0x80u8, 0xC1u8, 0x5Au8, 0x20u8, + 0x66u8, 0x25u8, 0x5Cu8, 0xD6u8, 0x65u8, 0xC1u8, 0xE8u8, 0x91u8, 0xFEu8, 0xB0u8, 0x02u8, + 0x5Au8, 0x1Du8, 0x41u8, 0x8Eu8, 0x58u8, 0x45u8, 0x41u8, 0x6Du8, 0x48u8, 0xD2u8, 0x40u8, + 0xADu8, 0xE8u8, 0xB7u8, 0x2Du8, 0x40u8, 0x8Au8, 0x8Cu8, 0xC0u8, 0xC8u8, 0x56u8, 0x1Du8, + 0x53u8, 0x36u8, 0xDFu8, 0x42u8, 0x40u8, 0x34u8, 0x27u8, 0x42u8, 0x07u8, 0xF9u8, 0x19u8, + 0xF3u8, 0xBFu8, 0x85u8, 0xC3u8, 0x85u8, 0x0Au8, 0x62u8, 0xBFu8, 0x84u8, 0x3Fu8, 0xEDu8, + 0xFBu8, 0x6Bu8, 0x5Au8, 0xABu8, 0xEBu8, 0x59u8, 0x3Fu8, 0xE6u8, 0xB7u8, 0xCAu8, 0x68u8, + 0xA0u8, 0x55u8, 0x25u8, 0xBFu8, 0x74u8, 0x7Bu8, 0xE0u8, 0x18u8, 0xB8u8, 0x37u8, 0xE4u8, + 0x3Eu8, 0x15u8, 0xE0u8, 0x40u8, 0x07u8, 0x32u8, 0x5Bu8, 0x9Cu8, 0xBEu8, 0x7Cu8, 0x83u8, + 0xCCu8, 0x0Eu8, 0x38u8, 0xB0u8, 0x47u8, 0x3Eu8, 0xD2u8, 0x04u8, 0xC6u8, 0x52u8, 0xCAu8, + 0xC8u8, 0x03u8, 0x3Eu8, 0x7Cu8, 0xA2u8, 0x5Cu8, 0x95u8, 0x4Fu8, 0xA6u8, 0x67u8, 0xC1u8, + 0xD7u8, 0x42u8, 0x72u8, 0x88u8, 0x93u8, 0x9Cu8, 0x59u8, 0xC1u8, 0xA2u8, 0x3Eu8, 0x2Eu8, + 0x45u8, 0x93u8, 0x5Du8, 0x05u8, 0x41u8, 0xCDu8, 0xB1u8, 0x4Bu8, 0x4Du8, 0x85u8, 0x42u8, + 0xC9u8, 0x40u8, 0x5Eu8, 0x07u8, 0x89u8, 0x36u8, 0x53u8, 0x40u8, 0x7Fu8, 0xC0u8, 0x38u8, + 0x41u8, 0x31u8, 0xC2u8, 0x3Eu8, 0xE1u8, 0x32u8, 0x40u8, 0x2Cu8, 0xACu8, 0x79u8, 0xE0u8, + 0x6Eu8, 0xB6u8, 0xDDu8, 0xBFu8, 0x4Du8, 0xAAu8, 0xBFu8, 0xC0u8, 0x84u8, 0xE4u8, 0x70u8, + 0xBFu8, 0x88u8, 0x30u8, 0x3Fu8, 0xC6u8, 0xDDu8, 0xA5u8, 0x54u8, 0x3Fu8, 0x3Du8, 0x17u8, + 0xDBu8, 0xD9u8, 0x2Cu8, 0xD0u8, 0x19u8, 0xBFu8, 0x93u8, 0xC0u8, 0x0Du8, 0x5Fu8, 0xE9u8, + 0x72u8, 0xD5u8, 0x3Eu8, 0x05u8, 0x18u8, 0x1Bu8, 0xDFu8, 0x6Eu8, 0xF8u8, 0x89u8, 0xBEu8, + 0x52u8, 0x40u8, 0xCCu8, 0xBCu8, 0x3Bu8, 0xA6u8, 0x2Bu8, 0x3Eu8, 0x84u8, 0x49u8, 0xFFu8, + 0xA4u8, 0xC9u8, 0x91u8, 0xEAu8, 0x3Du8, 0x00u8, 0x00u8, 0x00u8, 0x36u8, 0xAAu8, 0x6Eu8, + 0x0Au8, 0xC2u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x18u8, 0x15u8, 0x41u8, 0x80u8, + 0x70u8, 0xA5u8, 0xA8u8, 0x44u8, 0xCFu8, 0x81u8, 0xC1u8, 0x37u8, 0x9Cu8, 0xD6u8, 0x64u8, + 0x00u8, 0x63u8, 0x64u8, 0x41u8, 0xDFu8, 0xC0u8, 0xBAu8, 0x58u8, 0x6Cu8, 0xB3u8, 0x1Bu8, + 0x41u8, 0x6Cu8, 0x64u8, 0x69u8, 0x85u8, 0x0Eu8, 0x16u8, 0xD9u8, 0xC0u8, 0xDFu8, 0xC2u8, + 0xE8u8, 0x32u8, 0x9Cu8, 0x4Fu8, 0x5Cu8, 0x40u8, 0x60u8, 0xE3u8, 0x4Fu8, 0x41u8, 0xEEu8, + 0xD4u8, 0x1Fu8, 0xC0u8, 0xC9u8, 0x5Du8, 0x19u8, 0xEDu8, 0x0Bu8, 0xF8u8, 0xD5u8, 0xBFu8, + 0x10u8, 0x2Du8, 0x31u8, 0xEBu8, 0xBEu8, 0xF8u8, 0x91u8, 0x3Fu8, 0x30u8, 0xCBu8, 0x24u8, + 0x66u8, 0xB5u8, 0x27u8, 0x51u8, 0xBFu8, 0xB0u8, 0x88u8, 0xBBu8, 0x07u8, 0x83u8, 0x8Du8, + 0x07u8, 0x3Fu8, 0xE0u8, 0x8Eu8, 0x56u8, 0x4Du8, 0xF5u8, 0x1Du8, 0xB8u8, 0xBEu8, 0x97u8, + 0xE4u8, 0x99u8, 0x90u8, 0x42u8, 0x3Bu8, 0x66u8, 0x3Eu8, 0xACu8, 0x3Bu8, 0x67u8, 0x0Fu8, + 0x24u8, 0xDEu8, 0xF2u8, 0x3Du8, 0xE2u8, 0x5Au8, 0x49u8, 0x2Au8, 0xABu8, 0xBCu8, 0xD6u8, + 0xBDu8, 0xB0u8, 0xDDu8, 0x74u8, 0xB1u8, 0x29u8, 0xFBu8, 0x88u8, 0xC1u8, 0x23u8, 0xF3u8, + 0xACu8, 0xAFu8, 0xDFu8, 0x55u8, 0x5Au8, 0xC1u8, 0xC2u8, 0xFFu8, 0xB6u8, 0x1Fu8, 0x8Fu8, + 0x79u8, 0x23u8, 0x41u8, 0x19u8, 0x85u8, 0x6Bu8, 0x62u8, 0xD0u8, 0x12u8, 0xC1u8, 0x40u8, + 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x00u8, 0x00u8, 0x18u8, 0x25u8, 0x41u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, + 0x46u8, 0x40u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x00u8, 0x2Cu8, 0x40u8, ]; } From bcdfe0dcfc491a02fbddd273618f32a9a389ca6c Mon Sep 17 00:00:00 2001 From: Andrei Zisu Date: Sun, 5 Nov 2023 23:59:47 +0100 Subject: [PATCH 21/27] Implement position retrieval --- crates/lox_core/src/ephemeris/daf_spk.rs | 1 + crates/lox_core/src/ephemeris/daf_spk/api.rs | 127 +++++++++++ .../lox_core/src/ephemeris/daf_spk/parser.rs | 199 +++++++++++------- 3 files changed, 246 insertions(+), 81 deletions(-) create mode 100644 crates/lox_core/src/ephemeris/daf_spk/api.rs diff --git a/crates/lox_core/src/ephemeris/daf_spk.rs b/crates/lox_core/src/ephemeris/daf_spk.rs index 67c567fa..070a9576 100644 --- a/crates/lox_core/src/ephemeris/daf_spk.rs +++ b/crates/lox_core/src/ephemeris/daf_spk.rs @@ -1 +1,2 @@ +pub mod api; pub mod parser; diff --git a/crates/lox_core/src/ephemeris/daf_spk/api.rs b/crates/lox_core/src/ephemeris/daf_spk/api.rs new file mode 100644 index 00000000..bb2995ca --- /dev/null +++ b/crates/lox_core/src/ephemeris/daf_spk/api.rs @@ -0,0 +1,127 @@ +use super::parser::{DafSpkError, Spk, SpkSegment, SpkType2Array, SpkType2Record}; + +type Position = (f64, f64, f64); +type Epoch = f64; +type Body = i32; + +impl Spk { + fn find_segment( + &self, + origin: Body, + target: Body, + ) -> Result<(&SpkSegment, isize), DafSpkError> { + let mut sign = 1; + + let mut target = target; + let mut origin = origin; + if target < origin { + (origin, target) = (target, origin); + sign = -1; + } + + let segment = self + .segments + .get(&origin) + .ok_or(DafSpkError::UnableToFindMatchingSegment)? + .get(&target) + .ok_or(DafSpkError::UnableToFindMatchingSegment)?; + + Ok((&segment, sign)) + } + + fn find_record<'a>( + &'a self, + array: &'a SpkType2Array, + initial_epoch: Epoch, + epoch: Epoch, + ) -> Result<(&SpkType2Record, f64), DafSpkError> { + let seconds_from_record_start = epoch - initial_epoch; + + let intlen = array.intlen as f64; + let mut record_number = (seconds_from_record_start / intlen).floor() as usize; + let mut fraction = seconds_from_record_start % intlen; + + // Chebyshev piecewise polynomials overlap at patchpoints. This means that one + // can safely take the end of the interval from the next record. But this implies + // special handling of the last record, where there's no next record that we can + // draw from. + if record_number == array.n as usize { + record_number -= 1; + fraction = array.intlen as f64; + } + + let record = array + .records + .get(record_number) + .ok_or(DafSpkError::UnableToFindMatchingRecord)?; + + Ok((record, fraction)) + } + + pub fn position( + &self, + epoch: Epoch, + origin: Body, + target: Body, + ) -> Result { + let (segment, sign) = self.find_segment(origin, target)?; + let sign = sign as f64; + + if epoch < segment.initial_epoch || epoch > segment.final_epoch { + return Err(DafSpkError::UnableToFindMatchingSegment); + } + + // @TODO use a more flexible way + let mut x = 0f64; + let mut y = 0f64; + let mut z = 0f64; + + match &segment.data { + super::parser::SpkArray::Type2(array) => { + let (record, fraction) = self.find_record(array, segment.initial_epoch, epoch)?; + + let degree_of_polynomial = array.degree_of_polynomial() as usize; + let mut coefficients = Vec::::with_capacity(degree_of_polynomial); + + coefficients.push(1f64); + coefficients.push(2f64 * fraction / array.intlen as f64 - 1f64); + + for i in 2..degree_of_polynomial { + coefficients + .push(2f64 * coefficients[1] * coefficients[i - 1] - coefficients[i - 2]); + } + + #[allow(clippy::needless_range_loop)] + for i in 0..degree_of_polynomial { + x += sign * record.x[i] * coefficients[i]; + y += sign * record.y[i] * coefficients[i]; + z += sign * record.z[i] * coefficients[i]; + } + } + } + + Ok((x, y, z)) + } +} + +#[cfg(test)] +mod test { + use crate::ephemeris::daf_spk::parser::parse_daf_spk; + use crate::ephemeris::daf_spk::parser::test::FILE_CONTENTS; + + use super::*; + + #[test] + fn test_position() { + let spk = parse_daf_spk(&FILE_CONTENTS).expect("Unable to parse DAF/SPK"); + + assert_eq!( + Err(DafSpkError::UnableToFindMatchingSegment), + spk.position(2457388.5000000 as Epoch, 1, 2) + ); + assert_eq!( + Ok((-32703259.291699532, 31370540.51993667, 20159681.594182793)), + spk.position(-14200747200.0 as Epoch, 0, 1) + ); + } +} diff --git a/crates/lox_core/src/ephemeris/daf_spk/parser.rs b/crates/lox_core/src/ephemeris/daf_spk/parser.rs index 6c1c702c..65672467 100644 --- a/crates/lox_core/src/ephemeris/daf_spk/parser.rs +++ b/crates/lox_core/src/ephemeris/daf_spk/parser.rs @@ -1,8 +1,12 @@ +use std::collections::HashMap; + use nom::error::ErrorKind; use nom::bytes::complete as nb; use nom::number::complete as nn; +type BodyId = i32; + const RECORD_SIZE: u32 = 1024; #[derive(Debug, PartialEq)] @@ -43,24 +47,37 @@ pub enum DafSpkError { UnexpectedNumberOfComponents, UnableToParse, UnsupportedSpkArrayType { data_type: i32 }, + // Unable to find the segment for a given center body and target body + UnableToFindMatchingSegment, + // Unable to find record for a given date + UnableToFindMatchingRecord, } #[derive(Debug, PartialEq)] pub struct SpkType2Record { - x: Vec, - y: Vec, - z: Vec, + pub x: Vec, + pub y: Vec, + pub z: Vec, +} + +#[derive(Debug, PartialEq)] +pub struct SpkType2Array { + pub records: Vec, + pub init: u32, + pub intlen: u32, + pub rsize: u32, + pub n: u32, +} + +impl SpkType2Array { + pub fn degree_of_polynomial(&self) -> u32 { + degree_of_chebyshev_polynomial(self.rsize) + } } #[derive(Debug, PartialEq)] pub enum SpkArray { - Type2 { - records: Vec, - init: u32, - intlen: u32, - rsize: u32, - n: u32, - }, + Type2(SpkType2Array), } #[derive(Debug, PartialEq)] @@ -71,11 +88,11 @@ pub struct SpkSegment { // In J2000 epoch pub final_epoch: f64, // NAIF id of the target - pub target_id: i32, + pub target_id: BodyId, // NAIF id of the center - pub center_id: i32, + pub center_id: BodyId, // NAIF id of the reference frame - pub reference_frame_id: i32, + pub reference_frame_id: BodyId, pub data_type: i32, pub initial_address: usize, pub final_address: usize, @@ -93,7 +110,7 @@ pub struct DafSummaryRecord { pub struct Spk { pub file_record: DafFileRecord, pub comment: String, - pub segments: Vec, + pub segments: HashMap>, } pub fn parse_daf_file_record_endianness( @@ -367,7 +384,7 @@ pub fn parse_daf_spk(full_input: &[u8]) -> Result { file_record.fward, )?; - let segments = all_summaries + let segments: HashMap> = all_summaries .iter() .map(|summary_record| { summary_record @@ -379,7 +396,14 @@ pub fn parse_daf_spk(full_input: &[u8]) -> Result { .collect::, DafSpkError>>()? .into_iter() .flatten() - .collect::<_>(); + .fold(HashMap::new(), |mut map, segment| { + map.entry(segment.center_id) + .or_default() + .entry(segment.target_id) + .or_insert(segment); + + map + }); Ok(Spk { file_record, @@ -400,6 +424,10 @@ impl From> for DafSpkError { } } +fn degree_of_chebyshev_polynomial(rsize: u32) -> u32 { + (rsize - 2) / 3 +} + pub fn parse_spk_segment( summary: &DafSummary, full_input: &[u8], @@ -447,7 +475,7 @@ pub fn parse_spk_segment( let rsize = rsize as u32; let n = n as u32; - let degree_of_polynomial = (rsize - 2) / 3; + let degree_of_polynomial = degree_of_chebyshev_polynomial(rsize); let mut segment_data = &full_input[initial_byte_address..final_byte_address]; @@ -488,13 +516,13 @@ pub fn parse_spk_segment( }); } - SpkArray::Type2 { + SpkArray::Type2(SpkType2Array { records, init, intlen, rsize, n, - } + }) } _ => return Err(DafSpkError::UnsupportedSpkArrayType { data_type }), }; @@ -514,7 +542,7 @@ pub fn parse_spk_segment( } #[cfg(test)] -mod test { +pub mod test { use super::*; #[test] @@ -637,63 +665,14 @@ name is "19_spk") available from the NAIF website (http://naif.jpl.nasa.gov/tuto fn get_expected_spk() -> Spk { // Values confirmed with JPLEphem.jp and python-jplephem - Spk { - file_record: DafFileRecord { - locidw: "DAF/SPK".to_string(), - nd: 2, - ni: 6, - locifn: "NIO2SPK".to_string(), - fward: 4, - bward: 4, - free: 14967465, - locfmt: "LTL-IEEE".to_string(), - prenul: vec![ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, - ], - ftpstr: vec![ - 70, 84, 80, 83, 84, 82, 58, 13, 58, 10, 58, 13, 10, 58, 13, 0, 58, 129, 58, 16, - 206, 58, 69, 78, 68, 70, 84, 80, - ], - pstnul: vec![ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - ], - }, - comment: get_expected_comment_string(), - segments: vec![SpkSegment { + + let mut segments: HashMap> = HashMap::new(); + + segments + .entry(0) + .or_default() + .entry(1) + .or_insert(SpkSegment { name: "DE-0430LE-0430".to_string(), initial_epoch: -14200747200.0, final_epoch: 20514081600.0, @@ -703,7 +682,7 @@ name is "19_spk") available from the NAIF website (http://naif.jpl.nasa.gov/tuto data_type: 2, initial_address: 641, final_address: 1280, - data: SpkArray::Type2 { + data: SpkArray::Type2(SpkType2Array { records: vec![ SpkType2Record { x: vec![ @@ -1410,8 +1389,66 @@ name is "19_spk") available from the NAIF website (http://naif.jpl.nasa.gov/tuto intlen: 691200, rsize: 44, n: 14, - }, - }], + }), + }); + + Spk { + file_record: DafFileRecord { + locidw: "DAF/SPK".to_string(), + nd: 2, + ni: 6, + locifn: "NIO2SPK".to_string(), + fward: 4, + bward: 4, + free: 14967465, + locfmt: "LTL-IEEE".to_string(), + prenul: vec![ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, + ], + ftpstr: vec![ + 70, 84, 80, 83, 84, 82, 58, 13, 58, 10, 58, 13, 10, 58, 13, 0, 58, 129, 58, 16, + 206, 58, 69, 78, 68, 70, 84, 80, + ], + pstnul: vec![ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ], + }, + comment: get_expected_comment_string(), + segments, } } @@ -1463,7 +1500,7 @@ name is "19_spk") available from the NAIF website (http://naif.jpl.nasa.gov/tuto } } - const FILE_CONTENTS: [u8; 10240] = [ + pub const FILE_CONTENTS: [u8; 10240] = [ 0x44u8, 0x41u8, 0x46u8, 0x2Fu8, 0x53u8, 0x50u8, 0x4Bu8, 0x20u8, 0x02u8, 0x00u8, 0x00u8, 0x00u8, 0x06u8, 0x00u8, 0x00u8, 0x00u8, 0x4Eu8, 0x49u8, 0x4Fu8, 0x32u8, 0x53u8, 0x50u8, 0x4Bu8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, 0x20u8, From 03a62b5f0efea39d4141ea35c3fb1898cc5fbe84 Mon Sep 17 00:00:00 2001 From: Andrei Zisu Date: Wed, 8 Nov 2023 23:43:41 +0100 Subject: [PATCH 22/27] Transpose the coefficients --- crates/lox_core/src/ephemeris/daf_spk/api.rs | 11 +- .../lox_core/src/ephemeris/daf_spk/parser.rs | 1732 ++++++++++------- 2 files changed, 1026 insertions(+), 717 deletions(-) diff --git a/crates/lox_core/src/ephemeris/daf_spk/api.rs b/crates/lox_core/src/ephemeris/daf_spk/api.rs index bb2995ca..e7e16819 100644 --- a/crates/lox_core/src/ephemeris/daf_spk/api.rs +++ b/crates/lox_core/src/ephemeris/daf_spk/api.rs @@ -1,4 +1,4 @@ -use super::parser::{DafSpkError, Spk, SpkSegment, SpkType2Array, SpkType2Record}; +use super::parser::{DafSpkError, Spk, SpkSegment, SpkType2Array, SpkType2Coefficients}; type Position = (f64, f64, f64); type Epoch = f64; @@ -34,7 +34,7 @@ impl Spk { array: &'a SpkType2Array, initial_epoch: Epoch, epoch: Epoch, - ) -> Result<(&SpkType2Record, f64), DafSpkError> { + ) -> Result<(&Vec, f64), DafSpkError> { let seconds_from_record_start = epoch - initial_epoch; let intlen = array.intlen as f64; @@ -71,7 +71,6 @@ impl Spk { return Err(DafSpkError::UnableToFindMatchingSegment); } - // @TODO use a more flexible way let mut x = 0f64; let mut y = 0f64; let mut z = 0f64; @@ -93,9 +92,9 @@ impl Spk { #[allow(clippy::needless_range_loop)] for i in 0..degree_of_polynomial { - x += sign * record.x[i] * coefficients[i]; - y += sign * record.y[i] * coefficients[i]; - z += sign * record.z[i] * coefficients[i]; + x += sign * record[i].x * coefficients[i]; + y += sign * record[i].y * coefficients[i]; + z += sign * record[i].z * coefficients[i]; } } } diff --git a/crates/lox_core/src/ephemeris/daf_spk/parser.rs b/crates/lox_core/src/ephemeris/daf_spk/parser.rs index 65672467..1348b12f 100644 --- a/crates/lox_core/src/ephemeris/daf_spk/parser.rs +++ b/crates/lox_core/src/ephemeris/daf_spk/parser.rs @@ -1,4 +1,5 @@ use std::collections::HashMap; +use std::iter::zip; use nom::error::ErrorKind; @@ -54,15 +55,15 @@ pub enum DafSpkError { } #[derive(Debug, PartialEq)] -pub struct SpkType2Record { - pub x: Vec, - pub y: Vec, - pub z: Vec, +pub struct SpkType2Coefficients { + pub x: f64, + pub y: f64, + pub z: f64, } #[derive(Debug, PartialEq)] pub struct SpkType2Array { - pub records: Vec, + pub records: Vec>, pub init: u32, pub intlen: u32, pub rsize: u32, @@ -479,7 +480,7 @@ pub fn parse_spk_segment( let mut segment_data = &full_input[initial_byte_address..final_byte_address]; - let mut records: Vec = Vec::with_capacity(n as usize); + let mut records: Vec> = Vec::with_capacity(n as usize); for _ in 0..n { // MID and RADIUS seem to be generally ignored in the industry @@ -509,11 +510,12 @@ pub fn parse_spk_segment( f64_parser, )(segment_data)?; - records.push(SpkType2Record { - x: x_coeff, - y: y_coeff, - z: z_coeff, - }); + let zipped_coefficients: Vec<_> = zip(x_coeff, y_coeff) + .zip(z_coeff) + .map(|((x, y), z)| SpkType2Coefficients { x, y, z }) + .collect(); + + records.push(zipped_coefficients); } SpkArray::Type2(SpkType2Array { @@ -684,706 +686,1014 @@ name is "19_spk") available from the NAIF website (http://naif.jpl.nasa.gov/tuto final_address: 1280, data: SpkArray::Type2(SpkType2Array { records: vec![ - SpkType2Record { - x: vec![ - -45337598.32712886, - -11420944.697258519, - 1231640.8337434675, - 13474.686621275972, - -4516.487838379613, - 255.92773698003953, - -0.6852704163869968, - -1.186289041290495, - 0.10359080691773931, - -0.0024450355914312806, - -0.00037984826619000424, - 4.866121203130994e-5, - -2.0940028772635746e-6, - -1.1128208160400393e-7, - ], - y: vec![ - 19369938.44656301, - -12637982.109486885, - -560491.1149804397, - 75269.27662838619, - -1778.1593562220773, - -139.11079477516455, - 18.589407873398255, - -0.8470749615056106, - -0.025136377951734054, - 0.006832845296274551, - -0.0004590535913385917, - 5.317851604321568e-7, - 2.763684192830889e-6, - -2.5800884045558593e-7, - ], - z: vec![ - 15085572.533729337, - -5541486.962461706, - -428280.81049458525, - 38734.16963615925, - -474.28100346732754, - -101.07262002208887, - 9.987607796726845, - -0.32728192683015445, - -0.024284067540919708, - 0.003901376147416767, - -0.00020497975331372796, - -4.825361414826083e-6, - 1.693948385546482e-6, - -1.2582686566933554e-7, - ], - }, - SpkType2Record { - x: vec![ - -58449569.351693176, - -1800097.6887639922, - 1107930.6023072726, - -24766.34259255632, - -809.5258644486346, - 99.12917700968808, - -6.248044618744813, - 0.21641713799729656, - 0.0016499751844322543, - -0.0009274510372131162, - 8.000372257212273e-5, - -3.9756072002001035e-6, - 6.145431105172551e-8, - 1.0008661455878206e-8, - ], - y: vec![ - -7935720.979204208, - -14086536.219809037, - 136926.39656623837, - 40936.67997869476, - -1916.2731958592562, - 54.90763068538223, - 0.9048995628056529, - -0.2509084134758946, - 0.019117773815199555, - -0.0008500801852717656, - 7.62770401533323e-6, - 2.5586829899051993e-6, - -2.753091189940317e-7, - 1.6453893506401273e-8, - ], - z: vec![ - 1898385.1942239169, - -7324265.976069875, - -43287.182419830104, - 24436.04346304577, - -937.1533465759844, - 18.88014753122729, - 1.1386722295041676, - -0.15655757537582016, - 0.010024257990951446, - -0.0003560607620357178, - -4.331049116694897e-6, - 1.7821740868686663e-6, - -1.5334346647775201e-7, - 7.655421689274075e-9, - ], - }, - SpkType2Record { - x: vec![ - -54210897.94074123, - 5761909.474302993, - 777406.6366812486, - -28073.762491013582, - 121.63964967772013, - 12.083715502838807, - -1.653002384389899, - 0.09122771149628371, - -0.0039806132479455955, - 0.00011090320124970714, - 3.208770532420429e-7, - -3.086111778410841e-7, - 2.5750271455539576e-8, - -1.1242975305362077e-9, - ], - y: vec![ - -33770751.31370555, - -11464200.40064359, - 480029.461654695, - 18778.161983893195, - -916.1483800707576, - 37.85101299123708, - -1.1948239135585854, - 0.009935203283866965, - 0.0016042528603672538, - -0.00016422253688236636, - 9.711085809982569e-6, - -4.246183965796327e-7, - 1.1851050800781965e-8, - 3.905894854894403e-10, - ], - z: vec![ - -12326047.807205081, - -6719455.6659584055, - 174427.62741919362, - 12963.860927714393, - -501.4481801676182, - 18.921171942332254, - -0.46377127345030145, - -0.004278716845379022, - 0.0012736474960823164, - -9.924063032619023e-5, - 5.146289420109514e-6, - -1.9415079840488192e-7, - 3.450896117737893e-9, - 1.819059570466293e-10, - ], - }, - SpkType2Record { - x: vec![ - -37505891.58733246, - 10674488.54339679, - 455040.0736010689, - -25695.24376738423, - 113.81703928594601, - -7.925717470323576, - -0.34514522809375564, - 0.0176780815965851, - -0.0010531956678777052, - 4.514322215422244e-5, - -1.4448248877522545e-6, - 4.147204966378829e-8, - 6.312482379064945e-10, - 8.266830416632963e-11, - ], - y: vec![ - -52289262.29241685, - -6923680.138903326, - 637750.5106004501, - 8767.195085224153, - -409.200548600714, - 14.79991761561071, - -0.7183818860227476, - 0.014210457550526053, - -0.00046859577877625294, - -7.592577392189398e-6, - 7.777434254709131e-7, - -6.121607354123216e-8, - 2.661451379451677e-9, - -9.745279166627787e-10, - ], - z: vec![ - -23956693.94508471, - -4813309.998691719, - 292402.5132673988, - 7374.247209604691, - -230.21909153218752, - 8.726464815796334, - -0.3469500588730363, - 0.005723849852140356, - -0.00013937389776502555, - -8.79098050520026e-6, - 5.661431511840274e-7, - -3.7012971681646134e-8, - 1.7275326074056334e-9, - 2.647744718956467e-12, - ], - }, - SpkType2Record { - x: vec![ - -13480566.556582376, - 13098038.480735628, - 151264.9806054996, - -25476.58030891933, - -101.92493293828662, - -12.889820450709234, - -0.13746956986424033, - 0.0021899860484605447, - -6.102771135850726e-5, - 2.0203914290812262e-5, - 1.2401306222838308e-7, - 3.414370315475422e-8, - 6.113933096711511e-11, - -6.847536309069575e-11, - ], - y: vec![ - -60768703.66295594, - -1495202.6867775493, - 710699.0281462192, - 3754.081219384137, - -262.7478808422509, - 0.5057165515555004, - -0.5501353335248234, - -0.0026423962154335386, - -0.0005747023559221212, - -4.427521182666183e-6, - -2.2608106711907944e-7, - -2.077889269902425e-9, - 1.9965534065395228e-9, - -1.7723130627533263e-10, - ], - z: vec![ - -31001044.578021735, - -2172196.746889192, - 363207.4374640283, - 4677.273311438741, - -129.4495768022601, - 1.6230758048764975, - -0.2790110353336393, - -0.0016393935905534595, - -0.0003001401197731395, - -4.483326811276608e-6, - -1.3281815174391787e-7, - -4.685709180488663e-9, - 2.0915798921278826e-10, - 1.0123566576788687e-10, - ], - }, - SpkType2Record { - x: vec![ - 12924374.015098413, - 13036921.776594413, - -173258.67460110967, - -29322.559968570153, - -385.65279580845936, - -14.886368014428252, - 0.032080021355132285, - 0.016287548681964924, - 0.0012033591743594745, - 6.5773094877564e-5, - 2.552075542282858e-6, - 8.678130515258873e-8, - 1.4424526593101816e-9, - 8.481561628175781e-11, - ], - y: vec![ - -57983909.45103208, - 4294940.852419956, - 728370.1715333756, - -1151.356513103967, - -402.2354970834203, - -15.867069239763726, - -0.9161278285877755, - -0.02488481245885575, - -0.0008160331389670967, - -2.3656137324417096e-6, - 9.062712071296104e-7, - 8.465577138535719e-8, - 4.27633127160829e-9, - 6.586099007446288e-10, - ], - z: vec![ - -32286857.994901855, - 922700.2004467127, - 406705.6026941626, - 2464.488245095452, - -174.0636949697199, - -6.900606389564812, - -0.4920339971160255, - -0.01498370326892611, - -0.00056161731076134, - -8.1665411304901e-6, - 2.1587896504329588e-7, - 3.615726588487529e-8, - 1.8867080135302315e-9, - 6.753822366729298e-11, - ], - }, - SpkType2Record { - x: vec![ - 36409830.50565798, - 10117327.079638528, - -571151.4194038364, - -37563.17926341247, - -603.7807025768652, - -1.2081752304636253, - 1.568028009732732, - 0.11981831128613148, - 0.006256803697846111, - 0.0002222552080839927, - 2.371661165742397e-6, - -4.1003984878706727e-7, - -4.246271385183673e-8, - -2.140884834622074e-9, - ], - y: vec![ - -43709674.23762289, - 9923967.547431879, - 660828.826202368, - -11606.941139804172, - -1009.6836691174926, - -48.710551192440604, - -1.870529516169376, - -0.031933651917395375, - 0.0016547091763384166, - 0.00023129741041829377, - 1.544835685314219e-5, - 7.233327555162387e-7, - 1.9237101443426504e-8, - -4.723400496382733e-10, - ], - z: vec![ - -27137646.95744377, - 4231773.3597003305, - 412454.2316412725, - -2247.364291950567, - -475.17709608369734, - -25.85553272787237, - -1.1623769344020758, - -0.029613442794534588, - 0.00022571479137512476, - 0.000100040492847673, - 7.990148218873311e-6, - 4.2883476302382474e-7, - 1.5763466794390723e-8, - -2.856720293690054e-10, - ], - }, - SpkType2Record { - x: vec![ - 50543722.086727604, - 3599931.8894646326, - -1069755.3628819815, - -43737.09886475732, - 164.97450012878275, - 105.40651375456635, - 8.55469813080309, - 0.36590467785850955, - 0.0007971678655988924, - -0.0013822344209006461, - -0.00013287000051370035, - -6.7162339643467585e-6, - -5.9391362124116395e-8, - 2.4000988068303212e-8, - ], - y: vec![ - -19269185.716454018, - 14288380.206906335, - 384319.4620373969, - -38037.15054279719, - -2420.636919948095, - -84.68688187104273, - 0.4731449232651164, - 0.33945733423292934, - 0.02848960090423228, - 0.0012747729527165339, - 1.2336704218421914e-6, - -5.356377894611242e-6, - -5.226237790409592e-7, - -2.723298390425405e-8, - ], - z: vec![ - -15583889.594508631, - 7244035.831173811, - 317312.37891250395, - -15697.124584282366, - -1308.4974377707993, - -56.23908543773916, - -0.645794473447411, - 0.14265082540796215, - 0.01511275828687557, - 0.0008250912189995393, - 1.4607793651668574e-5, - -2.1519526344664532e-6, - -2.720837114530803e-7, - -1.6915798221638822e-8, - ], - }, - SpkType2Record { - x: vec![ - 47715161.385413, - -6765836.899970185, - -1465606.5161023152, - -10581.87372964701, - 4807.211552791774, - 343.9710037358144, - 2.4246758636389076, - -1.648672697688401, - -0.14393165092324786, - -0.0016606957917306442, - 0.0007746124393387002, - 7.591369608267796e-5, - 1.2175945888890173e-6, - -4.1804046500567263e-7, - ], - y: vec![ - 10404753.329928415, - 14779071.692198437, - -344210.7030515934, - -84226.8052209682, - -2583.8778640813425, - 164.8115854848478, - 24.30539430978275, - 0.9842641323600833, - -0.061475986403702304, - -0.010940818407565325, - -0.0005148133372302519, - 2.851152275335745e-5, - 5.894372589974007e-6, - 3.1205490724883324e-7, - ], - z: vec![ - 542318.7750979952, - 8594088.428959873, - -29727.188744053525, - -43815.874113158745, - -1882.9667458416272, - 51.797012526487116, - 12.710013263635187, - 0.6981068201687447, - -0.017679892337270447, - -0.005661512737256319, - -0.0003559310741837079, - 7.237817810727936e-6, - 3.016221773585502e-6, - 2.105018407145734e-7, - ], - }, - SpkType2Record { - x: vec![ - 23270918.979379125, - -17256716.368954264, - -954598.9755969029, - 101869.74273592202, - 6770.864790225536, - -404.3473796217518, - -52.99753919509793, - 1.3691602972264172, - 0.43925632684682697, - 0.0018346172940959047, - -0.0036142809423915173, - -0.00012491773418058397, - 2.828142086444596e-5, - 2.02650433691657e-6, - ], - y: vec![ - 33815823.653189495, - 7748953.55497174, - -1386443.8244291213, - -67045.26641936596, - 6049.759734071041, - 507.3469545124919, - -24.538365698424087, - -4.219212112047788, - 0.06532388690975224, - 0.03561010180824766, - 0.0005128648992871837, - -0.000292314096541678, - -1.34486238229468e-5, - 2.252218889725443e-6, - ], - z: vec![ - 15597350.020431643, - 5945649.545798879, - -639309.6247786926, - -46457.66020202247, - 2516.0791556047075, - 313.07375838137585, - -7.524554482312445, - -2.394293188546936, - -0.011274242477285907, - 0.018801936763089475, - 0.0006530328448389293, - -0.00014280604054292342, - -1.0142372145929214e-5, - 9.883364952693398e-7, - ], - }, - SpkType2Record { - x: vec![ - -14302112.478480183, - -19069919.56448197, - 515204.77798256016, - 110060.69037873248, - -5580.825240276621, - -370.2192777295126, - 48.86063157915018, - 0.3433868526053941, - -0.3689733210882523, - 0.014424822977178191, - 0.0022704585183469296, - -0.00022821024420895437, - -8.276206806577387e-6, - 2.406031793142807e-6, - ], - y: vec![ - 37127769.12752547, - -4490458.993168776, - -1451652.0030301881, - 54873.151509303076, - 5639.915091025177, - -490.94873651444885, - -13.34508901391277, - 3.8672966862522746, - -0.07771483028641848, - -0.025988013547959172, - 0.0018455519765964191, - 0.00012668340451298506, - -2.1807579234944036e-5, - -2.723247702600162e-8, - ], - z: vec![ - 21309842.14818654, - -392529.49609443726, - -828409.079766861, - 17714.073679264868, - 3594.2903651668257, - -223.0038885814632, - -12.24827254781346, - 2.0267775252913185, - -0.002714236959790189, - -0.015376585582127298, - 0.0007460432824687185, - 9.15335244786352e-5, - -1.0761861493761696e-5, - -2.6722360449168746e-7, - ], - }, - SpkType2Record { - x: vec![ - -45350344.168980576, - -11383349.691344053, - 1232277.6392773716, - 13199.32536501195, - -4497.195208447304, - 255.87672676675095, - -0.8110886216898764, - -1.1737944602604822, - 0.10326061177793994, - -0.0025024315740898176, - -0.0003717686519532686, - 4.828213004613172e-5, - -2.1153006377942852e-6, - -1.0663734226988474e-7, - ], - y: vec![ - 19224804.86125569, - -12654718.156929357, - -557057.1528215639, - 75163.12522116388, - -1788.8134345085332, - -137.42397399685794, - 18.500243622033917, - -0.8501479177967093, - -0.0242070325118841, - 0.006763728015186381, - -0.00045897874910957024, - 1.0308151299535684e-6, - 2.714271798917107e-6, - -2.567848133727514e-7, - ], - z: vec![ - 15021167.722862277, - -5554404.770343297, - -426515.7808066775, - 38706.450957135254, - -481.9905832453785, - -100.1671973654519, - 9.95325478448965, - -0.33023485740428854, - -0.023753716920769462, - 0.003870542044050555, - -0.000205785685419332, - -4.519405769857414e-6, - 1.6694911193365625e-6, - -1.2542045425680128e-7, - ], - }, - SpkType2Record { - x: vec![ - -58389226.22256667, - -1766054.6052030046, - 1106801.4567413135, - -24817.014284937664, - -801.9509565938666, - 98.56190425937514, - -6.225307809265943, - 0.2166308405314536, - 0.0015235918031991618, - -0.0009154264174046048, - 7.934582987812358e-5, - -3.963710165920319e-6, - 6.36383573374082e-8, - 9.61362055440764e-9, - ], - y: vec![ - -8091714.337427627, - -14081973.652760211, - 138810.8374249616, - 40820.06424547664, - -1912.170569517239, - 54.99316570351528, - 0.8782851315752163, - -0.248596524127064, - 0.019001665693900285, - -0.000848901463675118, - 8.060030376793692e-6, - 2.5078948861037383e-6, - -2.7242476898255323e-7, - 1.594140293923078e-8, - ], - z: vec![ - 1820428.2065686637, - -7325448.793696021, - -42163.3093941699, - 24379.16666021187, - -935.7589059008715, - 18.985238953105736, - 1.1220799638909078, - -0.1553450736857643, - 0.009975562024603925, - -0.0003567131372449493, - -4.030172364414252e-6, - 1.7540449870050126e-6, - -1.5196790376014343e-7, - 7.630701672941777e-9, - ], - }, - SpkType2Record { - x: vec![ - -54092426.04345092, - 5785867.736703381, - 776112.1568083934, - -28066.908030287876, - 122.603506733156, - 11.932401912329652, - -1.6433261659736709, - 0.09074605157091184, - -0.003965601544184511, - 0.00011096505553262233, - 2.6781404333806733e-7, - -3.037968216179319e-7, - 2.6331227830238215e-8, - -1.1234198172382371e-9, - ], - y: vec![ - -33906193.5251241, - -11449057.168716598, - 480896.6728461073, - 18721.70710881851, - -913.2813372009165, - 37.743845357251814, - -1.193841007569472, - 0.010130659052011168, - 0.0015820668574517652, - -0.00016276915666452104, - 9.640528130514774e-6, - -4.225407856969625e-7, - 1.1030750057785568e-8, - 5.757999958318061e-10, - ], - z: vec![ - -12399228.667557947, - -6713934.131973944, - 175026.40877961094, - 12933.041421377007, - -500.02031568076006, - 18.87986386969098, - -0.46425983354010003, - -0.004124182287322653, - 0.0012602487340585295, - -9.846948384070477e-5, - 5.11380993449563e-6, - -1.9349486950740913e-7, - 3.218807864676213e-9, - 1.9331843287510842e-10, - ], - }, + vec![ + SpkType2Coefficients { + x: -45337598.32712886, + y: 19369938.44656301, + z: 15085572.533729337, + }, + SpkType2Coefficients { + x: -11420944.697258519, + y: -12637982.109486885, + z: -5541486.962461706, + }, + SpkType2Coefficients { + x: 1231640.8337434675, + y: -560491.1149804397, + z: -428280.81049458525, + }, + SpkType2Coefficients { + x: 13474.686621275972, + y: 75269.27662838619, + z: 38734.16963615925, + }, + SpkType2Coefficients { + x: -4516.487838379613, + y: -1778.1593562220773, + z: -474.28100346732754, + }, + SpkType2Coefficients { + x: 255.92773698003953, + y: -139.11079477516455, + z: -101.07262002208887, + }, + SpkType2Coefficients { + x: -0.6852704163869968, + y: 18.589407873398255, + z: 9.987607796726845, + }, + SpkType2Coefficients { + x: -1.186289041290495, + y: -0.8470749615056106, + z: -0.32728192683015445, + }, + SpkType2Coefficients { + x: 0.10359080691773931, + y: -0.025136377951734054, + z: -0.024284067540919708, + }, + SpkType2Coefficients { + x: -0.0024450355914312806, + y: 0.006832845296274551, + z: 0.003901376147416767, + }, + SpkType2Coefficients { + x: -0.00037984826619000424, + y: -0.0004590535913385917, + z: -0.00020497975331372796, + }, + SpkType2Coefficients { + x: 4.866121203130994e-5, + y: 5.317851604321568e-7, + z: -4.825361414826083e-6, + }, + SpkType2Coefficients { + x: -2.0940028772635746e-6, + y: 2.763684192830889e-6, + z: 1.693948385546482e-6, + }, + SpkType2Coefficients { + x: -1.1128208160400393e-7, + y: -2.5800884045558593e-7, + z: -1.2582686566933554e-7, + }, + ], + vec![ + SpkType2Coefficients { + x: -58449569.351693176, + y: -7935720.979204208, + z: 1898385.1942239169, + }, + SpkType2Coefficients { + x: -1800097.6887639922, + y: -14086536.219809037, + z: -7324265.976069875, + }, + SpkType2Coefficients { + x: 1107930.6023072726, + y: 136926.39656623837, + z: -43287.182419830104, + }, + SpkType2Coefficients { + x: -24766.34259255632, + y: 40936.67997869476, + z: 24436.04346304577, + }, + SpkType2Coefficients { + x: -809.5258644486346, + y: -1916.2731958592562, + z: -937.1533465759844, + }, + SpkType2Coefficients { + x: 99.12917700968808, + y: 54.90763068538223, + z: 18.88014753122729, + }, + SpkType2Coefficients { + x: -6.248044618744813, + y: 0.9048995628056529, + z: 1.1386722295041676, + }, + SpkType2Coefficients { + x: 0.21641713799729656, + y: -0.2509084134758946, + z: -0.15655757537582016, + }, + SpkType2Coefficients { + x: 0.0016499751844322543, + y: 0.019117773815199555, + z: 0.010024257990951446, + }, + SpkType2Coefficients { + x: -0.0009274510372131162, + y: -0.0008500801852717656, + z: -0.0003560607620357178, + }, + SpkType2Coefficients { + x: 8.000372257212273e-5, + y: 7.62770401533323e-6, + z: -4.331049116694897e-6, + }, + SpkType2Coefficients { + x: -3.9756072002001035e-6, + y: 2.5586829899051993e-6, + z: 1.7821740868686663e-6, + }, + SpkType2Coefficients { + x: 6.145431105172551e-8, + y: -2.753091189940317e-7, + z: -1.5334346647775201e-7, + }, + SpkType2Coefficients { + x: 1.0008661455878206e-8, + y: 1.6453893506401273e-8, + z: 7.655421689274075e-9, + }, + ], + vec![ + SpkType2Coefficients { + x: -54210897.94074123, + y: -33770751.31370555, + z: -12326047.807205081, + }, + SpkType2Coefficients { + x: 5761909.474302993, + y: -11464200.40064359, + z: -6719455.6659584055, + }, + SpkType2Coefficients { + x: 777406.6366812486, + y: 480029.461654695, + z: 174427.62741919362, + }, + SpkType2Coefficients { + x: -28073.762491013582, + y: 18778.161983893195, + z: 12963.860927714393, + }, + SpkType2Coefficients { + x: 121.63964967772013, + y: -916.1483800707576, + z: -501.4481801676182, + }, + SpkType2Coefficients { + x: 12.083715502838807, + y: 37.85101299123708, + z: 18.921171942332254, + }, + SpkType2Coefficients { + x: -1.653002384389899, + y: -1.1948239135585854, + z: -0.46377127345030145, + }, + SpkType2Coefficients { + x: 0.09122771149628371, + y: 0.009935203283866965, + z: -0.004278716845379022, + }, + SpkType2Coefficients { + x: -0.0039806132479455955, + y: 0.0016042528603672538, + z: 0.0012736474960823164, + }, + SpkType2Coefficients { + x: 0.00011090320124970714, + y: -0.00016422253688236636, + z: -9.924063032619023e-5, + }, + SpkType2Coefficients { + x: 3.208770532420429e-7, + y: 9.711085809982569e-6, + z: 5.146289420109514e-6, + }, + SpkType2Coefficients { + x: -3.086111778410841e-7, + y: -4.246183965796327e-7, + z: -1.9415079840488192e-7, + }, + SpkType2Coefficients { + x: 2.5750271455539576e-8, + y: 1.1851050800781965e-8, + z: 3.450896117737893e-9, + }, + SpkType2Coefficients { + x: -1.1242975305362077e-9, + y: 3.905894854894403e-10, + z: 1.819059570466293e-10, + }, + ], + vec![ + SpkType2Coefficients { + x: -37505891.58733246, + y: -52289262.29241685, + z: -23956693.94508471, + }, + SpkType2Coefficients { + x: 10674488.54339679, + y: -6923680.138903326, + z: -4813309.998691719, + }, + SpkType2Coefficients { + x: 455040.0736010689, + y: 637750.5106004501, + z: 292402.5132673988, + }, + SpkType2Coefficients { + x: -25695.24376738423, + y: 8767.195085224153, + z: 7374.247209604691, + }, + SpkType2Coefficients { + x: 113.81703928594601, + y: -409.200548600714, + z: -230.21909153218752, + }, + SpkType2Coefficients { + x: -7.925717470323576, + y: 14.79991761561071, + z: 8.726464815796334, + }, + SpkType2Coefficients { + x: -0.34514522809375564, + y: -0.7183818860227476, + z: -0.3469500588730363, + }, + SpkType2Coefficients { + x: 0.0176780815965851, + y: 0.014210457550526053, + z: 0.005723849852140356, + }, + SpkType2Coefficients { + x: -0.0010531956678777052, + y: -0.00046859577877625294, + z: -0.00013937389776502555, + }, + SpkType2Coefficients { + x: 4.514322215422244e-5, + y: -7.592577392189398e-6, + z: -8.79098050520026e-6, + }, + SpkType2Coefficients { + x: -1.4448248877522545e-6, + y: 7.777434254709131e-7, + z: 5.661431511840274e-7, + }, + SpkType2Coefficients { + x: 4.147204966378829e-8, + y: -6.121607354123216e-8, + z: -3.7012971681646134e-8, + }, + SpkType2Coefficients { + x: 6.312482379064945e-10, + y: 2.661451379451677e-9, + z: 1.7275326074056334e-9, + }, + SpkType2Coefficients { + x: 8.266830416632963e-11, + y: -9.745279166627787e-10, + z: 2.647744718956467e-12, + }, + ], + vec![ + SpkType2Coefficients { + x: -13480566.556582376, + y: -60768703.66295594, + z: -31001044.578021735, + }, + SpkType2Coefficients { + x: 13098038.480735628, + y: -1495202.6867775493, + z: -2172196.746889192, + }, + SpkType2Coefficients { + x: 151264.9806054996, + y: 710699.0281462192, + z: 363207.4374640283, + }, + SpkType2Coefficients { + x: -25476.58030891933, + y: 3754.081219384137, + z: 4677.273311438741, + }, + SpkType2Coefficients { + x: -101.92493293828662, + y: -262.7478808422509, + z: -129.4495768022601, + }, + SpkType2Coefficients { + x: -12.889820450709234, + y: 0.5057165515555004, + z: 1.6230758048764975, + }, + SpkType2Coefficients { + x: -0.13746956986424033, + y: -0.5501353335248234, + z: -0.2790110353336393, + }, + SpkType2Coefficients { + x: 0.0021899860484605447, + y: -0.0026423962154335386, + z: -0.0016393935905534595, + }, + SpkType2Coefficients { + x: -6.102771135850726e-5, + y: -0.0005747023559221212, + z: -0.0003001401197731395, + }, + SpkType2Coefficients { + x: 2.0203914290812262e-5, + y: -4.427521182666183e-6, + z: -4.483326811276608e-6, + }, + SpkType2Coefficients { + x: 1.2401306222838308e-7, + y: -2.2608106711907944e-7, + z: -1.3281815174391787e-7, + }, + SpkType2Coefficients { + x: 3.414370315475422e-8, + y: -2.077889269902425e-9, + z: -4.685709180488663e-9, + }, + SpkType2Coefficients { + x: 6.113933096711511e-11, + y: 1.9965534065395228e-9, + z: 2.0915798921278826e-10, + }, + SpkType2Coefficients { + x: -6.847536309069575e-11, + y: -1.7723130627533263e-10, + z: 1.0123566576788687e-10, + }, + ], + vec![ + SpkType2Coefficients { + x: 12924374.015098413, + y: -57983909.45103208, + z: -32286857.994901855, + }, + SpkType2Coefficients { + x: 13036921.776594413, + y: 4294940.852419956, + z: 922700.2004467127, + }, + SpkType2Coefficients { + x: -173258.67460110967, + y: 728370.1715333756, + z: 406705.6026941626, + }, + SpkType2Coefficients { + x: -29322.559968570153, + y: -1151.356513103967, + z: 2464.488245095452, + }, + SpkType2Coefficients { + x: -385.65279580845936, + y: -402.2354970834203, + z: -174.0636949697199, + }, + SpkType2Coefficients { + x: -14.886368014428252, + y: -15.867069239763726, + z: -6.900606389564812, + }, + SpkType2Coefficients { + x: 0.032080021355132285, + y: -0.9161278285877755, + z: -0.4920339971160255, + }, + SpkType2Coefficients { + x: 0.016287548681964924, + y: -0.02488481245885575, + z: -0.01498370326892611, + }, + SpkType2Coefficients { + x: 0.0012033591743594745, + y: -0.0008160331389670967, + z: -0.00056161731076134, + }, + SpkType2Coefficients { + x: 6.5773094877564e-5, + y: -2.3656137324417096e-6, + z: -8.1665411304901e-6, + }, + SpkType2Coefficients { + x: 2.552075542282858e-6, + y: 9.062712071296104e-7, + z: 2.1587896504329588e-7, + }, + SpkType2Coefficients { + x: 8.678130515258873e-8, + y: 8.465577138535719e-8, + z: 3.615726588487529e-8, + }, + SpkType2Coefficients { + x: 1.4424526593101816e-9, + y: 4.27633127160829e-9, + z: 1.8867080135302315e-9, + }, + SpkType2Coefficients { + x: 8.481561628175781e-11, + y: 6.586099007446288e-10, + z: 6.753822366729298e-11, + }, + ], + vec![ + SpkType2Coefficients { + x: 36409830.50565798, + y: -43709674.23762289, + z: -27137646.95744377, + }, + SpkType2Coefficients { + x: 10117327.079638528, + y: 9923967.547431879, + z: 4231773.3597003305, + }, + SpkType2Coefficients { + x: -571151.4194038364, + y: 660828.826202368, + z: 412454.2316412725, + }, + SpkType2Coefficients { + x: -37563.17926341247, + y: -11606.941139804172, + z: -2247.364291950567, + }, + SpkType2Coefficients { + x: -603.7807025768652, + y: -1009.6836691174926, + z: -475.17709608369734, + }, + SpkType2Coefficients { + x: -1.2081752304636253, + y: -48.710551192440604, + z: -25.85553272787237, + }, + SpkType2Coefficients { + x: 1.568028009732732, + y: -1.870529516169376, + z: -1.1623769344020758, + }, + SpkType2Coefficients { + x: 0.11981831128613148, + y: -0.031933651917395375, + z: -0.029613442794534588, + }, + SpkType2Coefficients { + x: 0.006256803697846111, + y: 0.0016547091763384166, + z: 0.00022571479137512476, + }, + SpkType2Coefficients { + x: 0.0002222552080839927, + y: 0.00023129741041829377, + z: 0.000100040492847673, + }, + SpkType2Coefficients { + x: 2.371661165742397e-6, + y: 1.544835685314219e-5, + z: 7.990148218873311e-6, + }, + SpkType2Coefficients { + x: -4.1003984878706727e-7, + y: 7.233327555162387e-7, + z: 4.2883476302382474e-7, + }, + SpkType2Coefficients { + x: -4.246271385183673e-8, + y: 1.9237101443426504e-8, + z: 1.5763466794390723e-8, + }, + SpkType2Coefficients { + x: -2.140884834622074e-9, + y: -4.723400496382733e-10, + z: -2.856720293690054e-10, + }, + ], + vec![ + SpkType2Coefficients { + x: 50543722.086727604, + y: -19269185.716454018, + z: -15583889.594508631, + }, + SpkType2Coefficients { + x: 3599931.8894646326, + y: 14288380.206906335, + z: 7244035.831173811, + }, + SpkType2Coefficients { + x: -1069755.3628819815, + y: 384319.4620373969, + z: 317312.37891250395, + }, + SpkType2Coefficients { + x: -43737.09886475732, + y: -38037.15054279719, + z: -15697.124584282366, + }, + SpkType2Coefficients { + x: 164.97450012878275, + y: -2420.636919948095, + z: -1308.4974377707993, + }, + SpkType2Coefficients { + x: 105.40651375456635, + y: -84.68688187104273, + z: -56.23908543773916, + }, + SpkType2Coefficients { + x: 8.55469813080309, + y: 0.4731449232651164, + z: -0.645794473447411, + }, + SpkType2Coefficients { + x: 0.36590467785850955, + y: 0.33945733423292934, + z: 0.14265082540796215, + }, + SpkType2Coefficients { + x: 0.0007971678655988924, + y: 0.02848960090423228, + z: 0.01511275828687557, + }, + SpkType2Coefficients { + x: -0.0013822344209006461, + y: 0.0012747729527165339, + z: 0.0008250912189995393, + }, + SpkType2Coefficients { + x: -0.00013287000051370035, + y: 1.2336704218421914e-6, + z: 1.4607793651668574e-5, + }, + SpkType2Coefficients { + x: -6.7162339643467585e-6, + y: -5.356377894611242e-6, + z: -2.1519526344664532e-6, + }, + SpkType2Coefficients { + x: -5.9391362124116395e-8, + y: -5.226237790409592e-7, + z: -2.720837114530803e-7, + }, + SpkType2Coefficients { + x: 2.4000988068303212e-8, + y: -2.723298390425405e-8, + z: -1.6915798221638822e-8, + }, + ], + vec![ + SpkType2Coefficients { + x: 47715161.385413, + y: 10404753.329928415, + z: 542318.7750979952, + }, + SpkType2Coefficients { + x: -6765836.899970185, + y: 14779071.692198437, + z: 8594088.428959873, + }, + SpkType2Coefficients { + x: -1465606.5161023152, + y: -344210.7030515934, + z: -29727.188744053525, + }, + SpkType2Coefficients { + x: -10581.87372964701, + y: -84226.8052209682, + z: -43815.874113158745, + }, + SpkType2Coefficients { + x: 4807.211552791774, + y: -2583.8778640813425, + z: -1882.9667458416272, + }, + SpkType2Coefficients { + x: 343.9710037358144, + y: 164.8115854848478, + z: 51.797012526487116, + }, + SpkType2Coefficients { + x: 2.4246758636389076, + y: 24.30539430978275, + z: 12.710013263635187, + }, + SpkType2Coefficients { + x: -1.648672697688401, + y: 0.9842641323600833, + z: 0.6981068201687447, + }, + SpkType2Coefficients { + x: -0.14393165092324786, + y: -0.061475986403702304, + z: -0.017679892337270447, + }, + SpkType2Coefficients { + x: -0.0016606957917306442, + y: -0.010940818407565325, + z: -0.005661512737256319, + }, + SpkType2Coefficients { + x: 0.0007746124393387002, + y: -0.0005148133372302519, + z: -0.0003559310741837079, + }, + SpkType2Coefficients { + x: 7.591369608267796e-5, + y: 2.851152275335745e-5, + z: 7.237817810727936e-6, + }, + SpkType2Coefficients { + x: 1.2175945888890173e-6, + y: 5.894372589974007e-6, + z: 3.016221773585502e-6, + }, + SpkType2Coefficients { + x: -4.1804046500567263e-7, + y: 3.1205490724883324e-7, + z: 2.105018407145734e-7, + }, + ], + vec![ + SpkType2Coefficients { + x: 23270918.979379125, + y: 33815823.653189495, + z: 15597350.020431643, + }, + SpkType2Coefficients { + x: -17256716.368954264, + y: 7748953.55497174, + z: 5945649.545798879, + }, + SpkType2Coefficients { + x: -954598.9755969029, + y: -1386443.8244291213, + z: -639309.6247786926, + }, + SpkType2Coefficients { + x: 101869.74273592202, + y: -67045.26641936596, + z: -46457.66020202247, + }, + SpkType2Coefficients { + x: 6770.864790225536, + y: 6049.759734071041, + z: 2516.0791556047075, + }, + SpkType2Coefficients { + x: -404.3473796217518, + y: 507.3469545124919, + z: 313.07375838137585, + }, + SpkType2Coefficients { + x: -52.99753919509793, + y: -24.538365698424087, + z: -7.524554482312445, + }, + SpkType2Coefficients { + x: 1.3691602972264172, + y: -4.219212112047788, + z: -2.394293188546936, + }, + SpkType2Coefficients { + x: 0.43925632684682697, + y: 0.06532388690975224, + z: -0.011274242477285907, + }, + SpkType2Coefficients { + x: 0.0018346172940959047, + y: 0.03561010180824766, + z: 0.018801936763089475, + }, + SpkType2Coefficients { + x: -0.0036142809423915173, + y: 0.0005128648992871837, + z: 0.0006530328448389293, + }, + SpkType2Coefficients { + x: -0.00012491773418058397, + y: -0.000292314096541678, + z: -0.00014280604054292342, + }, + SpkType2Coefficients { + x: 2.828142086444596e-5, + y: -1.34486238229468e-5, + z: -1.0142372145929214e-5, + }, + SpkType2Coefficients { + x: 2.02650433691657e-6, + y: 2.252218889725443e-6, + z: 9.883364952693398e-7, + }, + ], + vec![ + SpkType2Coefficients { + x: -14302112.478480183, + y: 37127769.12752547, + z: 21309842.14818654, + }, + SpkType2Coefficients { + x: -19069919.56448197, + y: -4490458.993168776, + z: -392529.49609443726, + }, + SpkType2Coefficients { + x: 515204.77798256016, + y: -1451652.0030301881, + z: -828409.079766861, + }, + SpkType2Coefficients { + x: 110060.69037873248, + y: 54873.151509303076, + z: 17714.073679264868, + }, + SpkType2Coefficients { + x: -5580.825240276621, + y: 5639.915091025177, + z: 3594.2903651668257, + }, + SpkType2Coefficients { + x: -370.2192777295126, + y: -490.94873651444885, + z: -223.0038885814632, + }, + SpkType2Coefficients { + x: 48.86063157915018, + y: -13.34508901391277, + z: -12.24827254781346, + }, + SpkType2Coefficients { + x: 0.3433868526053941, + y: 3.8672966862522746, + z: 2.0267775252913185, + }, + SpkType2Coefficients { + x: -0.3689733210882523, + y: -0.07771483028641848, + z: -0.002714236959790189, + }, + SpkType2Coefficients { + x: 0.014424822977178191, + y: -0.025988013547959172, + z: -0.015376585582127298, + }, + SpkType2Coefficients { + x: 0.0022704585183469296, + y: 0.0018455519765964191, + z: 0.0007460432824687185, + }, + SpkType2Coefficients { + x: -0.00022821024420895437, + y: 0.00012668340451298506, + z: 9.15335244786352e-5, + }, + SpkType2Coefficients { + x: -8.276206806577387e-6, + y: -2.1807579234944036e-5, + z: -1.0761861493761696e-5, + }, + SpkType2Coefficients { + x: 2.406031793142807e-6, + y: -2.723247702600162e-8, + z: -2.6722360449168746e-7, + }, + ], + vec![ + SpkType2Coefficients { + x: -45350344.168980576, + y: 19224804.86125569, + z: 15021167.722862277, + }, + SpkType2Coefficients { + x: -11383349.691344053, + y: -12654718.156929357, + z: -5554404.770343297, + }, + SpkType2Coefficients { + x: 1232277.6392773716, + y: -557057.1528215639, + z: -426515.7808066775, + }, + SpkType2Coefficients { + x: 13199.32536501195, + y: 75163.12522116388, + z: 38706.450957135254, + }, + SpkType2Coefficients { + x: -4497.195208447304, + y: -1788.8134345085332, + z: -481.9905832453785, + }, + SpkType2Coefficients { + x: 255.87672676675095, + y: -137.42397399685794, + z: -100.1671973654519, + }, + SpkType2Coefficients { + x: -0.8110886216898764, + y: 18.500243622033917, + z: 9.95325478448965, + }, + SpkType2Coefficients { + x: -1.1737944602604822, + y: -0.8501479177967093, + z: -0.33023485740428854, + }, + SpkType2Coefficients { + x: 0.10326061177793994, + y: -0.0242070325118841, + z: -0.023753716920769462, + }, + SpkType2Coefficients { + x: -0.0025024315740898176, + y: 0.006763728015186381, + z: 0.003870542044050555, + }, + SpkType2Coefficients { + x: -0.0003717686519532686, + y: -0.00045897874910957024, + z: -0.000205785685419332, + }, + SpkType2Coefficients { + x: 4.828213004613172e-5, + y: 1.0308151299535684e-6, + z: -4.519405769857414e-6, + }, + SpkType2Coefficients { + x: -2.1153006377942852e-6, + y: 2.714271798917107e-6, + z: 1.6694911193365625e-6, + }, + SpkType2Coefficients { + x: -1.0663734226988474e-7, + y: -2.567848133727514e-7, + z: -1.2542045425680128e-7, + }, + ], + vec![ + SpkType2Coefficients { + x: -58389226.22256667, + y: -8091714.337427627, + z: 1820428.2065686637, + }, + SpkType2Coefficients { + x: -1766054.6052030046, + y: -14081973.652760211, + z: -7325448.793696021, + }, + SpkType2Coefficients { + x: 1106801.4567413135, + y: 138810.8374249616, + z: -42163.3093941699, + }, + SpkType2Coefficients { + x: -24817.014284937664, + y: 40820.06424547664, + z: 24379.16666021187, + }, + SpkType2Coefficients { + x: -801.9509565938666, + y: -1912.170569517239, + z: -935.7589059008715, + }, + SpkType2Coefficients { + x: 98.56190425937514, + y: 54.99316570351528, + z: 18.985238953105736, + }, + SpkType2Coefficients { + x: -6.225307809265943, + y: 0.8782851315752163, + z: 1.1220799638909078, + }, + SpkType2Coefficients { + x: 0.2166308405314536, + y: -0.248596524127064, + z: -0.1553450736857643, + }, + SpkType2Coefficients { + x: 0.0015235918031991618, + y: 0.019001665693900285, + z: 0.009975562024603925, + }, + SpkType2Coefficients { + x: -0.0009154264174046048, + y: -0.000848901463675118, + z: -0.0003567131372449493, + }, + SpkType2Coefficients { + x: 7.934582987812358e-5, + y: 8.060030376793692e-6, + z: -4.030172364414252e-6, + }, + SpkType2Coefficients { + x: -3.963710165920319e-6, + y: 2.5078948861037383e-6, + z: 1.7540449870050126e-6, + }, + SpkType2Coefficients { + x: 6.36383573374082e-8, + y: -2.7242476898255323e-7, + z: -1.5196790376014343e-7, + }, + SpkType2Coefficients { + x: 9.61362055440764e-9, + y: 1.594140293923078e-8, + z: 7.630701672941777e-9, + }, + ], + vec![ + SpkType2Coefficients { + x: -54092426.04345092, + y: -33906193.5251241, + z: -12399228.667557947, + }, + SpkType2Coefficients { + x: 5785867.736703381, + y: -11449057.168716598, + z: -6713934.131973944, + }, + SpkType2Coefficients { + x: 776112.1568083934, + y: 480896.6728461073, + z: 175026.40877961094, + }, + SpkType2Coefficients { + x: -28066.908030287876, + y: 18721.70710881851, + z: 12933.041421377007, + }, + SpkType2Coefficients { + x: 122.603506733156, + y: -913.2813372009165, + z: -500.02031568076006, + }, + SpkType2Coefficients { + x: 11.932401912329652, + y: 37.743845357251814, + z: 18.87986386969098, + }, + SpkType2Coefficients { + x: -1.6433261659736709, + y: -1.193841007569472, + z: -0.46425983354010003, + }, + SpkType2Coefficients { + x: 0.09074605157091184, + y: 0.010130659052011168, + z: -0.004124182287322653, + }, + SpkType2Coefficients { + x: -0.003965601544184511, + y: 0.0015820668574517652, + z: 0.0012602487340585295, + }, + SpkType2Coefficients { + x: 0.00011096505553262233, + y: -0.00016276915666452104, + z: -9.846948384070477e-5, + }, + SpkType2Coefficients { + x: 2.6781404333806733e-7, + y: 9.640528130514774e-6, + z: 5.11380993449563e-6, + }, + SpkType2Coefficients { + x: -3.037968216179319e-7, + y: -4.225407856969625e-7, + z: -1.9349486950740913e-7, + }, + SpkType2Coefficients { + x: 2.6331227830238215e-8, + y: 1.1030750057785568e-8, + z: 3.218807864676213e-9, + }, + SpkType2Coefficients { + x: -1.1234198172382371e-9, + y: 5.757999958318061e-10, + z: 1.9331843287510842e-10, + }, + ], ], init: 0, intlen: 691200, From 95d5fb2c0c8a0f79f8addd149a10d6e50ca51d5e Mon Sep 17 00:00:00 2001 From: Andrei Zisu Date: Wed, 8 Nov 2023 23:57:34 +0100 Subject: [PATCH 23/27] Implement get_segments --- crates/lox_core/src/ephemeris/daf_spk/api.rs | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/crates/lox_core/src/ephemeris/daf_spk/api.rs b/crates/lox_core/src/ephemeris/daf_spk/api.rs index e7e16819..432a0f5f 100644 --- a/crates/lox_core/src/ephemeris/daf_spk/api.rs +++ b/crates/lox_core/src/ephemeris/daf_spk/api.rs @@ -1,3 +1,5 @@ +use std::collections::HashMap; + use super::parser::{DafSpkError, Spk, SpkSegment, SpkType2Array, SpkType2Coefficients}; type Position = (f64, f64, f64); @@ -58,6 +60,10 @@ impl Spk { Ok((record, fraction)) } + pub fn get_segments(&self) -> &HashMap> { + &self.segments + } + pub fn position( &self, epoch: Epoch, @@ -106,7 +112,7 @@ impl Spk { #[cfg(test)] mod test { use crate::ephemeris::daf_spk::parser::parse_daf_spk; - use crate::ephemeris::daf_spk::parser::test::FILE_CONTENTS; + use crate::ephemeris::daf_spk::parser::test::{get_expected_segments, FILE_CONTENTS}; use super::*; @@ -123,4 +129,11 @@ mod test { spk.position(-14200747200.0 as Epoch, 0, 1) ); } + + #[test] + fn test_get_segments() { + let spk = parse_daf_spk(&FILE_CONTENTS).expect("Unable to parse DAF/SPK"); + + assert_eq!(&get_expected_segments(), spk.get_segments()); + } } From 2caf5cf3e0f583a62ee4a160e306c9f5de06703d Mon Sep 17 00:00:00 2001 From: Andrei Zisu Date: Thu, 9 Nov 2023 00:07:14 +0100 Subject: [PATCH 24/27] Fix the order according to the spec --- crates/lox_core/src/ephemeris/daf_spk/api.rs | 7 +++++- .../lox_core/src/ephemeris/daf_spk/parser.rs | 24 ++++++++++++------- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/crates/lox_core/src/ephemeris/daf_spk/api.rs b/crates/lox_core/src/ephemeris/daf_spk/api.rs index 432a0f5f..50977667 100644 --- a/crates/lox_core/src/ephemeris/daf_spk/api.rs +++ b/crates/lox_core/src/ephemeris/daf_spk/api.rs @@ -21,11 +21,16 @@ impl Spk { sign = -1; } + // An SPK file may contain any number of segments. A single file may contain overlapping segments: + // segments containing data for the same body over a common interval. When this happens, the + // latest segment in a file supersedes any competing segments earlier in the file. let segment = self .segments .get(&origin) .ok_or(DafSpkError::UnableToFindMatchingSegment)? .get(&target) + .ok_or(DafSpkError::UnableToFindMatchingSegment)? + .last() .ok_or(DafSpkError::UnableToFindMatchingSegment)?; Ok((&segment, sign)) @@ -60,7 +65,7 @@ impl Spk { Ok((record, fraction)) } - pub fn get_segments(&self) -> &HashMap> { + pub fn get_segments(&self) -> &HashMap>> { &self.segments } diff --git a/crates/lox_core/src/ephemeris/daf_spk/parser.rs b/crates/lox_core/src/ephemeris/daf_spk/parser.rs index 1348b12f..1667280d 100644 --- a/crates/lox_core/src/ephemeris/daf_spk/parser.rs +++ b/crates/lox_core/src/ephemeris/daf_spk/parser.rs @@ -111,7 +111,7 @@ pub struct DafSummaryRecord { pub struct Spk { pub file_record: DafFileRecord, pub comment: String, - pub segments: HashMap>, + pub segments: HashMap>>, } pub fn parse_daf_file_record_endianness( @@ -385,7 +385,7 @@ pub fn parse_daf_spk(full_input: &[u8]) -> Result { file_record.fward, )?; - let segments: HashMap> = all_summaries + let segments: HashMap>> = all_summaries .iter() .map(|summary_record| { summary_record @@ -401,7 +401,8 @@ pub fn parse_daf_spk(full_input: &[u8]) -> Result { map.entry(segment.center_id) .or_default() .entry(segment.target_id) - .or_insert(segment); + .or_default() + .push(segment); map }); @@ -665,16 +666,15 @@ name is "19_spk") available from the NAIF website (http://naif.jpl.nasa.gov/tuto .to_string() } - fn get_expected_spk() -> Spk { - // Values confirmed with JPLEphem.jp and python-jplephem - - let mut segments: HashMap> = HashMap::new(); + pub fn get_expected_segments() -> HashMap>> { + let mut segments: HashMap>> = HashMap::new(); segments .entry(0) .or_default() .entry(1) - .or_insert(SpkSegment { + .or_default() + .push(SpkSegment { name: "DE-0430LE-0430".to_string(), initial_epoch: -14200747200.0, final_epoch: 20514081600.0, @@ -1702,6 +1702,12 @@ name is "19_spk") available from the NAIF website (http://naif.jpl.nasa.gov/tuto }), }); + segments + } + + fn get_expected_spk() -> Spk { + // Values confirmed with JPLEphem.jp and python-jplephem + Spk { file_record: DafFileRecord { locidw: "DAF/SPK".to_string(), @@ -1758,7 +1764,7 @@ name is "19_spk") available from the NAIF website (http://naif.jpl.nasa.gov/tuto ], }, comment: get_expected_comment_string(), - segments, + segments: get_expected_segments(), } } From 2c333a7e7238d862af730e0fd2e68b3e09c219de Mon Sep 17 00:00:00 2001 From: Andrei Zisu Date: Fri, 10 Nov 2023 00:21:49 +0100 Subject: [PATCH 25/27] Implement position and state --- crates/lox_core/src/ephemeris/daf_spk/api.rs | 137 +++++++++++++++++-- 1 file changed, 125 insertions(+), 12 deletions(-) diff --git a/crates/lox_core/src/ephemeris/daf_spk/api.rs b/crates/lox_core/src/ephemeris/daf_spk/api.rs index 50977667..187bc06f 100644 --- a/crates/lox_core/src/ephemeris/daf_spk/api.rs +++ b/crates/lox_core/src/ephemeris/daf_spk/api.rs @@ -3,6 +3,7 @@ use std::collections::HashMap; use super::parser::{DafSpkError, Spk, SpkSegment, SpkType2Array, SpkType2Coefficients}; type Position = (f64, f64, f64); +type Velocity = (f64, f64, f64); type Epoch = f64; type Body = i32; @@ -69,6 +70,33 @@ impl Spk { &self.segments } + fn get_chebyshev_polynomial<'a>( + &'a self, + epoch: Epoch, + segment: &'a SpkSegment, + ) -> Result<(Vec, &Vec), DafSpkError> { + let (coefficients, record) = match &segment.data { + super::parser::SpkArray::Type2(array) => { + let (record, fraction) = self.find_record(array, segment.initial_epoch, epoch)?; + + let degree_of_polynomial = array.degree_of_polynomial() as usize; + let mut coefficients = Vec::::with_capacity(degree_of_polynomial); + + coefficients.push(1f64); + coefficients.push(2f64 * fraction / array.intlen as f64 - 1f64); + + for i in 2..degree_of_polynomial { + coefficients + .push(2f64 * coefficients[1] * coefficients[i - 1] - coefficients[i - 2]); + } + + (coefficients, record) + } + }; + + Ok((coefficients, record)) + } + pub fn position( &self, epoch: Epoch, @@ -76,7 +104,6 @@ impl Spk { target: Body, ) -> Result { let (segment, sign) = self.find_segment(origin, target)?; - let sign = sign as f64; if epoch < segment.initial_epoch || epoch > segment.final_epoch { return Err(DafSpkError::UnableToFindMatchingSegment); @@ -88,30 +115,87 @@ impl Spk { match &segment.data { super::parser::SpkArray::Type2(array) => { - let (record, fraction) = self.find_record(array, segment.initial_epoch, epoch)?; + let (polynomial, record) = self.get_chebyshev_polynomial(epoch, segment)?; + let sign = sign as f64; let degree_of_polynomial = array.degree_of_polynomial() as usize; - let mut coefficients = Vec::::with_capacity(degree_of_polynomial); - coefficients.push(1f64); - coefficients.push(2f64 * fraction / array.intlen as f64 - 1f64); + #[allow(clippy::needless_range_loop)] + for i in 0..degree_of_polynomial { + x += sign * record[i].x * polynomial[i]; + y += sign * record[i].y * polynomial[i]; + z += sign * record[i].z * polynomial[i]; + } + } + } - for i in 2..degree_of_polynomial { - coefficients - .push(2f64 * coefficients[1] * coefficients[i - 1] - coefficients[i - 2]); + Ok((x, y, z)) + } + + pub fn velocity( + &self, + epoch: Epoch, + origin: Body, + target: Body, + ) -> Result { + let (segment, sign) = self.find_segment(origin, target)?; + + if epoch < segment.initial_epoch || epoch > segment.final_epoch { + return Err(DafSpkError::UnableToFindMatchingSegment); + } + + let mut x = 0f64; + let mut y = 0f64; + let mut z = 0f64; + + match &segment.data { + super::parser::SpkArray::Type2(array) => { + let (polynomial, record) = self.get_chebyshev_polynomial(epoch, segment)?; + let sign = sign as f64; + + let degree_of_polynomial = array.degree_of_polynomial() as usize; + + let mut derivative = Vec::::with_capacity(degree_of_polynomial); + + derivative.push(0f64); + derivative.push(1f64); + + if degree_of_polynomial > 2 { + derivative.push(4f64 * polynomial[1]); + for i in 3..degree_of_polynomial { + let x = 2f64 * polynomial[1] * derivative[i - 1] + - derivative[i - 2] * polynomial[i - 1] + + polynomial[i - 1]; + let x = 2f64 * x; + let x = x / array.intlen as f64; + + derivative.push(x); + } } #[allow(clippy::needless_range_loop)] for i in 0..degree_of_polynomial { - x += sign * record[i].x * coefficients[i]; - y += sign * record[i].y * coefficients[i]; - z += sign * record[i].z * coefficients[i]; + x += sign * record[i].x * derivative[i]; + y += sign * record[i].y * derivative[i]; + z += sign * record[i].z * derivative[i]; } } } Ok((x, y, z)) } + + pub fn state( + &self, + epoch: Epoch, + origin: Body, + target: Body, + ) -> Result<(Position, Velocity), DafSpkError> { + let position = self.position(epoch, origin, target)?; + let velocity = self.velocity(epoch, origin, target)?; + + Ok((position, velocity)) + } } #[cfg(test)] @@ -122,19 +206,48 @@ mod test { use super::*; #[test] - fn test_position() { + fn test_unable_to_find_segment() { let spk = parse_daf_spk(&FILE_CONTENTS).expect("Unable to parse DAF/SPK"); assert_eq!( Err(DafSpkError::UnableToFindMatchingSegment), spk.position(2457388.5000000 as Epoch, 1, 2) ); + } + + #[test] + fn test_position() { + let spk = parse_daf_spk(&FILE_CONTENTS).expect("Unable to parse DAF/SPK"); + assert_eq!( Ok((-32703259.291699532, 31370540.51993667, 20159681.594182793)), spk.position(-14200747200.0 as Epoch, 0, 1) ); } + #[test] + fn test_velocity() { + let spk = parse_daf_spk(&FILE_CONTENTS).expect("Unable to parse DAF/SPK"); + + assert_eq!( + Ok((-16347507.654236255, -10396015.881953504, -3828362.817319523)), //@TODO validate + spk.velocity(-14200747200.0 as Epoch, 0, 1) + ); + } + + #[test] + fn test_state() { + let spk = parse_daf_spk(&FILE_CONTENTS).expect("Unable to parse DAF/SPK"); + + assert_eq!( + Ok(( + (-32703259.291699532, 31370540.51993667, 20159681.594182793), + (-16347507.654236255, -10396015.881953504, -3828362.817319523), + )), + spk.state(-14200747200.0 as Epoch, 0, 1) + ); + } + #[test] fn test_get_segments() { let spk = parse_daf_spk(&FILE_CONTENTS).expect("Unable to parse DAF/SPK"); From 68c8d4ccd61d5bfbd2932565cd5865a9f9eb8837 Mon Sep 17 00:00:00 2001 From: Helge Eichhorn Date: Fri, 10 Nov 2023 08:46:45 +0100 Subject: [PATCH 26/27] Fix velocity calculation --- crates/lox_core/src/ephemeris/daf_spk/api.rs | 23 +++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/crates/lox_core/src/ephemeris/daf_spk/api.rs b/crates/lox_core/src/ephemeris/daf_spk/api.rs index 187bc06f..bdb93281 100644 --- a/crates/lox_core/src/ephemeris/daf_spk/api.rs +++ b/crates/lox_core/src/ephemeris/daf_spk/api.rs @@ -163,16 +163,19 @@ impl Spk { if degree_of_polynomial > 2 { derivative.push(4f64 * polynomial[1]); for i in 3..degree_of_polynomial { - let x = 2f64 * polynomial[1] * derivative[i - 1] - - derivative[i - 2] * polynomial[i - 1] + let x = 2f64 * polynomial[1] * derivative[i - 1] - derivative[i - 2] + + polynomial[i - 1] + polynomial[i - 1]; - let x = 2f64 * x; - let x = x / array.intlen as f64; derivative.push(x); } } + let derivative: Vec = derivative + .iter() + .map(|d| 2.0 * d / array.intlen as f64) + .collect(); + #[allow(clippy::needless_range_loop)] for i in 0..degree_of_polynomial { x += sign * record[i].x * derivative[i]; @@ -230,7 +233,11 @@ mod test { let spk = parse_daf_spk(&FILE_CONTENTS).expect("Unable to parse DAF/SPK"); assert_eq!( - Ok((-16347507.654236255, -10396015.881953504, -3828362.817319523)), //@TODO validate + Ok(( + -46.723420416476635, + -28.050723083678367, + -10.055174230490163, + )), spk.velocity(-14200747200.0 as Epoch, 0, 1) ); } @@ -242,7 +249,11 @@ mod test { assert_eq!( Ok(( (-32703259.291699532, 31370540.51993667, 20159681.594182793), - (-16347507.654236255, -10396015.881953504, -3828362.817319523), + ( + -46.723420416476635, + -28.050723083678367, + -10.055174230490163, + ), )), spk.state(-14200747200.0 as Epoch, 0, 1) ); From e6594a4e02f9e1611ab347cb221e438c7558bfbb Mon Sep 17 00:00:00 2001 From: Andrei Zisu Date: Sat, 11 Nov 2023 13:59:40 +0100 Subject: [PATCH 27/27] Preallocate to win a few miliseconds --- crates/lox_core/src/ephemeris/daf_spk/parser.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/crates/lox_core/src/ephemeris/daf_spk/parser.rs b/crates/lox_core/src/ephemeris/daf_spk/parser.rs index 1667280d..93d65137 100644 --- a/crates/lox_core/src/ephemeris/daf_spk/parser.rs +++ b/crates/lox_core/src/ephemeris/daf_spk/parser.rs @@ -221,16 +221,16 @@ pub fn parse_daf_comment_area( input: &[u8], comment_areas_count: u32, ) -> nom::IResult<&[u8], String> { - // This function is definetely not optimal as there are several allocations at - // different points but this is not a hot data path. - let mut comment_area = String::new(); + let record_size = 1000; + + let mut comment_area = String::with_capacity((comment_areas_count * record_size) as usize); let mut input_cursor = input; for _ in 0..comment_areas_count { let comment_areas; (input_cursor, comment_areas) = nb::take(RECORD_SIZE)(input_cursor)?; - let (_, comment_record_content) = nb::take(1000u32)(comment_areas)?; + let (_, comment_record_content) = nb::take(record_size)(comment_areas)?; let comment_record_content = match nb::take_until("\x04")(comment_record_content) { Ok((_, content_to_end_of_transmission_char)) => content_to_end_of_transmission_char, @@ -267,8 +267,6 @@ pub fn parse_daf_summary_and_name_record_pair( let nc = 8 * (nd + (ni + 1) / 2); - let mut summaries = Vec::new(); - // 1. The record number of the next summary record in the file. (Zero if this is // the final summary record.) let (summary_record_input, next) = nn::f64(endianness)(summary_record_input)?; @@ -282,6 +280,8 @@ pub fn parse_daf_summary_and_name_record_pair( let (mut summary_record_input, nsum) = nn::f64(endianness)(summary_record_input)?; let nsum = nsum as u32; + let mut summaries = Vec::with_capacity(nsum as usize); + for _ in 0..nsum { let double_precision_components; (summary_record_input, double_precision_components) =