diff --git a/Cargo.lock b/Cargo.lock index c198aca..490653b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "a2lfile" @@ -28,6 +28,7 @@ version = "2.3.0" dependencies = [ "a2lfile", "argfile", + "bin_file", "clap", "cpp_demangle", "fxhash", @@ -36,6 +37,7 @@ dependencies = [ "memmap2", "object", "regex", + "tempfile", ] [[package]] @@ -47,6 +49,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "ansi_term" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" +dependencies = [ + "winapi", +] + [[package]] name = "anstream" version = "0.6.15" @@ -113,6 +124,18 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +[[package]] +name = "bin_file" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6992a872d89b4372adb176ab4e7d95c92d70f50565f5ffa2fc934f1b80d06361" +dependencies = [ + "ansi_term", + "bytesize", + "regex", + "serde", +] + [[package]] name = "bitflags" version = "2.6.0" @@ -125,6 +148,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +[[package]] +name = "bytesize" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e368af43e418a04d52505cf3dbc23dda4e3407ae2fa99fd0e4f308ce546acc" + [[package]] name = "cfg-if" version = "1.0.0" @@ -182,14 +211,20 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + [[package]] name = "fs-err" version = "2.11.0" @@ -238,9 +273,9 @@ checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" [[package]] name = "libc" -version = "0.2.159" +version = "0.2.168" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" +checksum = "5aaeb2981e0606ca11d79718f8bb01164f1d6ed75080182d3abf017e6d244b6d" [[package]] name = "linux-raw-sys" @@ -272,6 +307,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "once_cell" +version = "1.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" + [[package]] name = "os_str_bytes" version = "7.0.0" @@ -330,15 +371,35 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "rustix" -version = "0.38.37" +version = "0.38.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" +checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85" dependencies = [ "bitflags", "errno", "libc", "linux-raw-sys", - "windows-sys 0.52.0", + "windows-sys 0.59.0", +] + +[[package]] +name = "serde" +version = "1.0.210" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.210" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" +dependencies = [ + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -358,6 +419,19 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "tempfile" +version = "3.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" +dependencies = [ + "cfg-if", + "fastrand", + "once_cell", + "rustix", + "windows-sys 0.59.0", +] + [[package]] name = "terminal_size" version = "0.4.0" @@ -400,6 +474,28 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + [[package]] name = "windows-sys" version = "0.52.0" diff --git a/Cargo.toml b/Cargo.toml index 55d6b3f..d6de5d7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "a2ltool" version = "2.3.0" -authors = ["Daniel Thaler "] +authors = ["Daniel Thaler ", "Piergiorgio Navone <14rgnt472@mozmail.com>"] edition = "2021" license = "MIT OR Apache-2.0" @@ -18,6 +18,10 @@ regex = "1" indexmap = "2.2.0" fxhash = "0.2.1" argfile = { version ="0.2.0", features=["response"]} +bin_file = "0.1.1" + +[dev-dependencies] +tempfile = "3.14.0" [profile.release] panic = "abort" diff --git a/src/calibrate.rs b/src/calibrate.rs new file mode 100644 index 0000000..52ab043 --- /dev/null +++ b/src/calibrate.rs @@ -0,0 +1,609 @@ +use crate::{datatype, dwarf::DebugData, insert, search}; +use a2lfile::{A2lFile, AddrType, ByteOrderEnum, CharacteristicType, DataType}; +use bin_file::{BinFile, IHexFormat, SRecordAddressLength}; +use std::{ffi::OsString, fs::File, io::Write, path::Path}; + +#[derive(Debug)] +struct Calibration { + symbol: String, + value_repr: Option, + address: Option, + size: Option, + dim: Option, + dtype: Option, + endianess: ByteOrderEnum, +} + +#[derive(Debug, Clone, Copy)] +pub enum BinFileFormat { + SREC, + IHEX, +} + +pub(crate) fn calibration_from_binary_to_csv( + a2l_file: &mut A2lFile, + elf_info: &Option, + enable_structures: bool, + default_endianess: &ByteOrderEnum, + binfile: &BinFile, + csv_file: &OsString, + log_msgs: &mut Vec, +) -> Result { + let mut calibrations = read_calibrations_csv(csv_file, &default_endianess); + calibration_symbols_load( + &mut calibrations, + a2l_file, + elf_info, + enable_structures, + log_msgs, + )?; + read_calibration(&mut calibrations, &binfile, log_msgs)?; + write_calibrations_csv(csv_file, &calibrations)?; + Ok(true) +} + +pub(crate) fn calibration_from_csv_to_binary( + a2l_file: &mut A2lFile, + elf_info: &Option, + enable_structures: bool, + default_endianess: &ByteOrderEnum, + binfile: &mut BinFile, + csv_file: &OsString, + binary_file: &OsString, + log_msgs: &mut Vec, +) -> Result { + let mut calibrations = read_calibrations_csv(csv_file, &default_endianess); + calibration_symbols_load( + &mut calibrations, + a2l_file, + elf_info, + enable_structures, + log_msgs, + )?; + write_calibration(&calibrations, binfile, log_msgs)?; + save_binfile(binary_file, binfile, log_msgs)?; + Ok(true) +} + +pub(crate) fn guess_default_endianess( + a2l_file: &A2lFile, + elf_info: &Option, +) -> Option { + let mut default_order = None; + for module in &a2l_file.project.module { + if let Some(mod_common) = &module.mod_common { + if let Some(byte_order) = &mod_common.byte_order { + if default_order.is_none() { + default_order = Some(byte_order.byte_order.clone()); + } else if byte_order.byte_order != default_order.unwrap() { + panic!("Mixed BYTE_ORDER in MOD_COMMON not supported. Specify the --default_byte_order on the command line.") + } + } + } + } + if default_order.is_none() { + if let Some(debugdata) = elf_info { + default_order = match debugdata.endian { + object::Endianness::Little => Some(ByteOrderEnum::LittleEndian), + object::Endianness::Big => Some(ByteOrderEnum::BigEndian), + }; + } + } + default_order +} + +fn read_calibrations_csv( + csv_file: &OsString, + default_endianess: &ByteOrderEnum, +) -> Vec { + let mut ret: Vec = Vec::new(); + let text = std::fs::read_to_string(csv_file).expect("Cannot read CSV file"); + + for line in text.lines() { + let fields: Vec<&str> = line.split(';').collect(); + if fields.len() > 0 { + let f = fields[0].trim(); + if f.len() > 0 && !f.starts_with("#") { + let mut cal = Calibration { + symbol: f.to_string(), + value_repr: None, + address: None, + size: None, + dim: None, + dtype: None, + endianess: default_endianess.clone(), + }; + if fields.len() > 1 { + let f = fields[1].trim(); + if f.len() > 0 { + cal.value_repr = Some(f.to_string()); + } + } + ret.push(cal); + } + } + } + + ret +} + +fn write_calibrations_csv( + csv_file: &OsString, + calibrations: &Vec, +) -> Result { + let mut calmap = std::collections::HashMap::new(); + for cal in calibrations { + calmap.insert(&cal.symbol[..], cal); + } + + let text = std::fs::read_to_string(csv_file).expect("Cannot read CSV file"); + let mut file = File::create(csv_file).expect("Cannot open CSV file for writing"); + + for line in text.lines() { + let mut bypass = true; + let l = line.trim(); + let fields: Vec<&str> = line.split(';').collect(); + if fields.len() > 0 { + let f = fields[0].trim(); + if f.len() > 0 && !f.starts_with("#") { + if let Some(cal) = calmap.get(f) { + bypass = false; + writeln!( + file, + "{};{}", + (*cal).symbol, + (*cal).value_repr.as_ref().unwrap_or(&String::from("")) + ) + .expect("Error writing CSV file"); + } + } + } + if bypass { + writeln!(file, "{}", l).expect("Error writing CSV file"); + } + } + + Ok(true) +} + +fn calibration_symbols_load( + calibrations: &mut Vec, + a2l_file: &mut A2lFile, + elf_info: &Option, + enable_structures: bool, + log_msgs: &mut Vec, +) -> Result { + let mut characteristics = search::search_characteristics(a2l_file, &[".*"], log_msgs); + + if let Some(debugdata) = &elf_info { + // Add the characteristics that are listed in the CSV file, but not in the A2L. + let mut characteristic_symbols: Vec<&str> = Vec::new(); + for cal in &*calibrations { + if !characteristics.contains_key(&cal.symbol) { + characteristic_symbols.push(&cal.symbol); + } + } + if !characteristic_symbols.is_empty() { + insert::insert_items( + a2l_file, + debugdata, + vec![], + characteristic_symbols, + Some("AUTO"), + log_msgs, + enable_structures, + ); + + characteristics = search::search_characteristics(a2l_file, &[".*"], log_msgs); + } + } + + let record_layouts = search::search_reord_layout(a2l_file, &[".*"], log_msgs); + + for cal in &mut *calibrations { + if let Some(characteristic) = characteristics.get(&cal.symbol) { + cal.address = Some(characteristic.address); + if characteristic.byte_order.is_some() { + cal.endianess = characteristic.byte_order.as_ref().unwrap().byte_order; + } + match characteristic.characteristic_type { + CharacteristicType::Value => { + cal.dim = Some(1); + } + CharacteristicType::ValBlk => { + if let Some(matrix_dim) = &characteristic.matrix_dim { + cal.dim = Some(matrix_dim.dim_list.iter().product()); + } else { + log_msgs.push(format!( + "Characteristic {} matrix dimension not found", + &cal.symbol + )); + continue; + } + } + _ => { + log_msgs.push(format!( + "Characteristic {} type {} not supported", + &cal.symbol, &characteristic.characteristic_type + )); + continue; + } + } + if let Some(rl) = record_layouts.get(&characteristic.deposit) { + if let Some(fnc_value) = &rl.fnc_values { + if fnc_value.position == 1 && fnc_value.address_type == AddrType::Direct { + cal.size = Some(datatype::get_datatype_size(&fnc_value.datatype)); + cal.dtype = Some(fnc_value.datatype); + } else { + log_msgs.push(format!( + "Characteristic {} record layout not supported", + &cal.symbol + )); + } + } else { + log_msgs.push(format!( + "Characteristic {} data type not found", + &cal.symbol + )); + }; + }; + } else { + log_msgs.push(format!("Symbol {} not found", &cal.symbol)); + } + } + + Ok(true) +} + +fn read_calibration( + calibrations: &mut Vec, + binfile: &BinFile, + log_msgs: &mut Vec, +) -> Result { + log_msgs.push(format!("Reading calibrations from binary.")); + for cal in &mut *calibrations { + cal.value_repr = None; + if cal.address.is_some() && cal.dtype.is_some() && cal.size.is_some() && cal.dim.is_some() { + let a = cal.address.unwrap() as usize; + let s = cal.size.unwrap() as usize; + let d = cal.dim.unwrap() as usize; + let range = a..a + (s * d); + let val = binfile.get_values_by_address_range(range); + if let Some(val_vec) = val { + match datatype::bytes_to_text( + &val_vec, + cal.dtype.as_ref().unwrap(), + d, + &cal.endianess, + ) { + Ok(x) => { + log_msgs.push(format!("CAL: {}: {}", &cal.symbol, &x)); + cal.value_repr = Some(x) + } + Err(e) => log_msgs.push(format!("ERROR decoding {}: {}", &cal.symbol, &e)), + } + } else { + log_msgs.push(format!("ERROR reading {}", &cal.symbol)); + } + } + } + + Ok(true) +} + +fn write_calibration( + calibrations: &Vec, + binfile: &mut BinFile, + log_msgs: &mut Vec, +) -> Result { + log_msgs.push(format!("Writing calibrations to binary.")); + for cal in calibrations { + if cal.address.is_some() + && cal.dtype.is_some() + && cal.size.is_some() + && cal.dim.is_some() + && cal.value_repr.is_some() + { + let a = cal.address.unwrap() as usize; + let d = cal.dim.unwrap() as usize; + match datatype::text_to_bytes( + &cal.value_repr.as_ref().unwrap(), + cal.dtype.as_ref().unwrap(), + d, + &cal.endianess, + ) { + Ok(val) => { + log_msgs.push(format!( + "CAL: {}: {}", + &cal.symbol, + &cal.value_repr.as_ref().unwrap() + )); + let _ = binfile.add_bytes(val, Some(a), true); + } + Err(e) => log_msgs.push(format!("ERROR encoding {}: {}", &cal.symbol, &e)), + } + } else { + log_msgs.push(format!("ERROR writing {}", &cal.symbol)); + } + } + + Ok(true) +} + +fn guess_binfile_format( + binary_file: &OsString, +) -> ( + Option, + Option, + Option, +) { + let mut binfile_format: Option = None; + let mut srec_addr_len: Option = None; + let mut ihex_format: Option = None; + + if let Some(ext) = Path::new(binary_file) + .extension() + .and_then(|ext| ext.to_str()) + { + let ext_lower = ext.to_lowercase(); + + match ext_lower.as_str() { + "srec" | "s19" | "s28" | "s37" => { + binfile_format = Some(BinFileFormat::SREC); + srec_addr_len = Some(SRecordAddressLength::Length32); + } + "hex" | "ihex" => { + binfile_format = Some(BinFileFormat::IHEX); + ihex_format = Some(IHexFormat::IHex32); + } + _ => {} + }; + } + + (binfile_format, srec_addr_len, ihex_format) +} + +fn save_binfile( + binary_file: &OsString, + binfile: &BinFile, + _log_msgs: &mut Vec, +) -> Result { + let (binfile_format, srec_addr_len, ihex_format) = guess_binfile_format(binary_file); + + let text: Vec = match binfile_format { + Some(BinFileFormat::SREC) => binfile + .to_srec( + None, + srec_addr_len.unwrap_or(SRecordAddressLength::Length32), + ) + .unwrap(), + Some(BinFileFormat::IHEX) => binfile + .to_ihex(None, ihex_format.unwrap_or(IHexFormat::IHex32)) + .unwrap(), + _ => { + return Err(String::from("Unrecognized binary file format")); + } + }; + + let mut file = File::create(binary_file).expect("Error opening binary file for write"); + for line in text { + writeln!(file, "{}", line).expect("Error writing binary file"); + } + + Ok(true) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_read_calibrations_csv() { + let csv_file = OsString::from("tests/calibrate/cal_test_1.csv"); + let default_endianess = ByteOrderEnum::LittleEndian; + let calibrations = read_calibrations_csv(&csv_file, &default_endianess); + + assert_eq!(calibrations.len(), 5); + assert_eq!(calibrations[0].symbol, "cal_sleep_time"); + assert_eq!(calibrations[0].value_repr, Some("250".to_string())); + assert_eq!(calibrations[1].symbol, "cal_float"); + assert_eq!(calibrations[1].value_repr, Some("8.8888".to_string())); + assert_eq!(calibrations[2].symbol, "cal_text"); + assert_eq!(calibrations[2].value_repr, Some("\"aaa\"".to_string())); + assert_eq!(calibrations[3].symbol, "cal_sleep_counts"); + assert_eq!(calibrations[3].value_repr, Some("(2,4,6)".to_string())); + } + + #[test] + fn test_read_calibration() { + let default_endianess = ByteOrderEnum::LittleEndian; + let mut calibrations = vec![ + Calibration { + symbol: "cal_sleep_time".to_string(), + value_repr: None, + address: Some(0xc34c), + size: Some(4), + dim: Some(1), + dtype: Some(DataType::Ulong), + endianess: default_endianess, + }, + Calibration { + symbol: "cal_double".to_string(), + value_repr: None, + address: Some(0xc320), + size: Some(8), + dim: Some(2), + dtype: Some(DataType::Float64Ieee), + endianess: default_endianess, + }, + ]; + + let bin_file_path = OsString::from("tests/calibrate/cal_test_1.hex"); + let binfile = BinFile::from_file(&bin_file_path).expect("Cannot read binary file"); + let mut log_msgs = Vec::new(); + + let result = read_calibration(&mut calibrations, &binfile, &mut log_msgs); + assert!(result.is_ok()); + + assert_eq!(calibrations[0].symbol, "cal_sleep_time"); + assert_eq!( + calibrations[0] + .value_repr + .as_ref() + .expect("Undefined value") + .parse::() + .expect("Value is not a number"), + 100u32 + ); + + assert_eq!(calibrations[1].symbol, "cal_double"); + let text = calibrations[1] + .value_repr + .as_ref() + .expect("Undefined value"); + assert!(text.starts_with('(') && text.ends_with(')')); + let numbers: Vec<&str> = text[1..text.len() - 1].split(',').collect(); + assert_eq!(numbers.len(), 2); + let tolerance = 1e-6; + assert!( + (numbers[0].parse::().expect("Value is not a number") - 1.1111111).abs() + < tolerance, + "Values are not equal within the tolerance" + ); + assert!( + (numbers[1].parse::().expect("Value is not a number") - 2.222222).abs() + < tolerance, + "Values are not equal within the tolerance" + ); + } + + #[test] + fn calibrate_test() { + let default_endianess = ByteOrderEnum::LittleEndian; + let a2l_path = OsString::from("tests/calibrate/cal_test_1.a2l"); + let binary_start_path = OsString::from("tests/calibrate/cal_test_1.hex"); + let csv_write_path = OsString::from("tests/calibrate/cal_test_1.csv"); + let tmp_dir = tempfile::tempdir().expect("Failed to create temporary directory"); + let binary_end_path = OsString::from(tmp_dir.path().join("test.hex")); + let csv_read_start_path = OsString::from(tmp_dir.path().join("csv_start.csv")); + let csv_read_end_path = OsString::from(tmp_dir.path().join("csv_end.csv")); + + let mut a2l_log_msgs = Vec::new(); + let mut a2l_file = + a2lfile::load(&a2l_path, None, &mut a2l_log_msgs, false).expect("Cannot read A2L file"); + + let mut log_msgs = Vec::new(); + + std::fs::copy(&csv_write_path, &csv_read_start_path).expect("Failed to copy CSV file"); + std::fs::copy(&csv_write_path, &csv_read_end_path).expect("Failed to copy CSV file"); + + let res = calibration_from_binary_to_csv( + &mut a2l_file, + &None, + false, + &default_endianess, + &BinFile::from_file(&binary_start_path).expect("Cannot read binary file"), + &csv_read_start_path, + &mut log_msgs, + ); + assert!(res.is_ok()); + + let res = calibration_from_csv_to_binary( + &mut a2l_file, + &None, + false, + &default_endianess, + &mut BinFile::from_file(&binary_start_path).expect("Cannot read binary file"), + &csv_write_path, + &binary_end_path, + &mut log_msgs, + ); + assert!(res.is_ok()); + + let res = calibration_from_binary_to_csv( + &mut a2l_file, + &None, + false, + &default_endianess, + &BinFile::from_file(&binary_end_path).expect("Cannot read binary file"), + &csv_read_end_path, + &mut log_msgs, + ); + assert!(res.is_ok()); + + let mut calibrations_start = + read_calibrations_csv(&csv_read_start_path, &default_endianess); + calibration_symbols_load( + &mut calibrations_start, + &mut a2l_file, + &None, + false, + &mut log_msgs, + ) + .expect("Error loading calibrations metadata"); + let mut calibrations_write = read_calibrations_csv(&csv_write_path, &default_endianess); + calibration_symbols_load( + &mut calibrations_write, + &mut a2l_file, + &None, + false, + &mut log_msgs, + ) + .expect("Error loading calibrations metadata"); + let mut calibrations_end = read_calibrations_csv(&csv_read_end_path, &default_endianess); + calibration_symbols_load( + &mut calibrations_end, + &mut a2l_file, + &None, + false, + &mut log_msgs, + ) + .expect("Error loading calibrations metadata"); + + assert_eq!(calibrations_start.len(), calibrations_end.len()); + assert_eq!(calibrations_start.len(), calibrations_write.len()); + + for i in 0..calibrations_start.len() { + assert_eq!(calibrations_start[i].symbol, calibrations_end[i].symbol); + if calibrations_start[i].symbol != "cal_text" { + assert_eq!( + calibrations_write[i].value_repr, + calibrations_end[i].value_repr + ); + assert_ne!( + calibrations_start[i].value_repr, + calibrations_end[i].value_repr + ); + } else { + assert_eq!( + datatype::text_to_bytes( + calibrations_write[i].value_repr.as_ref().unwrap(), + calibrations_write[i].dtype.as_ref().unwrap(), + calibrations_write[i].dim.unwrap().into(), + &default_endianess + ), + datatype::text_to_bytes( + calibrations_end[i].value_repr.as_ref().unwrap(), + calibrations_end[i].dtype.as_ref().unwrap(), + calibrations_end[i].dim.unwrap().into(), + &default_endianess + ) + ); + assert_ne!( + datatype::text_to_bytes( + calibrations_start[i].value_repr.as_ref().unwrap(), + calibrations_start[i].dtype.as_ref().unwrap(), + calibrations_start[i].dim.unwrap().into(), + &default_endianess + ), + datatype::text_to_bytes( + calibrations_end[i].value_repr.as_ref().unwrap(), + calibrations_end[i].dtype.as_ref().unwrap(), + calibrations_end[i].dim.unwrap().into(), + &default_endianess + ) + ); + } + } + } +} diff --git a/src/datatype.rs b/src/datatype.rs index b734251..b0df029 100644 --- a/src/datatype.rs +++ b/src/datatype.rs @@ -1,5 +1,5 @@ use crate::dwarf::{DwarfDataType, TypeInfo}; -use a2lfile::DataType; +use a2lfile::{DataType, ByteOrderEnum}; // map the datatypes from the elf_info to a2l datatypes // the only really relevant cases are for the integer, floating point and enum types @@ -79,3 +79,319 @@ pub(crate) fn get_type_limits( }; (new_lower_limit, new_upper_limit) } + +pub(crate) fn get_datatype_size(datatype: &DataType) -> u16 { + match datatype { + DataType::Ubyte => 1, + DataType::Sbyte => 1, + DataType::Uword => 2, + DataType::Sword => 2, + DataType::Ulong => 4, + DataType::Slong => 4, + DataType::AUint64 => 8, + DataType::AInt64 => 8, + DataType::Float16Ieee => 2, + DataType::Float32Ieee => 4, + DataType::Float64Ieee => 8, + } +} + +pub(crate) fn bytes_to_text(bytes: &[u8], datatype: &DataType, dim: usize, endianess: &ByteOrderEnum) -> Result { + let size = get_datatype_size(datatype) as usize; + if bytes.len() != dim * size { + Err("Size mismatch") + } else { + if dim == 1 { + match datatype { + DataType::Ubyte => Ok(bytes[0].to_string()), + DataType::Sbyte => { + let x = bytes[0] as i8; + Ok(x.to_string()) + }, + DataType::Uword => { + match endianess { + ByteOrderEnum::LittleEndian | ByteOrderEnum::MsbLast => Ok(u16::from_le_bytes(bytes[0..size].try_into().unwrap()).to_string()), + ByteOrderEnum::BigEndian | ByteOrderEnum::MsbFirst => Ok(u16::from_be_bytes(bytes[0..size].try_into().unwrap()).to_string()), + _ => Err("Byte order not implemented") + } + }, + DataType::Sword => { + match endianess { + ByteOrderEnum::LittleEndian | ByteOrderEnum::MsbLast => Ok(i16::from_le_bytes(bytes[0..size].try_into().unwrap()).to_string()), + ByteOrderEnum::BigEndian | ByteOrderEnum::MsbFirst => Ok(i16::from_be_bytes(bytes[0..size].try_into().unwrap()).to_string()), + _ => Err("Byte order not implemented") + } + }, + DataType::Ulong => { + match endianess { + ByteOrderEnum::LittleEndian | ByteOrderEnum::MsbLast => Ok(u32::from_le_bytes(bytes[0..size].try_into().unwrap()).to_string()), + ByteOrderEnum::BigEndian | ByteOrderEnum::MsbFirst => Ok(u32::from_be_bytes(bytes[0..size].try_into().unwrap()).to_string()), + _ => Err("Byte order not implemented") + } + }, + DataType::Slong => { + match endianess { + ByteOrderEnum::LittleEndian | ByteOrderEnum::MsbLast => Ok(i32::from_le_bytes(bytes[0..size].try_into().unwrap()).to_string()), + ByteOrderEnum::BigEndian | ByteOrderEnum::MsbFirst => Ok(i32::from_be_bytes(bytes[0..size].try_into().unwrap()).to_string()), + _ => Err("Byte order not implemented") + } + }, + DataType::AUint64 => { + match endianess { + ByteOrderEnum::LittleEndian | ByteOrderEnum::MsbLast => Ok(u64::from_le_bytes(bytes[0..size].try_into().unwrap()).to_string()), + ByteOrderEnum::BigEndian | ByteOrderEnum::MsbFirst => Ok(u64::from_be_bytes(bytes[0..size].try_into().unwrap()).to_string()), + _ => Err("Byte order not implemented") + } + }, + DataType::AInt64 => { + match endianess { + ByteOrderEnum::LittleEndian | ByteOrderEnum::MsbLast => Ok(i64::from_le_bytes(bytes[0..size].try_into().unwrap()).to_string()), + ByteOrderEnum::BigEndian | ByteOrderEnum::MsbFirst => Ok(i64::from_be_bytes(bytes[0..size].try_into().unwrap()).to_string()), + _ => Err("Byte order not implemented") + } + }, + DataType::Float16Ieee => { + Err("Float16Ieee is not supported") + }, + DataType::Float32Ieee => { + match endianess { + ByteOrderEnum::LittleEndian | ByteOrderEnum::MsbLast => Ok(f32::from_le_bytes(bytes[0..size].try_into().unwrap()).to_string()), + ByteOrderEnum::BigEndian | ByteOrderEnum::MsbFirst => Ok(f32::from_be_bytes(bytes[0..size].try_into().unwrap()).to_string()), + _ => Err("Byte order not implemented") + } + }, + DataType::Float64Ieee => { + match endianess { + ByteOrderEnum::LittleEndian | ByteOrderEnum::MsbLast => Ok(f64::from_le_bytes(bytes[0..size].try_into().unwrap()).to_string()), + ByteOrderEnum::BigEndian | ByteOrderEnum::MsbFirst => Ok(f64::from_be_bytes(bytes[0..size].try_into().unwrap()).to_string()), + _ => Err("Byte order not implemented") + } + }, + } + } else if dim > 1 { + let mut repr = String::from("("); + let mut sep = ""; + for i in 0..dim { + repr.push_str(&sep); + repr.push_str(& bytes_to_text(&bytes[i*size..(i+1)*size], datatype, 1, endianess)?); + sep = ","; + } + repr.push(')'); + Ok(repr) + } else { + Err("Dimension zero is not allowed") + } + } +} + +pub(crate) fn text_to_bytes(text: &str, datatype: &DataType, dim: usize, endianess: &ByteOrderEnum) -> Result, &'static str> { + let text = text.trim(); + if text.starts_with('(') && text.ends_with(')') { + let numbers_str = &text[1..text.len()-1]; + + let numbers: Vec<&str> = numbers_str + .split(',') + .map(|num_str| num_str.trim()) + .collect(); + + if numbers.len() == dim { + let size = get_datatype_size(datatype) as usize; + let mut ret = Vec::with_capacity(dim * size); + for i in 0..dim { + ret.append(&mut text_to_bytes(&numbers[i], datatype, 1, endianess)?); + } + Ok(ret) + } else { + Err("Dimensions mismatch") + } + } else if text.starts_with('"') && text.ends_with('"') { + let bytes = text[1..text.len()-1].as_bytes(); + let size = get_datatype_size(datatype) as usize; + if bytes.len() <= dim * size { + let mut ret = bytes.to_vec(); + ret.resize(dim * size, 0u8); + Ok(ret) + } else { + Err("Dimensions mismatch") + } + } else { + match datatype { + DataType::Ubyte => { + let n = text.parse::(); + if n.is_ok() { + Ok(Vec::from(n.unwrap().to_le_bytes())) + } else { + Err("Error parsing number") + } + }, + DataType::Sbyte => { + let n = text.parse::(); + if n.is_ok() { + Ok(Vec::from(n.unwrap().to_le_bytes())) + } else { + Err("Error parsing number") + } + }, + DataType::Uword => { + let n = text.parse::(); + if n.is_ok() { + match endianess { + ByteOrderEnum::LittleEndian | ByteOrderEnum::MsbLast => Ok(Vec::from(n.unwrap().to_le_bytes())), + ByteOrderEnum::BigEndian | ByteOrderEnum::MsbFirst => Ok(Vec::from(n.unwrap().to_be_bytes())), + _ => Err("Byte order not implemented") + } + } else { + Err("Error parsing number") + } + }, + DataType::Sword => { + let n = text.parse::(); + if n.is_ok() { + match endianess { + ByteOrderEnum::LittleEndian | ByteOrderEnum::MsbLast => Ok(Vec::from(n.unwrap().to_le_bytes())), + ByteOrderEnum::BigEndian | ByteOrderEnum::MsbFirst => Ok(Vec::from(n.unwrap().to_be_bytes())), + _ => Err("Byte order not implemented") + } + } else { + Err("Error parsing number") + } + }, + DataType::Ulong => { + let n = text.parse::(); + if n.is_ok() { + match endianess { + ByteOrderEnum::LittleEndian | ByteOrderEnum::MsbLast => Ok(Vec::from(n.unwrap().to_le_bytes())), + ByteOrderEnum::BigEndian | ByteOrderEnum::MsbFirst => Ok(Vec::from(n.unwrap().to_be_bytes())), + _ => Err("Byte order not implemented") + } + } else { + Err("Error parsing number") + } + }, + DataType::Slong => { + let n = text.parse::(); + if n.is_ok() { + match endianess { + ByteOrderEnum::LittleEndian | ByteOrderEnum::MsbLast => Ok(Vec::from(n.unwrap().to_le_bytes())), + ByteOrderEnum::BigEndian | ByteOrderEnum::MsbFirst => Ok(Vec::from(n.unwrap().to_be_bytes())), + _ => Err("Byte order not implemented") + } + } else { + Err("Error parsing number") + } + }, + DataType::AUint64 => { + let n = text.parse::(); + if n.is_ok() { + match endianess { + ByteOrderEnum::LittleEndian | ByteOrderEnum::MsbLast => Ok(Vec::from(n.unwrap().to_le_bytes())), + ByteOrderEnum::BigEndian | ByteOrderEnum::MsbFirst => Ok(Vec::from(n.unwrap().to_be_bytes())), + _ => Err("Byte order not implemented") + } + } else { + Err("Error parsing number") + } + }, + DataType::AInt64 => { + let n = text.parse::(); + if n.is_ok() { + match endianess { + ByteOrderEnum::LittleEndian | ByteOrderEnum::MsbLast => Ok(Vec::from(n.unwrap().to_le_bytes())), + ByteOrderEnum::BigEndian | ByteOrderEnum::MsbFirst => Ok(Vec::from(n.unwrap().to_be_bytes())), + _ => Err("Byte order not implemented") + } + } else { + Err("Error parsing number") + } + }, + DataType::Float16Ieee => { + Err("Float16Ieee not supported") + }, + DataType::Float32Ieee => { + let n = text.parse::(); + if n.is_ok() { + match endianess { + ByteOrderEnum::LittleEndian | ByteOrderEnum::MsbLast => Ok(Vec::from(n.unwrap().to_le_bytes())), + ByteOrderEnum::BigEndian | ByteOrderEnum::MsbFirst => Ok(Vec::from(n.unwrap().to_be_bytes())), + _ => Err("Byte order not implemented") + } + } else { + Err("Error parsing number") + } + }, + DataType::Float64Ieee => { + let n = text.parse::(); + if n.is_ok() { + match endianess { + ByteOrderEnum::LittleEndian | ByteOrderEnum::MsbLast => Ok(Vec::from(n.unwrap().to_le_bytes())), + ByteOrderEnum::BigEndian | ByteOrderEnum::MsbFirst => Ok(Vec::from(n.unwrap().to_be_bytes())), + _ => Err("Byte order not implemented") + } + } else { + Err("Error parsing number") + } + }, + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_get_datatype_size() { + assert_eq!(get_datatype_size(&DataType::Ubyte), 1); + assert_eq!(get_datatype_size(&DataType::Sbyte), 1); + assert_eq!(get_datatype_size(&DataType::Uword), 2); + assert_eq!(get_datatype_size(&DataType::Sword), 2); + assert_eq!(get_datatype_size(&DataType::Ulong), 4); + assert_eq!(get_datatype_size(&DataType::Slong), 4); + assert_eq!(get_datatype_size(&DataType::AUint64), 8); + assert_eq!(get_datatype_size(&DataType::AInt64), 8); + assert_eq!(get_datatype_size(&DataType::Float16Ieee), 2); + assert_eq!(get_datatype_size(&DataType::Float32Ieee), 4); + assert_eq!(get_datatype_size(&DataType::Float64Ieee), 8); + } + + #[test] + fn test_get_a2l_datatype() { + let typeinfo = TypeInfo { datatype: DwarfDataType::Uint8, name: None, unit_idx: 123, dbginfo_offset: 123 }; + assert_eq!(get_a2l_datatype(&typeinfo), DataType::Ubyte); + + let typeinfo = TypeInfo { datatype: DwarfDataType::Sint32, name: None, unit_idx: 123, dbginfo_offset: 123 }; + assert_eq!(get_a2l_datatype(&typeinfo), DataType::Slong); + + let typeinfo = TypeInfo { datatype: DwarfDataType::Float, name: None, unit_idx: 123, dbginfo_offset: 123 }; + assert_eq!(get_a2l_datatype(&typeinfo), DataType::Float32Ieee); + } + + #[test] + fn test_bytes_to_text() { + let bytes = [0x01, 0x00]; + let datatype = DataType::Uword; + let endianess = ByteOrderEnum::LittleEndian; + assert_eq!(bytes_to_text(&bytes, &datatype, 1, &endianess).unwrap(), "1"); + + let endianess = ByteOrderEnum::BigEndian; + assert_eq!(bytes_to_text(&bytes, &datatype, 1, &endianess).unwrap(), "256"); + + let bytes = [0x01, 0x00, 0x02, 0x00]; + let datatype = DataType::Uword; + let endianess = ByteOrderEnum::LittleEndian; + assert_eq!(bytes_to_text(&bytes, &datatype, 2, &endianess).unwrap(), "(1,2)"); + } + + #[test] + fn test_text_to_bytes() { + let text = "-2"; + let datatype = DataType::Slong; + let endianess = ByteOrderEnum::LittleEndian; + assert_eq!(text_to_bytes(text, &datatype, 1, &endianess).unwrap(), vec![0xfe, 0xff, 0xff, 0xff]); + + let text = "(1, 2)"; + let datatype = DataType::Uword; + let endianess = ByteOrderEnum::BigEndian; + assert_eq!(text_to_bytes(text, &datatype, 2, &endianess).unwrap(), vec![0x00, 0x01, 0x00, 0x02]); + } +} diff --git a/src/dwarf/iter.rs b/src/dwarf/iter.rs index 0c1e1f9..86113b5 100644 --- a/src/dwarf/iter.rs +++ b/src/dwarf/iter.rs @@ -244,6 +244,7 @@ impl<'dbg> VariablesIterator<'dbg> { mod test { use super::*; use indexmap::IndexMap; + use object::Endianness; const DEFAULT_TYPEINFO: TypeInfo = TypeInfo { name: None, @@ -394,6 +395,7 @@ mod test { types.insert(1, structtype); let demangled_names = HashMap::new(); let debugdata = DebugData { + endian: Endianness::Little, variables, types, typenames: HashMap::new(), diff --git a/src/dwarf/mod.rs b/src/dwarf/mod.rs index 78ccb84..27a5938 100644 --- a/src/dwarf/mod.rs +++ b/src/dwarf/mod.rs @@ -87,6 +87,7 @@ pub(crate) struct UnitList<'a> { #[derive(Debug)] pub(crate) struct DebugData { + pub(crate) endian: Endianness, pub(crate) variables: IndexMap>, pub(crate) types: HashMap, pub(crate) typenames: HashMap>, @@ -224,6 +225,7 @@ impl<'elffile> DebugDataReader<'elffile> { std::mem::swap(&mut unit_names, &mut self.unit_names); DebugData { + endian: self.endian, variables, types, typenames, @@ -965,4 +967,12 @@ mod test { )); } } + + #[test] + fn test_elf_endianess() { + for filename in ELF_FILE_NAMES { + let debugdata = DebugData::load(OsStr::new(filename), true).unwrap(); + assert!(debugdata.endian == Endianness::Little); + } + } } diff --git a/src/main.rs b/src/main.rs index 6a92f28..10c40b9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,7 @@ +use bin_file::BinFile; use clap::{builder::ValueParser, parser::ValuesRef, Arg, ArgGroup, ArgMatches, Command}; -use a2lfile::{A2lError, A2lFile, A2lObject}; +use a2lfile::{A2lError, A2lFile, A2lObject, ByteOrderEnum}; use dwarf::DebugData; use std::{ ffi::{OsStr, OsString}, @@ -8,11 +9,13 @@ use std::{ time::Instant, }; +mod calibrate; mod datatype; mod dwarf; mod ifdata; mod insert; mod remove; +mod search; mod symbol; mod update; mod version; @@ -82,6 +85,8 @@ fn main() { // 8) clean up ifdata // 9) sort the file // 10) output +// 11) Binary calibration read +// 12) Binary calibration write fn core() -> Result<(), String> { let arg_matches = get_args(); @@ -118,6 +123,9 @@ fn core() -> Result<(), String> { let merge_includes = *arg_matches .get_one::("MERGEINCLUDES") .expect("option merge-includes must always exist"); + let calibrate = *arg_matches + .get_one::("CALIBRATE") + .expect("option calibrate must always exist"); let verbose = arg_matches.get_count("VERBOSE"); let now = Instant::now(); @@ -487,6 +495,35 @@ fn core() -> Result<(), String> { } } + // Read or write calibrations in a binary file + if calibrate { + let mut log_msgs: Vec = Vec::new(); + let guessed_default_endianess = calibrate::guess_default_endianess(&a2l_file, &elf_info); + let default_endianess = if let Some(endianess) = arg_matches.get_one("DEAFULT_BYTE_ORDER").or(guessed_default_endianess.as_ref()) { + endianess + } else { + return Err(String::from("Cannot detect a default BYTE_ORDER. Specify the --default_byte_order on the command line.")); + }; + log_msgs.push(format!("Using default byte order {}", default_endianess)); + + if let Some(binary_file) = arg_matches.get_one::("BINARY") { + let mut binfile = match BinFile::from_file(binary_file) { + Ok(bf) => bf, + Err(e) => { return Err(format!("Error opening binary file. {}", e.to_string())); }, + }; + if let Some(csv_file) = arg_matches.get_one::("CALIB_WRITE") { + calibrate::calibration_from_csv_to_binary(&mut a2l_file, &elf_info, enable_structures, default_endianess, &mut binfile, &csv_file, &binary_file, &mut log_msgs)?; + } + if let Some(csv_file) = arg_matches.get_one::("CALIB_READ") { + calibrate::calibration_from_binary_to_csv(&mut a2l_file, &elf_info, enable_structures, default_endianess, &binfile, &csv_file, &mut log_msgs)?; + } + } + + for msg in log_msgs { + cond_print!(verbose, now, msg); + } + } + cond_print!(verbose, now, "\nRun complete. Have a nice day!\n\n"); Ok(()) @@ -543,7 +580,7 @@ fn load_or_create_a2l( format!("Input \"{}\" loaded", input_filename.to_string_lossy()) ); Ok((input_filename, a2l_file)) - } else if arg_matches.contains_id("CREATE") { + } else if arg_matches.contains_id("CREATE") | arg_matches.contains_id("CALIBRATE") { // dummy file name let input_filename = OsStr::new(""); // a minimal a2l file needs only a PROJECT containing a MODULE @@ -565,7 +602,29 @@ fn load_or_create_a2l( Ok((input_filename, a2l_file)) } else { // shouldn't be able to get here, the clap config requires either INPUT or CREATE - Err("impossible: no input filename and no --create".to_string()) + Err("impossible: no input filename and no --create nor --calibrate".to_string()) + } +} + +#[derive(Clone)] +struct ByteOrderEnumParser; + +impl clap::builder::TypedValueParser for ByteOrderEnumParser { + type Value = ByteOrderEnum; + + fn parse_ref( + &self, + _cmd: &clap::Command, + _arg: Option<&clap::Arg>, + value: &std::ffi::OsStr, + ) -> Result { + match value.to_str().unwrap_or_default() { + "MSB_FIRST" => Ok(ByteOrderEnum::MsbFirst), + "MSB_LAST" => Ok(ByteOrderEnum::MsbLast), + "LITTLE_ENDIAN" => Ok(ByteOrderEnum::LittleEndian), + "BIG_ENDIAN" => Ok(ByteOrderEnum::BigEndian), + _ => Err(clap::Error::raw(clap::error::ErrorKind::ValueValidation, format!("Unknown {} value '{}'\n", _arg.unwrap(), value.to_str().unwrap_or_default()))) + } } } @@ -592,6 +651,36 @@ fn get_args() -> ArgMatches { .number_of_values(0) .action(clap::ArgAction::SetTrue) ) + .arg(Arg::new("CALIBRATE") + .help("Read of write calibrations in a binary file") + .long("calibrate") + .number_of_values(0) + .action(clap::ArgAction::SetTrue) + ) + .arg(Arg::new("CALIB_READ") + .help("CSV file containing the symbols to read from binary. The CSV file will be updated with the values read from the binary.") + .short('r') + .long("readcal") + .number_of_values(1) + .value_name("CSVFILE") + .value_parser(ValueParser::os_string()) + ) + .arg(Arg::new("CALIB_WRITE") + .help("CSV file containing the symbols to write to binary. The binary file will be updated with the values from the CSV.") + .short('w') + .long("writecal") + .number_of_values(1) + .value_name("CSVFILE") + .value_parser(ValueParser::os_string()) + ) + .arg(Arg::new("BINARY") + .help("Binary file (srecord, HEX, etc.)") + .short('b') + .long("binary") + .number_of_values(1) + .value_name("BINARY") + .value_parser(ValueParser::os_string()) + ) .arg(Arg::new("ELFFILE") .help("Elf file containing symbols and address information") .short('e') @@ -807,10 +896,19 @@ fn get_args() -> ArgMatches { .value_name("REGEX") .action(clap::ArgAction::Append) ) + .arg(Arg::new("DEAFULT_BYTE_ORDER") + .help("Default byte order applied when not specified in the A2L file: MSB_LAST, MSB_FIRST, BIG_ENDIAN, LITTLE_ENDIAN.") + .long("default-byte-order") + .number_of_values(1) + // .value_parser(["MSB_LAST", "MSB_FIRST", "BIG_ENDIAN", "LITTLE_ENDIAN"]) + .value_parser(ByteOrderEnumParser) + .requires("CALIBRATE") + .value_name("BYTE_ORDER") + ) .group( ArgGroup::new("INPUT_ARGGROUP") - .args(["INPUT", "CREATE"]) - .multiple(false) + .args(["INPUT", "CREATE", "CALIBRATE"]) + .multiple(true) .required(true) ) .group( diff --git a/src/search.rs b/src/search.rs new file mode 100644 index 0000000..3b6ba1c --- /dev/null +++ b/src/search.rs @@ -0,0 +1,173 @@ +use a2lfile::{A2lFile, Characteristic, Measurement, RecordLayout}; +use std::collections::HashMap; + +#[allow(dead_code)] +pub(crate) fn _search_measurements<'a>( + a2l_file: &'a A2lFile, + regex_strings: &[&str], + _log_messages: &mut Vec, +) -> HashMap<&'a String, &'a Measurement> { + let mut found = HashMap::new(); + + let compiled_regexes = regex_strings + .iter() + .map(|re| { + // extend the regex to match only the whole string, not just a substring + let extended_regex = if !re.starts_with('^') && !re.ends_with('$') { + format!("^{re}$") + } else { + re.to_string() + }; + regex::Regex::new(&extended_regex).unwrap() + }) + .collect::>(); + + for module in &a2l_file.project.module { + // search all measurements that match any of the regexes + for measurement in &module.measurement { + for regex in &compiled_regexes { + if regex.is_match(&measurement.name) { + found.insert(&measurement.name, measurement); + } + } + } + } + + found +} + +pub(crate) fn search_characteristics<'a>( + a2l_file: &'a A2lFile, + regex_strings: &[&str], + _log_messages: &mut Vec, +) -> HashMap<&'a String, &'a Characteristic> { + let mut found = HashMap::new(); + + let compiled_regexes = regex_strings + .iter() + .map(|re| { + // extend the regex to match only the whole string, not just a substring + let extended_regex = if !re.starts_with('^') && !re.ends_with('$') { + format!("^{re}$") + } else { + re.to_string() + }; + regex::Regex::new(&extended_regex).unwrap() + }) + .collect::>(); + + for module in &a2l_file.project.module { + // search all characteristics that match any of the regexes + for characteristic in &module.characteristic { + for regex in &compiled_regexes { + if regex.is_match(&characteristic.name) { + found.insert(&characteristic.name, characteristic); + } + } + } + } + + found +} + +pub(crate) fn search_reord_layout<'a>( + a2l_file: &'a A2lFile, + regex_strings: &[&str], + _log_messages: &mut Vec, +) -> HashMap<&'a String, &'a RecordLayout> { + let mut found = HashMap::new(); + + let compiled_regexes = regex_strings + .iter() + .map(|re| { + // extend the regex to match only the whole string, not just a substring + let extended_regex = if !re.starts_with('^') && !re.ends_with('$') { + format!("^{re}$") + } else { + re.to_string() + }; + regex::Regex::new(&extended_regex).unwrap() + }) + .collect::>(); + + for module in &a2l_file.project.module { + // search all characteristics that match any of the regexes + for record_layout in &module.record_layout { + for regex in &compiled_regexes { + if regex.is_match(&record_layout.name) { + found.insert(&record_layout.name, record_layout); + } + } + } + } + + found +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_search_measurements() { + let mut load_msgs = Vec::::new(); + let a2l_file = a2lfile::load("tests/example-a2l-file.a2l", None, &mut load_msgs, false).expect("Unable to load A2L file"); + let regex_strings = vec!["Measurement_0."]; + let mut search_msgs = Vec::new(); + let result = _search_measurements(&a2l_file, ®ex_strings, &mut search_msgs); + assert_eq!(result.len(), 9); + } + + #[test] + fn test_search_characteristics() { + let mut load_msgs = Vec::::new(); + let a2l_file = a2lfile::load("tests/example-a2l-file.a2l", None, &mut load_msgs, false).expect("Unable to load A2L file"); + let regex_strings = vec!["Characteristic_01", "Characteristic_14"]; + let mut search_msgs = Vec::new(); + let result = super::search_characteristics(&a2l_file, ®ex_strings, &mut search_msgs); + assert_eq!(result.len(), 2); + assert!(result.contains_key(&"Characteristic_01".to_string())); + assert!(result.contains_key(&"Characteristic_14".to_string())); + } + + #[test] + fn test_search_record_layout() { + let mut load_msgs = Vec::::new(); + let a2l_file = a2lfile::load("tests/example-a2l-file.a2l", None, &mut load_msgs, false).expect("Unable to load A2L file"); + let regex_strings = vec!["RecordLayout_05"]; + let mut search_msgs = Vec::new(); + let result = super::search_reord_layout(&a2l_file, ®ex_strings, &mut search_msgs); + assert_eq!(result.len(), 1); + assert!(result.contains_key(&"RecordLayout_05".to_string())); + } + + #[test] + fn test_search_measurements_no_match() { + let mut load_msgs = Vec::::new(); + let a2l_file = a2lfile::load("tests/example-a2l-file.a2l", None, &mut load_msgs, false).expect("Unable to load A2L file"); + let regex_strings = vec!["nonexistent"]; + let mut search_msgs = Vec::new(); + let result = super::_search_measurements(&a2l_file, ®ex_strings, &mut search_msgs); + assert_eq!(result.len(), 0); + } + + #[test] + fn test_search_characteristics_no_match() { + let mut load_msgs = Vec::::new(); + let a2l_file = a2lfile::load("tests/example-a2l-file.a2l", None, &mut load_msgs, false).expect("Unable to load A2L file"); + let regex_strings = vec!["nonexistent"]; + let mut search_msgs = Vec::new(); + let result = super::search_characteristics(&a2l_file, ®ex_strings, &mut search_msgs); + assert_eq!(result.len(), 0); + } + + #[test] + fn test_search_record_layout_no_match() { + let mut load_msgs = Vec::::new(); + let a2l_file = a2lfile::load("tests/example-a2l-file.a2l", None, &mut load_msgs, false).expect("Unable to load A2L file"); + let regex_strings = vec!["nonexistent"]; + let mut search_msgs = Vec::new(); + let result = super::search_reord_layout(&a2l_file, ®ex_strings, &mut search_msgs); + assert_eq!(result.len(), 0); + } +} diff --git a/src/symbol.rs b/src/symbol.rs index 8acb34e..1a194ed 100644 --- a/src/symbol.rs +++ b/src/symbol.rs @@ -324,6 +324,7 @@ fn get_index(idxstr: &str) -> Option { mod test { use super::*; use indexmap::IndexMap; + use object::Endianness; use std::collections::HashMap; #[test] @@ -346,6 +347,7 @@ mod test { #[test] fn test_find_symbol_of_array() { let mut dbgdata = DebugData { + endian: Endianness::Little, types: HashMap::new(), typenames: HashMap::new(), variables: IndexMap::new(), @@ -406,6 +408,7 @@ mod test { #[test] fn test_find_symbol_of_array_in_struct() { let mut dbgdata = DebugData { + endian: Endianness::Little, types: HashMap::new(), typenames: HashMap::new(), variables: IndexMap::new(), @@ -478,6 +481,7 @@ mod test { #[test] fn test_select_varinfo() { let mut debug_data = DebugData { + endian: Endianness::Little, types: HashMap::new(), typenames: HashMap::new(), variables: IndexMap::new(), diff --git a/tests/calibrate/cal_test_1.a2l b/tests/calibrate/cal_test_1.a2l new file mode 100644 index 0000000..f182a4c --- /dev/null +++ b/tests/calibrate/cal_test_1.a2l @@ -0,0 +1,50 @@ +/* a2ltool 2.2.0 */ +ASAP2_VERSION 1 71 +/begin PROJECT new_project "description of project" + /begin MODULE new_module "" + + /begin CHARACTERISTIC cal_double "characteristic for cal_double" + VAL_BLK 0xC320 __FLOAT64_IEEE_Z 0 NO_COMPU_METHOD -1.7976931348623157e308 1.7976931348623157e308 + MATRIX_DIM 2 + SYMBOL_LINK "cal_double" 0 + /end CHARACTERISTIC + + /begin CHARACTERISTIC cal_float "characteristic for cal_float" + VALUE 0xC330 __FLOAT32_IEEE_Z 0 NO_COMPU_METHOD -3.4028234663852886e38 3.4028234663852886e38 + SYMBOL_LINK "cal_float" 0 + /end CHARACTERISTIC + + /begin CHARACTERISTIC cal_sleep_counts "characteristic for cal_sleep_counts" + VAL_BLK 0xC340 __ULONG_Z 0 NO_COMPU_METHOD 0 4294967295 + MATRIX_DIM 3 + SYMBOL_LINK "cal_sleep_counts" 0 + /end CHARACTERISTIC + + /begin CHARACTERISTIC cal_sleep_time "characteristic for cal_sleep_time" + VALUE 0xC34C __ULONG_Z 0 NO_COMPU_METHOD 0 4294967295 + SYMBOL_LINK "cal_sleep_time" 0 + /end CHARACTERISTIC + + /begin CHARACTERISTIC cal_text "characteristic for cal_text" + VAL_BLK 0xC334 __UBYTE_Z 0 NO_COMPU_METHOD 0 255 + MATRIX_DIM 12 + SYMBOL_LINK "cal_text" 0 + /end CHARACTERISTIC + + /begin RECORD_LAYOUT __FLOAT32_IEEE_Z + FNC_VALUES 1 FLOAT32_IEEE ROW_DIR DIRECT + /end RECORD_LAYOUT + + /begin RECORD_LAYOUT __FLOAT64_IEEE_Z + FNC_VALUES 1 FLOAT64_IEEE ROW_DIR DIRECT + /end RECORD_LAYOUT + + /begin RECORD_LAYOUT __UBYTE_Z + FNC_VALUES 1 UBYTE ROW_DIR DIRECT + /end RECORD_LAYOUT + + /begin RECORD_LAYOUT __ULONG_Z + FNC_VALUES 1 ULONG ROW_DIR DIRECT + /end RECORD_LAYOUT + /end MODULE +/end PROJECT \ No newline at end of file diff --git a/tests/calibrate/cal_test_1.csv b/tests/calibrate/cal_test_1.csv new file mode 100644 index 0000000..0dc525f --- /dev/null +++ b/tests/calibrate/cal_test_1.csv @@ -0,0 +1,6 @@ +# Test +cal_sleep_time;250 +cal_float;8.8888 +cal_text;"aaa"; +cal_sleep_counts;(2,4,6) +cal_double;(1.23456789,9.87654321) diff --git a/tests/calibrate/cal_test_1.elf b/tests/calibrate/cal_test_1.elf new file mode 100755 index 0000000..3915e72 Binary files /dev/null and b/tests/calibrate/cal_test_1.elf differ diff --git a/tests/calibrate/cal_test_1.hex b/tests/calibrate/cal_test_1.hex new file mode 100644 index 0000000..659e52e --- /dev/null +++ b/tests/calibrate/cal_test_1.hex @@ -0,0 +1,3007 @@ +:1010000080330020592F0000F19A0000452F000086 +:10101000452F0000452F0000452F00000000000074 +:10102000000000000000000000000000213100006E +:10103000452F000000000000ED300000452F0000AB +:101040001133000011330000113300001133000090 +:101050001133000011330000113300001133000080 +:101060001133000011330000113300001133000070 +:101070001133000011330000113300001133000060 +:101080001133000011330000113300001133000050 +:101090001133000011330000113300001133000040 +:1010A0001133000011330000113300001133000030 +:1010B0001133000011330000113300001133000020 +:1010C0001133000011330000113300001133000010 +:1010D0001133000011330000113300001133000000 +:1010E00011330000113300001133000011330000F0 +:1010F00011330000113300001133000011330000E0 +:1011000053B94AB9002908BF00281CBF4FF0FF316E +:101110004FF0FF3000F00CB8ADF1080C6DE904CED3 +:1011200000F008F8DDF804E0DDE9022304B07047C0 +:10113000704700BF2DE9F04786468C460846089E5A +:10114000154674461946002B40F0C2808542B2FA1B +:1011500082F245D94AB1C2F1200300FA02FC2EFA0C +:1011600003F3954043EA0C0C94404FEA154EA8B2A5 +:10117000BCFBFEF8230C0EFB18CC08FB00F943EA7D +:101180000C43994528D9EB1808F1FF3704D299454B +:1011900002D9A8F102072B44A3EB0903A4B2B3FBC5 +:1011A000FEFC0EFB1C330CFB00F044EA0344A0429F +:1011B00014D92C190CF1FF3304D2A04202D9ACF19E +:1011C00002032C44241A43EA07401EB1D4400023F2 +:1011D00034607360BDE8F0874746DDE76346F1E7BA +:1011E00092BB431B01214FEA154EAFB2B3FBFEFC8D +:1011F000200C0EFB1C330CFB07F840EA0343984518 +:1012000062D9EB180CF1FF3004D2984502D9ACF149 +:1012100002002B44A3EB0803A4B2B3FBFEFC0EFBBD +:101220001C330CFB07F744EA0344A7424ED92C19A0 +:101230000CF1FF3304D2A74202D9ACF102032C44D3 +:10124000E41B43EA0040C0E7C2F1200320FA03F1A7 +:10125000954090402EFA03F303434FEA154EAFB288 +:10126000B1FBFEFC0EFB1C10190C0CFB07F841EA4D +:101270000041884504FA02F422D969180CF1FF30C4 +:1012800004D2884502D9ACF102002944A1EB08013F +:101290009BB2B1FBFEFC0EFB1C110CFB07F743EAF3 +:1012A00001439F420ED9EB180CF1FF3104D29F424B +:1012B00002D9ACF102012B44DB1B41EA004192E769 +:1012C0006046E3E76146F7E76046A3E76346B7E7B2 +:1012D000834206D916B9002108467BE7C6E900E03B +:1012E000F9E7B3FA83F78FB9834201D3724508D87F +:1012F000BEEB020460EB030301209C461EB90021F3 +:1013000068E73846FAE7C6E9004CF8E7C7F1200C71 +:10131000BB4022FA0CF41C432EFA0CF120FA0CF319 +:10132000B84001434FEA14490EFA07F5B3FBF9F848 +:101330001FFA84FE09FB18300B0C08FB0EFA43EA77 +:1013400000439A4502FA07F240D9E31808F1FF304A +:1013500004D29A4502D9A8F102002344A3EB0A0360 +:1013600089B2B3FBF9F809FB183308FB0EFE41EA1A +:1013700003418E452CD9611808F1FF3304D28E4504 +:1013800002D9A8F10203214443EA0040A0FB0298DD +:10139000A1EB0E014145CE46434602D306D14D4551 +:1013A00004D2B9EB020E68EB04030138002EA6D07C +:1013B000B5EB0E0261EB030101FA0CFC22FA07F314 +:1013C0004CEA0303F940C6E9003198E74046C5E717 +:1013D0004346D9E7034613F8012B002AFBD1181A1C +:1013E0000138704770B5002000F094FD08B100206E +:1013F00070BD064611480AF044F80028F7D04FF4B3 +:10140000D0110F4807F037FC0028F0DB3546022DDD +:10141000FCD80B4807F03AFC0028E8DB094B53F8EE +:101420002540642303FB04F422460749074807F0DC +:101430008BF9204607F034FC0135E8E720C10000B5 +:1014400080C3000040C3000034C3000078C3000024 +:1014500008B5024B1B68984708BD00BFB0000020CC +:1014600000B585B00A4600230093019302930393CD +:1014700002238DF80230044B01930146684607F0C1 +:1014800075F905B05DF804FB51140000014B1860BC +:10149000704700BFB000002080B505460E461746D5 +:1014A000984606F00DFD03460AF0DCFD0446DFF821 +:1014B000189049F80030424639463046A84754F85B +:1014C000090001F0B7FD00BF080000002DE9F0435E +:1014D00083B0044608461546238B13F0080F05D148 +:1014E00003F0070600230093019354E0012909D07B +:1014F00043F02003238385F31188BFF36F8F03B07C +:10150000BDE8F08343F010032383F4E7204607F09F +:1015100040FE42E0D4F814904A466946204607F05F +:1015200051FE4FF00008238B03F00707B74269D044 +:10153000A268002A66D0012243F00803238385F3C2 +:101540001188BFF36F8F002A64D1009B2BB14B46EB +:101550003A466946204607F0AEFEB8F1000F02D0C9 +:1015600034492046C047EFF31185202383F31288C6 +:10157000BFF36F8F238B23F008032383238B13F098 +:10158000100F4DD023F0100323830120268B06F08B +:1015900007060028AFD00228B8D00028ABD0013809 +:1015A00004282BD801A353F820F000BF1515000024 +:1015B000FD150000C1150000D5150000E91500005B +:1015C0002369D3F800800621204607F0B8FD4FF0CC +:1015D0000009A8E72369D3F804800421204607F016 +:1015E000AEFD4FF000099EE72369D3F8088005217E +:1015F000204607F0A4FD4FF0000994E74FF00008E3 +:10160000C14690E7009A0AB1002295E7B8F1000FB1 +:1016100092D1B3E74A463946204607F098FD94E751 +:1016200013F0200F04D023F0200323830220ADE722 +:101630000020ABE7E5920000014B036000207047FB +:1016400088C30000072801D900207047024B0344DB +:1016500083F8BB100120704798080020072801D9A3 +:1016600000207047024B034493F8BB00704700BF53 +:101670009808002010B50378C3F341130A33064CD1 +:1016800054F8233023B19847002803DB012010BD14 +:101690000020FCE70020FAE7980800200A30024BFF +:1016A00043F82010704700BF98080020014B586293 +:1016B000704700BF98080020136800221A705A7003 +:1016C00001221A70064A92F8C3203AB1022242F06F +:1016D00001021A7002230B60012070470022F6E716 +:1016E0009808002030B545884FEA152EAEF1040366 +:1016F000DBB2012B21D9EDB2BEF1070F1FD8114B80 +:101700005B6A002400E00344187840B193F801C0FC +:10171000F445F8D1A54201D00134F4E7012068B1C5 +:101720001360BEF1020F02D01B780B6006E09A78BE +:10173000DB7842EA03230B6000E0002030BD00208C +:10174000FCE700BF9808002038B50C460D4B5B6ADB +:10175000156800E013441A788AB193F801C0BCF10F +:10176000040FF7D193F802C0B0F804E0F445F1D1CA +:101770006046FFF773FF28700120206000E0002022 +:1017800038BD00BF98080020034B93F8BA0000381A +:1017900018BF0120704700BF98080020074B5B6A04 +:1017A00000E013441A783AB159780229F9D119792D +:1017B0008142F6D901207047002070479808002028 +:1017C00030F0800318D01049104B994219D210B450 +:1017D00003E024310D4B99420CD20C6A00230A7F9E +:1017E0009A42F6D904EBC3021279824206D0013341 +:1017F000DBB2F4E7002002E001207047012010BCBA +:1018000070470020704700BFB0030020D4030020C1 +:10181000014B9861704700BF98080020014BD861C8 +:10182000704700BF98080020F8B506460A4D0B4BDC +:101830009D420FD22F6A002401E00134E4B22B7FD5 +:10184000A34205D907EBC400B0470028F5DAF8BD7C +:101850002435ECE70020FAE7B0030020D403002091 +:1018600038B50C4B00E024330B4CA3420ED25C681D +:101870000A4D6D6AAC42F6D31D69002DF3D094F881 +:1018800002C00479A445EED1A84701E06FF08500BD +:1018900038BD00BFB0030020D4030020980800200A +:1018A0002DE9F04106460F469046114C05E04246B0 +:1018B00039463046A84719E024340E4B9C4213D2D7 +:1018C00063680D4D6D6AAB42F6D3A569002DF3D068 +:1018D000997832799142EAD05B79012BECD142467A +:1018E00039463046A847E7E76FF08500BDE8F0814C +:1018F000B0030020D403002098080020F8B5074664 +:101900000E4615460A4C00E024340A4B9C420AD28B +:101910006369002BF8D02A4631463846984703467B +:101920000028F1D101E06FF085031846F8BD00BF33 +:10193000B0030020D403002010B5044608F0A0FB3B +:1019400010F1780F00D050B9204607F07BFE044A12 +:10195000D2F8C43023EA0003C2F8C430002010BD1E +:101960009808002038B50446007908F089FB054640 +:10197000207907F067FE044AD2F8C43023EA000356 +:10198000C2F8C430284638BD9808002070B582B02F +:101990000D4604798DF807402046FFF711FF0646F3 +:1019A00030B134F0800306D0FFF7EEFE18B90646DA +:1019B000304602B070BD5DB1204602F0BBF90A4B63 +:1019C000DB69002BF4D00DF1070108209847EFE701 +:1019D000204602F0DFF9044BDB69002BE8D00DF163 +:1019E000070109209847E3E79808002030B583B045 +:1019F000044680788DF80000A388ADF80230E378C3 +:101A000003F003038DF8043007F01CFE0546174B66 +:101A1000D3F8C430034219D1684602F063F910F1DB +:101A2000780F00D0E8B99DF8000002F0FDF910F140 +:101A3000780F00D0B8B90D4B012083F8B900D3F866 +:101A4000C4201543C3F8C45003B030BD204607F08E +:101A50000CFE09F03CFF0028DED1962006F0F4F9D8 +:101A6000DAE70020F0E70020EEE700BF980800204A +:101A70002DE9F8430646194B5C6A0027FF25A84666 +:101A8000B94607E094F80380A578B088854212D063 +:101A900023781C442378C3B16378042BF2D0052B40 +:101AA000F6D1B3889D42F3D1B2784146204607F083 +:101AB000F1FD0746ECE771888845E9D1C9B2C0B2AB +:101AC000FFF7C0FD0746A146E2E7044BDB6913B10F +:101AD0004946072098473846BDE8F8839808002013 +:101AE000024B00221A605A60704700BF5309002061 +:101AF0002DE9F0410546224B5C6A43881BB1002763 +:101B0000FF26B04610E0FFF7EBFF6A881C4B83F816 +:101B1000BA20DB6913B11B490320984701271EE057 +:101B200094F8038023781C442378BBB16378042B9A +:101B3000F6D0052B07D0022BF4D166796B889E4234 +:101B4000F0D10127EEE76B889E42EBD1B8F1000F90 +:101B5000E8D12046FFF74AFF0746E3E717B93846C2 +:101B6000BDE8F081FFF7BCFF6A88054B83F8BA2017 +:101B7000DB69002BF3D0034903209847EFE700BF50 +:101B8000980800205209002010B5146890F9003020 +:101B9000002B0ADB4378013B082B3AD8DFE803F03F +:101BA00024392F391A39393921004378062B07D0C7 +:101BB000082B08D00BB1002010BDFFF77DFDFBE71F +:101BC000FFF790FDF8E7144B93F8BA30237001202B +:101BD0000860F1E7807802F073F8B0FA80F040090D +:101BE000EAE7FFF785FFE7E74388012B01D00020F4 +:101BF000E2E7094B002283F8C3200120DCE7438899 +:101C0000012B01D00020D7E70120034B83F8C3004C +:101C1000D2E70020D0E700BF9808002070B5054645 +:101C20000E46042803D0012803D0134C11E0FFF71F +:101C300057FF124B93F8B930002BF6D000F046FC5A +:101C40000F48FFF7F1FD0D4B002283F8B920ECE7B8 +:101C500024340C4B9C4207D2E368002BF8D0324668 +:101C6000294620469847F3E7044B1B6A13B13146D7 +:101C70002846984770BD00BFB00300209808002098 +:101C800065190000D403002070B504460D461646C1 +:101C9000184B9B690BB1984748B1237803F01F0399 +:101CA000012B0DD0022B13D013B16FF0150070BDB6 +:101CB000324629462046FFF767FF88B10020F6E745 +:101CC00032462946204607F0EEFC60B10020EEE7E0 +:101CD00032462946204607F02EFD38B10020E6E7BF +:101CE0006FF01500E3E76FF01500E0E76FF0150007 +:101CF000DDE700BF9808002070B50E4E0E4B9E42E7 +:101D000015D2356A002401E00134E4B2337F9C42ED +:101D10000BD205EBC40355F83410187902F0EEF934 +:101D20000028F1D04FF0FF3070BD2436E6E70020E8 +:101D3000FAE700BFB0030020D403002010B582B042 +:101D4000154B1B7DF3B9144CE268019201ABA168FD +:101D5000802007F013FDA368019A1344A360E36891 +:101D60009B1AE360B3B9AAB1E28823699A4211DDF4 +:101D700094F8C82093FBF2F102FB113353B901220E +:101D8000227507E00021044B19750B460A46802096 +:101D900002F078F802B010BD9808002000B585B0B8 +:101DA00000230393002840F0858019B3494BDA687B +:101DB000002A67DD03AB47498968002008F079F9FC +:101DC00000286CDB434A936803990B449360D36803 +:101DD0005B1AD360002B6FD1104602F1380342F832 +:101DE000083F00F11001FFF745FC00285ED0FFF727 +:101DF000A5FF61E0082201A908F05BF900282EDBAD +:101E00009DF80400334B18709DF805205A70BDF8FA +:101E100006205A80BDF808209A80BDF80A10D980A3 +:101E200003F138029A6000221A751A61DA6010F024 +:101E3000800F02D1802916D8E1B9274A02F10801A2 +:101E4000A2F10800FFF716FCC0B1224BDA8819692D +:101E50008A42A8BF0A46DA60FFF770FF2CE08020B4 +:101E600001F068FF28E0802001F064FF002001F00D +:101E700061FF21E0174B1961D9601DE0802001F05E +:101E800059FF19E003AB002212498968104608F097 +:101E900010F9002810DA802001F04CFF0CE08020BF +:101EA00001F048FF002001F045FF05E0802001F02F +:101EB00041FF01E0802802D005B05DF804FB054B2E +:101EC000DB681BB9034B1B7D002BF5D0FFF736FFFA +:101ED000F2E700BF98080020A008002008B5FFF72F +:101EE000E5FB08490020FFF7D9FB07490120FFF770 +:101EF000D5FB06490220FFF7D1FB0548FFF788FC18 +:101F0000002008BD891C000061180000FD180000B9 +:101F1000A118000070B582B005464FF0FF324FF0B7 +:101F2000FF33454805F01EF9444B93F8B830002BB9 +:101F300073D1424B5B6A002B64D0012007F093FB06 +:101F4000041E6CDB3D4B5E6A1D623D4C2046FFF774 +:101F500065FC204602F0E6F801F076FE041E5EDB2A +:101F600000F0E0FA041E5ADB7378012B5DD1F3799F +:101F7000002B5DD0314A82F8C830ADF80230002322 +:101F80008DF804308DF80030684601F0ABFE041E79 +:101F900045DB80238DF80030684601F0A3FE041E67 +:101FA0003DDB2849002002F0A9F8041E37DB254953 +:101FB000802002F0A3F8041E31DBFFF79DFE041E13 +:101FC0002DDB002001F030FF041E28DB002007F08D +:101FD00039FB1A4AD2F8C4300343C2F8C430802017 +:101FE00001F022FF041E1ADB802007F02BFB134BAD +:101FF000D3F8C4200243C3F8C420012283F8B820D8 +:1020000000240CE000F0EAF8FFF768FF0B4B5B6A76 +:10201000002B92D14FF0FF3401E06FF077040648B7 +:1020200005F020F9204602B070BD6FF01504F6E708 +:102030006FF01504F3E700BFD802002098080020D5 +:102040001D1C00009D1D00000246064800E02430D3 +:10205000054B984203D243689342F8D100E0002038 +:10206000704700BFB0030020D403002010B58AB031 +:102070000DF1040C1D4C0FCCACE80F0023688CF85C +:10208000003000230693079308930993184A1360BE +:1020900053609360D3601382102106A808F051FAB0 +:1020A000002820DD0828B8BF0820A0F1080C002275 +:1020B00017E00CEB020328336B4413F8103C51007B +:1020C0000AA800EB131010F824EC094800F812E0FD +:1020D00003F00F03013128336B4413F8243C4354BD +:1020E0000132072AE5DD02480AB010BD88C30000AE +:1020F000640900202DE9F04182B004464FF001133D +:10210000019300252F46A8462E4604E0204607F0FE +:1021100062FB23781C442378002B48D06378052B7E +:10212000F7D801A252F823F0812100000D21000010 +:10213000AB21000081210000412100006721000047 +:10214000E378002BE5D1A37853B92046FFF77CFF55 +:102150008046002836D0836813B139462046984718 +:102160000137FFB2D5E7B8F1000F2ED001AA4146E2 +:10217000204607F050FB0028CBD04FF0FF301BE08B +:10218000032D0AD06DB91EB3A31BB370C3F307238D +:10219000F37037710135EDB2BBE7204607F09CFBC9 +:1021A000F0E7204607F005FBF4E72646B1E7A01C60 +:1021B000094B984203D1002002B0BDE8F081FFF73F +:1021C00099FFF9E74FF0FF30F6E74FF0FF30F3E704 +:1021D0004FF0FF30F0E700BFAF03002008B5084B19 +:1021E0001B780BB1074808BD0648FFF783FF20B9ED +:1021F000034B01221A700348F5E70020F3E700BF04 +:10220000201D00200C030020002300E00133032BDD +:102210000CD89A0106498A5C8242F7D101EB8312FD +:102220005268002AF2D001EB8310704700207047FB +:10223000780900202DE9F04182B0044610F82C5CAA +:1022400050F8283C13F1100F23D1036913F0020F4B +:1022500030D050F8202C2AB913F0040F21D143F0CC +:102260000403036101AB54F8241C284607F086FAE6 +:10227000D8B954F8242C019B1A4444F8242C54F85F +:10228000202CD21A44F8202C54F81C2C134444F867 +:102290001C3C54F8283C13F1100F3FD102B0BDE8AC +:1022A000F081002340F8283CF3E76FF0150344F871 +:1022B000283CEEE701AB50F8202C50F8241C2846AF +:1022C00001F064FEA0B954F8243C019E334444F864 +:1022D000243C54F8203C9B1B44F8203C54F81C3C04 +:1022E000334444F81C3C46B9002344F8283CD0E76A +:1022F0006FF0150344F8283CCBE7284601F018FF9F +:10230000B6FBF0F300FB1366002EEDD154F8203C31 +:10231000002BE9D0284601F097FEBAE754F8186C74 +:1023200054F81C7C54F8148C09F0D1FA68B90023D5 +:1023300044F8183CA4F1100005F00CF8002EADD0C4 +:10234000424639462846B047A8E72146014809F0E9 +:102350008FFAA3E7D803002070B582B006460C467A +:10236000FFF752FF631EDBB2012B0AD8054650B1BE +:1023700009F0ADFA08B1012C12D105F12C00FFF7DC +:1023800059FF02B070BD012CFBD101AB01220DF150 +:102390000301304601F0FAFD019B002BF5D1F0E777 +:1023A00005F12C01014809F063FAEAE7D80300209F +:1023B0002DE9F84F0546884616461F4607F0E0FA15 +:1023C00000285CD1EFF31189202383F31288BFF337 +:1023D0006F8F0024032C30D8A0011830294B1844EB +:1023E00004300022002304F0DBFF824608B10134F0 +:1023F000F0E7A201234B03EB8414D4F804B01BF1E3 +:10240000100F23D09D54C4F80880E6600023236198 +:102410000A9B6361E7630B9BA3616FF00F0363602B +:10242000284601F085FEB8B917F0020F22D004F15A +:102430002C01154809F01CFA01E06FF00B0A89F332 +:102440001188BFF36F8F5046BDE8F88F04F11C0070 +:1024500004F080FFDA46F2E7284601F069FEB6FB99 +:10246000F0F300FB1366002EDED0E36B43F00403B1 +:10247000E363D9E7284601F0E7FD8246DFE76FF026 +:102480000F0AE0E778090020D803002010B5EFF329 +:102490001184202383F31288BFF36F8FFFF7B4FEFC +:1024A00020B10146436813F1100F04D084F3118862 +:1024B000BFF36F8F10BD6FF08B0343602C31024868 +:1024C00009F0D6F9F2E700BFD803002038B50024A0 +:1024D00004E085F31188BFF36F8F0134032C1BD800 +:1024E000EFF31185202383F31288BFF36F8F0B4B1B +:1024F00003EB84135B6813F1100FEAD1074BA101C2 +:1025000003EB84126FF08B005060283119440431C2 +:10251000034809F0ADF9DCE738BD00BF78090020B9 +:10252000D803002070B5002511E0AC0104F12800AB +:10253000094E30440949043009F07FF904F11800CC +:10254000304404300122114609F0E5F80135032D2D +:10255000EBD9002070BD00BF7809002035220000B3 +:1025600070B504460E4615460179184807F0D8F9AB +:1025700030B394F90020002A18DB6278202A04D0B6 +:10258000222A0ED06FF0850019E02A68116840F801 +:10259000101C9188927920F80C1C00F80A2C00205D +:1025A0000DE0A27800F8092C002008E06278212ACA +:1025B00009D1A0F110032B6007233360002070BD08 +:1025C0006FF01200FBE76FF08500F8E7780A002053 +:1025D00008B50146034807F0B7F910B1012200F829 +:1025E000072C08BD780A002008B50169012381F88D +:1025F0004B300B6813B191F8493003B908BD08316D +:10260000014809F035F9F9E7D803002008B5016958 +:10261000012381F84A300B6813B191F8483003B9AF +:1026200008BD0831014809F023F9F9E7D803002073 +:1026300038B50D461446012382F84830136813B1AB +:1026400092F84A305BB9D4F890301A699B6893428B +:102650000BD004F118015DB1002200230BE002F160 +:102660000801074809F004F9EDE73DB904F1180144 +:1026700040F6CD420023024809F010F938BD00BFF2 +:10268000D803002030B583B0054614460A1E16DD77 +:1026900004F14C01D4F88C0006F055FF012384F8B6 +:1026A0004930236813B194F84B306BB9D4F88C10CF +:1026B000CB694A684969521A9B1A3F2B0AD994F888 +:1026C0009E305BB903B030BD04F10801094809F040 +:1026D000CFF8EBE7012384F8A030F3E70194064B31 +:1026E00000930123402204F14C012846FFF760FECD +:1026F000E8E700BFD80300208526000038B504694C +:1027000094F89E30A3B194F89F300BB1002010E0F4 +:1027100084F84830D4F8900006F015FF05460022F2 +:10272000002304F11801034809F0B8F8284600E036 +:10273000002038BDD803002008B503464FF0000C38 +:1027400080F89EC080F89FC080F849C080F848C0DB +:102750000B4A92E80300C3F89400A3F89810090C00 +:1027600083F89A1083F89CC083F89BC083F8A0C0BC +:102770004022614603F14C0009F06CFC08BD00BF2B +:1027800050C3000030B583B00446D0F8A4305D6873 +:102790000139052906D8DFE801F003050723262AB9 +:1027A000FFF7CAFF03B030BD90F89E30002BF9D17F +:1027B000012380F89E302B6A02460021187BFFF728 +:1027C00061FF94F84830002BECD12B6A187D0194FE +:1027D0000B4B0093022300221146FFF7E9FDE1E7CE +:1027E000FFF7AAFFDEE7012380F89F30DAE790F8D1 +:1027F0009F30002BD6D0002380F89F30D2E700BF57 +:102800003126000038B50C4615460146044807F04D +:1028100075F820B12A462146A438FFF7B3FF38BD2A +:10282000780A002010B582B08DF8071004690023E3 +:1028300084F8483002E0012007F034F901220DF15C +:102840000701D4F8900006F07EFE30B909F03FF899 +:1028500018B994F8A130002BEDD12122002304F106 +:102860001801024809F01AF802B010BDD803002080 +:1028700010B50469C4F8A40004F1A8030022C4F848 +:10288000A8200B4A526872B11360094A5360094983 +:1028900004F1080008F0D1FF074904F1180008F01E +:1028A000F1FF002010BD024A53601360EFE700BF44 +:1028B000780A0020B1990000BD280000F0B585B06D +:1028C0000446A0F11806D0F88C305B681B6A1D7DA9 +:1028D000284607F055F810B994F886300BB905B0C2 +:1028E000F0BD4FF4806203A9A06F06F04CFE0746CE +:1028F0000028F4D0002384F8303010F03F0F00D1CE +:10290000471E0196064B009302233A460399284638 +:10291000FFF74EFD3946A06F06F052FEDFE700BF1D +:102920003126000030B583B0084D002400944FF0EC +:10293000FF334FF480620649284604F05DFE0549E6 +:10294000284604F09DFE204603B030BDD803002089 +:10295000401D0020F0C3000008B5034806F0BEFB90 +:10296000024806F0BBFB08BDFCC3000034C40000F5 +:1029700008B5024805F040FD08BD00BF64C4000072 +:10298000B0F5680F17D00CD840F6BA63984214D04F +:10299000B0F5683F13D03A2801D0012070470020DD +:1029A0007047094B98420CD0084B984201D0012047 +:1029B00070470020704700207047002070470020BB +:1029C00070470020704700BF3A00003A2C5F5CA9B6 +:1029D000E8B108B54268B2F5683F07D00F498A42AE +:1029E0001AD0006804F03EFC002008BD03680022F5 +:1029F000BFF35B8F53E8001F012903D143E8002098 +:102A00000028F7D1BFF35B8F04D11046EDE76FF4D8 +:102A1000E04070470248E8E70248E6E72C5F5CA91F +:102A2000E98FFFFFEA8FFFFF30B308B54268B2F5C8 +:102A3000683F0CD012498A421CD000684FF0FF3228 +:102A40004FF0FF3304F08EFB88B10E480FE00368AF +:102A50000122BFF35B8F53E8001F002903D143E835 +:102A600000200028F7D1BFF35B8F01D1002008BD03 +:102A70000448FCE70448FAE76FF4E040704700BF01 +:102A80002C5F5CA9E98FFFFFEA8FFFFF10B50446BA +:102A9000A8B16368B3F5683F10D0B3F5680F0DD0E7 +:102AA0000D4A93420AD013F4686F0DD021680B4889 +:102AB00008F047FD00232360074B636010BD084BFF +:102AC0005B6808489847E4E7236800221A605A6068 +:102AD0009A60DA601A61EFE72C5F5CA9800F002032 +:102AE000000200206CC4000010B5044668B36068A2 +:102AF000B0F5683F28D0B0F5680F25D0174B984245 +:102B000028D0FFF73DFFC0B14FF0FF324FF0FF3349 +:102B10002146134804F0F4FA08B923681BB9114B95 +:102B20005B6811489847236800221A605A609A60CF +:102B3000DA601A614FF468636360206808F04CFD46 +:102B4000636843F03A03636010BD064B5B68074857 +:102B50009847CCE72368002BD3D1D5E72C5F5CA93D +:102B6000800F00200002002094C400006CC400000C +:102B700008B5402314220449044808F0D4FC044951 +:102B8000044805F0ABFC08BD800A0020800F00203F +:102B9000C4C40000D8C4000030BFFFF7FDBF00BFB1 +:102BA00038B50446054D2A46054909F045FA054A57 +:102BB0000021601909F04EFA38BD00BF0000000086 +:102BC00020C300000400000070B50646064D074B08 +:102BD0001D444C1B2046FFF7E3FF083CC6F8A44009 +:102BE00005F1080070BD00BF0000000004000000F7 +:102BF000074B9B6893F90E20002A08DB044A5269B0 +:102C0000934204D0034A536843F0805353607047A3 +:102C1000081B002000ED00E038B51546204B9B6AEC +:102C200013F4805F19D116241D4B9B6A13F4006FB7 +:102C300000D018241A4B9B6A13F4007F10D0184B55 +:102C40009A6B9B6A13F4004F09D0D9B1144A936A66 +:102C500023F400439362192402E01724E4E71924C3 +:102C60000F4B9B6A13F4806F00D01A240C4B9B6AA5 +:102C700013F4807F08D10A4B9B6A13F4005F04D0E1 +:102C80001C2402E01924EBE71B24054A936A43F451 +:102C90007F439362012106F031FF2870204638BD42 +:102CA00000ED00E0174B9B6A13F0007F25D11D203B +:102CB000144B9B6A13F0807F00D01F20114B9B6A3E +:102CC00013F4002F00D021200E4B9B6A13F4802FA9 +:102CD00000D022200B4B9B6A13F4003F00D023202E +:102CE000084B9B6A13F4803F09D1064A936A6FEA46 +:102CF00003436FEA1343936270471E20D8E72420F2 +:102D0000F3E700BF00ED00E081690D4B5A6942F422 +:102D100080725A61BFF34F8FBFF36F8F31F8021C7F +:102D20005A6922F480725A61BFF34F8FBFF36F8FDD +:102D30004DF60273994201D0002070470120704780 +:102D400000ED00E070B504461646324B9B6A13F066 +:102D5000100F1AD110252F4B9B6A13F0080F00D0CB +:102D600012252C4B9B6A13F0020F10D0294B586B85 +:102D70009B6A13F0800F3DD000293FD0254A936A0B +:102D800023F080039362132503E01125E3E76FF03E +:102D90001500204B9B6A13F0010F00D014251D4B2A +:102DA0009B6A13F0200F00D015251A4B9B6A13F075 +:102DB000100F04D1174B9B6A13F0020F04D0154B70 +:102DC0005B6813F4006F1BD1124B9B6A13F0200F4A +:102DD00004D0104A536A23F4005353620D4A936A95 +:102DE00043F0FF0393620121204606F087FE307016 +:102DF000284670BD6FF015001325CAE71325C8E7F4 +:102E0000214600F01DFA0028DED080F30988022553 +:102E1000DAE700BF00ED00E038B5054600230B708F +:102E20001A4BD86A10F002002DD10C46DB6A002B39 +:102E30002ADB164BD86A10F0804025D02846FFF7D1 +:102E400063FF08B128681FE0104B9B6A13F0FF0F67 +:102E50000DD10E4B986A10F47F400ED10B4B9B6A3C +:102E6000B3F5803F10D32846FFF71CFF0CE0224645 +:102E700001212846FFF766FF06E022460121284689 +:102E8000FFF7CAFE00E0002038BD00BF00ED00E003 +:102E900030B58BB00C46264B5968C1F308010023AE +:102EA00083F31188BFF36F8F02F07F43B3F17F4F3D +:102EB00015D102F00C03082B14D012F0080F0BD020 +:102EC00000250DF12702204606F01DFE86469DF8DE +:102ED000273053B10BB030BD04460125F1E7002582 +:102EE0002C46EEE700252C46EBE70DF1040C20689C +:102EF0006168A268E368ACE80F0020696169A269B3 +:102F0000E369ACE80F0045B1C3F308025AB96FEAB0 +:102F100053236FEA4323089305E0089B23F4FF73D0 +:102F200023F00103089301A9704606F0D2FDD1E712 +:102F300000ED00E0024A536943F01003536170470B +:102F400000ED00E0EFF30880EFF3098101B5724670 +:102F5000FFF79EFF01BD00BF00201349087000204D +:102F600080F31488BFF36F8F03F0DEF800200F4961 +:102F70000860BFF34F8F0E4880F3088800F030F8E8 +:102F8000202080F311880B484FF40461401880F32F +:102F90000988EFF314800221084380F31488BFF3FB +:102FA0006F8F00F00FF900002C1D002094ED00E061 +:102FB00080330020C0250020084BD3F89000C0F3D8 +:102FC0000720002306E0054AC2F898300021C2F825 +:102FD000A01001338342F6DB704700BF00ED00E034 +:102FE00010B572B6002484F31388FFF7E5FF23467B +:102FF00008E003F120010E4A4FF0FF3042F82100B3 +:103000000133DBB2072BF4D9002308E003F16001A0 +:10301000074A4FF0FF3042F821000133DBB2072BA3 +:10302000F4D962B6BFF34F8FBFF36F8F10BD00BFEF +:1030300000E100E008B50A4B9B68834202D008F02B +:10304000E2FD08BDEFF30583002BF8D0054B5A686D +:1030500042F080525A605A6A22F400425A62EEE705 +:10306000081B002000ED00E00A4A9368C3F8A8009E +:103070006FF00A01C3F8AC1007494B6843F0805366 +:103080004B60002383F31188BFF36F8F9368D3F8ED +:10309000AC007047081B002000ED00E010B50446AE +:1030A000EFF31183202383F31288BFF36F8F0C4B50 +:1030B000586998600B4B4FF000625A60D0F8A4201A +:1030C000094B1A60D0F8A8300022C0F8A82083F37A +:1030D0001188BFF36F8F00F039F9204610BD00BF93 +:1030E000081B002000ED00E09C0F00200B498A68BF +:1030F0004FF030001044EFF3098C80E8F01F744665 +:103100007046FFF7CBFFA64604498A6802F13000FB +:1031100090E8F01F8CF3098870470000081B00201E +:103120001EF0040F0CBFEFF30880EFF309808169F4 +:1031300011F8021C0229FFD001B506F0D3FC01BD35 +:10314000002807DB00F01F02400901239340024AD8 +:1031500042F82030704700BF00E100E000280CDB9F +:1031600000F01F024009012393402030034A42F837 +:103170002030BFF34F8FBFF36F8F704700E100E047 +:10318000002808DB4901C9B200F1604000F5614048 +:1031900080F80013704700F00F004901C9B2014BDD +:1031A0001954704714ED00E04209054B53F82220F2 +:1031B00000F01F00012303FA00F01040704700BF29 +:1031C00000E100E008B50B4B0B4A22F07F029A6049 +:1031D000BFF34F8FBFF36F8FD3F8882022F47002B4 +:1031E000C3F8882003F0D4FE04F038FF00F076F82E +:1031F00003F02CFF00ED00E00010000010B4A2F17D +:1032000020040E4942F8081C21F0010142F8081C74 +:1032100042F8203C019B42F81C3C029B42F8183CBF +:10322000039B42F8143C4FF0807342F8043C046561 +:103230000023C0F8A83010BC704700BF99140000EC +:10324000104B9B68BBB110F1160F0BD0D3F8942034 +:10325000A2F1400C844510D8824210D98A4207D886 +:1032600000207047D3F894208A4201D8002070478C +:10327000D3F894007047002070470020704700206A +:10328000704700BF081B002008B50D4614460C4AC5 +:103290009060D0F8A4200B4B1A6000F057F8A446B9 +:1032A000644685F309884FF00000074B9847204695 +:1032B0004FF000014FF000024FF00003034C204795 +:1032C000081B00209C0F0020799B0000991400002F +:1032D000014B10221A61704700ED00E0002206E069 +:1032E00003F00F030949194420230B7601322F2ADA +:1032F0000ADC53B2002BF3DB03F1604303F56143B7 +:10330000202183F80013F1E7704700BFFCEC00E0D8 +:1033100008B5EFF30583103B044A02EBC30149688B +:1033200052F833008847FFF763FC08BD5CC100001A +:1033300008B5034B034A0121034806F070FD08BDA0 +:103340000000042000000020E8C4000008B5D0F808 +:103350009430403B0448036040234360034B836048 +:10336000012106F060FD08BDA00F002000000B1534 +:10337000084AC2F898000B6823F01F03034343F088 +:103380001003C2F89C308B6843F00103C2F8A030F0 +:10339000704700BF00ED00E0084BD3F89030C3F356 +:1033A0000723013B984205D810B50446FFF7E0FF1C +:1033B000204610BD6FF01500704700BF00ED00E023 +:1033C00010B5034C0123227806F029FC207010BDB3 +:1033D000211D002008B500230B4A127806F01FFCBF +:1033E00010F1160F0FD0024606E0084BC3F89820E4 +:1033F0000021C3F8A0100132044BD3F89030C3F37E +:1034000007239342F1DC08BD211D002000ED00E000 +:10341000044B0522C3F89420BFF34F8FBFF36F8F87 +:10342000704700BF00ED00E0BFF35F8F024B00224A +:10343000C3F89420704700BF00ED00E038B51C4B86 +:103440001D681C4BD3F89030C3F307239D422BD843 +:10345000FFF7EAFF002409E0154B5B6804EB440129 +:1034600003EB81012046FFF783FF0134A542F3D827 +:103470001148057006F0FBFB10F1160F13D00E4B30 +:103480001A780C4BD3F89030C3F307239A4207DA2B +:10349000084BC3F898200021C3F8A0100132F0E7D0 +:1034A000FFF7B6FF002038BD4FF0FF30FBE700BF4D +:1034B000F4C4000000ED00E0211D002008B5024B1F +:1034C0001B689847002008BDAC0F0020034B186014 +:1034D000034A937843F0020393707047AC0F0020C7 +:1034E0002C01002008B5064921F00701C1F1005266 +:1034F00002F58022034805F0ADFD002008BD00BFA5 +:1035000087420020B00F00200123044AC2F8403552 +:103510004FF08042C2F878350020704700E001404B +:1035200030B108B5034B800143F00103984708BD53 +:10353000704700BF70C3000010B5044606F09DFC44 +:10354000C0B104F00F0314F0800F0AD114F0080F7B +:1035500014D103F1090040014830094B18440430EC +:1035600010BD14F0080F07D158014830044B18441F +:103570000430F5E70020F3E70248F1E70248EFE7FF +:10358000BC0F0020081100202812002010B50024D4 +:1035900005E0E0B206F08CFC06F094FC0134072C48 +:1035A000F7D9002402E006F08DFC0134072C0AD87C +:1035B000E0B206F083FC0369002BF4D10A4B03EB65 +:1035C00084130361EFE7882006F072FC06F07AFCB2 +:1035D000082006F073FC03691BB106F073FC0020A1 +:1035E00010BD024B0361F8E74C1600204C1200207E +:1035F00008B500220023024803F072FE08BD00BF98 +:10360000FC02002010B504E04168054807F099FF6E +:103610002CB1FFF7EDFF04460028F5D1F8E710BD07 +:103620006C02002000B583B00022002301A91048DD +:1036300003F066FD20B90198406003B05DF804FB1B +:10364000FFF7E0FF0022002301A9094803F058FD1D +:1036500008B10020F1E70199496004230B74054883 +:1036600008F04DF80449054808F002F9F1E700BFF9 +:103670006C020020FC020020E40F0020A8040020BF +:1036800010B50446FFF7CEFF50B101460023037486 +:103690000472064808F033F8054B93F8243003B958 +:1036A00010BD0449044808F0E3F8F9E7FC020020E3 +:1036B000BC0F0020E40F0020A804002010B5082053 +:1036C000FFF73AFF10B10446037A03B910BD012396 +:1036D00043770377FFF7A6FF01460028F6D00123C2 +:1036E000037403738460044808F009F8034904482C +:1036F00008F0BEF8EAE700BFFC020020E40F00205B +:10370000A804002070B5044685782846FFF714FF0A +:10371000064615F0800F14D1E3784BB3012B12D17C +:10372000FFF780FF014670B10123737703740373C1 +:1037300086601B4807F0E3FF1A491B4808F098F819 +:1037400001E0E37803B170BDFFF76CFF014600288C +:10375000F9D00023B3770123037403230373866036 +:103760000F4807F0CCFF0F490F4808F081F8EAE74F +:10377000FFF758FF05460028E5D0A1780B4806F072 +:103780005BFBF06001232B7402232B73AE60294690 +:10379000034807F0B4FF0349034808F069F8D2E78B +:1037A000FC020020E40F0020A8040020007002406A +:1037B00010B5844644694FF0000EC4F800E0C4F828 +:1037C00004E01F4BD3F880242270D3F88424627065 +:1037D000D3F8881489B2D3F88C24120292B20A4327 +:1037E0006280D3F8901489B2D3F89424120292B272 +:1037F0000A43A280D3F8982492B2D3F89C341B02D7 +:103800009BB21343E3800823C3600E4B20686168BA +:1038100003C3DCF8003071469CF80900984794F91E +:103820000030002B01DBE38823B9074B0022A3F80B +:103830008C2210BD044AA2F88C3201F09BF9F8E703 +:1038400000700240C00F0020BC0F002038B5046893 +:103850000379032B06D8DFE803F002060B1020469D +:10386000FFF7A6FF38BD21460F4806F0A4FBF9E795 +:1038700023680121607A9847F4E7A37A0BB9E37FC4 +:1038800023B123680221607A9847EBE7074D4FF098 +:10389000FF324FF0FF33284603F064FC01F048FA92 +:1038A000284603F0DFFCECE7BC0F0020F40F0020FB +:1038B00010B50378042B1CD8DFE803F01C030C2C94 +:1038C0003B0000F023FFA0B900F0AEFE1F4806F059 +:1038D00095FB0EE01D4C204606F03BFB002000F05F +:1038E000FBFE012384F82530236813B10021022058 +:1038F000984710BD154C002384F8253001F042FB99 +:10390000204606F00CFB2368002BF2D00021042097 +:103910009847EEE70D4B93F82530002BE9D000F0E7 +:10392000FFFE0A4B1B68002BE3D0002105209847BF +:10393000DFE7064B1B68002BDBD0044A92F82520FA +:10394000002AD6D0002106209847D2E7BC0F0020DD +:1039500008B507F083FD01F015FB00F05BFEFFF7F3 +:1039600051FEFFF713FE07F072FD024800F016FF4C +:1039700008BD00BFFD3A000070B505460CE0616867 +:10398000284807F0DEFD07E004F10800FFF75EFFBE +:103990006168244807F0D5FDFFF72AFE0446002899 +:1039A0003ED0214B93F8253013B9237C002BE6D170 +:1039B000237C042BECD801A252F823F0D13900006B +:1039C00089390000DB390000073A00001B3A00008B +:1039D00004F10800FFF76CFFDAE705F110064FF07D +:1039E000FF324FF0FF33304603F0BCFBFFF7CEFD54 +:1039F000304603F037FC55F8283C002BC8D0002196 +:103A000001209847C4E7FFF759FE55F8283C002BE2 +:103A1000BED000210A209847BAE7FFF799FFB7E721 +:103A200070BD00BF6C020020BC0F002070B50446C2 +:103A300085782846FFF780FD064615F0800F14D1E3 +:103A4000E3784BB3012B12D1FFF7ECFD014670B1C7 +:103A500001237377037403738660244807F04FFED5 +:103A60002349244807F004FF01E0E37803B170BD67 +:103A7000FFF7D8FD01460028F9D00023B3770123D2 +:103A80000374032303738660184807F038FE18494F +:103A9000184807F0EDFEEAE7FFF7C4FD05460028E9 +:103AA000E5D00123037402230373866006F10C0141 +:103AB000A07800F03DFF104BB3F88C32F2689342CF +:103AC0000CD80D4B0022A3F88C222946074807F09A +:103AD00016FE0749074807F0CBFEC8E79B1A064ABF +:103AE000A2F88C3201F046F8EFE700BFFC0200209C +:103AF000E40F0020A8040020BC0F002010B588B0FF +:103B00000023039304930593069307930378013BE3 +:103B1000052B1CD8DFE803F025031D2143290323CF +:103B20008DF81430FFF77EFD034680B19DF81C2010 +:103B3000027400F1080205A903C982E803001946CE +:103B4000214807F0DCFD2149214807F091FE08B02B +:103B500010BD04238DF81430E4E704238DF81430ED +:103B6000E0E702238DF81C30DCE704468078FFF79D +:103B7000E3FC837A012B0ED005D8002BE7D1204639 +:103B8000FFF754FFE3E7023BDBB2012BDFD820460F +:103B9000FFF7B8FDDBE72046FFF7B4FDD7E701A844 +:103BA00000F0C2FF9DF80530052B07D00020FFF77D +:103BB000C3FC01238DF81C300590B3E79DF8043059 +:103BC00013F0600FC3D0F1E7FC020020E40F0020E7 +:103BD000A804002030B583B0124800F0DFFD124B7E +:103BE00098421BD1114803F03FF8114803F06CF8DC +:103BF000104D002400944FF0FF334FF480620E49C3 +:103C0000284603F0F9FC0D49284603F039FD0C491C +:103C10000C4807F012FE204603B030BD6FF00400E0 +:103C2000FAE700BFFD3A00000000AD0B38C5000008 +:103C300034C50000A80400208021002028C5000011 +:103C400079390000E40F002010B5184B93F82430A8 +:103C500013B10024204610BD154C204607F0BCFCD3 +:103C6000002001F0A5FB44F81C0C002201212720B4 +:103C700005F076FF07F0EBFBFFF788FC044618B968 +:103C80000A4B012283F824200A4B1B681BB10A4906 +:103C90000A4807F0EDFD4FF08043D3F8383413F0B5 +:103CA000010FD7D0002006F021F9D3E7BC0F002088 +:103CB000F40F0020FC020020E40F0020A8040020E4 +:103CC000074B93F824302BB1054B93F8253023B1E3 +:103CD000002070476FF0120070476FF012007047BD +:103CE000BC0F002038B5124B93F82430BBB104460A +:103CF00005782846FFF720FCA0B145722279827230 +:103D000062884260207810F0080F03D163885A1E41 +:103D100013420AD1618800F02FFD002038BD6FF0FA +:103D20001200FBE76FF01500F8E76FF01500F5E7FC +:103D3000BC0F002038B5164B93F82430E3B104468D +:103D4000134B93F82530D3B1FFF7F6FB0546C8B106 +:103D5000837A012B19D007D80BB900F0EFFF0020B0 +:103D6000E8606B69AB6138BD023BDBB2012BF6D872 +:103D7000204600F0A5FEF2E76FF01200F3E76FF0C7 +:103D80001200F0E76FF01500EDE76FF01500EAE7BD +:103D9000BC0F0020114B93F824309BB110B50446A2 +:103DA0000E4B93F8253083B1FFF7C6FB80B114F0BA +:103DB000080F10D1204600F0ADFE204601F08CF92E +:103DC000002010BD6FF0120070476FF01200F8E78E +:103DD0006FF01500F5E76FF01500F2E7BC0F00205B +:103DE00038B5104B93F824307BB104460D460D4B8B +:103DF00093F8253063B1FFF79FFB60B175B12046A2 +:103E000000F066FE2870002038BD6FF01200FBE75E +:103E10006FF01200F8E76FF01500F5E76FF015008E +:103E2000F2E700BFBC0F002038B5154B93F82430E3 +:103E3000EBB10446FFF780FB0546D8B114F0080F3C +:103E400009D02B7ACBB901232B720D4B93F8253077 +:103E500043B9002038BD204600F05CFE204601F04A +:103E60003BF9EEE7204601F0F7F80020F2E76FF0AB +:103E70001200EFE76FF01500ECE76FF07700E9E76D +:103E8000BC0F00202DE9F04184B01F463C4B93F855 +:103E90002430002B65D0044688461646384B93F8EC +:103EA0002530002B60D010F0800F60D0FFF744FB6E +:103EB000054600285ED0037A002B5ED04FF0FF321B +:103EC0004FF0FF332F4803F04DF9AB7F9BBB1EB97A +:103ED000EB7F0BB10023EB77AB7A63B95EB1284A75 +:103EE0005289B24207D96968B6FBF1F201FB12624E +:103EF0000AB90122EA771BB900F026FFA04220D1BF +:103F00000123AB77CDF8048002960023039301A927 +:103F1000204600F0B3FC1C4B984219D00023AB772D +:103F2000D7B13B606FF00404164803F09BF92046BC +:103F300004B0BDE8F081134803F094F96FF00A046F +:103F4000F5E700F0F5FE0F4803F08CF90024EEE7EA +:103F50002FB13E600024E7E76FF00404E4E700249B +:103F6000E2E76FF01204E2E76FF01204DFE76FF0B0 +:103F70001504DCE76FF01504D9E76FF01504D6E7F8 +:103F8000BC0F0020F40F00200000AD0B2DE9F04124 +:103F90001F462B4B93F82430002B42D00D4616467B +:103FA000274B93F82530002B3ED010F0800F3ED1E8 +:103FB00049B3FFF7C1FA044600283BD0037A002B2F +:103FC0003BD04FF0FF324FF0FF331E4803F0CAF8EA +:103FD000E368B0469E4228BF9846CDB14246A169EB +:103FE000284608F029F8A3694344A361E368A3EBDA +:103FF0000803E3600FB1C7F80080124803F032F9FC +:104000000020BDE8F081002AD3D06FF01500F8E75A +:10401000002EE3D107B13B600A4803F023F90020EA +:10402000EFE76FF01200ECE76FF01200E9E76FF0D6 +:104030001500E6E76FF01500E3E76FF01500E0E725 +:10404000BC0F0020F40F0020274B93F82430002BE6 +:104050003AD0254B93F82530002B38D010F0800F44 +:1040600038D110B5FFF768FA0446002835D0037A36 +:10407000002B35D04FF0FF324FF0FF331B4803F0D9 +:1040800071F8E3682BB96369A36101232377637F28 +:1040900023B9164803F0E6F8002010BDFFF7C2FA76 +:1040A000014658B10123037484600373104807F07C +:1040B00026FB1049104807F0DBFBEAE70B4803F04A +:1040C000D1F86FF00B00E8E76FF0120070476FF067 +:1040D000120070476FF0150070476FF01500DCE7B5 +:1040E0006FF01500D9E700BFBC0F0020F40F0020CF +:1040F000FC020020E40F0020A8040020084B93F8E5 +:1041000024303BB110B50C46FFF716FA28B1046015 +:10411000002010BD6FF0120070476FF01500F8E737 +:10412000BC0F0020014B1860704700BFBC0F00207F +:1041300008B5074B93F8243023B1FFF7FDF920B100 +:10414000406808BD6FF01200FBE76FF01500F8E75C +:10415000BC0F002042B200F00F0310F0080F09D18D +:10416000002A03DB064800EB83007047054800EB9C +:1041700083007047002A01DB0348704703487047FB +:104180003071024008710240507102402C710240AF +:1041900042B200F00F0310F0080F15D1002A09DB1E +:1041A00003EB83039B0003F1804303F51C33D3F837 +:1041B0000807704703EB83039B0003F1804303F57B +:1041C0001C33D3F808067047002A03DB034BD3F8EF +:1041D000A8077047014BD3F8A8067047007002404B +:1041E0004FFA80FC10F0080F22D100F00F03BCF151 +:1041F000000F0FDB10B4184C03EB830004EB8000BE +:10420000C0F80017C0F804270A33012244F823201D +:1042100010BC7047104803EB830C00EB8C0CCCF8FF +:104220000016CCF8042600EB83000123436070479E +:10423000BCF1000F07DB084BC3F8A017C3F8A42795 +:1042400001229A647047044BC3F8A016C3F8A42651 +:1042500001225A62704700BF0070024008B505F0A5 +:104260005EFF18B1024B8222C3F81C2C08BD00BFB0 +:104270000070024008B505F052FF18B1024B002251 +:10428000C3F81C2C08BD00BF0070024000B583B00D +:104290000023074A1370074A1370019301238DF816 +:1042A0000430054B1B6801A8984703B05DF804FB78 +:1042B000251D0020241D0020441A002000B583B0D5 +:1042C00000238DF804300C4BD3F82025ADF80620E0 +:1042D000D3F8C03463B94FF48071084A13680B43B4 +:1042E0001360074B1B6801A8984703B05DF804FBF7 +:1042F0004FF00121F1E700BF00700240401A00209A +:10430000441A002000B583B0012303FA01F1154AD5 +:1043100013680B43136010F0800F12D1124B1B680F +:1043200019420BD106238DF804308DF806000123C5 +:104330008DF807300D4B1B6801A8984703B05DF856 +:1043400004FB094B1B681942F8D106238DF8043091 +:104350008DF8060000238DF80730044B1B6801A878 +:104360009847EBE7401A00203C1A0020441A00202E +:1043700000B583B0114BD3F8803413F0800F1BD1FC +:1043800000220F4B1A700F4A136823F001131360B9 +:104390000D4A136823F48033136043F00103136064 +:1043A0000023019305238DF80430084B1B6801A8F6 +:1043B000984703B05DF804FB8022E2E700700240FA +:1043C000241D00203C1A0020401A0020441A00201E +:1043D00010B582B01C4BD3F80044C3F8004414F469 +:1043E000807F0BD0194B01221A7000230193022306 +:1043F0008DF80430164B1B6801A8984714F4007F11 +:104400000AD00023114A1370019303238DF804305E +:104410000F4B1B6801A8984714F4806F12D00B4B08 +:104420001B787BB10023094A1370074A0121C2F8A7 +:1044300008159165019304238DF80430044B1B6823 +:1044400001A8984702B010BD00700240251D002051 +:10445000441A0020EFF31183202282F31288BFF365 +:104460006F8F0C4AD2F8002C72B90A4A49F27531A2 +:10447000C2F8001CC020C2F8140CC2F8001C83F360 +:104480001188BFF36F8F7047024AC021C2F8141C15 +:10449000F5E700BF00E00640EFF31183202282F32E +:1044A0001288BFF36F8F0C4AD2F8002C72B90A4AF7 +:1044B00049F27531C2F8001C0020C2F8140CC2F891 +:1044C000001C83F31188BFF36F8F7047024A0021ED +:1044D000C2F8141CF5E700BF00E00640EFF31183BB +:1044E000202282F31288BFF36F8F0C4AD2F8002C7F +:1044F00072B90A4A49F27531C2F8001C0320C2F8A9 +:10450000140DC2F8001C83F31188BFF36F8F70473E +:10451000024A0321C2F8141DF5E700BF00E006407F +:10452000EFF31183202282F31288BFF36F8F0C4ABE +:10453000D2F8002C72B90A4A49F27531C2F8001C4F +:104540000020C2F8140DC2F8001C83F31188BFF3D9 +:104550006F8F7047024A0021C2F8141DF5E700BFB3 +:1045600000E0064008B505F0C7FDC0B905F0BAFD8A +:10457000C0B9114B0122C3F800250F4BD3F800340A +:1045800013F4006FF9D00C4B4FF40062C3F8002411 +:1045900005F0A8FD48B905F0AFFD48B908BDFFF723 +:1045A0009DFFE3E7FFF756FFE3E7FFF775FFF2E74D +:1045B000FFF7B6FFF2E700BF00700240F8B506460D +:1045C0000C4615464B68934200D81D46216801F001 +:1045D0006043B3F1005F10D1236833607560606899 +:1045E000401B606023682B442360A36813F0010F15 +:1045F0000AD0281E18BF0120F8BD054F2A463846AC +:1046000007F01AFD3760E9E7003818BF0120F3E72B +:104610004C1800200023024A1360024A13707047AE +:10462000441A0020261D002010B5244B4FF40062D0 +:10463000C3F80024FFF796FF05F07BFD10B1204B77 +:104640001B7863BB05F058FD90BB05F041FD58B1E8 +:104650001A4B40F2E372C3F800284022C3F8042842 +:10466000BFF36F8FBFF34F8F144B8022C3F81C250D +:104670000122C3F83025134B40F2FF121A600024C8 +:10468000114B1C60114B1C70FFF7F4FD104B1C709C +:10469000104B02221A7005F02FFD60B910BD0024E6 +:1046A000064BC3F80045FFF75DFF054B1C70C9E7DB +:1046B000FFF714FFC9E7FFF733FFEFE70070024091 +:1046C00060020020401A00203C1A0020221D002019 +:1046D000241D0020261D002010B5084B00221A7052 +:1046E00050B9074B074CC4F80033272005F02EFAC9 +:1046F0000123C4F8043510BD034BF3E7251D00204A +:10470000FDFFDF0100700240FDFFFF01034B187841 +:10471000012894BF00200120704700BF261D002003 +:10472000EFF31182202383F31288BFF36F8F104BB6 +:104730001B7803F0FF00B3B10E4BD3F8003413F431 +:10474000007F0FD10B4B0121C3F82C15D3F82C158A +:10475000D3F8003413F4007F05D00020054BC3F8D4 +:104760002C0500E0002082F31188BFF36F8F7047A3 +:10477000251D00200070024010F0800F08D1054B6D +:1047800000F00F0000EB400003EBC003998270477C +:10479000014BF5E78C1800206419002070B5264BFA +:1047A0001C78002C46D1254B1860234B01221A702F +:1047B000254613E040213046FFF7DEFF16F0800F5C +:1047C00016D11F4B05F00F0202EB420203EBC203AE +:1047D00000229A751A731A610135EDB2082D1DD8A1 +:1047E00045F0800615F0080FE4D040F2FF11E2E733 +:1047F000144BE7E740212046FFF7BEFF14F0800F7F +:1048000014D10F4B04F00F0202EB420203EBC20380 +:1048100000229A751A731A610134E4B2082C07D881 +:1048200014F0080FE6D040F2FF11E4E7054BE9E78A +:10483000054870BD0548FCE7261D0020441A0020ED +:104840008C180020641900200000AD0B0500AD0B92 +:1048500000F00F0110F0800F09D1074BD3F8142599 +:1048600001238B40134214BF012000207047024BEC +:10487000D3F81025F4E700BF0070024070B546B2CF +:10488000002E11DB102300F00F02D418EFF3118E6D +:10489000202383F31288BFF36F8F3AB91B4B1B7829 +:1048A000834203D01A482BE00023ECE7194B1B6826 +:1048B000DB439BB2184805682B434FF0010C0CFA00 +:1048C00004FC13EA0C0F1AD1002E16DB134B02EB7B +:1048D000420203EBC20301221A7307C983E80700EF +:1048E00000221A619A7545EA0C050B4A15600C4BBB +:1048F0008022C3F804210B4802E00B4BE7E70B488A +:104900008EF31188BFF36F8F70BD00BF241D002090 +:104910000A00AD0B401A00203C1A00208C18002021 +:1049200000E100E00000AD0B641900200B00AD0BAE +:1049300010F0800F17D10E4B00F00F0000EB40007D +:1049400003EBC003EFF31182202080F31288BFF342 +:104950006F8F18690860197B39B9987D82F31188C7 +:10496000BFF36F8F7047034BE6E70420F6E700BF05 +:104970008C1800206419002010F0080F07D100F0F7 +:104980000F0000F59470064B53F820007047044B5D +:10499000D3F8C00410F4803FF8D00020704700BF67 +:1049A000007002403F4B1A683F4B1B681A4200D10F +:1049B0007047F0B585B0002200233C4802F0F0FCBF +:1049C000002854D005B0F0BD05F0E9FB06465BE0D9 +:1049D000374C03E066F07F05EDB2354C05F00F0370 +:1049E00003EB430304EBC30415F0800F25D12846E5 +:1049F000FFF7C2FF07460346A28A214602A805F038 +:104A00009AFB029B13B1039BBB421CD308B9002342 +:104A10002373FFF723FC0122B24023490B6823EAEA +:104A200002030B602369039A13442361214B1D7019 +:104A300002992846FFF7D4FBC4E7A28A214602A8C0 +:104A4000FFF7BCFDE2E70221A1750122B240154843 +:104A5000036823EA0203036006238DF804308DF80F +:104A600006508DF80710144B1B6801A898470D4B92 +:104A700018680D4B1B68184010D010F00123A3D00C +:104A8000184605F08CFB06460F2EA3D9A6F110039D +:104A9000DDB213F0800F9BD1084C9FE7034802F072 +:104AA00059FC8FE73C1A0020401A0020EC0200203D +:104AB00064190020231D0020441A00208C180020B7 +:104AC00040F48070014BC3F8180570470070024035 +:104AD00042B200F00F0310F0080F16D1002A0BDBD2 +:104AE00003F588739B0003F1804303F51C3358687A +:104AF000003818BF0120704703F58473044A52F848 +:104B00002300003818BF012070470020704700BF05 +:104B100000700240034BC3F80C0540F48070C3F8EA +:104B20000C05704700700240002303604360104B87 +:104B3000D3F880240270D3F884244270D3F8881408 +:104B4000D3F88C24120292B20A434280D3F8901414 +:104B5000D3F89424120292B20A438280D3F89824A4 +:104B6000D3F89C341B029BB21343C380704700BF31 +:104B700000700240014B0122DA647047007002406D +:104B800010B582B00446FFF703FB00F00100254A90 +:104B9000137843401370FFF76DFB234802F0DAFBF4 +:104BA00061B2002925DB214A04F00F0303EB430027 +:104BB00002EBC002907D03281DD0127B6ABB002946 +:104BC00000DB1022134401229A401948036823EAAB +:104BD0000203036000291DDB06238DF804308DF8E5 +:104BE000064000238DF80730124B1B6801A8984738 +:104BF0000CE0114AD8E700290ADB102213440122F5 +:104C00009A400B490B6823EA02030B6002B010BD07 +:104C10000022F3E7882CF9D1DEE7002CF6D1FFF76C +:104C2000A9FFF3E7221D0020EC0200208C180020D1 +:104C30003C1A0020441A00206419002038B5384B73 +:104C4000D3F8604134B10022C3F86021D3F86C443A +:104C5000C3F86C44324BD3F828318BB1304B00226F +:104C6000C3F828212F4A137892F90020002A2DDB5F +:104C7000102203F00F031344012202FA03F31C4332 +:104C8000294B1D782846FFF765FA036803BB2046C9 +:104C900005F06CFA224BD3F80031FBB9204BD3F866 +:104CA000543143B11E4B0022C3F85421D3F80433CE +:104CB00013F4001F19D11A4BD3F85831C3B9184B4C +:104CC000D3F85C31DBB9FFF76DFE38BD0022D0E7C9 +:104CD000002303602846FFF753FFD8E7104B00225C +:104CE000C3F80021FFF7D2FAD8E7FFF7E7FAE2E7C7 +:104CF0000B4B0022C3F85821FFF76AFBDFE70B4B91 +:104D00009B682BB9084B1B78802BDCD0002BDAD0AA +:104D1000034B0022C3F85C21FFF72AFBD3E700BF57 +:104D200000700240241D0020231D0020EC02002002 +:104D3000014B01221A65704700700240014B0122AD +:104D40005A65704700700240014B1878704700BFE9 +:104D5000241D002010B4EFF3118C202383F312885C +:104D6000BFF36F8F10F0800F19D1102300F00F01E7 +:104D70000B4401229A400B4C236823EA0203236070 +:104D800010F0080F05D101F59471074B002243F88C +:104D900021208CF31188BFF36F8F10BC7047002364 +:104DA000E4E700BF401A00200070024070B582B0F6 +:104DB000EFF31185202383F31288BFF36F8F42B284 +:104DC000002A24DB3A4C00F00F0303EB430104EB11 +:104DD000C104002A20DB374A126803F110010123C5 +:104DE0008B4033EA020114D10021217322EA03022D +:104DF00030490A6030490A6822EA03020A60032344 +:104E0000A37585F31188BFF36F8F02B070BD2B4C73 +:104E1000D9E7FFF79FFFF2E710F0080F13D18028C2 +:104E200034D003F2DA3252002549C1F80028D1F813 +:104E30000428D2B242F00202D1F804683243C1F829 +:104E40000428D1F804281C4A11681A4A166866EA30 +:104E5000010C012202FA03F31CEA030FD1D026EA67 +:104E60000306144A16601943134B19600023237379 +:104E70000323A37506228DF804208DF806008DF813 +:104E80000730104B1B6801A89847BAE70C4940F25D +:104E9000B472C1F80028D1F80428D2B242F004025A +:104EA000D1F804683243C1F80428D1F80428CAE7CD +:104EB0008C1800203C1A0020401A002064190020A1 +:104EC00000700240441A002038B50446094D4FF0E6 +:104ED000FF324FF0FF33284602F062FA2046FFF718 +:104EE00065FF284602F036FA034B8022C3F80421FE +:104EF00038BD00BFEC02002000E100E038B5124BE5 +:104F00005B88124A146844EA034409E045F08000D3 +:104F100010F0080F0FD0EDB20123AB4024EA0304D8 +:104F200064B194FAA4F5B5FA85F50F2DEED9A5F183 +:104F30001000C0B2ECE7FFF739FFECE7024B40F29C +:104F4000FF121A6038BD00BF401A00203C1A002032 +:104F500038B50A4B8022C3F884212720FEF724F9B4 +:104F600000B938BDFFF7CAFF054C0025C4F8045549 +:104F7000272004F0F0FDC4F80053F2E700E100E060 +:104F80000070024008B54FF0FF324FF0FF33154874 +:104F900002F006FAFFF7DCFF134B1B7863B9134BE3 +:104FA0000022C3F80025FFF765F90E4802F0D2F998 +:104FB0000F4B01221A7008BD0C4B0022C3F80821C8 +:104FC000012209498020FFF70BF9084BD3F808317B +:104FD000002BFAD00023054AC2F80831024A1370A8 +:104FE000DDE700BFEC020020221D0020007002401F +:104FF000261D002070B5044646B200F00F054FF0A4 +:10500000FF324FF0FF33114802F0CAF92046FFF794 +:10501000CDFE002E10DB0E49D1F814350122AA4036 +:1050200023EA0203C1F81435084802F093F9094B4A +:105030008022C3F8042170BD0549D1F81035012242 +:10504000AA4023EA0203C1F81035EDE7EC02002084 +:105050000070024000E100E0F8B5044646B200F0FE +:105060000F05FFF7F5FB68B9002E0CDB1849D1F8E6 +:1050700014350122AA401343C1F81435631EDBB274 +:10508000062B09D9F8BD1249D1F810350122AA40E2 +:105090001343C1F81035F1E7EFF31187202383F3B1 +:1050A0001288BFF36F8F2046FFF754FE002E0DDBF2 +:1050B00010231D440122AA4006490B6823EA02037B +:1050C0000B6087F31188BFF36F8FDBE70023F0E7F6 +:1050D000007002403C1A002010B5044610F0800F0A +:1050E00003D0064BC3F8184510BDFFF7F1FC0028AC +:1050F000F7D02046FFF72EFEF3E700BF0070024016 +:10510000004870479C1A0020034BC01A8010034BC4 +:1051100003FB00F0704700BF5C1A0020B76DDBB6E0 +:1051200038B505460C46FFF7EFFF0146402203481D +:1051300005F0C8F801462846A04738BDF8C0000071 +:1051400030B583B005460C46FFF7DEFF014640232D +:1051500000932346054A064805F0CEF8011E01DB00 +:1051600003B030BD2846A047FAE700BF41A30000C6 +:10517000F8C0000008B510B101280DD008BD00210D +:10518000084805F02DF8836813F0070FF6D10021C9 +:10519000044805F085F8F1E70121024805F080F8A0 +:1051A000ECE700BFF8C0000010B582B0EFF3118447 +:1051B000202383F31288BFF36F8F154A136843F0DF +:1051C0000201116013F0010F09D1002384F311884B +:1051D000BFF36F8FB3B905F0BBF802B010BD0DF18E +:1051E000070201214FF0804004F0DEFF9DF80730F8 +:1051F000012B01D00023E9E7FFF782FF05F03EF81D +:105200000123E3E70021034805F04AF8E5E700BF82 +:10521000AC1A0020F8C0000010B5EFF31184202371 +:1052200083F31288BFF36F8F074A136823F00201DC +:10523000116013F0010F04D084F31188BFF36F8F56 +:1052400010BD05F08FF8F7E7AC1A002070B582B0FA +:105250000546012807D14FF08043D3F81C3403F0F2 +:105260000303012B4BD006F032FB044618B9284B40 +:105270001B78002B38D1EFF31186202383F312889B +:10528000BFF36F8F012424B94FF080430222C3F88B +:10529000082301AA00214FF0804004F085FF20B1CF +:1052A000019B012B26D0012D24D0FCB1304604F007 +:1052B00077FC4FF08043D3F81835002BE9D14FF03D +:1052C0008043D3F80431002BE3D04FF08043002219 +:1052D000C3F80421D3F804210122C3F818250D498D +:1052E000C1F880219A60D4E70026CCE7012005F0C0 +:1052F00043F8DEE72CB186F31188BFF36F8F02B05D +:1053000070BD4FF080430222C3F80423F7E700BFCB +:105310002C1D002000E100E000B585B0CDF800D0E4 +:10532000CDF804D000230293012303936B46074A70 +:1053300004F0FEFF002805DB4FF48042002368469E +:1053400002F02EF805B05DF804FB00BFA5A3000035 +:1053500070B5064600220121104604F001FC1148F8 +:1053600001F054F8104B984219D101F063F8002471 +:10537000012C12D82146304604F032FF0546214662 +:10538000304604F038FF094903F0BAFF002805DB76 +:105390000123AB601C44E4B2EAE7002070BD6FF06B +:1053A0000400FBE7755100000000AD0B3CC5000098 +:1053B00008B5C1B2014804F01EFF08BDF8C00000E6 +:1053C00010B50446104B0121BFF35B8F53E8002F4B +:1053D00043E800100028F9D1BFF35B8F1AB1631EB8 +:1053E000012B0DD910BD094804F005FF0849002321 +:1053F0004B608B60CB6001238B6003F09EFFEEE778 +:105400002046FFF723FFEDE7581A0020F8C0000000 +:10541000481A002010B504460A2806D0E1B2064812 +:1054200083685B689847204610BD034883685B68C3 +:105430000D219847F2E700BF34C1000010B5044CBD +:105440002046FEF743F82046FCF720F810BD00BFC9 +:105450001554000008B5054806F013F818B1FFF719 +:10546000EDFF002008BD6FF01200FBE734C1000023 +:10547000F0B51C46059F069E00F01F0C400936D073 +:10548000012837D1284D0CF5E07355F8233099B336 +:1054900001209AB34FF0020E40EA0E008CB34FF099 +:1054A0000C0E40EA0E007FB34FF4E06E40EA0E00AF +:1054B0006EB34FF4403E40EA0E0023EA000049B3C9 +:1054C0000B784AB31278520013433CB3227892000F +:1054D00013432FB33A78120213431EB332781204E7 +:1054E000134303430CF5E07C45F82C30F0BD4FF03E +:1054F000A045C8E70025C6E70020CAE74FF0000E28 +:10550000CAE74FF0000ECCE74FF0000ECEE74FF0A9 +:10551000000ED0E70023D4E70022D5E70022D7E72A +:105520000022D9E70022DBE70003005000F01F0350 +:10553000400909D001280AD1064A03F5E07352F860 +:10554000230000F0010070474FF0A042F5E7002271 +:10555000F3E700BF0003005028B1012801D1034840 +:105560007047002070470248704700BF0CC1000020 +:1055700020C100002DE9F04786B0884615469946BF +:10558000446801F01F07237B47EA4317204604F0D5 +:1055900070FF002853D0B5F5001F2AD00DF10C0A7A +:1055A0000026039604964946284604F09FFF8DF88E +:1055B0000C00009601960296CDF804A0A36823FA89 +:1055C00008F313F0010F02D1B5F1A07F18D0103409 +:1055D0006A463946204605F0E3FE1C4B984231D11D +:1055E00001223946204605F0FFFE002006B0BDE846 +:1055F000F087394604F1100005F0FAFE0020F5E7C7 +:105600003846FFF793FF0028E1D104F110050DF1B2 +:1056100017023946284605F0CFFE0D4B984203D0BD +:105620000DF117030493D2E70DF11701284605F099 +:10563000D7FE064B9842F3D06FF00B00D6E76FF021 +:105640008500D3E76FF01500D0E700BF0000AD0B79 +:105650000400AD0BF0B589B00F461446456801F063 +:105660001F062B7B46EA4316104604F007FF8DF811 +:105670001E0040F206332340B3F5837F54D016D882 +:10568000062B4DD006D9B3F5807F0DD101238DF8BF +:105690001D3024E003B3022B03D104238DF81D3009 +:1056A0001DE06FF0150039E06FF0150036E040F2B4 +:1056B000022293423CD0B3F5407F03D103238DF8FF +:1056C0001D300CE0B3F5007F03D102238DF81D30AF +:1056D00005E06FF0150021E000238DF81D3014F473 +:1056E000002F29D06A680123BB40C2F8083528463C +:1056F00004F0BFFE48B310350DF11F0231462846B5 +:1057000005F05AFE074614F4403F37D1314628468B +:1057100005F05EFE3C4B9F426ED0002009B0F0BD0C +:1057200006238DF81D30DAE707238DF81D30D6E704 +:1057300005238DF81D30D2E714F4802FD7D06A6886 +:105740000123BB40C2F80C35D1E7C4F340438DF8C8 +:10575000083014F4803F0CBF012300238DF8103073 +:10576000002401940DF11D0300930DF11E0304AA02 +:1057700002A93046FFF77CFE2046CFE702AA0023AD +:1057800002930393049305930693059204AA31466A +:10579000284605F005FE1C4B98421DD114F4003F2D +:1057A0001DD09DF81D308DF8103014F4803F0CBFD3 +:1057B000012300238DF811309DF81E308DF8123032 +:1057C000002304AA3146284605F0EEFD0E4B984210 +:1057D000A0D06FF01500A1E76FF015009EE7002341 +:1057E0000493059306930DF11E03049304AA314616 +:1057F000284605F0D5FDE9E79DF81F10284605F07D +:10580000EBFD00208AE700BF0000AD0B10B5446837 +:10581000204604F02EFE08B9002010BD10342046AA +:1058200005F0D2FD08B10020F7E70021204605F081 +:10583000C7FD094B98420BD100220849204605F0CC +:10584000B7FD00220521062004F08AF90020E4E7D4 +:105850006FF00400E1E700BF0000AD0B25A50000DC +:1058600070B400F01F0C400919D001281AD10E4D58 +:105870000CF5E07055F820600C4C344041EA4201D0 +:1058800041EA83039DF80C2043EA02239DF810208F +:1058900043EA0243234345F8203070BC70474FF081 +:1058A000A045E5E70025E3E700030050F0F8FCFF22 +:1058B00000F01F01400907D0012808D1054A012343 +:1058C0008B40C2F8083570474FF0A042F7E700223E +:1058D000F5E700BF0003005000F01F01400907D0AA +:1058E000012808D1054A01238B40C2F80C357047C6 +:1058F0004FF0A042F7E70022F5E700BF0003005099 +:105900002DE9F04F85B0074689460392002421E037 +:105910004FF0FF3634E0039BC3F80C654FF00108ED +:105920004146B6F1FF3F13D0B1F1FF3F4BD157F8DD +:105930000A3013F4004F4AD1454600220192CDF8B7 +:1059400000B0C3F34123424629463046FFF788FFA3 +:105950000134E4B24C453DD24FEA840A57F8243072 +:10596000C3F3C725C3F3C322C3F3080615F0080524 +:1059700034D11D4911F802B040F2FF129642C7D04F +:105980005B0C032B2DD801A252F823F0175900000D +:105990009D590000AB590000B9590000039BC3F8A2 +:1059A0001465A8464FF0FF31BBE7039BC3F80865B9 +:1059B0004FF001084146B4E7039BC3F81065A846C1 +:1059C0004FF0FF31ADE7304604F001FEAFE74FF096 +:1059D0000108B2E7002005B0BDE8F08F6FF01500B8 +:1059E000F9E76FF08500F6E7F8C5000043681A682C +:1059F000B1F5164F6FD03AD8B1F5165F6ED00AD90F +:105A0000B1F5E14F75D024D947F6122399422BD135 +:105A10004FF4000313E0B1F5966F61D007D9B1F5EB +:105A2000166F63D0B1F5965F10D13C4B07E0B1F52E +:105A3000967F58D0B1F5167F05D14FF41C33C2F8CC +:105A40002435002070476FF0150070476FF0150087 +:105A50007047B1F5615F4ED0B1F5964F01D1304B33 +:105A6000EDE76FF0150070476FF015007047B1F566 +:105A7000613F42D009D9B1F5612F46D01FD9294BDA +:105A8000994248D14FF08053D9E7B1F5963F37D0CE +:105A900005D9B1F5E13F0FD14FF0EB73CFE74DF6EC +:105AA000C02399422ED0B1F5614F02D14FF46B0360 +:105AB000C5E76FF0150070476FF0150070471A4B7F +:105AC000994225D0B1F5E12F02D14FF0E863B6E756 +:105AD0006FF0150070474FF41D03B0E7134BAEE7AE +:105AE0004FF49E23ABE74FF4A033A8E74FF41D23F8 +:105AF000A5E70F4BA3E70F4BA1E74FF06C739EE7B1 +:105B00000D4B9CE74FF4650399E74FF0706396E700 +:105B10004FF0806393E76FF01500704700B01300FB +:105B200000A04E0040420F0090D00300005027001C +:105B300000C0750000F03A0000903A01F8B5054643 +:105B40000E46076905F0C3FE10B9114B1B787BB9EF +:105B5000EFF31184202383F31288BFF36F8F28465D +:105B600004F0FEFD40B984F31188BFF36F8FEFE7B7 +:105B7000284604F024FF04467B691E7001227969DF +:105B8000284604F007FE84F31188BFF36F8FF8BD39 +:105B90002C1D002038B505460C4601F11C0001F013 +:105BA00019F90A4B98420DD105F10C0205F59071D7 +:105BB000207F00F0DBFB237F0120984000F0D0FB2A +:105BC000002038BD6FF00400FBE700BF0000AD0B04 +:105BD00021F07F4100F5A870014B43F82010704779 +:105BE000001001404FF480338340024AC2F844332E +:105BF000704700BF001001404FF480338340024AD9 +:105C0000C2F84833704700BF00100140014BD3F881 +:105C100004057047001001402DE9F8430546894608 +:105C20009046FFF7E9FF284604F0C3FF4E460327DE +:105C300010E0FFF7EBFF0446494604F0A9FFB0F57A +:105C4000000F26D9284604F0B4FFB8F1000F22D186 +:105C50003E19013731462846FFF7BAFF2846FFF7BD +:105C6000C1FFFFF7D3FF0446C11C304604F090FF8C +:105C70000A4B98420AD9284604F08EFF0028D8D152 +:105C8000B8F1000FE4D06FF0150000E00020BDE88F +:105C9000F8830020FBE76FF01500F8E7FDFF7F00B9 +:105CA000034B044AC3F80823C3F84823704700BFD6 +:105CB0000010014003000F0010B5012383406FEA7C +:105CC000030C0E4ABFF35B8F52E8001F01EA0C0E73 +:105CD00042E800E4002CF7D1BFF35B8F4FF4803231 +:105CE00082400748C0F80823BFF35F8FBFF36F8F70 +:105CF0000B4214BF0120002010BD00BFEC1A002091 +:105D0000001001404FF480338340144AD2F804233A +:105D1000134201D10020704710B50446012383408F +:105D2000DB430F49BFF35B8F51E8002F02EA03000A +:105D300041E8000CBCF1000FF6D1BFF35B8F22FAF3 +:105D400004F313F0010F03D1204604F025FF18B12E +:105D5000204604F02EFF012010BD00BF00100140BE +:105D6000E81A002001B9704701238340114ABFF3AC +:105D70005B8F52E800CF4CEA030C42E800C10029D7 +:105D8000F7D1BFF35B8F4FF4803383400A4AC2F8E8 +:105D90000433BFF35B8F094B1B68BFF35B8FC340BA +:105DA00013F0010FDFD0064B4FF40032C3F800218F +:105DB000D9E700BFEC1A002000100140E81A0020CB +:105DC00000E100E038B514461046194604F0FDFE27 +:105DD00002460D490B68E01A1B184C6844F1000498 +:105DE0000B604C60A2F50013B3F5400F09D2074BCE +:105DF0001B68190A1B06D41841F10005044BC3E9BE +:105E0000004502F0EDF938BD88050020F01A0020A9 +:105E10009005002038B50D4B1C68250A2406BFF3F9 +:105E20005F8FFFF7F3FE0346001945F10001B3F55C +:105E3000801F0AD2064BD3E90023904271EB030383 +:105E400003D210F1807041F1000138BDF01A00203A +:105E5000900500202DE9F041064614461D469DF8A8 +:105E600020801046194604F0B0FE0746FFF7D2FF27 +:105E7000A04271EB050319D2201A65EB01011D4BFD +:105E8000984271F100012FD21B4B03EB0613D3E9AB +:105E90000223AB4208BFA24201D1002018E04246D3 +:105EA00039463046FFF7B8FE90B11BE0B8F1000F5D +:105EB0001DD10123B340114ABFF35B8F52E8000F9D +:105EC000184342E800010029F8D1BFF35B8F00209E +:105ED000094B320103EB0616C6E9024506999950B3 +:105EE000079B7360BDE8F0816FF01500FAE76FF073 +:105EF0001500F7E70100800078050020E81A00206F +:105F000030B585B0FFF7CCFE00231E4AC2F8083535 +:105F1000002B25DD1B4C0225C4F804531A4B4FF40B +:105F20000032C3F8802100220121112003F018FE65 +:105F3000112003F00BFE0123A3602360134A1360BA +:105F4000002402940194124B0093124A002320462D +:105F500004F04BFE2846FFF733FA204605B030BD6B +:105F60000D4A02EB03124FF0FF304FF0FF31C2E950 +:105F700002014FF480329A400249C1F804230133F0 +:105F8000C6E700BF0010014000E100E0EC1A00206D +:105F9000C55D0000FFFF7F00780500202DE9F04778 +:105FA00082B00446FFF7AEFE10B902B0BDE8F0873C +:105FB000FFF730FF82460D4604F00AFE0646154BF9 +:105FC00003EB0413D3E90289C24575EB09050BD233 +:105FD0000025304604F004FE002DE6D0009742462E +:105FE0004B462046A847E0E70A4A230102EB04118A +:105FF000D5584F680020D0504FF0FF324FF0FF339C +:10600000C1E902232046FFF7F7FD204604F0D1FD49 +:10601000DFE700BF7805002010B50D4BD3F804333F +:1060200013F0020F03D10024002C0BDD10BD022160 +:10603000074804F077FD0028F5D0064A13680133BD +:106040001360F0E72046FFF7A9FF0134ECE700BF3B +:1060500000100140F01A002010B584B0B0F1FF3FED +:1060600018D001281BDD154B9842A8BF18460446DE +:10607000134B01221A70FFF7CDFE124B1A685B68B2 +:10608000801AB0F5000F0CD20444B4F5000F09D308 +:106090000A4C07E00A4B00221A70084CEBE7012477 +:1060A000E6E7064C00201219029001900649009183 +:1060B00043F1000304F099FD04B010BDFFFF7F0021 +:1060C000291D002088050020C55D000008B5FFF7E8 +:1060D000A1FE024B1B68C01A08BD00BF8805002046 +:1060E000BFF34F8F0549CA6802F4E062044B1343C3 +:1060F000CB60BFF34F8F00BFFDE700BF00ED00E0B6 +:106100000400FA05024BD3F80034002BFAD0704794 +:1061100000E0014008B5034BC3F80405FFF7F2FFA8 +:1061200008BD00BF00E0014038B504F086FD40B175 +:106130004FF080430022C3F80C21C3F81021C3F8AC +:10614000382504F084FD002846D04FF08052D2F864 +:1061500004145B4BC3F82015D2F80814C3F82415B7 +:10616000D2F80C14C3F82815D2F81014C3F82C1563 +:10617000D2F81414C3F83015D2F81814C3F8341533 +:10618000D2F81C14C3F84015D2F82014C3F84415F3 +:10619000D2F82414C3F84815D2F82814C3F84C15C3 +:1061A000D2F82C14C3F85015D2F83014C3F8541593 +:1061B000D2F83414C3F86015D2F83814C3F8641553 +:1061C000D2F83C14C3F86815D2F84014C3F86C1523 +:1061D000D2F84424C3F8702504F043FD18B1394BBC +:1061E000394AC3F88C2604F04FFD18B1374BFB2217 +:1061F000C3F8182504F05BFD70B14FF08041D1F871 +:10620000E43E23F00F034FF08052D2F8582202F000 +:106210000F021343C1F8E43E04F05CFD20B12C4BA7 +:106220004FF40072C3F8402604F067FD60B14FF0F0 +:106230008043D3F8003413F0010F05D04FF08043B2 +:106240006FF00102C3F8002404F071FD4FF0102339 +:10625000D3F80C3213F0010F0CD14FF01023D3F808 +:106260000032002B18DB4FF01023D3F80432002B40 +:1062700012DB38BD0120FFF74DFF4FF01022D2F89E +:106280000C3223F00103C2F80C32FFF73BFF002071 +:10629000FFF740FFFFF724FF0120FFF73BFF4FF020 +:1062A00010241225C4F80052FFF72CFFC4F8045242 +:1062B000FFF728FF0020FFF72DFFFFF711FF00BFBA +:1062C00000C00040005000404881030000F0004042 +:1062D0000090024010B50468CCB1B4FA84F3C3F165 +:1062E0001F03DBB201229A4024EA0202BFF35B8F54 +:1062F00050E800CFA44504D140E8002EBEF1000FC5 +:10630000F6D1BFF35B8FE6D10B70024810BD024897 +:10631000FCE700BF0000AD0B0200AD0B0368CB40F3 +:1063200013F0010F15D100B5026801238B40134310 +:10633000BFF35B8F50E800CF944504D140E8003EA6 +:10634000BEF1000FF6D1BFF35B8FEDD102485DF8CF +:1063500004FB0248704700BF0000AD0B0400AD0B0A +:10636000014BC3F80405704700F00140034BA23015 +:1063700043F8301003EBC0035A60704700F001404F +:1063800070B582B0064618B1012816D002B070BDB3 +:106390004FF080430222C3F808230122DA60002272 +:1063A000C3F80421D3F8043101238DF807309E424D +:1063B0000FD0002542F2107413E04FF08043012209 +:1063C000C3F808235A600022C3F80021D3F8003133 +:1063D000EAE70DF10705EDE7012004F0B8FC013C08 +:1063E0000CD02A4631464FF0804004F0B4FC28B16E +:1063F000002DF1D09DF80730012BEDD0012EC5D135 +:10640000014B00225A71C1E7F41A0020064B1B7998 +:106410003BB9054B186001221A7100225A710348DA +:1064200070470348704700BFF41A00200000AD0B0E +:106430000C00AD0B08B5074B1B680BB104F0A9FCB1 +:1064400004F0A5FC4FF08043C3F81805024B01226D +:106450001A7008BDF41A00202A1D002000B583B070 +:1064600020B1012849D003B05DF804FB4FF0804310 +:10647000D3F81824D3F8183403F00303019312F46B +:10648000803F13D14FF08043D3F8143413F0010F41 +:1064900010D104F07CFC0190019A4FF08043C3F8C6 +:1064A000182508224FF4827302202AE001A804F084 +:1064B00079FCF1E74FF08043D3F81C3403F0030379 +:1064C000019301A804F06EFC0028E5D0194B1B686D +:1064D0002BB14FF080430222C3F80423C3E74FF0EF +:1064E0008043D3F80431002BF9D04FF080430022D1 +:1064F000C3F80421D3F80431B5E700224FF48073C8 +:10650000012003F1804300211960196802F18042E3 +:1065100001211160074A126822B14FF08043C3F88D +:106520000403A0E71A68002AFCD000221A601B6846 +:1065300099E700BFF41A002008B54FF08043D3F864 +:1065400000318BB14FF080430022C3F80021D3F813 +:1065500000210122C3F80823154B5B7923B9144BA2 +:106560005A711B68002098474FF08043D3F80431DC +:106570009BB14FF080430022C3F80421D3F80421DB +:10658000D3F81824D3F8183413F0030F06D14FF0C2 +:1065900080430122C3F818259A6008BD4FF080435C +:1065A0000222C3F80823024B1B6801209847F4E736 +:1065B000F41A002070B400F01F0C400919D0012813 +:1065C0001AD10E4D0CF5E07055F820600C4C34409B +:1065D00041EA420141EA83039DF80C2043EA022389 +:1065E0009DF8102043EA0243234345F8203070BC55 +:1065F00070474FF0A045E5E70025E3E700030050B2 +:10660000F0F8FCFFF0B51C46059F069E00F01F0C3D +:10661000400936D0012837D1284D0CF5E07355F8E4 +:10662000233099B301209AB34FF0020E40EA0E00D6 +:106630008CB34FF00C0E40EA0E007FB34FF4E06EC7 +:1066400040EA0E006EB34FF4403E40EA0E0023EAEB +:10665000000049B30B784AB31278520013433CB39D +:106660002278920013432FB33A78120213431EB3D9 +:1066700032781204134303430CF5E07C45F82C30C8 +:10668000F0BD4FF0A045C8E70025C6E70020CAE7E7 +:106690004FF0000ECAE74FF0000ECCE74FF0000EAF +:1066A000CEE74FF0000ED0E70023D4E70022D5E775 +:1066B0000022D7E70022D9E70022DBE700030050E1 +:1066C00000F01F02400908D0012809D1054BD3F87A +:1066D0001005D04000F0010070474FF0A043F6E7EE +:1066E0000023F4E70003005000F01F03400909D025 +:1066F00001280AD1064A03F5E07352F82300C0F3DB +:10670000014070474FF0A042F5E70022F3E700BFD9 +:106710000003005000B583B084468E460D4B93E8CD +:10672000030002AB03E9030063460BE002A901EB9F +:10673000830151F8081CD1F8200542F8040BC1F878 +:10674000200501330CEB0E009842EFD803B05DF842 +:1067500004FB00BF58C3000000F01F01400907D030 +:10676000012808D1054A01238B40C2F82035704723 +:106770004FF0A042F7E70022F5E700BF000300500A +:106780004309034AD35C00F01F001844C0B27047AD +:1067900080C6000000487047700100202DE9F041DC +:1067A00084B005460C4616461F460846FFF7E8FF2C +:1067B000804656B32146284604F0ECFB28B121461A +:1067C000284604F0A7FB002841D12146284604F0C2 +:1067D000B0FB10B17378012B39D001238DF80F3045 +:1067E000002301930096B31C721C0DF10F0120468B +:1067F000FFF708FF2879FFF7CDFF08F1080230F80E +:10680000123043F0030320F81230002F39D0214614 +:10681000284604F0BFFB002835D13E782B6806F5EA +:10682000A272002143F822102879FFF7B3FF08F184 +:10683000080230F8123023F02003DB04DB0C20F8D0 +:1068400012307B782BB9114804B0BDE8F0811048B4 +:10685000FAE7BA78009222463146286804F0D5FA61 +:106860002879FFF797FF024608F1080032F8103048 +:106870007603B6B2334343F0200322F810300348C6 +:10688000E2E70248E0E70248DEE700BF0000AD0BA8 +:106890000400AD0B70B506460D46144604F03AFBF5 +:1068A00068B13079FFF776FF06462846FFF768FFA4 +:1068B000083036F810305B0B2370024870BD024878 +:1068C000FCE700BF0000AD0B0400AD0B30B583B09A +:1068D00005460191002400E00134012C18D80E4B2C +:1068E0001B5D03F0070202A901EBD30313F8043C7C +:1068F000D34013F0010FEFD005EB840201212046B5 +:10690000FFF708FF55F82430002BE5D0012000E008 +:10691000002003B030BD00BF90C600002DE9F0415B +:1069200082B00546884616461F4604F07FFCAEB38B +:106930003A463146284604F089FB041E20DB2879BC +:10694000FFF728FF40F834602879FFF723FF00EBBA +:10695000C40047602879FFF71DFF05464046FFF752 +:106960000FFF083035F81030E4B26402A4B22343BC +:1069700043F4807325F81030094802B0BDE8F08177 +:106980002879FFF707FF0DF107017830FFF7A2FC28 +:10699000034B9842F1D19DF80740D0E70048ECE75F +:1069A0000000AD0B2DE9F04385B004460D461746B7 +:1069B0000846FFF7E5FE0646D7F80080B8F1000F5D +:1069C00028D02946204604F0D4FA00284FD10023CD +:1069D0008DF80E308DF80F300193009343460DF182 +:1069E0000F020DF10E012846FFF70CFE2079FFF78C +:1069F000D1FE06F1080830F8183023F0020320F821 +:106A000018302079FFF7C6FE30F8183043F0010344 +:106A100020F818307B68F3B193F80080D3F8049025 +:106A20002946204604F096FA18B3B9F1000F65D153 +:106A30002079FFF7AFFE083630F8163023F01C033C +:106A400020F816302079FFF7A5FE30F8163043EA1B +:106A5000880320F81630BA68002A53D053681268A9 +:106A600029462046FFF75AFF05B0BDE8F0832648C7 +:106A7000FAE72079FFF78EFE06F1080230F81230AF +:106A800023F02003DB04DB0C20F81230B9F1000FF7 +:106A9000CED0B8F1030F33D87B685B6893F80090D1 +:106AA000B8F1000F06D1236809F5A279002243F856 +:106AB0002920BDE7404604F075FA0346216809F530 +:106AC000A27C51F82C2022F0030241F82C202A4607 +:106AD0004946206804F080F92079FFF75BFE06F153 +:106AE000080230F812304FEA49391FFA89F943EAAF +:106AF000090343F0200320F8123099E70248B3E776 +:106B00000148B1E70148AFE70400AD0B0000AD0B51 +:106B100038B505460C4604F0EEF908B9074838BD0B +:106B20002146284604F06FFA2146284604F0A9FBC6 +:106B3000204604F0C4F90248F1E700BF0400AD0BA1 +:106B40000000AD0B70B582B005460E460079FFF728 +:106B500021FE90F8803013B10B4802B070BD04469E +:106B600060220021103005F075FA236F0093002396 +:106B700032464FF00041286804F0ADFB012384F851 +:106B80008030A3670148E8E70C00AD0B0000AD0BB7 +:106B90002DE9F04383B080460F4600230093019314 +:106BA000C96F6846FFF792FE4BE094FAA4F4B4FA7A +:106BB00084F404F01F05254B9B5D45EA43152846E8 +:106BC000FFF7DEFD083037F81090C9F382090DEBAE +:106BD0008603E00804F007041A5C0121A14022EAC0 +:106BE00001021A542846FFF77FFD03464A4629460C +:106BF000384604F0DBFA2846FFF7AEFD02AB03EBA4 +:106C0000860353F8084C002CCFD10136012E0DD845 +:106C10000F4B9B5D07F17C02D90803F00703525C20 +:106C200022FA03F313F0010FEFD0E7E73A6F4FF0CA +:106C30000041404604F025F9F96F6846FFF746FE2B +:106C400008B10026E2E703B0BDE8F08394C6000077 +:106C500090C6000008B50249024804F087FB08BD51 +:106C600070010020006000400F4B1B780BB10F48F3 +:106C7000704710B504460178C1F340014FF08040E1 +:106C800004F0CAFB237813F0010F0BD001224FF060 +:106C90008043C3F8782504F0D1FB034B01221A701E +:106CA000034810BD0022F2E72B1D00200C00AD0BA5 +:106CB0000000AD0B08B504F0D1FB024B00221A60B6 +:106CC00008BD00BFFC1A002010B50446FFF7F2FF14 +:106CD00023680BB1014A136010BD00BFFC1A0020ED +:106CE00010B54FF08043D3F8044314F0040F0CD0D8 +:106CF000D3F808314BB14FF080430022C3F808218C +:106D0000D3F80831304B1B68984714F0200F0ED091 +:106D10004FF08043D3F814314BB14FF08043002043 +:106D2000C3F81401D3F81431284B1B68984714F0AA +:106D3000400F0FD04FF08043D3F8183153B14FF0CC +:106D400080430022C3F81821D3F818311F4B1B6869 +:106D50000120984714F0800F0ED04FF08043D3F8F5 +:106D60001C314BB14FF080430020C3F81C01D3F815 +:106D70001C31174B1B68984714F4807F0FD04FF0DD +:106D80008043D3F8203153B14FF080430022C3F841 +:106D90002021D3F820310E4B1B680120984714F4B2 +:106DA000007F0FD04FF08043D3F8243153B14FF020 +:106DB00080430022C3F82421D3F82431044B1B68FC +:106DC0000220984710BD00BF041B0020001B0020BC +:106DD000FC1A002008B501460148FFF77BFA08BD00 +:106DE000F4010020034B00E01433034A9342FBD329 +:106DF000704700BFF8C000005CC1000038B5EFF379 +:106E00001185202383F31288BFF36F8F054B9C6895 +:106E100004F04FFB85F31188BFF36F8F2046FCF71A +:106E200009F938BD081B002038B505460A4B53F850 +:106E3000204002E02368984708346B1C064A52F849 +:106E40002330A34206D96368002BF3D0204604F018 +:106E500033FBF1E738BD00BFA8C6000010B586B00F +:106E6000B023114C03FB004400EB400C00EB80000E +:106E70000E4B03EB80030E4A0592012204920F226F +:106E8000039200220292019200930A4B4FF4A072E7 +:106E9000094901EBCC11204600F012FC637B23F082 +:106EA0000403637306B010BD98050020081B002082 +:106EB00098C6000093B50000002E002008B553EAE4 +:106EC000020102D104F02FFD08BD0249183001F083 +:106ED00001F9F9E71FBB000010B586B0184C14E0AB +:106EE000636A0593236A0493E3690393A369029396 +:106EF0006369019323690093E368A268616820686D +:106F000000F0DEFB23685C6530340E4B9C42E7D317 +:106F100000F09AFE0A4C00E030340A4B9C420BD23F +:106F2000A26AE36AB3F1FF3F08BFB2F1FF3FF3D0BB +:106F30002068FFF7C3FFEFE700F09EFE06B010BD2C +:106F4000DCC20000DCC2000008B50A4B01221A7046 +:106F50000320FFF769FFFBF7FFFC0420FFF764FF46 +:106F6000FFF7BAFFFAF73EFA034A137B23F0010357 +:106F7000137308BD2C1D00204806002008B50146EB +:106F8000014A0248FCF780F9496F000048060020DA +:106F900008B50348034A121A002104F0A5FA08BDF7 +:106FA000D8030020301D002010B50446FFF756FF1F +:106FB000B0230B4903FB04110A4A04EB840302EBE0 +:106FC0008303D9601C7404EB4411074B03EB81135A +:106FD00003F5046304EB840402EB8402536010BDE8 +:106FE00098050020081B0020C025002070B586B041 +:106FF00000F060FE104D114B5D61114B05930123B4 +:107000000493002403940294019400940D4B4FF4D4 +:1070100080620D49284600F053FB06466B7B23F047 +:1070200004036B73284604F013FD2046FFF7BCFFF2 +:10703000304606B070BD00BF48060020081B002087 +:10704000A0C60000496F0000802F002008B5002076 +:10705000FFF7EAFE1D4B83F308881D4C636943F478 +:1070600000736361E02384F822300025E5772576FC +:107070006576A57684F82050636A43F4E023636262 +:1070800084F82350FBF756FFFCF722F94FF0FF334B +:10709000A362E362FCF7D2F9FCF74AF90D4B012435 +:1070A0005C731C73C3F89450C3F89850C3F8A05095 +:1070B000094A9360FFF796FE2046FFF7B5FE0220CF +:1070C000FFF7B2FEFFF792FFFFF758FF002E0020F8 +:1070D00000ED00E0F8060020081B002010B5064C6B +:1070E000002000E01C34054B9C4204D2204604F0F2 +:1070F00003FA0028F6DA10BD6C0200208802002096 +:1071000030B583B00D46EFF31181202484F312884B +:10711000BFF36F8FC46864B12C602368C360836958 +:1071200001338361002081F31188BFF36F8F03B0B7 +:1071300030BD00F1080C53EA020404D100232B6097 +:107140006FF00B00EFE7009201930246604600F0FB +:10715000B9FC0028EBD1024B9B685B692B60E6E72A +:10716000081B00202DE9F04182B00446EFF311879F +:10717000202181F31288BFF36F8FC16899B900296C +:1071800050D1364B9B6893F90E3023610131E16099 +:10719000324B9B68A36087F31188BFF36F8F002089 +:1071A00002B0BDE8F08116461D4682682B4B9B68F5 +:1071B0009A42E4D055EA060136D092F90E80414653 +:1071C00093F90E0004F0F2F9804534DC4FF000082A +:1071D0000096019522463946214800F073FC0028AC +:1071E000DED0EFF31185202383F31288BFF36F8F76 +:1071F000A36843B323689C4223D013B3216993F956 +:107200000E0004F0D3F90146204604F0DAF9E8B99B +:10721000B8F1000F1AD185F31188BFF36F8F6FF0AB +:107220000A00BDE72369B0E787F31188BFF36F8FCA +:107230006FF00F00B4E70146204604F0C2F9804623 +:10724000C6E72169E0E7B8F1000FE4D02946044819 +:1072500000F0B0FC6FF00A00A2E700BF081B00209E +:107260002C1B002038B583687BB304461A4A926809 +:1072700093422DD1C368012B03D9013BC360002089 +:1072800038BDEFF31185202383F31288BFF36F8F8E +:10729000016904F096F9204604F047FCA06068B14B +:1072A00090F90E3023610024C0F8AC4004F0D0FB0C +:1072B00029460A4800F07EFC2046E1E70020E06015 +:1072C00085F31188BFF36F8FDAE76FF01500D7E70A +:1072D0004FF0FF30D4E700BF081B00202C1B00201C +:1072E00010B582B001468446EFF31184202080F36C +:1072F0001288BFF36F8F5CF8080B88B1036823F026 +:1073000003030B604A68904208D0012104F0E8F9B9 +:1073100084F31188BFF36F8F02B010BD4B60F4E7A8 +:1073200053EA02010BD00092019362462146604667 +:1073300000F0C8FB48B9064B9B685869ECE784F33A +:107340001188BFF36F8F0020E6E70020E4E700BF5D +:10735000081B002038B50446EFF31185202383F382 +:107360001288BFF36F8F04F0E0FB48B10022C0F831 +:10737000AC2004F06DFB2946084800F01BFC38BD2A +:10738000A368E268934207D001221344A36085F307 +:107390001188BFF36F8FF2E70022F6E72C1B002065 +:1073A00010B582B0EFF31181202484F31288BFF36B +:1073B0006F8F846844B1013C846081F31188BFF30E +:1073C0006F8F002002B010BD53EA020406D0009275 +:1073D00001930246054800F075FBF3E781F311883D +:1073E000BFF36F8F6FF00F00ECE700BF2C1B002086 +:1073F00070B338B50D4604461B4B9B6883421BD0C7 +:1074000000231A46D4F8C830C3F38001C3F3C00088 +:1074100013F0010F1FD001B102B300B109B3002373 +:107420002B60D4F8B43073B11D60C4F8B45020465A +:1074300004F093F9012038BD04F049FA08B901239A +:10744000DFE70023DDE7C4F8B450C4F8B050EEE73E +:107450006FF0150070476FF01200ECE76FF00F004F +:10746000E9E76FF00F00E6E7081B002010B5C368DE +:1074700023F00203C360134B1C687CB1236803B183 +:107480000CB100210FE02346FBE722460D4804F033 +:1074900051F904F10800FFF75DFF10BD2346F0E746 +:1074A0001A461C461346002CF7D062688242ECD084 +:1074B0002146002BF4D01A68002AF2D0002BF0D11C +:1074C0001A46EEE72C1B002070B584B0054616E086 +:1074D000D5F8C83023F00402C5F8C82013F0040F13 +:1074E0005BD1002302934FF0FF324FF0FF33CDE921 +:1074F000002305F1B8023146314800F0E7FCEFF314 +:107500001186202383F31288BFF36F8FD5F8B04024 +:10751000002CDDD02368C5F8B030D5F8B4209442F3 +:1075200038D0D5F8C83043F00203C5F8C830E36856 +:1075300043F00102E26023F0040343F00103E3603F +:10754000636886F31188BFF36F8F20469847EFF387 +:107550001186202383F31288BFF36F8FE36823F033 +:107560000103E36013F0100F21D1E36813F0020F61 +:1075700021D1D5F8C83023F00203C5F8C830C3F3D1 +:10758000002386F31188BFF36F8F002BB7D100F073 +:1075900099FBB4E7C5F8B430C3E705F1C004002295 +:1075A0000121204604F055FB0028F8D199E7204638 +:1075B00004F03AF9D9E72046FFF758FFD9E700BFB2 +:1075C000341B002008B58446084653EA02010CD05B +:1075D000C16841F00801C160DCF800108162054912 +:1075E000103000F077FD012008BD614604F0BFF8BF +:1075F000FAE700BFCFB70000F0B589B004460E9D92 +:107600000020C4F8B000C4F8B40004F1B800C4F815 +:10761000B800C4F8BC0004F1C000C4F8C000C4F84D +:10762000C4002DB3287928BB0120C4F8C8004FF04E +:10763000FF364FF0FF37CDE9066700200490039333 +:107640000290019000940D4B204604F07BF955B157 +:10765000296811B1204600F013F86B791BB1237B28 +:1076600043F001032373204604F05DF909B0F0BD37 +:107670000120DAE740F20110D7E700BFC97400002B +:1076800010B5044640B11F2204F1740004F061FCFF +:10769000002084F8930010BD014B9C68F3E700BF05 +:1076A000081B002008B553EA020102D104F03BF99F +:1076B00008BD0249183000F00DFDF9E71FBB0000BE +:1076C0002DE9F04F85B004460F4615461E46DDF8FD +:1076D00038A0DDF83C90DDF84080DDF84CB000F1DA +:1076E00058038365C365129B0422119904F01FF9A6 +:1076F0002A463946204604F0F0F80546CDF80880C1 +:10770000CDF80490CDF800A0334602463946204615 +:10771000FBF774FD002363652666C4F864A0C4F813 +:107720006890C4F86C80EFF31182202383F31288F1 +:10773000BFF36F8F124B196A21671C6282F31188A5 +:10774000BFF36F8FBBF1000F13D01F22594604F116 +:10775000740004F0FEFB002384F89330084B9B6810 +:107760005BB1D3F8A030C4F8A030284605B0BDE81E +:10777000F08F002384F87430F0E7C4F8A030F4E709 +:10778000081B002010B5114B53F8184F9C420FD026 +:1077900074B180B90D4B9B685A7B12F01F0F0AD150 +:1077A000A26942B9DA897F2A05D9084A53610BE0F8 +:1077B000064BDC68EDE7054B9B68A34202D02046F0 +:1077C00000F0CEFB014B5C6110BD00BF081B002028 +:1077D00008B5437B90F90D20002A08DB094B9B6814 +:1077E000834214BF00200120FFF7CCFF08BD03F047 +:1077F0007F0343734268036813605A600023036089 +:107800004360EBE7081B0020B3F1FF3F08BFB2F174 +:10781000FF3F00D1704708B50249183000F05AFC0C +:1078200008BD00BF1FBB0000427B90F90D30002B4C +:1078300033DB70B5044612F01F0F01D1866906B123 +:1078400070BD62F07F024273144B53F8185F9D4283 +:1078500008D1354606E06B68636025601C606C608B +:1078600017E035466DB12946204604F093F800280C +:10787000F1DC002DF6D0094BDB699D42F1D02D687B +:10788000F0E7064BDA6903F11801216062601460C9 +:10789000DC610020FFF776FFD2E77047081B00206D +:1078A000437B0B425CD170B504460D460B434373DA +:1078B00013F0800F1FD1082D28D000260120FFF7DC +:1078C00061FF102D45D0204600F0AAFB66B1254B84 +:1078D00001225A731A730022C3F89420C3F8982027 +:1078E000C3F8A020204A9360BFF35F8F637B23F02F +:1078F0006003637370BD03F07F03437342680368E2 +:1079000013605A60002303604360D4E7A3685BB14F +:107910006268236813605A60002323606360627B9F +:1079200022F002026273A36004F1180004F0FBF974 +:1079300004F1580004F038F80B4B9B68A34201D0C7 +:107940000026BBE7EFF305830BB90026B6E7012657 +:10795000B4E7BFF35F8F637B23F060036373C9E712 +:10796000704700BFF8060020081B002038B5054608 +:107970000C46124B9868437B13F0600F05D013F050 +:10798000200F07D00821FFF78BFF84F31188BFF386 +:107990006F8F0EE01021F6E7EFF31184202383F3BD +:1079A0001288BFF36F8F03F0FFFD84F31188BFF3DC +:1079B0006F8F6B7B13F0600FEED138BD081B00207A +:1079C000F8B504460E46154600F1580703F0DCFFF3 +:1079D000B8B1637B55B1202213436373EFF3058382 +:1079E00033B131462046FFF7C1FF17E04022F3E7ED +:1079F0003946104B986803F0F4FF304603F0C6FF99 +:107A00000CE065B108212046FFF74AFF094B9B684F +:107A1000A34206D086F31188BFF36F8FF8BD102103 +:107A2000F1E7EFF30583002BF4D1304603F0AEFF0E +:107A3000F4E700BF081B002038B50546437B90F9EA +:107A40000D20002A0ADB6B7B63F07F036B731C4BFA +:107A500053F8184F9C4213D1002411E003F07F0328 +:107A600043734268036813605A60002303604360F5 +:107A7000E9E763686B602C601D60656017E00024B7 +:107A80006CB12146284603F085FF0028F1DC002C6C +:107A9000F6D00B4BDB699C42F1D02468F0E7084B31 +:107AA000DA6903F1180129606A601560DD61044B31 +:107AB0009868A84214BF00200120FFF763FE38BD7C +:107AC000081B002010B50C4611460A4882680A4B74 +:107AD0001A60EFF31183202383F31288BFF36F8FB3 +:107AE000DDE90223806803F0A7FF2046FBF7BCFA1C +:107AF00010BD00BF081B0020341B00202DE9F04101 +:107B000005460F460023EFF31186202282F31288E8 +:107B1000BFF36F8F184629E063686B602C601D60AF +:107B2000656017E044466CB12146284603F032FFF9 +:107B30000028F1DC002CF6D01D4BDB699C42F1D013 +:107B40002468F0E71A4BDA6903F1180129606A60CA +:107B50001560DD610120FFF715FE012001E0AF7324 +:107B6000002086F31188BFF36F8F0123F3B96B7B7D +:107B700013F01F0FF3D1D5F81880B8F1000FEED134 +:107B800003F07F036B736A682B6813605A600023ED +:107B90002B606B60AF736B7B63F07F036B73044B85 +:107BA00053F8184F9C42BED14446BCE7BDE8F08173 +:107BB000081B002008B50B4659B9EFF3058242B9FE +:107BC000064A50699268904203D00846FBF74CFA87 +:107BD00003E083F31188BFF36F8F08BD081B0020FB +:107BE00010B5EFF31184202383F31288BFF36F8F56 +:107BF000437B13F0040F04D184F31188BFF36F8F1C +:107C000010BD23F004034373FFF70EFE2146024824 +:107C1000FFF7D0FFF4E700BF341B002008B5034690 +:107C200050B9EFF305823AB9064A51699268914218 +:107C300002D0FBF719FA03E083F31188BFF36F8FCB +:107C400008BD00BF081B00200023EFF31181202294 +:107C500082F31288BFF36F8F09E0064B9A68D37BDB +:107C6000013BD37381F31188BFF36F8F0123002B86 +:107C7000F3D07047081B002010B50023EFF31184E8 +:107C8000202282F31288BFF36F8F0CE0084B9A68B2 +:107C9000D37B0133D3730020FFF774FD84F3118885 +:107CA000BFF36F8F0123002BF0D003F08DFF10BDC9 +:107CB000081B002008B5024803F0A1FF08BD00BF63 +:107CC0001C1B002070B5EFF31186202383F312886C +:107CD000BFF36F8F1E4B9A68517B01F07F01517388 +:107CE00050681168016048600021116051609D6812 +:107CF0006A7B62F07F026A7353F8184F9C4208D186 +:107D0000002406E063686B602C601D60656017E00E +:107D100000246CB12146284603F03CFE0028F1DC2B +:107D2000002CF6D00A4BDB699C42F1D02468F0E7C6 +:107D3000074BDA6903F1180129606A601560DD619B +:107D40000120FFF71FFD3046FBF78EF970BD00BF25 +:107D5000081B00202DE9F04150EA010337D004460A +:107D60000E466FF001031B1A4FF0FF3262EB010267 +:107D7000012B72F100022EDB6FF001052D1AEFF3DB +:107D80001188202383F31288BFF36F8F144FB868D4 +:107D9000144B1860FFF71CFDB868224633461249A1 +:107DA000183000F097F9BA68537B43F0100353730F +:107DB0004046FBF759F903F0D3FF281A63EB03039E +:107DC000012873F1000300DA0020BDE8F081FFF71D +:107DD00079FF0020F9E703F0C3FF0519CFE700BFE3 +:107DE000081B0020341B00201FBB000008B5B1F1A8 +:107DF000FF3F08BFB0F1FF3F1DD0FFF7ABFFC21739 +:107E0000510141EAD06143011B1A61EB0201890073 +:107E100041EA93719B001B1842EB0102D20042EA37 +:107E20005372DB0047F6FF71581842F10002C00B95 +:107E300040EA424008BD034B986803F024FE4FF02F +:107E4000FF30F7E7081B002008B5C117C90341EA56 +:107E50005041C003184BC018184A4FF0000341F1BD +:107E60000001F9F74DF9C117FFF774FF4FEAE07C05 +:107E70004FEA4C1343EAD0634201121A63EB0C033E +:107E80005B0243EAD253520212184CEB03014FEA51 +:107E9000811E4EEA926E93019B1A6EEB010E18182A +:107EA0004CEB0E0C47F6FF73C0184CF1000CC00BE6 +:107EB00040EA4C4008BD00BF3F420F0040420F0067 +:107EC000014B9868704700BF081B00202DE910483F +:107ED00083B0089CDDE906BCCDE900BCFFF7F2FDEC +:107EE0001CB1034B9B685B69236003B0BDE810883D +:107EF000081B0020044BC01AC010044B03FB00F009 +:107F0000034B01221A547047A8070020ABAAAAAA63 +:107F1000381B0020C3897F2B11D80E4B1B687BB107 +:107F200090F90E200C4B1B689A420CDB437B13F03C +:107F30001F0F0AD1094B984209D0012300E000230A +:107F400003F0010070470023FAE70023F8E700235D +:107F5000F6E700BF401B00203C1B002098050020D6 +:107F600070B505460D4B1E7C06EB46030C4C04EB2E +:107F7000C304204603F0D7FE0A4B00229A55284638 +:107F8000FFF7C8FF00B970BD074B1A68013AD31755 +:107F90000649204600F09EF8F5E700BF081B0020C8 +:107FA000A8070020381B0020401B0020F57E0000A1 +:107FB00038B5EFF31185202383F31288BFF36F8F59 +:107FC000144B9C68144B1B68A34217D0124B002221 +:107FD0001A60104B1B7C114AD35C53B12046FFF74B +:107FE00099FF30B1637B13F01F0F0FD02046FFF7CE +:107FF000B7FF85F31188BFF36F8F38BD2046FFF7B9 +:10800000AFFF85F31188BFF36F8FF6E72046FFF7C8 +:1080100013FDEBE7081B0020341B0020381B002059 +:10802000EFF31181202383F31288BFF36F8F0A4B84 +:108030001B6A834204D11A6F074B1A6207E013468A +:1080400013B11A6F8242FAD10BB1026F1A6781F332 +:108050001188BFF36F8F7047081B002008B50648D2 +:10806000064A121A064903F043FA064A0649074827 +:1080700003F03EFA08BD00BF00000020D40300203A +:1080800064C700000000000064C70000000000207A +:10809000034B1868984200D070470020FCE700BFEF +:1080A000F801002030B1044A5268904201D00068C3 +:1080B00070470020704700BFF801002008B5044B4E +:1080C0001B680BB1002008BDFEF700F8FBE700BFFE +:1080D000441B0020B3F1FF3F08BFB2F1FF3F77D050 +:1080E0002DE9F047044692461D4681600023EFF3D8 +:1080F0001187202282F31288BFF36F8F26E01AF1D6 +:10810000010845F10009FFF7D9FF18EB000349EB1F +:10811000E070236160613BE0521A66EB0303026189 +:1081200043614368636020601C60446005E0294B44 +:108130005A682360626014605C60FFF7A9FF8442A4 +:108140003AD087F31188BFF36F8F0123002B3DD105 +:1081500053466FF00101B1EB0A014FF0FF3060EBC5 +:108160000502002ACBDB1C4A116852685B1842EBFF +:1081700005026FF00101C91A60EB020308461A46B6 +:10818000012973F1000301DA0120002220616261FC +:10819000FFF77EFF0028CAD002694669216963693A +:1081A000914273EB060EB7DB891A63EB060321617C +:1081B0006361FFF777FFEDE7084B1B68002BC0D129 +:1081C00003F094FD0021FDF747FFBAE7BDE8F08713 +:1081D000704700BFF8010020C0070020441B0020AA +:1081E00070B5EFF31186202383F31288BFF36F8FEE +:1081F0002A4B1860FFF74CFF044623E0284A136817 +:1082000051685B1941EBE571136051600022002356 +:10821000C4E90423204603F052FD86F31188BFF31E +:108220006F8FA36820469847EFF31186202383F3CE +:108230001288BFF36F8F194A13685B1B1360FFF737 +:1082400027FF04463CB125696169144B1A68D317AE +:10825000AA428B41D2DA44B1236962690F490968A5 +:108260005B1A62EBE172236162610D4A0B4D286873 +:10827000136851681B1841EBE071136051600024D2 +:108280002C6003F033FD2146FDF7E6FE86F31188EE +:10829000BFF36F8FFFF78CFE70BD00BF441B002043 +:1082A000C007002010B50022EFF31184202383F3D0 +:1082B0001288BFF36F8F134611460CE0FFF7FEFEE6 +:1082C000074A13685168C31841EBE07184F31188C1 +:1082D000BFF36F8F0122002AF0D0184610BD00BFF7 +:1082E000C007002038B504460D4603F0F0FA48B93F +:1082F000054B9B68D3F8A00018B12A46214603F02D +:1083000093FD38BD0020FCE7081B002010B5064C8B +:1083100005E0A2686168204603F0A8FD1434034B11 +:108320009C42F6D3002010BD880200208802002065 +:1083300000B585B0094A02AB92E8030083E8030068 +:1083400000934FF0FF334FF4806205490548FFF773 +:1083500053F9002005B05DF804FB00BF60C30000C6 +:10836000C0330020C807002010B50A4C23681BB199 +:1083700001232360002010BD00F0EAF80028F7D0A8 +:108380000138062803D8044B53F8200010BD0348D9 +:1083900010BD00BF481B0020CCC60000FE8FFFFFB1 +:1083A000BFF34F8F0549064BCA6802F4E0621343DE +:1083B000CB60BFF34F8F00BFFDE700BF00ED00E0D3 +:1083C0000400FA0510B4094B09490A4C4FF0FE327B +:1083D000C3F800244968C3F80424C3F80824C3F888 +:1083E0000C240023C4F8003510BC084700B002502C +:1083F0000002002000A00250D0E90012014BC3E9A6 +:10840000001270470002002010B5044650B16368A6 +:1084100013F0685F05D0064A934202D00023236020 +:10842000626010BD034B04485B689847EFE700BFEC +:108430002C5F5CA900020020E8C60000C8B14368B8 +:108440000D4A934213D013F0685F0ED0012350E819 +:10845000002F194640E8001C9CF0000FF7D1012ABC +:10846000F5D0BFF35F8F0020704704487047044881 +:1084700070476FF4E04070472C5F5CA9E98FFFFF05 +:10848000EA8FFFFF80B14368094A93420AD013F094 +:10849000685F05D0BFF35F8F002303601846704705 +:1084A00004487047044870476FF4E040704700BFCD +:1084B0002C5F5CA9E98FFFFFEA8FFFFF10B5044630 +:1084C00020B1044B63600022226010BD0248FFF718 +:1084D00079FFF6E73A00003A10C7000070B5D0E91E +:1084E0000023174C174D6360D0E90230C4E9023015 +:1084F00022604868D1F800C0134BC3E900C0D5F82A +:108500001801D1F808C0C3F808C010F0685FD1F8AE +:108510000CC00969C3F80CC0196110D00B49C5F82B +:10852000BC110023C5E9453105F58A70C5F8B8319D +:108530009047236805F5DC70BDE87040184770BDB2 +:108540001C020020601B0020080200202C5F5CA998 +:1085500038B500F02FF820B1032400F063F820466E +:1085600038BD00F031F898B900F0ACF898B90F4D6B +:10857000D5F828391B0EF02B08D1D5F8242A0C4B3E +:108580009A420AD0072400F017F8E6E70624FAE733 +:108590000424204638BD0024F5E7012000F092F8BD +:1085A00004460028F7D1C5F80C0AD8E700B00250FD +:1085B0000000E0200020704700207047014BC3F806 +:1085C000040A704700B0025010B5114800F048F896 +:1085D00000B110BD0F4800F043F80028F9D10E4C4F +:1085E000204600F03DF80028F3D10C4B0C481C60ED +:1085F00000F036F801460028EBD100F02DF80446D3 +:1086000008B1204610BD00F03FF82046FAE700BF51 +:108610005C02002058020020540200204C0200207E +:108620005002002008B5084800F024F8074800F080 +:1086300021F8074800F01EF8064800F01BF8BDE8D6 +:10864000084000F00BB800BF5C0200205802002078 +:10865000540200205002002000207047704700BFE5 +:1086600008B5034B02681B6810689847002008BDD6 +:108670001C02002008B5034B02685B68106898472D +:10868000002008BD1C02002070B5094C094D20696E +:10869000AB68984718B1084B08485B689847084A88 +:1086A000EB68206900211160BDE87040184700BFE9 +:1086B000080200201C0200200002002034C7000035 +:1086C0005C1B0020F8B51A4D1A4E0446B2682869A2 +:1086D0009047E8B9184F3B684CB1A3B1012B19D0B2 +:1086E000013B3B602869F36898470020F8BD43B917 +:1086F000124A0121C2F800151149D1F81029002AA7 +:10870000FBD101333B60F368286998470020F8BD2E +:108710000C48F8BD0A4AD2F81039002BFBD1074AA1 +:108720006FF07E40C2F80035FFF748FF3B68D7E79F +:10873000080200201C0200205C1B002000A0025048 +:1087400000B00250E98FFFFF0FB407B5064B04AA33 +:10875000186852F8041B019200F008F803B05DF8A5 +:1087600004EB04B0704700BF24C500002DE9F04FB2 +:108770008DB043680293837815469A07804640F18E +:108780000D8100240E78002E00F00A81252E0BD0DA +:108790004B1C03930134029B414630469847002806 +:1087A000C0F2F6800399EDE74E788B1C252E0393DB +:1087B000F0D00027B946BB46BBF11F0F38D8A6F151 +:1087C0002003102B0AD8DFE803F02A090930090931 +:1087D000092109090928092D09091F00A6F13003FB +:1087E000092B33D92A2E37D11BF0400F55F8043B03 +:1087F00040F08280002BA7BF4BF0200B9946C3F1BD +:1088000000094BF0280B01E04BF0010B039B13F820 +:10881000016B0393002ECFD130E04BF0020B4BF0F5 +:10882000040BF3E74BF0080BF0E74BF0100BEDE710 +:10883000BBF17F0F19D8A6F13003092BD2D81BF05A +:10884000400F03D00A2101FB0737DFE70A2101FBB4 +:1088500009394BF0200BD9E72E2E06D11BF0400F23 +:1088600040F09E804BF0400BD0E76C2E31D02BD8DF +:10887000682E36D06A2E3CD04C2E3AD0002F46F0CF +:108880002003B8BF2BF04002A3F16501BCBF1FFA63 +:1088900082FB0027022901D9612B2FD1073525F052 +:1088A0000705DFF8ACA2083507271BF0080F66D0D4 +:1088B0000AEB070B56465E4563D1A4EB0A0A06EBAA +:1088C0000A02A9EB07096FE1742E9FD07A2E9DD082 +:1088D000D4E71BF0800F18BF4BF4007B4BF0800BEC +:1088E00094E71BF4807F18BF4BF4007B4BF4807B34 +:1088F0008CE74BF4207B89E71F4687E7A6F16301ED +:10890000122900F2F080DFE811F013004F00EE00B2 +:10891000EE00EE00EE004F00EE00EE00EE00EE0086 +:10892000EE00FE00E900EE00EE001B00EE00AF00DE +:1089300055F8043B8DF8183001270DF1180AB4E7FB +:1089400055F804AB834BBAF1000F08BF9A461BF0F1 +:10895000400F14BF39464FF0FF31504603F009FB7A +:108960000746A2E7029B41462020984700280FDBDC +:10897000013EB742F6D34C44A41BB14698E74E469D +:10898000F7E716F8010B029B41469847002892DA58 +:1089900098F8023043F0040388F802304FF0FF34B7 +:1089A00020460DB0BDE8F08F1BF0800F34D01BF4D3 +:1089B000007F2CD0073525F00705AA4669685AF8CC +:1089C000080B2BF010050029ADB237DA404261EBFD +:1089D000410145F480650DF1180B0A235A4603F056 +:1089E000D4FAA0EB0B0301936B0662D5019B25F033 +:1089F00001019F4289B240F3A180002E00F09980CE +:108A000015F0100240F09C80BB460D4623E0AA46BC +:108A10005AF8040BC117D4E7AA461BF4807F5AF812 +:108A2000041B01D10846F5E71BF4007F15BF48B2CF +:108A300008B241F3C01141F3C031C2E750EA01036B +:108A4000C9D11BF0400FC6D0002FC4D12BF01102AA +:108A500095B2BB46019740F2064115EA01021CBFE0 +:108A60000BF1010B00222CE02BF010021FFA82FB0D +:108A70000A231BF0800C49D01BF400711DBF073581 +:108A800025F00705AA46AA461ABF5AF8080B6968D6 +:108A90005AF8040B50EA010545D12BF016051BF0DE +:108AA000400FADB242D0002F40D12BF0170295B24B +:108AB000019715F0100248D0019B002E42D103F11E +:108AC000010B29075AD4EB0706D5D9456FDD01996B +:108AD000A9EB0B035F18CB465B4649E04BF0100B4C +:108AE00010237826C5E7782B04D1C6F1780343F02C +:108AF0001003BEE7029B4146252098470028FFF659 +:108B000047AF023447E608230026B2E7AA461BF423 +:108B100080715AF8040BBDD01BF400711ABFC0B2AB +:108B2000614680B2B6E72BF0060295B20DF1180B44 +:108B300054E725F01105ADB2BB468CE70D46B8E70A +:108B40003B460D4603F1020BBBE7DDF804B082E7BC +:108B50005BC7000054C70000CDE904324146029BC8 +:108B6000202098470028FFF613AF049B059A013395 +:108B70009945F1DCA4EB0B01CC189B460AB3029B90 +:108B80004146302098470028FFF602AF8EB90134E5 +:108B90002744019B391B994224DC1D465DBB019A89 +:108BA000A9EB0B09224455461446914435E0019F38 +:108BB00092E7023441463046029B98470028E7DAA4 +:108BC000E6E640F206410D42E2D015F0020F14BF76 +:108BD0002B20202015F4806F04F10104414618BFBA +:108BE0002D20E9E7029B414630209847002804F1F8 +:108BF0000104CEDACCE606AB013D4146585D029B4E +:108C000098470028CADAC3E6029B414620209847CD +:108C1000002804F10104FFF6BBAEA9EB0403002B0E +:108C2000F2DCBFE5704738B513468568046912F475 +:108C3000801F07D012F4402F04D012F0010F01D092 +:108C400082F4402323F4801213F0010F0AD023682A +:108C50004FF0010C0CFA01FC43EA0C0323602B6873 +:108C6000984738BD23684FF0010C0CFA01FC23EA49 +:108C70000C032360F3E708B503468C4600681979B6 +:108C8000DA8842EA0C02FFF7CEFF08BD08B50346BA +:108C900000681B790121994083685B69984708BD8A +:108CA00008B520EAE070C117C90341EA5041C0038A +:108CB00040F2E733C0184FF47A724FF0000341F1ED +:108CC0000001F8F71DFAFFF791F808BDC90004315B +:108CD000084470474FEAC10C00EBC103DB8899429E +:108CE0000CD08444BCF80410043240F82230CA008E +:108CF00006328352DB000433C1527047C36801213E +:108D0000914023EA0103C3600432002340F822307B +:108D1000704710B5131D50F8234074B9C36801247F +:108D200094402343C360043240F82210CB001A1D44 +:108D300089B281520633C15210BDE2000432835A17 +:108D40004FEAC10C0CF1040E20F80E300CF1060CA9 +:108D500020F80C40DB00063389B2C1528152EBE7A8 +:108D600000B5CB00023330F803E0A2EB010C891A06 +:108D700001EB5E014FEA4C0E20F803E04FEA410E92 +:108D8000D300023320F803E020F832C0C35A02EBCC +:108D9000530220F832105DF804FB00B5C90002311F +:108DA00030F801E04FEAC20C0CF1020C30F80C3044 +:108DB0005B0803EB5E034FEA430E20F801E030F856 +:108DC0000C1002EB510220F832305DF804FB04393C +:108DD000081AC008704708B500EBC1035A8852084A +:108DE000B2FA82F2C2F11F02FFF774FF08BD08B5A4 +:108DF00000EBC1035A885208B2FA82F2C2F11F0294 +:108E0000FFF787FF08BDF8B504460D46CE00B71C36 +:108E1000C15B05EB510100EBC1035B8813F0010F4F +:108E20000CD0A15B691A04EBC1035B8813F0010F3E +:108E30000ED029462046FFF7DAFFF8BDFFF7CBFF3B +:108E4000E25B05EB520229462046FFF7A6FFE8E762 +:108E50002046FFF7C0FFA15B2A46691A2046FFF7AC +:108E60009CFFA35BED1AE4E770B5B1FA81F3C3F19F +:108E7000230450F82450CDB1C3F11F024FF0030E6C +:108E8000141D50F824404FEAC40C00EBC406768849 +:108E9000B1EB560F14D98444BCF80640161D40F8B7 +:108EA0002640BEF1010E01D0A542E9D1C468C3F14C +:108EB0002002012393405B421C4005D1204670BD37 +:108EC0002146FFF707FFF9E794FAA4F2B2FA82F21B +:108ED000131D50F823402146FFF7FCFEEEE779B161 +:108EE00010B504682046FFF772FF014604EBC0028C +:108EF000538823F0010353802046FFF784FF10BD01 +:108F00007047F8B5056841B30B46AA68B2EBD10FBC +:108F100025D90B33DC0821462846FFF7A5FF074675 +:108F2000F8B1C60005EBC0035B88B4EB530F09D35F +:108F3000AB195A8842F001025A8039462846FFF799 +:108F4000C5FEF8BD0444224601462846FFF708FF47 +:108F500021462846FFF74BFFEAE70020F1E7002013 +:108F6000EFE70020EDE72DE9F843154606684B4290 +:108F70000B4001F1FF3919EA010904D0032B48D84D +:108F80004C46994603E00C4604293DD90423002DA4 +:108F900057D0B268B2EBD50F56D96119C91A0B3147 +:108FA000C9083046FFF760FF074600284FD001464A +:108FB0003046FFF78BFE00EB0908A04408F1FF38AC +:108FC000B8FBF4F804FB08F8A8EB090808EB050463 +:108FD000073424F0070441463046FFF7F8FE054603 +:108FE000A41BE410874218D3EF0006EBC5035B888F +:108FF00005EB53039C421AD33E44738843F00103AC +:1090000073804046BDE8F8831146FFF77AFF80463B +:10901000F7E74C4699460423B9E7024639463046FD +:10902000FFF79EFE39463046FFF7E1FEDCE72246B9 +:1090300029463046FFF794FE21463046FFF7D7FE1B +:10904000DAE74FF00008DCE74FF00008D9E74FF00F +:109050000008D6E770B50346043AC81D20F00700A3 +:109060000A4422F00702121AD5081860856000230E +:10907000C360B5FA85F1C1F1200EC1F12401890068 +:10908000CE1DF10805E003F1040C002440F82C404B +:1090900001337345F7DB4C00A4B244804FF0000C61 +:1090A000A0F800C044F0010444806B1A4FEA430E5C +:1090B00026F00704A51C20F805E0015322F0070460 +:1090C000951C20F805C002440353538843F0010364 +:1090D0005380FFF78CFE70BD002070470FB400B5C1 +:1090E00083B004A951F8040B0191F8F7B9F903B062 +:1090F0005DF804EB04B070470B4639B11168196094 +:1091000041688A4209D000231360704713680360E6 +:1091100041688A42F7D14360F5E74360F3E708B559 +:109120000A460368002101E019461B682BB19342EF +:10913000FAD1FFF7E1FF012000E0002008BD01F0B7 +:109140000701038B23F007030B43038370472DE9CB +:10915000F04106460F469046816821B10C683CB14B +:1091600031B90C4604E00C4602E0234621461C4679 +:1091700069B14D6843463A463046A847002CF4D0C2 +:109180002368002BF2D0002CF0D12346EEE7BDE897 +:10919000F081038B13F0070303D102680AB10320A7 +:1091A0007047022B03D0012B06D000207047428B62 +:1091B000002AF8D10420704703680BB105207047DE +:1091C0000020704710B504468C46038B002A07DB4D +:1091D00003F007035A1F012A0ED9042B36D010BD05 +:1091E000D0E900018CE803000023236063600121C3 +:1091F0002046FFF7A4FFF2E7D0E900018CE8030066 +:10920000002222606260062B1BD1DCF8003053B1D3 +:10921000628B013262831A461B68002BF7D0002A4A +:10922000F5D11346F3E702212046FFF788FF2046D9 +:10923000FFF7AFFF0028D2D0238B43F02003238316 +:10924000CDE700212046FFF77AFFF0E70021FFF786 +:1092500076FF2046FFF79DFF0028C0D0238B43F008 +:1092600020032383BBE750B110B50C4651B1081D54 +:1092700000F006F910B9A368032B06D810BD6FF0F3 +:10928000150070476FF01500F8E76FF01500F5E76F +:109290002DE9F04107460C4616461D461946201D8D +:1092A00000F005F928B180462B4632462146384663 +:1092B000C047BDE8F0812DE9F04180460C461746D5 +:1092C0001E4604E033463A464046FFF7E1FF216878 +:1092D00031B10D68256063688B42F3D16560F1E7B9 +:1092E000BDE8F08108B5EFF311824FF0200C8CF34C +:1092F0001288BFF36F8F41610121F8F7E7F808BDCD +:10930000034670B181B10A688AB14A6892B10020FF +:10931000186058609860D860186158619861196148 +:1093200070476FF0150070476FF0150070476FF0D1 +:10933000150070476FF01500704770B505460E4672 +:10934000FFF791FF041E2EDBEFF31182202383F33E +:109350001288BFF36F8FB5F818C00CF0070C6B8B39 +:109360004FF6FF718B422CD06446BCF1020F08D03F +:10937000BCF1060F19D8DFE80CF01E1818181E2AC9 +:109380001E0001336B8301230021084628B1002011 +:109390003060686808B306606E6009BB82F31188AC +:1093A000BFF36F8F0BBB204670BD6FF0040400232A +:1093B00019461846EAE7BCFA8CF149090023012056 +:1093C000E4E76FF00A04002319461846DEE76FF061 +:1093D0008504002319461846D8E76E602E60DCE746 +:1093E00002212846F8F772F8DDE70023624631468D +:1093F0002846FFF74DFFD6E710B5EFF31182202383 +:1094000083F31288BFF36F8F038B03F00703022BE4 +:1094100007D0012B02D06FF0850408E06FF0040440 +:1094200005E01C46438B013B9BB243832BB182F387 +:109430001188BFF36F8F204610BD0221F8F746F860 +:10944000F9E7B8B1C9B138B5EFF31185202383F33B +:109450001288BFF36F8F038B03F00704FFF75FFEE3 +:1094600008B1204601E06FF0770085F31188BFF363 +:109470006F8F38BD6FF0150070476FF015007047A3 +:10948000024658B1436803F00303012B03D0032BBA +:1094900007D1036843B10020906070476FF015005A +:1094A00070476FF0150070476FF015007047034666 +:1094B000426802F003028160032A03D1006800229F +:1094C0005A6070470020FAE770B40346C6684568E2 +:1094D000A81BDC69844215D9201AD3F814C0A5EB67 +:1094E0000C0CA4EB0C04A24228BF2246904228BFD9 +:1094F00010461A68AD1B2A440A605A6802445A6032 +:1095000070BC7047001B2644E6E730B444688368AB +:10951000E41A8C422CBF002401248CB90246194461 +:1095200081604160C568491BC3698B428CBF0020C4 +:10953000012008B930BC70472B44D3602046F9E7BE +:109540006FF01500F6E72DE9F04182B080460E4637 +:10955000154600272A4601A94046FFF7B5FF0446F5 +:1095600002463146019802F067FD274426442D1B30 +:1095700001D0002CEED139464046FFF7C6FF3846F1 +:1095800002B0BDE8F08170B4034686690569A81B86 +:10959000DC69844211D9201A9C68641BA24228BF4E +:1095A0002246904228BF10461A68AD1B2A440A6022 +:1095B0001A6902441A6170BC7047001B2644EAE72E +:1095C00030B404694369E41A8C422CBF002401249E +:1095D0008CB902461944416101618569491BC3691F +:1095E0008B428CBF0020012008B930BC70472B444F +:1095F00093612046F9E76FF01500F6E72DE9F04199 +:1096000082B080460E461546002709E002460199C1 +:10961000304602F011FD264427442D1B09D044B1E9 +:109620002A4601A94046FFF7AEFF0446002EEDD1C1 +:10963000F2E739464046FFF7C3FF384602B0BDE8BF +:10964000F081704700F07F0310F0700F09D110F027 +:10965000800F02D1012098407047103301209840BC +:109660007047002070470020704710B582B08478A2 +:109670008DF80040C37803F003038DF804302046D2 +:10968000F8F704FF2046F8F757F9B0FA80F04009E0 +:1096900002B010BD08B5914202D0FFF7E6FF08BD49 +:1096A000F8F7A4F9FBE7F8B504460E461546176827 +:1096B000F8F76AF800B9F8BD2079F8F76FF80028D4 +:1096C000F9D094F90030002B04DB63780B2B13D016 +:1096D0000020F0E763781BB10A2B07D00020EAE7EF +:1096E00000233B707B7002233360E4E72A46314657 +:1096F0002046F8F729F8DEE72046F8F7B9F9DAE767 +:10970000F8B50E46047917682046F8F759F805466B +:1097100030B134F0800305D0F8F736F810B90546BB +:109720002846F8BD39462046FAF75AFB00237B70DD +:1097300002233360F4E708B590F90030002B06DB14 +:109740004378012B0AD0032B10D0002002E043788D +:109750000BB1002008BDFFF7D3FFFBE743880BB137 +:109760000020F7E70021F8F711F9F3E743880BB180 +:109770000020EFE70121F8F709F9EBE72DE9F843BD +:109780008146884617461E46032500E01D4633469F +:109790003A4641464846FAF775FB044610F10B0F6E +:1097A00004D1FEF78FFA6B1E002DEFD12046BDE8E5 +:1097B000F88310F8022BD31E5208023A08E0002169 +:1097C000C154591E10F802C000F801C0023B013A12 +:1097D000002BF4DA704710B582B0044600238DF8F0 +:1097E00000304022ADF802208DF80430684600F0C9 +:1097F00025FC20B9BDF80230E37102B010BD08238A +:10980000ADF80230684600F019FC0028F2D00023C1 +:10981000ADF80230EEE72DE9F04383B00546894606 +:109820009046002747E0D8F8002004F110010123FA +:109830008B401A4208D164F07F038DF800306846EF +:1098400000F0FCFB0346D0B10134E4B20F2C31D858 +:10985000EB7803F003038DF80430AB88ADF80230E9 +:10986000AB788DF8003013F0800FDCD1D8F80020F1 +:109870000123A3401A42E7D18DF80040DFE79DF8AD +:109880000020AA70327112F0800F0AD1D8F800209F +:109890000121A1400A43C8F80020184603B0BDE8E2 +:1098A000F083D8F8002010340121A1400A43C8F801 +:1098B0000020F2E7013799F81C309F4209D2D9F80D +:1098C0002060AA7806EBC70633799A42F2D10124C8 +:1098D000BCE74FF0FF33E0E738B50446F8F7C6FBC6 +:1098E00030B10546F7F776FD024608B1102800D0E2 +:1098F00038BD2946A01C02F09FFBF9E7006810B1B3 +:10990000043800E0184650B103685B688B4206D00B +:10991000031DF7D040680028F5D00438F3E77047FE +:10992000006810B1043800E0184660B103685B6855 +:109930005B689B788B4206D0031DF5D040680028F9 +:10994000F3D00438F1E77047006800B10438B0B1D3 +:1099500030B403E0406800B1043870B103685C685B +:10996000256A0023227F9A42F4D905EBC3021279BB +:109970008A4202D00133DBB2F4E730BC7047704753 +:1099800008B5F8F741FC28B1436813F1100F03D074 +:10999000002008BD0020FCE70120FAE781708176F5 +:1099A0004B1CDBB280F82530C37600F8061C7047EC +:1099B00008B550F8083C50F8041CD0F89C009847B3 +:1099C00008BD0369002283F84A207047036993F8B1 +:1099D0004A2022B193F848301BB90020704700207C +:1099E0007047012070470369002283F84B207047BD +:1099F000036993F849300BB9002070470120704784 +:109A0000036993F8482012B193F84A203AB993F8C1 +:109A1000492032B193F84B302BB900207047012018 +:109A2000704700207047012070470120704703698C +:109A300019605A60704770B505460469D4F88C0007 +:109A4000FFF7DCFD0646D4F88C3019699A6891421C +:109A500012D094F8A0206AB1DA6959685B69CB1A10 +:109A6000D31A3F2B06D96A6894F89E3043B9002375 +:109A700084F8A030304670BD002284F84920E8E721 +:109A8000136A22460021187BF8F7FCFDEFE708B5C2 +:109A90000122FFF7D0FF012801D1002008BD4FF0BF +:109AA000FF30FBE708B520EAE070C117C90341EABF +:109AB0005041C00340F2E733C0184FF47A724FF0C0 +:109AC000000341F10001F7F71BFBFEF78FF908BD1A +:109AD000FEE708B5012802D0FDF790F908BDEFF3C5 +:109AE0000583F9E708B501460068FFF7F2FF08BDF6 +:109AF00008B5F9F751F8F9F77BF808BD0020704771 +:109B000000230B70704708B500231370CB1E092B80 +:109B10001AD8DFE803F005090D11191919191914DC +:109B20001146F9F779F910E00021F9F70BF90CE08B +:109B30000021F9F771F808E0F9F7B4F805E01146EB +:109B4000FFF7DEFF002000E0002008BD08B540B2AE +:109B5000F9F7F6FA08BD08B540B2F9F7FFFA08BD03 +:109B600008B5013140B2F9F70BFB08BD08B500217B +:109B70000120FFF7AEFF08BD61B662B680F3118821 +:109B8000BFF36F8F704772B6002383F31188BFF362 +:109B90006F8FBFF34F8F30BF62B6BFF36F8F7047C9 +:109BA00072B6002383F31188BFF36F8FBFF34F8F1B +:109BB00020BF80F31188BFF36F8F62B67047436890 +:109BC0005A1E134206D11F2B06D903681A4205D02C +:109BD0000020704700207047002070470120704728 +:109BE00000B585B00B6801934B688A68202B12D9A9 +:109BF000B3F1004F11D8013BB3FA83F3C3F11F0354 +:109C00005B0003F03E031343039301A9F9F7C4FB80 +:109C100005B05DF804FB0823F5E73E23F3E72DE9E3 +:109C2000F84380460F4699461646002509E021462E +:109C3000F0B2FFF7D5FF064610F1160F14D001362B +:109C40000135BD4210DA05EB450408EB8404626877 +:109C5000002AF5D0B9F1000FE9D02046FFF7AFFF99 +:109C60000028E4D16FF015063046BDE8F883F0B562 +:109C700085B0054603A8F7F7DFFC0646002424E07C +:109C8000B3F5801F20D1576809589368202B64D9F9 +:109C9000B3F1004F63D8013BB3FA83F3C3F11F0361 +:109CA0005B0003F03E0343F0885343F430230097F6 +:109CB0000191029369462878F9F76EFB0028C0F2FB +:109CC000A8802B7801332B700134B44280F0A4803B +:109CD0002001039901EB0412D3681B0D1B05B3F59A +:109CE000000F5ED01DD8B3F5001F3AD0B3F5800F3A +:109CF000C6D1576809589368202B4ED9B3F1004F4D +:109D00004DD8013BB3FA83F3C3F11F035B0003F0AB +:109D10003E0343F0E06343F4003300970191029364 +:109D2000C8E7B3F1807F56D0B3F1007FCCD157683C +:109D300009589368202B68D9B3F1004F67D8013BCD +:109D4000B3FA83F3C3F11F035B0003F03E0343F454 +:109D50008023009701910293ACE70823A3E73E23F9 +:109D6000A1E7576809589368202B12D9B3F1004F27 +:109D700011D8013BB3FA83F3C3F11F035B0003F077 +:109D80003E0343F0885343F400230097019102936C +:109D900090E70823F5E73E23F3E70823B9E73E23DE +:109DA000B7E7576809589368202B10D9B3F1004FD3 +:109DB0000FD8013BB3FA83F3C3F11F035B0003F039 +:109DC0003E0343F0827300970191029372E70823E8 +:109DD000F7E73E23F5E7576809589368202B10D919 +:109DE000B3F1004F0FD8013BB3FA83F3C3F11F0364 +:109DF0005B0003F03E0343F08873009701910293E8 +:109E000058E70823F7E73E23F5E708239FE73E23BB +:109E10009DE76FF0150000E0002005B0F0BD08B52B +:109E2000F9F7CEFA08BD08B5F9F7D4FA08BD08B5B8 +:109E3000F9F744FB002008BD11F0800F05D111F0A7 +:109E4000080F11D0D0F8A807704711F0080F02D002 +:109E5000D0F8A806704701F00F0101EB810100EB7B +:109E60008100D0F80806704701F00F0101EB810175 +:109E700000EB8100D0F80807704700F07F0310F076 +:109E8000800F06D1082B0FD010F0780F0ED10120D3 +:109E90007047082B04D010F0780F03D101207047D1 +:109EA0000120704700207047012070470020704754 +:109EB00008B540F08000F9F73FFB08BD08B5F9F799 +:109EC0003BFB08BD10B50446036943618361002371 +:109ED000C360837F33B90123237700236377A3779C +:109EE000E37710BD407AFAF7EFFFF4E7012808D0D6 +:109EF000022802D000B17047012008B5F9F7C0FB75 +:109F000008BD0020F9E710B50446FFF79AFA10F1F2 +:109F1000780F00D010BD2046FFF76EFAFAE708B5BB +:109F200000F120030022BFF35B8F53E8001F0129DB +:109F300004D143E8002CBCF1000FF6D1BFF35B8FD6 +:109F400005D100F10C01C069FFF7DDFF08BD00205D +:109F5000FCE710B5002400E00134072C09DCE0B276 +:109F6000FFF7A6FF037A002BF6D0407AFBF774F8D0 +:109F7000F2E78820FFF79CFF037A0BB9002404E086 +:109F8000407AFBF769F8F9E70134072C09DCE0B205 +:109F9000FFF794FF037A002BF6D0407AFBF75CF8CA +:109FA000F2E70820FFF78AFF037A03B910BD407A71 +:109FB000FBF752F8FAE74B7FFBB170B584B00C4663 +:109FC0000B7F0BB904B070BD00264E770E7700F101 +:109FD00038054FF0FF324FF0FF332846FDF7C2F847 +:109FE0006369019363680293039601A9607AFAF7A3 +:109FF00045FC2846FDF736F9E4E7704708B500F15F +:10A0000020030122BFF35B8F53E8001F002904D116 +:10A0100043E8002CBCF1000FF6D1BFF35B8F0BD1EE +:10A0200000230361436183610123436100F10C015B +:10A03000C069FFF782F908BD0020FCE7027802F052 +:10A040000F01037903B981B9082911D8012B06D072 +:10A05000012B10D012F0080F0FD10020704712F022 +:10A06000080FF5D14FF0FF3070474FF0FF307047C9 +:10A070004FF0FF307047002070474FF0FF307047BF +:10A0800038B50446F9F758FA68B10546037A6BB15A +:10A090002046FAF7AFFF0024AC772846FFF712FFFF +:10A0A0002C72204638BD6FF01500FBE76FF077008B +:10A0B000F8E770B505460C461646F9F767FF18B97C +:10A0C0001CB12846F9F7C0FF70BD002EF9D1FBE79F +:10A0D0004FF08053D3F83031082B01D00020704767 +:10A0E000012070474FF08053D3F83031082B01D056 +:10A0F00000207047012070474FF08053D3F8302183 +:10A10000D3F83431082A01D000207047002B04D83E +:10A11000DFE803F0010000207047012070474FF096 +:10A120008053D3F83031082B01D000207047012034 +:10A1300070470020704730B44C68A34208D900250E +:10A140004560096801609A420BD0002030BC70471E +:10A1500043600D680560E41A4C60086818440860A4 +:10A16000F1E70CB90020F1E70120EFE710B5044654 +:10A1700008E042F08000D2B20123934024EA0304B5 +:10A18000FAF7C0F854B194FAA4F2B2FA82F2114686 +:10A190000F2AEED9A2F11000C0B2ECE710BD90FA80 +:10A1A000A0F0B0FA80F07047034619B101290CD035 +:10A1B00000207047D3F81804C0F300407AB1D3F8F8 +:10A1C000183403F0030313607047D3F80C04C0F392 +:10A1D000004022B1D3F80C3403F001031370704730 +:10A1E000006901EB4101890038310844704740683B +:10A1F00000EBC10070470069C1EBC10100EB8100B9 +:10A20000704708B5C9B2FFF7EBFF806800F00700A0 +:10A2100008BDEFF31182202383F31288BFF36F8F01 +:10A22000036813F0C00301D08B4207D10123036000 +:10A23000002082F31188BFF36F8F70474FF0FF301B +:10A24000F7E7EFF31182202383F31288BFF36F8FB8 +:10A25000036803F0C00C03F00703012B08D08C4502 +:10A2600009D04FF0FF3082F31188BFF36F8F704732 +:10A2700001600020F7E76FF07700F4E7EFF3118259 +:10A28000202383F31288BFF36F8F036803F0C003AA +:10A2900043F00203036082F31188BFF36F8F7047AE +:10A2A000F8B506460C46FFF79BFF05684768002394 +:10A2B00040F8083BFFF7E2FF1DB13A462146304621 +:10A2C000A847F8BD70B506461546CCB22146FFF743 +:10A2D00087FF29460830FFF79CFF002806DB214650 +:10A2E0003046FFF784FF43689847002070BD08B5EB +:10A2F0008022FFF7E7FF08BD2DE9F04106469046B2 +:10A300001F46CDB22946FFF76BFF04460699083079 +:10A31000FFF797FF002809DBC4F800806760294633 +:10A320003046FFF764FF036898470020BDE8F081DE +:10A3300010B582B080240094FFF7DEFF02B010BD9C +:10A3400010B51446C9B2FFF756FF0021A04710BD53 +:10A3500008B50120FCF782F808BD08B50020FCF71D +:10A360007DF808BD08B5012000F032FD08BD08B534 +:10A37000002000F02DFD08BD08B520EAE070C117EF +:10A38000C90341EA5041C00340F2E733C0184FF41B +:10A390007A724FF0000341F10001F6F7B1FEFDF7CC +:10A3A00025FD08BD08B51046FCF7D4FF08BD0B46D7 +:10A3B00039B11168196041688A4209D000231360DD +:10A3C00070471368036041688A42F7D14360F5E73C +:10A3D0004360F3E708B50A460368002101E0194627 +:10A3E0001B682BB19342FAD1FFF7E1FF012000E097 +:10A3F000002008BD70B504460D461646036833B10B +:10A40000FFF7E8FF70B91EB96FF0150006E032B132 +:10A4100023682B602560636843B1002070BD6FF036 +:10A420001500FBE7002EF3D10020F7E76560002060 +:10A43000F4E770B50E461546016821B10C683CB1D1 +:10A4400031B90C4604E00C4602E0234621461C4686 +:10A4500071B18A682A4002D04B6830469847002C78 +:10A46000F3D02368002BF1D0002CEFD12346EDE789 +:10A4700070BD0069003818BF0120704710F0100F40 +:10A4800004D110F0200F03D1002070470320704743 +:10A490000120704743685B68D3F810350B600020DB +:10A4A000704743685B6802EA010021EA0201C3F8D1 +:10A4B0000805C3F80C150020704743685B68C3F8B3 +:10A4C00008150020704743685B68C3F80C1500202E +:10A4D000704743685A68D2F8043521EA03000B40FC +:10A4E000C2F80805C2F80C3500207047B0F5800F9F +:10A4F00007D0B1F1C06F0DD0B1F1007F08D00120BD +:10A500007047B1F1007F01D00520704704207047EB +:10A51000022070470320704708B500690430FFF738 +:10A5200069FF08BD10B500F01F044009FBF714F8DF +:10A5300030B1014600690122A2400430FFF779FFE3 +:10A5400010BD10B584B00C464FF080531A6E0092C7 +:10A55000596E01910B0A03F47F4343EA11634FEAFA +:10A56000012C0CF47F0C43EA0C0343EA01630293D1 +:10A57000130A03F47F4343EA1263110201F47F01DB +:10A580000B4343EA02630393082C00D908242246B4 +:10A5900002A901F051FD204604B010BD00B543688A +:10A5A000136001E008331360136890F808C0D0F816 +:10A5B00004E00EEBCC0C634505D293F805C08C4546 +:10A5C000F0D1002001E06FF001005DF804FB08B558 +:10A5D00011B9FBF781F908BDFBF76AF9FBE743689E +:10A5E0001B68EFF31182202181F31288BFF36F8F74 +:10A5F000D3F8201131B10021C3F82011D3F8201174 +:10A600000121D96082F31188BFF36F8F704770B555 +:10A61000044646683568D5F8043313F4807F03D0C8 +:10A62000D5F82031002B37D1736813F0100F19D0F3 +:10A63000EFF31182202383F31288BFF36F8FD5F8D5 +:10A64000583113B10023C5F800352369DB680BB11D +:10A650001B691BB94FF48003C5F8083382F31188D6 +:10A66000BFF36F8F2369DA68AAB1D5F8581121B109 +:10A6700000211161DA68927B8AB9D5F8242122B1D0 +:10A680000022C5F82421D5F82421DA68136813B113 +:10A6900051682046984770BDFFF7A1FFC4E74FF40B +:10A6A0008002C5F80823DB689973F4E770B582B0BF +:10A6B00006460C4605694B79012B06D0032B11D0B9 +:10A6C0006FF08503184602B070BD00238DF8063088 +:10A6D000A379032B37D1E37943B1012B10D06FF06D +:10A6E0008503EFE710238DF80630F1E700238DF89E +:10A6F0000430237943B1022B21D06FF08503E1E7C9 +:10A7000001238DF80430F4E700238DF8053021682B +:10A710003046FBF76BF90346C0B9726810689DF8C4 +:10A7200005109DF806609DF8042031430A43C0F8E7 +:10A730006C25043594E8030085E80300C2E70E2386 +:10A740008DF80530E3E76FF08503BBE76FF0850315 +:10A75000B8E743681B68D3F88004C3F880047047E7 +:10A7600043681A685B6803F00203D2F8581129B9EC +:10A7700033B9D2F820312BB900207047012070473F +:10A78000002070470120704743681B680822C3F807 +:10A790000025704710B543681C68C4F84415C4F818 +:10A7A00048250022C4F82021D4F82011C4F85821EB +:10A7B000D4F858215B6813F0100F02D10123A36075 +:10A7C00010BD0121FFF7E0FF4FF48003C4F804330C +:10A7D000F4E710B4046943681B68D3F810215AB138 +:10A7E000A26912780A700020C3F81001D3F8102172 +:10A7F00001221A6010BC70474FF0FF30FAE743683F +:10A800001B680069002A0DDDD3F8102162B1002217 +:10A81000C3F81021D3F81021826912780A70012040 +:10A8200018607047002070470020704743681A681E +:10A830000169EFF31183202080F31288BFF36F8F3B +:10A84000C968002088734FF48001C2F8041383F3B1 +:10A850001188BFF36F8F70470369DB6801229A7319 +:10A860007047436819680369DB689A7B5AB9D1F865 +:10A87000582152B1D1F8042312F4800F07D00022DE +:10A880001A610120704700207047002070470020A7 +:10A89000704743681B68D3F81001003818BF0120C7 +:10A8A000704743681B681022C3F80423704743684D +:10A8B0001B681022C3F80823704743681B684FF4D5 +:10A8C0000072C3F80423704743681B684FF400729A +:10A8D000C3F80823704738B5044643681D68D5F8A7 +:10A8E000043313F4800F06D1D5F8043313F0100F9E +:10A8F00007D1002038BDFFF7B4FF0028F4D00120B5 +:10A90000F8E72046FFF7C5FF0028F3D00120F1E764 +:10A91000012070470369D8680160DB685A6070479E +:10A92000F8B505460669F3689C899442A8BF1446A9 +:10A9300010330122BFF35B8F53E8000F002803D1CF +:10A9400043E80027002FF7D1BFF35B8F1FD1F368D7 +:10A950002246986801F070FBEFF31187202383F300 +:10A960001288BFF36F8F2846FFF7FAFE40B9F368ED +:10A9700000241C6187F31188BFF36F8F2046F8BD58 +:10A98000F368224699682846FFF704FFF2E700249F +:10A99000F4E708B520EAE070C117C90341EA504165 +:10A9A000C00340F2E733C0184FF47A724FF000034F +:10A9B00041F10001F6F7A4FBFDF718FA08BD70B5E8 +:10A9C000064612E075B1EFF31184202383F3128859 +:10A9D000BFF36F8F3046FFF7C3FE98B984F3118839 +:10A9E000BFF36F8F0120FFF7D4FF64243046FFF7D9 +:10A9F000B7FE05460028E5D1012000F0A8F9013C8A +:10AA0000F4D1DFE7204670BD10B582B0044601AA3C +:10AA1000FFF7C4FD002805DB019B2268197918683F +:10AA2000FAF76EFF02B010BD2DE9F0410446476809 +:10AA30003E68D0F810800021C6F80015C8F8000064 +:10AA4000F868FFF7E1FF051E35DB08F10401204639 +:10AA5000FFF72CFE054670BB7B6813F0020F2DD16B +:10AA60000823C6F800353B7A5BB9C6F81031D6F832 +:10AA70001031D8F81830C6F834350123C6F8383507 +:10AA800033607B6813F0020F03D14FF48073C6F874 +:10AA900004337B6813F0100F03D04FF48003C6F823 +:10AAA0000433D8F81430C6F844350023C6F84835C6 +:10AAB0000123B360F3602846BDE8F081414630468B +:10AAC000FBF768F80028CBDA0546F4E710B5044632 +:10AAD000002201210220FFF743F80220FFF736F899 +:10AAE00001212046FFF7A0FF10BD00B5A2F5807E32 +:10AAF0004FEA9E0E4FF0010C0CFA0EFC1CEA010FFF +:10AB00000DD0815809B900200AE0002181508258F7 +:10AB10001BB11A684CEA02021A60012000E0002012 +:10AB20005DF804FB70B582B006460D460024019422 +:10AB300009E0A20001AB02F5A07229463046FFF7FA +:10AB4000D4FF0134E4B2032CF3D915F0010F02D085 +:10AB5000D6F8003143B915F0020F02D0D6F804310F +:10AB600063B9019802B070BD0023C6F80031D6F871 +:10AB70000031019B43F001030193ECE70023C6F889 +:10AB80000431D6F80431019B43F002030193E8E756 +:10AB9000401A20F07F40704700F150039B009BB2A9 +:10ABA00003F1804303F588331868003818BF01208B +:10ABB000704700F150039B009BB203F1804303F503 +:10ABC000883300221A601B68704720F07F4070476E +:10ABD000EFF31180202383F31288BFF36F8F704748 +:10ABE00080F31188BFF36F8F7047F0B585B00446CE +:10ABF00017461D46FBF760F806469DF83030029375 +:10AC00000B9B01930A9B00933A462B462046FBF789 +:10AC100021F9054631462046FBF7A4F8284605B041 +:10AC2000F0BD08B5FDF7A0FB08BD08B5F7F7A0FE1D +:10AC3000F7F79EFFFFF7F5FF08BD4FF08053D3F8FD +:10AC40003031082B01D000207047012070474FF0B1 +:10AC50008053D3F83031082B01D0002070470120F9 +:10AC600070474FF08053D3F83021D3F83431082A9D +:10AC700001D000207047002B04D8DFE803F001006A +:10AC800001207047002070474FF08053D3F83021E7 +:10AC9000D3F83431082A01D000207047002B04D8A3 +:10ACA000DFE803F0010001207047002070474FF0FB +:10ACB0008053D3F83021D3F83431082A01D0002052 +:10ACC0007047002B04D8DFE803F001000120704733 +:10ACD000002070474FF08053D3F83021D3F834313F +:10ACE000082A01D000207047002B04D8DFE803F0C9 +:10ACF000010001207047002070474FF08053D3F8C7 +:10AD00003031082B01D000207047012070474FF0F0 +:10AD10008053D3F83021D3F83431082A01D00020F1 +:10AD20007047042B01D8002070470120704708B5F8 +:10AD3000FFF7EDFF38B14FF01023D3F808224FF0A2 +:10AD40008043C3F8582508BD08B5804708BD08B53D +:10AD500000F091FB08BD034619B101290CD0002079 +:10AD60007047D3F81804C0F300407AB1D3F8183410 +:10AD700003F0030313607047D3F80C04C0F30040E2 +:10AD800022B1D3F80C3403F0010313707047002094 +:10AD9000704708B50020F8F707FA00B108BDFEF7C4 +:10ADA000D5FEFBE738B504460368012B02D033B962 +:10ADB000012300E001231D461BB1284638BD0023B6 +:10ADC000F9E70020FBF7DCFAFFF7E1FF2060F4E78A +:10ADD00008B5FBF7D5FA08BD10B401F5A27150F81B +:10ADE000214024F44F3424F4407440F8214050F8BA +:10ADF0002140120202F47C521B0403F440331A4334 +:10AE0000144340F8214010BC704710B401F5A27102 +:10AE100050F8214024F4991424F4F85440F82140C7 +:10AE200050F82140120202F47C521B0403F4403318 +:10AE30001A439DF804301B0503F480131A4314438E +:10AE400040F8214010BC704700B5A2F5807E4FEA63 +:10AE50009E0E4FF0010C0CFA0EFC1CEA010F0DD0F7 +:10AE6000815809B900200AE00021815082581BB1A5 +:10AE70001A684CEA02021A60012000E000205DF826 +:10AE800004FBF0B583B005460E4617460024019436 +:10AE900009E0E2B2920001AB02F580723146284629 +:10AEA000FFF7D2FF0134BC42F3D301AB4FF4BE72C3 +:10AEB00031462846FFF7C8FF019803B0F0BD00B542 +:10AEC00083B00021019100910B460122FBF772FB38 +:10AED00003B05DF804FB00B585B08DF80F100DF1DF +:10AEE0000F030193002100910B460A46FBF78AFBF2 +:10AEF00005B05DF804FB38B50D460079FBF74AFC58 +:10AF000004462846FBF73CFC083034F8100000F0FB +:10AF1000010038BD38B50D460079FBF73BFC04460F +:10AF20002846FBF72DFC083034F81000C0F3401021 +:10AF300038BD38B50D460079FBF72CFC0446284691 +:10AF4000FBF71EFC083034F8100010F01C0018BF8E +:10AF5000012038BD38B50D460079FBF71BFC0446CF +:10AF60002846FBF70DFC083034F81000C0F3400011 +:10AF700038BD38B504460D46FFF7ECFF30B1294621 +:10AF80002046FFF7C7FF18B1012000E0002038BDC0 +:10AF90000020FCE708B5FFF7DDFF80F00100C0B23C +:10AFA00008BD7047704738B50D460079FBF7F2FBD6 +:10AFB00004462846FBF7E4FB083034F81000400B49 +:10AFC00038BD032894BF00200120704770B50646A5 +:10AFD0000D46002404E04FF0FF33AB4211D00134A2 +:10AFE0002F2C0CD83079FBF7D5FB04F1080330F88F +:10AFF000133013F4807FEED0C3F34323EDE700203A +:10B0000000E0012070BD38B504460D46FFF782FF11 +:10B01000B8B129462046FFF7BDFF90B1294620462A +:10B02000FFF7C1FF226801238340C2F8083322687A +:10B0300000F5A27052F8203023F0030342F82030CC +:10B0400003E000212846FFF746FF38BDF8B5064665 +:10B050000F4615460024002C03DD4FF0FF34204638 +:10B06000F8BD3079FBF796FB50F83430BB4201D085 +:10B070000134F0E700EBC4035B68AB42F8D1EEE7C4 +:10B0800038B50C460079FBF785FB05462046FBF7F3 +:10B0900077FB083035F81030C3F38203042B09D056 +:10B0A000052B01D1022006E02046FBF709FB18B171 +:10B0B000032000E0032038BD0220FCE710B5044661 +:10B0C0000846FBF75DFB083034F8103013F4807F3E +:10B0D00004D0C3F3432304EBC30010BD0020FCE7FE +:10B0E00070B504460E4615460079FBF753FB8660A3 +:10B0F0002079FBF74FFBC56070BD08B50079FBF701 +:10B1000049FB90F88000003818BF012008BD70B5D9 +:10B1100004460D4616460368D3F80423002A03DBD1 +:10B120004FF00042C3F8042329462046FFF7F2FE01 +:10B1300000B329462046FFF72DFFD8B12946204607 +:10B14000FFF731FF2268830003F580739BB2002173 +:10B1500099509B58226800F5A27152F8213043F0B3 +:10B16000010342F821306EB1226801238340C2F806 +:10B17000043307E029462046FFF782FF01462846B0 +:10B18000FFF7A9FE70BDF8B504460D461646FFF759 +:10B1900095FF20B10768426831462846B847A36842 +:10B1A0001BB1E268314628469847F8BDF8B5074616 +:10B1B0000E4614461D461046FFF703FF60B9022DE8 +:10B1C0001DD002213046FFF786FE032C1BD0022D36 +:10B1D00017D0032D1DD0F8BD224631463846FFF763 +:10B1E000D2FF3046FBF780FAA842F4D10021304666 +:10B1F000FFF771FE29463046FFF76DFEEBE70321AE +:10B20000E0E7012CE5D1224631463846FFF7BBFF87 +:10B21000E1E7022CDFD1F6E710B50C460079FBF729 +:10B22000B9FA21467430FBF755F810BD70B50546E4 +:10B230000846FBF7A5FA04462879FBF7ABFA04F1B8 +:10B24000080330F8133013F4807F0BD0C3F3432688 +:10B25000083423F4F85320F8143031462846FFF719 +:10B26000B5FE00B170BD2879FBF794FA002340F8D1 +:10B2700036302879FBF78EFA31467830FBF74EF8F6 +:10B28000F0E770B504460D46FFF744FE48B1266866 +:10B2900029462046FFF787FE00F5A270002346F8F6 +:10B2A000203029462046FFF7C1FF2079FBF772FACC +:10B2B00004462846FBF764FA0830002324F81030CF +:10B2C00070BD10B50C460079FBF764FA2146743066 +:10B2D000FBF724F810BD70B504460D461E460498D1 +:10B2E0004FF0000C01E00CF1010C84450ED25FFA26 +:10B2F0008CF2920002F580719208012303FA02F2A7 +:10B300001542F0D0002363506358ECE7002D04DAB7 +:10B310000023C4F87C31D4F87C3144F30730FEF7C5 +:10B3200015FC0EB1C4F8045370BDF8B506460F46BF +:10B33000144618E094FAA4F3B3FA83F301229A4076 +:10B3400024EA020403F5A27356F82350C5F3052539 +:10B3500056F82300C0F30140FFF723FE02462946BA +:10B360003846FFF710FF002CE4D1F8BD70B5054654 +:10B370000E46D0F80413C9B2326F41F00041FFF716 +:10B3800080FD041E05DB224631462846FFF7CDFF2F +:10B3900070BD31462846FBF7FBFB24F00044F2E782 +:10B3A00008B5FBF7FFFA08BD08B5FBF7F7F908BDCC +:10B3B00008B5FFF795FE08BD08B5FBF76BFA08BDA9 +:10B3C00008B5FBF7BFFB08BD08B5FFF796FE08BD43 +:10B3D00008B5FBF79DFB08BD08B5FFF772FF08BD78 +:10B3E00008B5FFF719FF08BD08B5FFF790FE08BDC7 +:10B3F00008B5FFF708FE08BD4FF08053D3F83021A1 +:10B40000D3F83431082A01D000207047022B01D034 +:10B41000002070470120704710B5044641B1FFF786 +:10B42000EBFF48B101234FF08042C2F8383600E00C +:10B430000023C4F8803510BD0123FAE708B50020C9 +:10B44000F7F7B2FE00B108BDFEF780FBFBE74FF057 +:10B4500080434FF46072C3F8042370474FF0804379 +:10B460004FF46072C3F80823704708B5FBF738FC47 +:10B47000FBF762F808BD00B9704708B5F8F750F857 +:10B4800008BD60B1C3685A7812F0010F03D01B7871 +:10B490001BB100207047002070470120704700203A +:10B4A0007047EFF31183202383F31288BFF36F8F6C +:10B4B000FEE708B5FFF7F5FF10B5446803688BB1E8 +:10B4C0002046984730B100280ADBFF2800DDFF2026 +:10B4D000E3681870E268537843F00103537010BDBD +:10B4E0004042F2E70020F5E708B500F0B3FD08BDE3 +:10B4F00008B500F0A1FD08BD426983681A4312F047 +:10B5000003020DD10021C16005E0C1681960C3606C +:10B5100041690B44013201699142F6D8002070471D +:10B520006FF01500704710B50446036142618160F9 +:10B5300000238361FFF7E0FF002801DB24606460E3 +:10B5400010BDF8B504460D46EFF31186202383F3B2 +:10B550001288BFF36F8FC36853B1E3682B60E56057 +:10B56000A369013BA36186F31188BFF36F8FF8BD18 +:10B5700000F1080700F0D9FA0028EED00022C0F848 +:10B58000AC20456100F064FA31463846FCF712FB06 +:10B59000EDE708B5EFF31183202383F31288BFF39F +:10B5A0006F8FFEF7F0FAF5E700BF7047884200DAC8 +:10B5B000014611F17F0F01DB084670476FF07E00F6 +:10B5C000704708B5806890F90E308B4201D1002099 +:10B5D00008BDFCF793FAFBE7034600209860D860AB +:10B5E0001B605B6070470B6803F003030B604268ED +:10B5F00032B1136803F003030B43136041607047DB +:10B6000041600160704708B591B18C460B6823F02A +:10B610000301032B18D9136803F003030B431360D2 +:10B62000DCF8003003F003031343CCF8003008BD0E +:10B630000168136803F003030B431360026043685F +:10B64000002BF4D14260F2E71146FFF7CCFFEEE7A2 +:10B6500008B50022C0F8AC20416100F0F9F908BD3E +:10B660002DE9F84304460E4615461F469DF8203046 +:10B6700000F10808EFF31189202282F31288BFF34A +:10B680006F8F03B14668404600F04FFA70B9B7B902 +:10B6900000232B602A4631462046FFF7B4FF494677 +:10B6A0004046FCF787FA0020BDE8F8832946FFF7FB +:10B6B000CFFF49464046FCF77DFA0020F4E7082119 +:10B6C0000020FCF70FFE20B1456001220260054614 +:10B6D000E0E789F31188BFF36F8F6FF00B00E3E7AA +:10B6E00060B1036813F0030F08D010B5446809B9BE +:10B6F000204610BD00F0B1FB2046FAE7704700B5C8 +:10B7000083B00A460123009300231946FFF7A8FFE0 +:10B7100003B05DF804FB3AB18A4208D38160C2608D +:10B7200000604060002070476FF0150070476FF0B8 +:10B73000150070470B4639B11168196041688A429B +:10B7400009D00023136070471368036041688A4280 +:10B75000F7D14360F5E74360F3E730B108B5002265 +:10B760001146B83000F075FA08BD0020704770B57A +:10B770000D46C36813F0020F22D1044613F0040FE4 +:10B7800023D10B68ABB1E36813F0010F14D0A368A9 +:10B790002B60022621462868FBF72AFE002811DBD1 +:10B7A000E36843F00403E3602B68A36036B13046DE +:10B7B0000AE083680B60E6E70126EBE7304601E02C +:10B7C0006FF00F0000232B6070BD0020FAE710B56A +:10B7D00082B00346EFF31184202282F31288BFF374 +:10B7E0006F8F0022019250F8042C22F0080140F8DB +:10B7F000041C12F0080F05D184F31188BFF36F8F7A +:10B8000002B010BD10389B69019301A9FFF7AFFF8B +:10B81000F2E708B5EFF31180202383F31288BFF31A +:10B820006F8FFCF7FBF908BD08B5C36823F0100360 +:10B83000C3601030FBF78EFD08BD0023036043603A +:10B840008360C3604160704710B582B001900846C4 +:10B85000EFF31184202383F31288BFF36F8F01A9C4 +:10B86000FFF785FF84F31188BFF36F8F02B010BD1F +:10B8700010B5FFF7E9FF041E01DC204610BDFFF7FD +:10B88000C8FFFAE738B504460D463022002100F023 +:10B89000E1FB65604FF48073E36038BD10B582B0A2 +:10B8A0000190EFF31184202080F31288BFF36F8F93 +:10B8B000C86810F01E0F06D0002084F31188BFF373 +:10B8C0006F8F02B010BD01A8FBF77CFEF5E7EFF328 +:10B8D0000580003818BF01207047F8B50546D31D14 +:10B8E00023F007037F3323F03F0301F14007A3F167 +:10B8F00040063F2B07D8002282F31188BFF36F8FD9 +:10B900000422104602DFCC1821462846F7F75CF9DE +:10B91000073020F00700C5F89470C5F89860C5F8A6 +:10B920009C00201AF8BD08B5FCF75AF908BD10B400 +:10B9300000248460037342738173C4738461C4619F +:10B9400010BC7047F0B587B00446129E139D0027C7 +:10B950000597109F04970F9F03970E9F02970D9FC7 +:10B9600001970C9F0097FBF7ABFEB5F1FF3F08BFB7 +:10B97000B6F1FF3F02D1204607B0F0BD32462B465C +:10B980002046FBF78FFEF6E70020704708B5F7F773 +:10B990006BFB08BD90F90E3091F90E00834201D087 +:10B9A000C01A70470020704770B506463468A6423A +:10B9B00016D0ACB16268236813605A600025256018 +:10B9C0006560637B23F002036373A56004F11800D4 +:10B9D00000F0A9F9C4F8AC502046FBF725FFE5E7D5 +:10B9E00070BD70B505460E46FBF7F2FE6B7B43F06B +:10B9F00002036B73FEB1AE603468A64208D1002426 +:10BA000006E063686B602C601D60656013E00024D5 +:10BA100064B121462846FFF7BDFF0028F1DC002C69 +:10BA2000F6D073689C42F2D02468F1E773682E6008 +:10BA30006B601D60756070BD70B5044616461D468E +:10BA4000FFF7CFFF32462B462046FBF7DDFE70BDE9 +:10BA500038B504460023EFF31185202282F31288C3 +:10BA6000BFF36F8F04E085F31188BFF36F8F01235D +:10BA700043B92046FFF788FF0028F4D12046FBF7A2 +:10BA8000D3FEF0E738BD10B50446183000F04BF98E +:10BA9000EFF31181202383F31288BFF36F8F637B51 +:10BAA00013F0100F04D081F31188BFF36F8F10BD16 +:10BAB00000222046FBF784FFF9E770B504460E46E6 +:10BAC0000023EFF31185202282F31288BFF36F8FDA +:10BAD00007E02046FBF7A8FE85F31188BFF36F8FC0 +:10BAE0000123DBB9637B13F0280FF5D1A3685BB1A9 +:10BAF0006268236813605A60002323606360627B7E +:10BB000022F002026273A360637B23F0040262737B +:10BB1000002EDED023F014036373DAE770BD08B59E +:10BB200001211838FFF7C9FF08BD70B5054600238D +:10BB3000EFF31186202282F31288BFF36F8F1C4629 +:10BB400005E0002486F31188BFF36F8F0123ABB9A2 +:10BB50002C68A542F5D0002CF4D0626823681360ED +:10BB60005A60002323606360627B22F002026273EA +:10BB7000A36004F1180000F0D6F8E3E7204670BD9A +:10BB800008B50023EFF31181202282F31288BFF35E +:10BB90006F8F04E081F31188BFF36F8F01237BB9AE +:10BBA0008368002BF6D04268036813605A60002354 +:10BBB00003604360427B22F0020242738360E9E744 +:10BBC000183000F0B0F808BD08B5EFF3118020235D +:10BBD00083F31288BFF36F8FFCF720F808BD38B5E8 +:10BBE000054600202C68A54208D03CB12046FFF74E +:10BBF000C7FF2046FFF72CFF0120F3E738BD031DE8 +:10BC000043608360704708B5EFF31181202383F30D +:10BC10001288BFF36F8F037B13F0010F08D1437BB2 +:10BC200013F0080F11D081F31188BFF36F8F0BE071 +:10BC300081F31188BFF36F8F002383F31188BFF363 +:10BC40006F8F0423184602DF08BD0122FBF7B8FE00 +:10BC5000FAE72DE9F0410546884617460023EFF341 +:10BC60001186202282F31288BFF36F8F184604E0FA +:10BC700086F31188BFF36F8F0123F3B92C68A542B7 +:10BC8000F6D0002CF4D0C4F8AC80676162682368F9 +:10BC900013605A6000232360636094F80DC02CF099 +:10BCA000020C84F80DC0A36004F1180000F03BF80A +:10BCB0002046FBF7B9FD0120DAE7BDE8F08110B5B9 +:10BCC0000446FCF7EFF948B102460369416920696F +:10BCD0001B18606941EB00011361516162682368C0 +:10BCE00013605A6000232360636010BD10B5FCF739 +:10BCF000CFF90446FCF7E2F97CB1236962691B1AAB +:10BD000062EBE072B3F1004F72F1000108DA002A31 +:10BD100001DB184610BD0023FBE76FF00040F9E798 +:10BD20006FF00040F6E770B504460023EFF311868C +:10BD3000202282F31288BFF36F8F6FF0150004E0AA +:10BD400086F31188BFF36F8F01231D463BB923682B +:10BD5000002BF5D02046FFF7B2FF2846F0E770BD74 +:10BD600008B5FCF79FFA08BD70B50646B3F1FF3F72 +:10BD700008BFB2F1FF3F09D015461C4653EA020145 +:10BD80000CD100220023C0E9002305E04FF0FF3270 +:10BD90004FF0FF33C0E90023304670BD6FF0010162 +:10BDA000891A4FF0FF3262EB0303002B02DB0160C4 +:10BDB0004360F1E7FCF776FA2B462246012D74F139 +:10BDC000000401DA01230022C01841EB02013060B7 +:10BDD0007160E1E7F8B50546B3F1FF3F08BFB2F186 +:10BDE000FF3F0AD014461F4657EA02030CD1002237 +:10BDF0000023C0E900232846F8BD4FF0FF324FF082 +:10BE0000FF33C0E90023F6E7FCF74CFA03460A4685 +:10BE1000A042B94105D2E61A67EB02022E606A60C1 +:10BE2000E9E700263246F9E7D0B582B004460023A0 +:10BE300004320ED27BB900260027CDE9006741F01D +:10BE40000401204600F01AF808B140F8044B02B093 +:10BE5000D0BD0123EEE70020F9E730B108B5011F9E +:10BE600050F8040C00F059F808BD704710B500F107 +:10BE70000C04C4600461FDF7EDF810BD2DE9F04F2E +:10BE800089B006468A469146129D139C2A4623464F +:10BE900006A8FFF769FFDDE90623CDE9022306F1D5 +:10BEA000140BEFF31181202383F31288BFF36F8FFC +:10BEB0004FF000084746CDF814B08B4615E0DDE999 +:10BEC000022306A8FFF786FF069D079C00950194B4 +:10BED00006F10C0259460598FBF7F4FDEFF3118BC0 +:10BEE000202383F31288BFF36F8F77B94A465146F8 +:10BEF0003046FDF738F8074638B9254305D0B8F184 +:10BF0000000FDCD14FF00108D9E78BF31188BFF3A4 +:10BF10006F8F384609B0BDE8F08F70B5044600F168 +:10BF20001406EFF31185202383F31288BFF36F8F7C +:10BF3000FCF7D5FF04F10C00FFF751FE20B985F3A3 +:10BF40001188BFF36F8F70BD29463046FBF732FE74 +:10BF5000F9E710B50139044632B111F8013F00F894 +:10BF6000013B013A002BF7D1002100F073F8204685 +:10BF700010BD10B5024601448A42134603D01C7816 +:10BF80000132002CF8D1181A10BDF0B5C3F13707F3 +:10BF90000446FFB203F01F031046082BE6B233D06D +:10BFA000102B3ED06508A40844EA817445EAC175A7 +:10BFB0002D194FEA910242EB5102290941EA02711F +:10BFC0006D1842EB1212290A41EA02616D1842EB28 +:10BFD0001222290C41EA02416D1842EB1242AD18BF +:10BFE00042F10002EC0844EA4274D10804EB8402F6 +:10BFF000A6EB4205EDB2092D0CD90134A5F10A05D5 +:10C0000041F10001EDB212E0E40844EA417406F0A7 +:10C010000705C908303554EA010200F8015BBCD1BC +:10C02000F0BD240944EA017406F00F050909092D41 +:10C0300084BFED19EDB2EDE70A44914200F1FF3300 +:10C0400000D1704710B511F8014B03F8014F914230 +:10C05000F9D110BD02440346934200D1704703F862 +:10C06000011BF9E701480068704700009C0F0020A1 +:08C07000C450FF7F0100000035 +:10C07800093500000000000051530000F8C000001E +:10C08800DD700000000000000D83000000000000CB +:10C098000D58000020C100000D5800000CC1000020 +:10C0A80023AC000000000000CDAA000048C1000039 +:10C0B8007128000034C10000555400000000000041 +:10C0C800015F0000000000002529000000000000BA +:10C0D800E5340000000000002BAC00000000000068 +:10C0E8003183000000000000D53B00000000000084 +:10C0F80048C5000058C5000068C50000630200205C +:10C108005C1A002084C50000A4C50000D4C5000046 +:10C1180065020020B01A002094C50000BCC50000CC +:10C12800D4C5000067020020BC1A00209CC3000090 +:10C13800B0030020ACC30000610200200000002012 +:10C1480000C6000010C600003CC6000069020020BE +:04C158003C01002086 +:10C15C006BB4000049AD0000000000006D9B0000B6 +:10C16C0048C100000FA60000000000006D9B0000FD +:10C17C00000000006D9B0000000000006D9B0000A3 +:10C18C00556C000049AD0000000000006D9B0000E4 +:10C19C00000000006D9B0000000000006D9B000083 +:10C1AC00000000006D9B0000000000006D9B000073 +:10C1BC00000000006D9B0000000000006D9B000063 +:10C1CC00000000006D9B0000000000006D9B000053 +:10C1DC00000000006D9B00000000000019600000D2 +:10C1EC00000000006D9B0000000000006D9B000033 +:10C1FC00000000006D9B0000000000006D9B000023 +:10C20C00000000006D9B0000000000006D9B000012 +:10C21C00000000006D9B0000000000006D9B000002 +:10C22C00000000006D9B0000000000006D9B0000F2 +:10C23C00000000006D9B0000000000006D9B0000E2 +:10C24C00000000006D9B0000000000006D9B0000D2 +:10C25C00000000006D9B0000000000006D9B0000C2 +:10C26C00000000006D9B0000000000006D9B0000B2 +:10C27C00000000006D9B0000000000006D9B0000A2 +:10C28C00000000006D9B00003D4C000049AD00001B +:10C29C00000000006D9B0000000000006D9B000082 +:10C2AC00000000006D9B0000000000006D9B000072 +:10C2BC00000000006D9B0000000000006D9B000062 +:10C2CC00000000006D9B0000000000006D9B000052 +:10C2DC00040000000F000000010000000800000036 +:10C2EC002000000060000000700000000D00000045 +:10C2FC000C0000000E000000500000007400000054 +:10C30C00A8000000FFFFFFFFFFFFFFFFFFFFFFFF85 +:04C31C00FFFFFFFF21 +:10C32000B68FCB6E1CC7F13F1B9DF3531CC701405A +:10C33000C3F5484043414C4942524154494F4E0095 +:10C340000100000002000000050000006400000081 +:10C3500000C201000000080000000050000300506F +:10C36000C0C6000000010000000000000000000046 +:10C370000338FDD87047000025732025750A00009A +:10C3800020C1000017000100303132333435363718 +:10C390003839414243444546000000006364635F0E +:10C3A00061636D5F75617274300000008F9A0000E8 +:10C3B0002528000000000000FD260000379A00003C +:10C3C0000D260000C3990000CD990000E92500006A +:10C3D000E799000000000000F19900000000000053 +:10C3E00000000000019A00002B9A00002F9A000024 +:10C3F000757362776F726B71000000002A2A2A2021 +:10C40000426F6F74696E67206E524620436F6E6E86 +:10C410006563742053444B2076322E372E302D35F1 +:10C420006362383535373063613433202A2A2A0A6B +:10C43000000000002A2A2A205573696E67205A6579 +:10C4400070687972204F532076332E362E39392D6D +:10C45000313030626566633730633734202A2A2AE8 +:10C460000A00000000000000D19A00006D7574659C +:10C47000785F696E69742063616C6C6564207769AC +:10C480007468204E554C4C20706172616D65746506 +:10C4900072000000436F756C64206E6F7420616CD5 +:10C4A0006C6F63617465206D757465782062656674 +:10C4B0006F726520696E697469616C697A696E670B +:10C4C00000000000240100201C01002014010020B5 +:10C4D000000000000C010020E92A00008D2A000065 +:10C4E000292A0000D12900000000002000000000DF +:10C4F00000000B06020000000CC50000464C415332 +:10C50000485F30005352414D5F3000000000000092 +:10C51000FCC40000260002070000002004C5000043 +:10C5200022000B112C010020757362645F776F721B +:10C530006B710000ED9E0000010000004151000001 +:10C540002151000000000000636C6F636B403430C9 +:10C550003030303030300000A95100001952000056 +:10C560005BA300006FA3000019530000EFA20000BE +:10C5700031A300000000000003A200000000000042 +:10C58000000000006770696F403530303030333064 +:10C59000300000006770696F403530303030303027 +:10C5A00030000000FFFF000000030050000000000A +:10C5B000010000000060004000000000FFFFFFFFDE +:10C5C000000000500000000000000000006000407B +:10C5D000000000005556000095A40000A3A4000030 +:10C5E000BBA40000C7A40000D3A400007555000040 +:10C5F00019A5000000000000000102030405060761 +:10C6000075617274403430303032303030000000A8 +:10C6100000200040020000000000000020C60000D2 +:10C62000002000402CC600000100000034C60000BD +:10C63000020000000600000007000200D3A700006F +:10C640003D5B000053A7000021A90000FFA70000E8 +:10C650002DA8000059A8000063A80000A3A80000AE +:10C66000AFA8000063A8000093A80000BBA80000CA +:10C67000C9A80000D7A8000011A9000015A9000052 +:10C6800000203030303030303030303030303030EA +:10C69000000100000001000069646C6500000000FA +:10C6A0006D61696E0000000078C0000078C0000075 +:10C6B000C8C00000D0C00000F8C00000F8C00000F2 +:10C6C000737973776F726B7100000000FF8FFFFF4B +:10C6D000FF8FFFFFFE8FFFFFFE8FFFFFFD8FFFFF2E +:10C6E000FC8FFFFFFC8FFFFF6D757465785F6672CE +:10C6F00065652063616C6C65642077697468204EA1 +:10C70000554C4C20706172616D657465720000005B +:10C7100043616E277420696E697469616C697A651A +:10C72000206D757465782C20776173204E554C4CC4 +:10C730000D0A0000436F756C64206E6F74206C6F7F +:10C74000636B20706F7765722073617665206D75FD +:10C7500074657800286E756C6C29002A666C6F61B0 +:04C76000742A000037 +:10C7640000000000000000000000000000000000C5 +:10C7740000000000000000000000000000000000B5 +:10C7840000000000000000000000000000000000A5 +:10C794000000000000000000000000000000000095 +:10C7A4000000000000000000000000000000000085 +:10C7B4000000000000000000000000000000000075 +:10C7C4000000000000000000000000000000000065 +:10C7D4000000000000000000000000000000000055 +:10C7E400000000000000000000000000D400002051 +:10C7F400B400002000C20100000008000000000096 +:10C804000000000000000000000000000000000024 +:10C81400D990000000380020000000000000000053 +:10C824000000000000000000000000000000000004 +:10C8340000040000003C0020000000000000000094 +:10C8440000000000000000000000000000000000E4 +:10C8540000040000D12500008000000059230000DE +:10C864000000000059230000800000009C0200200A +:10C874003A000000B00200203A00000088020020C4 +:10C884003A000000C40200203A000000000000004A +:10C894002F9E0000000000000000000000000000C7 +:10C8A40000C20100000103005C0100200000000040 +:10C8B400281D0020271D00200000000000000000AB +:10C8C40000000000C81A0020200000000000000042 +:10C8D4000000000000000000000000000000000054 +:10C8E4000000000000000000000000000000000044 +:10C8F4000000000000000000000000000000000034 +:10C904000000000000000000000000000000000023 +:10C914000000000000000000000000000000000013 +:10C924000000000000000000000000000000000003 +:10C9340000000000000000000000000000000000F3 +:10C9440008000000FF0000000000000003000000D9 +:10C9540000000000FFFF0F00F8010020F801002094 +:10C9640000000000A1830000440200203C020020DB +:10C9740034020020000000002C020020BD840000CE +:10C98400098400003D840000858400004C1B0020C5 +:10C994003A00003A501B00203A00003A541B002091 +:10C9A4003A00003A581B00203A00003A5402002092 +:10C9B40018020020100200200C02002008020020AF +:01C9C4000171 +:0AC9C5000000000000000000000068 +:01C9CF00FF68 +:10C9D0006C0200206C0200200040002000000000DB +:0CC9E00020000000140000000000000017 +:10C9EC0088020020880200200000000000000000E7 +:10C9FC000E0000009C0200209C02002000000000A1 +:10CA0C00000000000E000000B0020020B002002068 +:10CA1C0000000000000000000E000000C402002016 +:10CA2C00C402002000000000000000000E00000006 +:10CA3C00D8020020D80200200000000000000000F6 +:04CA4C000E000000D8 +:10CA5000EC020020EC0200200100000001000000B8 +:10CA60000000000000000000040300200403002078 +:10CA700012010002EF020140E32F00010603010250 +:10CA8000030109020000000100E032080B0002026D +:10CA90000200000904000001020200000524001049 +:10CAA00001052401020104240202052406000107F5 +:10CAB00005800310000A09040100020A00000007B3 +:10CAC0000580024000000705000240000004030941 +:10CAD000040E035A4550485952000000000000104F +:10CAE000035553422D44455600000000000000222B +:10CAF00003303132333435363738394142434445D7 +:10CB000046000000000000000000000000000000DF +:03CB100000000022 +:01CB1300FF22 +:10CB1400000000002F0300209D990000052800005C +:10CB24006125000000000000000000000300000078 +:04CB3400F4000020E9 +:04CB380015E015E00F +:0400000300002F5971 +:00000001FF diff --git a/tests/example-a2l-file.a2l b/tests/example-a2l-file.a2l new file mode 100755 index 0000000..112b21f --- /dev/null +++ b/tests/example-a2l-file.a2l @@ -0,0 +1,993 @@ +/************************************************************************************/ +/* */ +/* ASAP2 v1.6.1 language example */ +/* */ +/* 2013-02-13 */ +/* File: example-a2l-file.a2l */ +/* Version: 1.0 */ +/* */ +/* ASAM e.V. */ +/* Altlaufstr. 40 */ +/* 85635 Höhenkirchen */ +/* */ +/************************************************************************************/ + +ASAP2_VERSION 1 61 + +/begin PROJECT + ASAM + "_default_Project" + /begin HEADER + "default_Header" + PROJECT_NO ASAM2013 + /end HEADER + /begin MODULE + Module_01 + "default_Module" + +// /include "asam.aml" + + /begin MOD_PAR "default_ModPar" + ADDR_EPK 0x100100FF + EPK "EPROM_ID_01" + /begin MEMORY_SEGMENT MemorySegment_01 + "MemorySegment_01" + DATA + FLASH + EXTERN + 0x1000FFFF + 0xf0000 + 0xFFFFFFFF 0xFFFFFFFF 0xFFFFFFFF 0xFFFFFFFF 0xFFFFFFFF + /begin IF_DATA ETK_XETK + ADDRESS_MAPPING + 0x80810000 + 0xa3010000 + 0xf0000 + /end IF_DATA + /end MEMORY_SEGMENT + /end MOD_PAR + + /begin MOD_COMMON "default_ModCommon" + DEPOSIT ABSOLUTE + BYTE_ORDER MSB_FIRST + ALIGNMENT_BYTE 1 + ALIGNMENT_WORD 2 + ALIGNMENT_LONG 4 + ALIGNMENT_FLOAT32_IEEE 4 + ALIGNMENT_FLOAT64_IEEE 8 + /end MOD_COMMON + + /begin IF_DATA XCP + /begin PROTOCOL_LAYER + 0x0100 + 2000 + 2000 + 2000 + 65535 + 2000 + 0005 + 0005 + 0x08 + 0x0008 + BYTE_ORDER_MSB_LAST + ADDRESS_GRANULARITY_BYTE + SEED_AND_KEY_EXTERNAL_FUNCTION "SeedNKeyXcp.dll" + /end PROTOCOL_LAYER + /begin DAQ + STATIC + 0x06 + 0x06 + 0x00 + OPTIMISATION_TYPE_DEFAULT + ADDRESS_EXTENSION_FREE + IDENTIFICATION_FIELD_TYPE_ABSOLUTE + 0x04 + OVERLOAD_INDICATION_EVENT + /begin DAQ_LIST + 0x0 + DAQ_LIST_TYPE DAQ + MAX_ODT 0x2 + MAX_ODT_ENTRIES 0x7 + FIRST_PID 0x0 + EVENT_FIXED 0x0 + /end DAQ_LIST + /begin DAQ_LIST + 0x1 + DAQ_LIST_TYPE DAQ + MAX_ODT 0x2 + MAX_ODT_ENTRIES 0x7 + FIRST_PID 0x2 + EVENT_FIXED 0x1 + /end DAQ_LIST + /begin DAQ_LIST + 0x2 + DAQ_LIST_TYPE DAQ + MAX_ODT 0x2 + MAX_ODT_ENTRIES 0x7 + FIRST_PID 0x4 + EVENT_FIXED 0x2 + /end DAQ_LIST + /begin DAQ_LIST + 0x3 + DAQ_LIST_TYPE DAQ + MAX_ODT 0x2 + MAX_ODT_ENTRIES 0x7 + FIRST_PID 0x6 + EVENT_FIXED 0x3 + /end DAQ_LIST + /begin DAQ_LIST + 0x5 + DAQ_LIST_TYPE DAQ + MAX_ODT 0xf + MAX_ODT_ENTRIES 0x7 + FIRST_PID 0x8 + EVENT_FIXED 0x5 + /end DAQ_LIST + /begin DAQ_LIST + 0x4 + DAQ_LIST_TYPE DAQ + MAX_ODT 0xf + MAX_ODT_ENTRIES 0x7 + FIRST_PID 0x17 + EVENT_FIXED 0x4 + /end DAQ_LIST + /begin EVENT + "Segment 1" + "Segment 1" + 0x0 + DAQ + 0x1 + 0x0 + 0 + 0 + /end EVENT + /begin EVENT + "Segment 2" + "Segment 2" + 0x1 + DAQ + 0x1 + 0x0 + 0 + 0 + /end EVENT + /begin EVENT + "Segment 3" + "Segment 3" + 0x2 + DAQ + 0x1 + 0x0 + 0 + 0 + /end EVENT + /begin EVENT + "Segment 4" + "Segment 4" + 0x3 + DAQ + 0x1 + 0x0 + 0 + 0 + /end EVENT + /begin EVENT + "Tim100ms" + "Tim100ms" + 0x5 + DAQ + 0x1 + 0x1 + 8 + 0 + /end EVENT + /begin EVENT + "Time 10ms" + "Time 10ms" + 0x4 + DAQ + 0x1 + 0x1 + 7 + 0 + /end EVENT + /end DAQ + /end IF_DATA + + /begin MEASUREMENT Measurement_01 + "Preasure_chamber_01" + UBYTE + CompuMethod_02 + 1 + 0. + 0. + 255. + DISPLAY_IDENTIFIER Measurement_01 + ECU_ADDRESS 0xE0010000 + BIT_MASK 0x1F + /begin IF_DATA XCP + /begin DAQ_EVENT + VARIABLE + /begin DEFAULT_EVENT_LIST + EVENT 0 + EVENT 1 + EVENT 2 + EVENT 3 + EVENT 4 + /end DEFAULT_EVENT_LIST + /end DAQ_EVENT + /end IF_DATA + /end MEASUREMENT + + /begin MEASUREMENT Measurement_02 + "Preasure_chamber_02" + UBYTE + CompuMethod_02 + 1 + 0. + 0. + 255. + DISPLAY_IDENTIFIER Measurement_02 + ECU_ADDRESS 0xE0020000 + BIT_MASK 0x1F + /begin IF_DATA XCP + /begin DAQ_EVENT + VARIABLE + /begin DEFAULT_EVENT_LIST + EVENT 0 + EVENT 1 + EVENT 2 + EVENT 3 + EVENT 4 + /end DEFAULT_EVENT_LIST + /end DAQ_EVENT + /end IF_DATA + /end MEASUREMENT + + /begin MEASUREMENT Measurement_03 + "Preasure_chamber_03" + UWORD + CompuMethod_03 + 1 + 0. + 0. + 65535. + DISPLAY_IDENTIFIER Measurement_03 + ECU_ADDRESS 0xE0030000 + FORMAT "%6.0" + /begin IF_DATA XCP + /begin DAQ_EVENT + VARIABLE + /begin DEFAULT_EVENT_LIST + EVENT 0 + EVENT 1 + EVENT 2 + EVENT 3 + EVENT 4 + /end DEFAULT_EVENT_LIST + /end DAQ_EVENT + /end IF_DATA + /end MEASUREMENT + + /begin MEASUREMENT Measurement_04 + "Preasure_chamber_04" + UWORD + CompuMethod_05 + 1 + 0. + 0. + 359.999 + DISPLAY_IDENTIFIER Measurement_04 + ECU_ADDRESS 0xE0040000 + FORMAT "%6.3" + /begin IF_DATA XCP + /begin DAQ_EVENT + VARIABLE + /begin DEFAULT_EVENT_LIST + EVENT 0 + EVENT 1 + EVENT 2 + EVENT 3 + EVENT 4 + /end DEFAULT_EVENT_LIST + /end DAQ_EVENT + /end IF_DATA + /end MEASUREMENT + + /begin MEASUREMENT Measurement_05 + "Preasure_chamber_05" + UWORD + CompuMethod_01 + 1 + 0. + 0. + 65535. + DISPLAY_IDENTIFIER Measurement_05 + ECU_ADDRESS 0xE0050000 + FORMAT "%6.0" + /begin IF_DATA XCP + /begin DAQ_EVENT + VARIABLE + /begin DEFAULT_EVENT_LIST + EVENT 0 + EVENT 1 + EVENT 2 + EVENT 3 + EVENT 4 + /end DEFAULT_EVENT_LIST + /end DAQ_EVENT + /end IF_DATA + /end MEASUREMENT + + /begin MEASUREMENT Measurement_06 + "Preasure_chamber_06" + UWORD + CompuMethod_01 + 1 + 0. + 0. + 65535. + DISPLAY_IDENTIFIER Measurement_06 + ECU_ADDRESS 0xE0060000 + FORMAT "%6.0" + /begin IF_DATA XCP + /begin DAQ_EVENT + VARIABLE + /begin DEFAULT_EVENT_LIST + EVENT 0 + EVENT 1 + EVENT 2 + EVENT 3 + EVENT 4 + /end DEFAULT_EVENT_LIST + /end DAQ_EVENT + /end IF_DATA + /end MEASUREMENT + + /begin MEASUREMENT Measurement_07 + "Preasure_chamber_07" + UBYTE + CompuMethod_02 + 1 + 0. + 0. + 255. + DISPLAY_IDENTIFIER Measurement_07 + ECU_ADDRESS 0xE0070000 + BIT_MASK 0x1F + /begin IF_DATA XCP + /begin DAQ_EVENT + VARIABLE + /begin DEFAULT_EVENT_LIST + EVENT 0 + EVENT 1 + EVENT 2 + EVENT 3 + EVENT 4 + /end DEFAULT_EVENT_LIST + /end DAQ_EVENT + /end IF_DATA + /end MEASUREMENT + + /begin MEASUREMENT Measurement_08 + "Preasure_chamber_08" + UWORD + CompuMethod_05 + 1 + 0. + 0. + 359.999 + DISPLAY_IDENTIFIER Measurement_08 + ECU_ADDRESS 0xE0080000 + FORMAT "%6.3" + /begin IF_DATA XCP + /begin DAQ_EVENT + VARIABLE + /begin DEFAULT_EVENT_LIST + EVENT 0 + EVENT 1 + EVENT 2 + EVENT 3 + EVENT 4 + /end DEFAULT_EVENT_LIST + /end DAQ_EVENT + /end IF_DATA + /end MEASUREMENT + + /begin MEASUREMENT Measurement_09 + "Preasure_chamber_09" + UWORD + CompuMethod_03 + 1 + 0. + 0. + 65535. + DISPLAY_IDENTIFIER Measurement_09 + ECU_ADDRESS 0xE0090000 + FORMAT "%6.0" + /begin IF_DATA XCP + /begin DAQ_EVENT + VARIABLE + /begin DEFAULT_EVENT_LIST + EVENT 0 + EVENT 1 + EVENT 2 + EVENT 3 + EVENT 4 + /end DEFAULT_EVENT_LIST + /end DAQ_EVENT + /end IF_DATA + /end MEASUREMENT + + /begin MEASUREMENT Measurement_10 + "Preasure_chamber_10" + UWORD + CompuMethod_03 + 1 + 0. + 0. + 65535. + DISPLAY_IDENTIFIER Measurement_10 + ECU_ADDRESS 0xE00A0000 + FORMAT "%6.0" + /begin IF_DATA XCP + /begin DAQ_EVENT + VARIABLE + /begin DEFAULT_EVENT_LIST + EVENT 0 + EVENT 1 + EVENT 2 + EVENT 3 + EVENT 4 + /end DEFAULT_EVENT_LIST + /end DAQ_EVENT + /end IF_DATA + /end MEASUREMENT + + /begin MEASUREMENT Measurement_11 + "Preasure_chamber_11" + UWORD + CompuMethod_03 + 1 + 0. + 0. + 65535. + DISPLAY_IDENTIFIER Measurement_11 + ECU_ADDRESS 0xE00B0000 + FORMAT "%6.0" + /begin IF_DATA XCP + /begin DAQ_EVENT + VARIABLE + /begin DEFAULT_EVENT_LIST + EVENT 0 + EVENT 1 + EVENT 2 + EVENT 3 + EVENT 4 + /end DEFAULT_EVENT_LIST + /end DAQ_EVENT + /end IF_DATA + /end MEASUREMENT + + /begin MEASUREMENT Measurement_12 + "Preasure_chamber_12" + UWORD + CompuMethod_05 + 1 + 0. + 0. + 359.999 + DISPLAY_IDENTIFIER Measurement_12 + ECU_ADDRESS 0xE00C0000 + FORMAT "%6.3" + /begin IF_DATA XCP + /begin DAQ_EVENT + VARIABLE + /begin DEFAULT_EVENT_LIST + EVENT 0 + EVENT 1 + EVENT 2 + EVENT 3 + EVENT 4 + /end DEFAULT_EVENT_LIST + /end DAQ_EVENT + /end IF_DATA + /end MEASUREMENT + + /begin MEASUREMENT Measurement_13 + "Preasure_chamber_13" + UBYTE + CompuMethod_02 + 1 + 0. + 0. + 255. + DISPLAY_IDENTIFIER Measurement_13 + ECU_ADDRESS 0xE00D0000 + BIT_MASK 0x1F + /begin IF_DATA XCP + /begin DAQ_EVENT + VARIABLE + /begin DEFAULT_EVENT_LIST + EVENT 0 + EVENT 1 + EVENT 2 + EVENT 3 + EVENT 4 + /end DEFAULT_EVENT_LIST + /end DAQ_EVENT + /end IF_DATA + /end MEASUREMENT + + /begin MEASUREMENT Measurement_14 + "Preasure_chamber_14" + UBYTE + CompuMethod_02 + 1 + 0. + 0. + 255. + DISPLAY_IDENTIFIER Measurement_14 + ECU_ADDRESS 0xE00E0000 + BIT_MASK 0x1F + /begin IF_DATA XCP + /begin DAQ_EVENT + VARIABLE + /begin DEFAULT_EVENT_LIST + EVENT 0 + EVENT 1 + EVENT 2 + EVENT 3 + EVENT 4 + /end DEFAULT_EVENT_LIST + /end DAQ_EVENT + /end IF_DATA + /end MEASUREMENT + + /begin MEASUREMENT Measurement_15 + "Preasure_chamber_15" + UBYTE + CompuMethod_02 + 1 + 0. + 0. + 255. + DISPLAY_IDENTIFIER Measurement_15 + ECU_ADDRESS 0xE00F0000 + BIT_MASK 0x1F + /begin IF_DATA XCP + /begin DAQ_EVENT + VARIABLE + /begin DEFAULT_EVENT_LIST + EVENT 0 + EVENT 1 + EVENT 2 + EVENT 3 + EVENT 4 + /end DEFAULT_EVENT_LIST + /end DAQ_EVENT + /end IF_DATA + /end MEASUREMENT + + /begin MEASUREMENT Measurement_16 + "Preasure_chamber_16" + UWORD + CompuMethod_06 + 1 + 0. + 0. + 359.999 + DISPLAY_IDENTIFIER Measurement_16 + ECU_ADDRESS 0xE0100000 + FORMAT "%6.3" + /begin IF_DATA XCP + /begin DAQ_EVENT + VARIABLE + /begin DEFAULT_EVENT_LIST + EVENT 0 + EVENT 1 + EVENT 2 + EVENT 3 + EVENT 4 + /end DEFAULT_EVENT_LIST + /end DAQ_EVENT + /end IF_DATA + /end MEASUREMENT + + /begin CHARACTERISTIC Characteristic_01 + "regulator_01" + VALUE + 0x1100FF00 + RecordLayout_01 + 1. + CompuMethod_02 + 0. + 1. + DISPLAY_IDENTIFIER Characteristic_01 + BIT_MASK 0x1F + /end CHARACTERISTIC + + /begin CHARACTERISTIC Characteristic_02 + "regulator_02" + VALUE + 0x1200FF00 + RecordLayout_02 + 359.999 + CompuMethod_05 + 0. + 359.999 + DISPLAY_IDENTIFIER Characteristic_02 + FORMAT "%6.3" + /end CHARACTERISTIC + + /begin CHARACTERISTIC Characteristic_03 + "regulator_03" + VALUE + 0x1300FF00 + RecordLayout_02 + 359.999 + CompuMethod_05 + 0. + 359.999 + DISPLAY_IDENTIFIER Characteristic_03 + FORMAT "%6.3" + /end CHARACTERISTIC + + /begin CHARACTERISTIC Characteristic_04 + "regulator_04" + VALUE + 0x1400FF00 + RecordLayout_02 + 359.999 + CompuMethod_05 + 0. + 359.999 + DISPLAY_IDENTIFIER Characteristic_04 + FORMAT "%6.3" + /end CHARACTERISTIC + + /begin CHARACTERISTIC Characteristic_05 + "regulator_05" + VALUE + 0x1500FF00 + RecordLayout_02 + 65535. + CompuMethod_03 + 0. + 65535. + DISPLAY_IDENTIFIER Characteristic_05 + FORMAT "%6.0" + /end CHARACTERISTIC + + /begin CHARACTERISTIC Characteristic_06 + "regulator_06" + VALUE + 0x1600FF00 + RecordLayout_02 + 65535. + CompuMethod_03 + 0. + 65535. + DISPLAY_IDENTIFIER Characteristic_06 + FORMAT "%6.0" + /end CHARACTERISTIC + + /begin CHARACTERISTIC Characteristic_07 + "regulator_07" + VALUE + 0x1700FF00 + RecordLayout_02 + 65535. + CompuMethod_03 + 0. + 65535. + DISPLAY_IDENTIFIER Characteristic_07 + FORMAT "%6.0" + /end CHARACTERISTIC + + /begin CHARACTERISTIC Characteristic_08 + "regulator_08" + VALUE + 0x1800FF00 + RecordLayout_01 + 255. + CompuMethod_03 + 0. + 255. + DISPLAY_IDENTIFIER Characteristic_08 + FORMAT "%5.0" + /end CHARACTERISTIC + + /begin CHARACTERISTIC Characteristic_09 + "regulator_09" + VALUE + 0x1900FF00 + RecordLayout_02 + 1000.9 + CompuMethod_04 + 2.e-002 + 1001. + DISPLAY_IDENTIFIER Characteristic_09 + FORMAT "%6.2" + /end CHARACTERISTIC + + /begin CHARACTERISTIC Characteristic_10 + "regulator_10" + VALUE + 0x1A00FF00 + RecordLayout_02 + 65535. + CompuMethod_03 + 0. + 65535. + DISPLAY_IDENTIFIER Characteristic_10 + FORMAT "%5.0" + /end CHARACTERISTIC + + /begin CHARACTERISTIC Characteristic_11 + "regulator_11" + VALUE + 0x1B00FF00 + RecordLayout_02 + 65535. + CompuMethod_03 + 0. + 65535. + DISPLAY_IDENTIFIER Characteristic_11 + FORMAT "%5.0" + /end CHARACTERISTIC + + /begin CHARACTERISTIC Characteristic_12 + "regulator_12" + VALUE + 0x1C00FF00 + RecordLayout_02 + 1000.9 + CompuMethod_04 + 0. + 1000.9 + DISPLAY_IDENTIFIER Characteristic_12 + FORMAT "%5.1" + /end CHARACTERISTIC + + /begin CHARACTERISTIC Characteristic_13 + "regulator_13" + VALUE + 0x1D00FF00 + RecordLayout_02 + 1000.9 + CompuMethod_04 + 0. + 1000.9 + DISPLAY_IDENTIFIER Characteristic_13 + FORMAT "%5.1" + /end CHARACTERISTIC + + /begin CHARACTERISTIC Characteristic_14 + "regulator_14" + VALUE + 0x1E00FF00 + RecordLayout_02 + 359.999 + CompuMethod_05 + 0. + 359.999 + DISPLAY_IDENTIFIER Characteristic_14 + FORMAT "%6.3" + /end CHARACTERISTIC + + /begin CHARACTERISTIC Characteristic_15 + "regulator_15" + MAP + 0x1F00FF00 + RecordLayout_03 + 1000.99 + CompuMethod_04 + 2.e-002 + 1001. + DISPLAY_IDENTIFIER Characteristic_15 + FORMAT "%6.2" + /begin AXIS_DESCR + STD_AXIS + NO_INPUT_QUANTITY + CompuMethod_03 + 100 + 0. + 255. + FORMAT "%4.0" + /end AXIS_DESCR + /begin AXIS_DESCR + STD_AXIS + Measurement_16 + CompuMethod_07 + 100 + 0. + 1000.9 + FORMAT "%5.1" + /end AXIS_DESCR + /end CHARACTERISTIC + + /begin CHARACTERISTIC Characteristic_16 + "regulator_16" + CURVE + 0x2000FF00 + RecordLayout_05 + 40. + CompuMethod_09 + -19. + 20. + DISPLAY_IDENTIFIER Characteristic_16 + FORMAT "%7.2" + /begin AXIS_DESCR + COM_AXIS + NO_INPUT_QUANTITY + CompuMethod_08 + 20 + 0. + 50. + FORMAT "%4.4" + AXIS_PTS_REF AxisPts_01 + /end AXIS_DESCR + /end CHARACTERISTIC + + /begin COMPU_METHOD CompuMethod_01 + "" + RAT_FUNC + "%2.2" + "-" + COEFFS 0 1. 0. 0 0 2 + /end COMPU_METHOD + + /begin COMPU_METHOD CompuMethod_02 + "" + TAB_VERB + "%2.2" + "-" + COMPU_TAB_REF CompuVtab_01 + /end COMPU_METHOD + + /begin COMPU_METHOD CompuMethod_03 + "RATIONALFUNCTION_[0;1;0;0;0;1]" + RAT_FUNC + "%2.2" + "-" + COEFFS 0. 1. 0. 0. 0. 1. + /end COMPU_METHOD + + /begin COMPU_METHOD CompuMethod_04 + "RATIONALFUNCTION_[0;1;0;0;0;0.02]" + RAT_FUNC + "%2.2" + "s" + COEFFS 0. 1. 0. 0. 0. 2.e-002 + /end COMPU_METHOD + + /begin COMPU_METHOD CompuMethod_05 + "RATIONALFUNCTION_[0;1;0;0;0;0.1]" + RAT_FUNC + "%2.2" + "%" + COEFFS 0. 1. 0. 0. 0. 2.5e-003 + /end COMPU_METHOD + + /begin COMPU_METHOD CompuMethod_06 + "" + RAT_FUNC + "%2.2" + "rpm" + COEFFS 0 4. 0. 0 0 1 + /end COMPU_METHOD + + /begin COMPU_METHOD CompuMethod_07 + "RATIONALFUNCTION_[0;1;0;0;0;0.205]" + RAT_FUNC + "%2.2" + "U/min" + COEFFS 0. 1. 0. 0. 0. 0.205 + /end COMPU_METHOD + + /begin COMPU_METHOD CompuMethod_08 + "" + RAT_FUNC + "%2.2" + "V" + COEFFS 0 819. 0. 0 0 1 + /end COMPU_METHOD + + /begin COMPU_METHOD CompuMethod_09 + "" + RAT_FUNC + "%4.4" + "bar" + COEFFS 0 100. 0. 0 0 1 + /end COMPU_METHOD + + /begin COMPU_VTAB CompuVtab_01 + "" + TAB_VERB + 2 + 0 "FALSE" + 1 "TRUE" + /end COMPU_VTAB + + /begin RECORD_LAYOUT RecordLayout_01 + FNC_VALUES 1 UBYTE COLUMN_DIR PLONG + /end RECORD_LAYOUT + + /begin RECORD_LAYOUT RecordLayout_02 + FNC_VALUES 1 UWORD COLUMN_DIR PLONG + /end RECORD_LAYOUT + + /begin RECORD_LAYOUT RecordLayout_03 + NO_AXIS_PTS_X 1 UBYTE + AXIS_PTS_X 2 UBYTE INDEX_INCR DIRECT + NO_AXIS_PTS_Y 3 UWORD + AXIS_PTS_Y 4 UWORD INDEX_INCR DIRECT + FNC_VALUES 5 UWORD COLUMN_DIR DIRECT + /end RECORD_LAYOUT + + /begin RECORD_LAYOUT RecordLayout_04 + NO_AXIS_PTS_X 1 UWORD + AXIS_PTS_X 2 UWORD INDEX_DECR DIRECT + /end RECORD_LAYOUT + + /begin RECORD_LAYOUT RecordLayout_05 + FNC_VALUES 1 SWORD COLUMN_DIR PLONG + /end RECORD_LAYOUT + + /begin AXIS_PTS AxisPts_01 + "" + 0xEE001134 + NO_INPUT_QUANTITY + RecordLayout_04 + 5. + CompuMethod_08 + 2 + 0. + 5. + FORMAT "%4.4" + /end AXIS_PTS + + /begin FUNCTION Function_01 + "FunctionList_01" + FUNCTION_VERSION "2.2" + /begin DEF_CHARACTERISTIC + Characteristic_01 + Characteristic_02 + Characteristic_03 + Characteristic_04 + Characteristic_05 + Characteristic_06 + Characteristic_07 + Characteristic_08 + Characteristic_09 + Characteristic_10 + Characteristic_11 + Characteristic_12 + Characteristic_13 + Characteristic_14 + /end DEF_CHARACTERISTIC + /begin OUT_MEASUREMENT + Measurement_01 + Measurement_02 + Measurement_03 + Measurement_04 + /end OUT_MEASUREMENT + /begin IN_MEASUREMENT + Measurement_05 + Measurement_06 + Measurement_07 + Measurement_08 + Measurement_09 + Measurement_10 + Measurement_11 + Measurement_12 + Measurement_13 + /end IN_MEASUREMENT + /begin LOC_MEASUREMENT + Measurement_14 + Measurement_15 + /end LOC_MEASUREMENT + /end FUNCTION + /end MODULE +/end PROJECT