From 0ca355d757fa9eed53c9c610af3d402cc240c55f Mon Sep 17 00:00:00 2001 From: cadmic Date: Tue, 4 Jun 2024 15:44:13 -0700 Subject: [PATCH] Implement matching compression for old gzip versions (#22) * Implement matching compression for old gzip versions * Add gzip tests * Add CHANGELOG entry * Avoid typing.Optional * Add references to README --- CHANGELOG.md | 10 +- Cargo.lock | 10 + README.md | 3 + c_bindings/include/crunch64.h | 1 + c_bindings/include/crunch64/error.h | 1 + c_bindings/include/crunch64/gzip.h | 58 + c_bindings/tests.c | 23 +- cli/src/main.rs | 24 +- lib/Cargo.toml | 1 + lib/crunch64/__init__.py | 1 + lib/crunch64/crunch64.pyi | 1 + lib/crunch64/gzip.py | 5 + lib/crunch64/gzip.pyi | 5 + lib/src/gzip.rs | 1244 +++++++++++++++++ lib/src/lib.rs | 4 + python_bindings/tests.py | 30 +- test_data/dirt.png.bin.gzip-6-small-mem | Bin 0 -> 319062 bytes test_data/dirt.png.bin.gzip-9 | Bin 0 -> 314146 bytes test_data/dirt.png.bin.gzip-9-small-mem | Bin 0 -> 314858 bytes test_data/dirt.png.gzip-6-small-mem | Bin 0 -> 270362 bytes test_data/dirt.png.gzip-9 | Bin 0 -> 270242 bytes test_data/dirt.png.gzip-9-small-mem | Bin 0 -> 270362 bytes test_data/ground.png.bin.gzip-6-small-mem | Bin 0 -> 289290 bytes test_data/ground.png.bin.gzip-9 | Bin 0 -> 281985 bytes test_data/ground.png.bin.gzip-9-small-mem | Bin 0 -> 282255 bytes test_data/ground.png.gzip-6-small-mem | Bin 0 -> 237537 bytes test_data/ground.png.gzip-9 | Bin 0 -> 237421 bytes test_data/ground.png.gzip-9-small-mem | Bin 0 -> 237537 bytes ...ips_gist_wiseguy_yaz0.bin.gzip-6-small-mem | Bin 0 -> 3317 bytes test_data/mips_gist_wiseguy_yaz0.bin.gzip-9 | Bin 0 -> 3322 bytes ...ips_gist_wiseguy_yaz0.bin.gzip-9-small-mem | Bin 0 -> 3322 bytes test_data/small.txt.gzip-6-small-mem | Bin 0 -> 98 bytes test_data/small.txt.gzip-9 | Bin 0 -> 98 bytes test_data/small.txt.gzip-9-small-mem | Bin 0 -> 98 bytes test_data/stones.png.bin.gzip-6-small-mem | Bin 0 -> 327392 bytes test_data/stones.png.bin.gzip-9 | Bin 0 -> 320632 bytes test_data/stones.png.bin.gzip-9-small-mem | Bin 0 -> 321221 bytes test_data/stones.png.gzip-6-small-mem | Bin 0 -> 270847 bytes test_data/stones.png.gzip-9 | Bin 0 -> 270721 bytes test_data/stones.png.gzip-9-small-mem | Bin 0 -> 270847 bytes test_data/tile.png.bin.gzip-6-small-mem | Bin 0 -> 245130 bytes test_data/tile.png.bin.gzip-9 | Bin 0 -> 237114 bytes test_data/tile.png.bin.gzip-9-small-mem | Bin 0 -> 237618 bytes test_data/tile.png.gzip-6-small-mem | Bin 0 -> 226852 bytes test_data/tile.png.gzip-9 | Bin 0 -> 226658 bytes test_data/tile.png.gzip-9-small-mem | Bin 0 -> 226852 bytes .../x86-64_rabbitizer.bin.gzip-6-small-mem | Bin 0 -> 35609 bytes test_data/x86-64_rabbitizer.bin.gzip-9 | Bin 0 -> 35097 bytes .../x86-64_rabbitizer.bin.gzip-9-small-mem | Bin 0 -> 35082 bytes 49 files changed, 1404 insertions(+), 17 deletions(-) create mode 100644 c_bindings/include/crunch64/gzip.h create mode 100644 lib/crunch64/gzip.py create mode 100644 lib/crunch64/gzip.pyi create mode 100644 lib/src/gzip.rs create mode 100644 test_data/dirt.png.bin.gzip-6-small-mem create mode 100644 test_data/dirt.png.bin.gzip-9 create mode 100644 test_data/dirt.png.bin.gzip-9-small-mem create mode 100644 test_data/dirt.png.gzip-6-small-mem create mode 100644 test_data/dirt.png.gzip-9 create mode 100644 test_data/dirt.png.gzip-9-small-mem create mode 100644 test_data/ground.png.bin.gzip-6-small-mem create mode 100644 test_data/ground.png.bin.gzip-9 create mode 100644 test_data/ground.png.bin.gzip-9-small-mem create mode 100644 test_data/ground.png.gzip-6-small-mem create mode 100644 test_data/ground.png.gzip-9 create mode 100644 test_data/ground.png.gzip-9-small-mem create mode 100644 test_data/mips_gist_wiseguy_yaz0.bin.gzip-6-small-mem create mode 100644 test_data/mips_gist_wiseguy_yaz0.bin.gzip-9 create mode 100644 test_data/mips_gist_wiseguy_yaz0.bin.gzip-9-small-mem create mode 100644 test_data/small.txt.gzip-6-small-mem create mode 100644 test_data/small.txt.gzip-9 create mode 100644 test_data/small.txt.gzip-9-small-mem create mode 100644 test_data/stones.png.bin.gzip-6-small-mem create mode 100644 test_data/stones.png.bin.gzip-9 create mode 100644 test_data/stones.png.bin.gzip-9-small-mem create mode 100644 test_data/stones.png.gzip-6-small-mem create mode 100644 test_data/stones.png.gzip-9 create mode 100644 test_data/stones.png.gzip-9-small-mem create mode 100644 test_data/tile.png.bin.gzip-6-small-mem create mode 100644 test_data/tile.png.bin.gzip-9 create mode 100644 test_data/tile.png.bin.gzip-9-small-mem create mode 100644 test_data/tile.png.gzip-6-small-mem create mode 100644 test_data/tile.png.gzip-9 create mode 100644 test_data/tile.png.gzip-9-small-mem create mode 100644 test_data/x86-64_rabbitizer.bin.gzip-6-small-mem create mode 100644 test_data/x86-64_rabbitizer.bin.gzip-9 create mode 100644 test_data/x86-64_rabbitizer.bin.gzip-9-small-mem diff --git a/CHANGELOG.md b/CHANGELOG.md index b6bf8bc..716a2c5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,16 +7,20 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Added + +- Add matching zlib/DEFLATE compression for old gzip versions. + ## [0.4.0] - 2024-06-03 ### Added -- Add MIO0 compression to CLI (#17) +- Add MIO0 compression to CLI. ### Changed -- Speed up compression by 2100% (#18) -- Move CompressionType from library to CLI (#19) +- Speed up compression by 2100%. +- Move CompressionType from library to CLI. ## [0.3.1] - 2024-01-20 diff --git a/Cargo.lock b/Cargo.lock index c61d93e..816c9e6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -123,10 +123,20 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + [[package]] name = "crunch64" version = "0.4.0" dependencies = [ + "crc32fast", "pyo3", "rstest", "thiserror", diff --git a/README.md b/README.md index e2cd221..ddb38ba 100644 --- a/README.md +++ b/README.md @@ -64,3 +64,6 @@ to check the latest release. - Reference implementation by Mr-Wiseguy: - MIO0 - Hack64.net docs: +- gzip + - Reference implementation: + - DEFLATE specification: diff --git a/c_bindings/include/crunch64.h b/c_bindings/include/crunch64.h index d0a084b..9077e4f 100644 --- a/c_bindings/include/crunch64.h +++ b/c_bindings/include/crunch64.h @@ -6,5 +6,6 @@ #include "crunch64/mio0.h" #include "crunch64/yay0.h" #include "crunch64/yaz0.h" +#include "crunch64/gzip.h" #endif diff --git a/c_bindings/include/crunch64/error.h b/c_bindings/include/crunch64/error.h index 52abeef..ca23a3b 100644 --- a/c_bindings/include/crunch64/error.h +++ b/c_bindings/include/crunch64/error.h @@ -18,6 +18,7 @@ typedef enum Crunch64Error { Crunch64Error_ByteConversion, Crunch64Error_OutOfBounds, Crunch64Error_NullPointer, + Crunch64Error_InvalidCompressionLevel, } Crunch64Error; #ifdef __cplusplus diff --git a/c_bindings/include/crunch64/gzip.h b/c_bindings/include/crunch64/gzip.h new file mode 100644 index 0000000..caf3724 --- /dev/null +++ b/c_bindings/include/crunch64/gzip.h @@ -0,0 +1,58 @@ +#ifndef CRUNCH64_GZIP_H +#define CRUNCH64_GZIP_H +#pragma once + +#include +#include +#include + +#include "error.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +/** + * @brief Get a size big enough to allocate a buffer that can fit the compressed data produced by compressing `src`. + * + * Returning `true` means the function succeeded and the requested size was put in `dst_size` + * + * If this function fails to calculate said size then it will return `false` and `dst_size` may not be a valid value. + * + * @param dst_size[out] Will be set to the requested size. + * @param src_len Size of `src` + * @param src[in] Data that would be compressed + */ +Crunch64Error crunch64_gzip_compress_bound(size_t *dst_size, size_t src_len, const uint8_t *const src); + +/** + * @brief Compresses the data pointed by `src` and puts that data into `dst`. + * + * The `dst` should point to a buffer big enough to hold the compressed data. To know how big said buffer must be + * refer to `crunch64_gzip_compress_bound`. + * + * When this function is called, `dst_len` must point to the size of the `dst` pointer, allowing for range checking + * and avoiding to write out of bounds. + * + * If the function succeedes it returns `true` and it puts the compressed data on `dst` and the actual compressed + * size is put on `dst_len`. + * + * If this function fails it will return `false`. `dst_size` and `dst` may have garbage data. + * + * `dst` will include the gzip footer but no gzip header. + * + * @param dst_len[in,out] Will be set to the compressed size. It should point to the size of the `dst` buffer when the function is called. + * @param dst[out] Pointer to buffer big enough to hold the compressed data. + * @param src_len The length of the data pointed by `src`. + * @param src[in] Pointer to the decompressed data. + * @param level Compression level (4-9). + * @param small_mem If `true` then the function will output compressed blocks more often. + */ +Crunch64Error crunch64_gzip_compress(size_t *dst_len, uint8_t *dst, size_t src_len, const uint8_t *const src, int level, bool small_mem); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/c_bindings/tests.c b/c_bindings/tests.c index ac03066..2d1a267 100644 --- a/c_bindings/tests.c +++ b/c_bindings/tests.c @@ -220,10 +220,10 @@ void run_tests(const char *name, const char *file_extension, compress_bound_fn c assert(compressed_data_size > 0); assert(compressed_data != NULL); - if (!test_matching_decompression(decompress_bound, decompress, bin_size, bin, compressed_data_size, compressed_data)) { + if (decompress != NULL && !test_matching_decompression(decompress_bound, decompress, bin_size, bin, compressed_data_size, compressed_data)) { errors++; } - if (!test_matching_compression(compress_bound, compress, bin_size, bin, compressed_data_size, compressed_data)) { + if (compress != NULL && !test_matching_compression(compress_bound, compress, bin_size, bin, compressed_data_size, compressed_data)) { errors++; } @@ -240,11 +240,30 @@ void run_tests(const char *name, const char *file_extension, compress_bound_fn c } } +int gzip_level; +bool gzip_small_mem; + +Crunch64Error gzip_compress(size_t *dst_size, uint8_t *dst, size_t src_size, const uint8_t *src) { + return crunch64_gzip_compress(dst_size, dst, src_size, src, gzip_level, gzip_small_mem); +} + int main(void) { run_tests("yay0", ".Yay0", crunch64_yay0_compress_bound, crunch64_yay0_compress, crunch64_yay0_decompress_bound, crunch64_yay0_decompress); run_tests("yaz0", ".Yaz0", crunch64_yaz0_compress_bound, crunch64_yaz0_compress, crunch64_yaz0_decompress_bound, crunch64_yaz0_decompress); run_tests("mio0", ".MIO0", crunch64_mio0_compress_bound, crunch64_mio0_compress, crunch64_mio0_decompress_bound, crunch64_mio0_decompress); + gzip_level = 9; + gzip_small_mem = false; + run_tests("gzip (level 9)", ".gzip-9", crunch64_gzip_compress_bound, gzip_compress, NULL, NULL); + + gzip_level = 9; + gzip_small_mem = true; + run_tests("gzip (level 9, small_mem)", ".gzip-9-small-mem", crunch64_gzip_compress_bound, gzip_compress, NULL, NULL); + + gzip_level = 6; + gzip_small_mem = true; + run_tests("gzip (level 6, small_mem)", ".gzip-6-small-mem", crunch64_gzip_compress_bound, gzip_compress, NULL, NULL); + if (errors == 0) { fprintf(stderr, "All tests passed\n"); return 0; diff --git a/cli/src/main.rs b/cli/src/main.rs index 586ded1..68dafcd 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -18,6 +18,7 @@ enum CompressionType { Yay0, Yaz0, Mio0, + Gzip, } #[derive(Parser, Debug)] @@ -31,40 +32,47 @@ struct Args { in_path: String, #[arg()] out_path: String, + /// Compression level for gzip (4-9) + #[arg(long, default_value_t = 9)] + level: usize, + /// Output gzip blocks more frequently + #[arg(long)] + small_mem: bool, } -fn compress(format: CompressionType, bytes: &[u8]) -> Result, Crunch64Error> { - match format { +fn compress(args: &Args, bytes: &[u8]) -> Result, Crunch64Error> { + match args.format { CompressionType::Yay0 => crunch64::yay0::compress(bytes), CompressionType::Yaz0 => crunch64::yaz0::compress(bytes), CompressionType::Mio0 => crunch64::mio0::compress(bytes), + CompressionType::Gzip => crunch64::gzip::compress(bytes, args.level, args.small_mem), // _ => Err(Crunch64Error::UnsupportedCompressionType), } } -fn decompress(format: CompressionType, bytes: &[u8]) -> Result, Crunch64Error> { - match format { +fn decompress(args: &Args, bytes: &[u8]) -> Result, Crunch64Error> { + match args.format { CompressionType::Yay0 => crunch64::yay0::decompress(bytes), CompressionType::Yaz0 => crunch64::yaz0::decompress(bytes), CompressionType::Mio0 => crunch64::mio0::decompress(bytes), - //_ => Err(Crunch64Error::UnsupportedCompressionType), + _ => Err(Crunch64Error::UnsupportedCompressionType), } } fn main() { let args = Args::parse(); - let file_bytes = read_file_bytes(args.in_path); + let file_bytes = read_file_bytes(&args.in_path); let out_bytes = match args.command { - Command::Compress => match compress(args.format, file_bytes.as_slice()) { + Command::Compress => match compress(&args, file_bytes.as_slice()) { Ok(bytes) => bytes, Err(error) => { eprintln!("{:?}", error); process::exit(1); } }, - Command::Decompress => match decompress(args.format, file_bytes.as_slice()) { + Command::Decompress => match decompress(&args, file_bytes.as_slice()) { Ok(bytes) => bytes, Err(error) => { eprintln!("{:?}", error); diff --git a/lib/Cargo.toml b/lib/Cargo.toml index f9f2ad8..09bbe96 100644 --- a/lib/Cargo.toml +++ b/lib/Cargo.toml @@ -13,6 +13,7 @@ path = "src/lib.rs" crate-type = ["lib", "staticlib", "cdylib"] [dependencies] +crc32fast = "1.4.2" pyo3 = { version="0.20.0", features = ["extension-module"], optional = true } thiserror = "1.0" diff --git a/lib/crunch64/__init__.py b/lib/crunch64/__init__.py index 21fb8b7..fb1432c 100644 --- a/lib/crunch64/__init__.py +++ b/lib/crunch64/__init__.py @@ -10,3 +10,4 @@ from . import yay0 as yay0 from . import yaz0 as yaz0 from . import mio0 as mio0 +from . import gzip as gzip diff --git a/lib/crunch64/crunch64.pyi b/lib/crunch64/crunch64.pyi index 4019be8..223472a 100644 --- a/lib/crunch64/crunch64.pyi +++ b/lib/crunch64/crunch64.pyi @@ -5,3 +5,4 @@ from __future__ import annotations from . import yay0 as yay0 from . import yaz0 as yaz0 from . import mio0 as mio0 +from . import gzip as gzip diff --git a/lib/crunch64/gzip.py b/lib/crunch64/gzip.py new file mode 100644 index 0000000..5c993f6 --- /dev/null +++ b/lib/crunch64/gzip.py @@ -0,0 +1,5 @@ +#!/usr/bin/env python3 + +from __future__ import annotations + +from .crunch64 import compress_gzip as compress diff --git a/lib/crunch64/gzip.pyi b/lib/crunch64/gzip.pyi new file mode 100644 index 0000000..090ab9e --- /dev/null +++ b/lib/crunch64/gzip.pyi @@ -0,0 +1,5 @@ +#!/usr/bin/env python3 + +from __future__ import annotations + +def compress(data: bytes, level: int = 9, small_mem: bool = False) -> bytes: ... diff --git a/lib/src/gzip.rs b/lib/src/gzip.rs new file mode 100644 index 0000000..628f1ef --- /dev/null +++ b/lib/src/gzip.rs @@ -0,0 +1,1244 @@ +// Implements matching zlib/DEFLATE compression for old gzip versions (before +// 2006 or so), used by some N64 and iQue games. The compressed output has a +// gzip footer (with a CRC32 checksum and the uncompressed size) but the gzip +// header is omitted. See https://github.com/Thar0/gzip-1.3.3-ique for the +// original gzip code and https://datatracker.ietf.org/doc/html/rfc1951 for +// details on the DEFLATE compression format. + +use crate::{utils, Crunch64Error}; + +// Bitstream writer for compressed output +struct OutputStream { + bytes: Vec, + bit_buffer: u32, + bit_count: u8, +} + +impl OutputStream { + fn new(capacity: usize) -> OutputStream { + OutputStream { + bytes: Vec::with_capacity(capacity), + bit_buffer: 0, + bit_count: 0, + } + } + + fn flush_bits(&mut self) { + if self.bit_count > 0 { + self.bytes.push((self.bit_buffer & 0xFF) as u8); + self.bit_buffer = 0; + self.bit_count = 0; + } + } + + fn write_bits(&mut self, value: u16, length: u8) { + self.bit_buffer |= (value as u32) << self.bit_count; + self.bit_count += length; + while self.bit_count >= 8 { + self.bytes.push((self.bit_buffer & 0xFF) as u8); + self.bit_buffer >>= 8; + self.bit_count -= 8; + } + } + + fn write_bytes(&mut self, bytes: &[u8]) { + self.flush_bits(); + self.bytes.extend_from_slice(bytes); + } + + fn into_boxed_slice(mut self) -> Box<[u8]> { + self.flush_bits(); + self.bytes.into_boxed_slice() + } +} + +// Standard min-heap implementation as a complete binary tree in a flat array. +// We use this instead of `std::collections::BinaryHeap` to ensure consistent +// behavior when two heap elements have the same priority. +struct Heap { + data: Vec, +} + +impl Heap { + fn new(data: Vec) -> Heap { + let mut heap = Heap { data }; + + let n = heap.data.len() / 2; + for i in (0..n).rev() { + heap.sift_down(i); + } + heap + } + + fn len(&self) -> usize { + self.data.len() + } + + fn min(&self) -> T { + self.data[0] + } + + fn remove_min(&mut self) -> T { + let min = self.data[0]; + let last = self.data.pop().unwrap(); + if !self.data.is_empty() { + self.data[0] = last; + self.sift_down(0); + } + min + } + + fn replace_min(&mut self, value: T) { + self.data[0] = value; + self.sift_down(0); + } + + fn sift_down(&mut self, mut i: usize) { + let v = self.data[i]; + let mut child = 2 * i + 1; + while child < self.len() { + if child + 1 < self.len() && self.data[child + 1] <= self.data[child] { + child += 1; + } + + if v <= self.data[child] { + break; + } + + self.data[i] = self.data[child]; + i = child; + child = 2 * i + 1; + } + self.data[i] = v; + } +} + +// Huffman code implementation. A Huffman code maps symbols to variable-length +// code words, such that no code word is a prefix of another. The code words are +// bit-reversed in the output stream and in the lookup table. + +#[derive(Clone, Copy)] +struct CodeWord { + length: u8, + code: u16, +} + +struct HuffmanCode { + num_symbols: usize, + table: Vec, +} + +type NodeId = u16; +const NULL: u16 = 0xFFFF; + +// Node in a Huffman tree +struct Node { + symbol: u16, + parent: NodeId, +} + +// Subtree of a Huffman tree under construction +#[derive(Clone, Copy, PartialEq, Eq)] +struct Tree { + root: NodeId, + freq: u16, + depth: u16, +} + +impl Ord for Tree { + fn cmp(&self, other: &Self) -> std::cmp::Ordering { + (self.freq, self.depth).cmp(&(other.freq, other.depth)) + } +} + +impl PartialOrd for Tree { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } +} + +impl HuffmanCode { + fn new(lengths: &[u8], length_counts: &[u16]) -> HuffmanCode { + let num_lengths = length_counts.len(); + let empty_word = CodeWord { length: 0, code: 0 }; + + // Generate the first code for each length (non-bit-reversed) + let mut next_code = vec![0; num_lengths + 1]; + for i in 0..num_lengths { + next_code[i + 1] = (next_code[i] + length_counts[i]) << 1; + } + + // Generate code words + let mut table = vec![empty_word; lengths.len()]; + let mut max_symbol = 0; + for (i, &length) in lengths.iter().enumerate() { + if length != 0 { + let code = next_code[length as usize].reverse_bits() >> (16 - length); + table[i] = CodeWord { length, code }; + next_code[length as usize] += 1; + max_symbol = i; + } + } + + let num_symbols = max_symbol + 1; + HuffmanCode { num_symbols, table } + } + + // Construct a dynamic Huffman code from a table of symbol frequencies + fn create_dynamic(freqs: &[u16], max_length: usize) -> HuffmanCode { + let num_symbols = freqs.len(); + let max_num_nodes = 2 * num_symbols - 1; + + // Tree nodes + let mut nodes: Vec = Vec::with_capacity(max_num_nodes); + // Initial tree leaves + let mut trees: Vec = Vec::with_capacity(num_symbols); + + // Construct leaf nodes + let mut max_symbol = 0; + for (i, &freq) in freqs.iter().enumerate() { + if freq != 0 { + let new_node = nodes.len() as NodeId; + nodes.push(Node { + symbol: i as u16, + parent: NULL, + }); + trees.push(Tree { + root: new_node, + freq, + depth: 0, + }); + max_symbol = i as u16; + } + } + + // Ensure at least two symbols + while nodes.len() < 2 { + let new_symbol = if max_symbol < 2 { + max_symbol += 1; + max_symbol + } else { + 0 + }; + let new_node = nodes.len() as NodeId; + nodes.push(Node { + symbol: new_symbol, + parent: NULL, + }); + trees.push(Tree { + root: new_node, + freq: 1, + depth: 0, + }); + } + + // Construct tree and sort nodes by frequency + let mut heap = Heap::new(trees); + let mut sorted: Vec = Vec::with_capacity(max_num_nodes); + while heap.len() > 1 { + let node1 = heap.remove_min(); + let node2 = heap.min(); + + sorted.push(node1.root); + sorted.push(node2.root); + + let new_node = nodes.len() as NodeId; + nodes[node1.root as usize].parent = new_node; + nodes[node2.root as usize].parent = new_node; + nodes.push(Node { + symbol: NULL, + parent: NULL, + }); + + let new_tree = Tree { + root: new_node, + freq: node1.freq + node2.freq, + depth: 1 + std::cmp::max(node1.depth, node2.depth), + }; + heap.replace_min(new_tree); + } + sorted.push(heap.min().root); + + // Assign lengths to nodes and compute the number of codes for each length + let mut node_lengths: Vec = vec![0; max_num_nodes]; + let mut symbol_lengths: Vec = vec![0; num_symbols]; + let mut length_counts: Vec = vec![0; max_length + 1]; + let mut overflow: i32 = 0; + for &i in sorted.iter().rev() { + let node = &nodes[i as usize]; + let mut length = 0; + if node.parent != NULL { + length = 1 + node_lengths[node.parent as usize]; + if length > max_length as u8 { + length = max_length as u8; + overflow += 1; + } + } + + node_lengths[i as usize] = length; + if node.symbol != NULL { + symbol_lengths[node.symbol as usize] = length; + length_counts[length as usize] += 1; + } + } + + if overflow > 0 { + // Adjust bit lengths to avoid overflow + for _ in 0..((overflow + 1) / 2) { + for length in (0..max_length).rev() { + if length_counts[length] > 0 { + length_counts[length] -= 1; + length_counts[length + 1] += 2; + length_counts[max_length] -= 1; + break; + } + } + } + + // Regenerate lengths for each symbol in order of frequency + let mut i = 0; + for length in (0..=max_length).rev() { + for _ in 0..length_counts[length] { + let mut symbol = nodes[sorted[i] as usize].symbol; + i += 1; + while symbol == NULL { + symbol = nodes[sorted[i] as usize].symbol; + i += 1; + } + symbol_lengths[symbol as usize] = length as u8; + } + } + } + + HuffmanCode::new(&symbol_lengths, &length_counts) + } +} + +// Symbol details for the Huffman codes in the compressed data stream. There are +// 3 alphabets: bit length symbols (0-18), literal/length symbols (0-285), and +// distance symbols (0-29). Each symbol can be followed by "extra bits" in the +// compressed data stream depending on the symbol value. + +// Bit length alphabet + +const B_NUM_SYMBOLS: usize = 19; + +#[rustfmt::skip] +const B_EXTRA_BITS: [u8; B_NUM_SYMBOLS] = [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0-15 + 2, 3, 7, // 16-18 +]; + +const B_SYMBOL_ORDER: [u8; B_NUM_SYMBOLS] = [ + 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15, +]; + +// Literal/length alphabet + +const L_NUM_SYMBOLS: usize = 286; + +#[rustfmt::skip] +const L_EXTRA_BITS: [u8; L_NUM_SYMBOLS] = [ + // literals + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // eof + 0, + // lengths + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, + 4, 4, 4, 4, 5, 5, 5, 5, 0, +]; + +#[rustfmt::skip] +const BASE_LENGTH: [u16; L_NUM_SYMBOLS] = [ + // literals + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // eof + 0, + // lengths + 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, + 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, + 64, 80, 96, 112, 128, 160, 192, 224, 255, +]; + +const fn init_length_symbols() -> [u8; 256] { + let mut lcodes = [0; 256]; + let mut code = 0; + while code < 28 { + let extra_bits = L_EXTRA_BITS[code + 257] as usize; + let base = BASE_LENGTH[code + 257] as usize; + let mut n = 0; + while n < (1 << extra_bits) { + lcodes[base + n] = code as u8; + n += 1; + } + code += 1; + } + lcodes[255] = 28; + lcodes +} + +const LENGTH_SYMBOLS: [u8; 256] = init_length_symbols(); + +fn length_symbol(length: u8) -> usize { + LENGTH_SYMBOLS[length as usize] as usize + 257 +} + +const END: usize = 256; + +// Distance alphabet + +const D_NUM_SYMBOLS: usize = 30; + +#[rustfmt::skip] +const D_EXTRA_BITS: [u8; D_NUM_SYMBOLS] = [ + 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, + 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, + 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, +]; + +#[rustfmt::skip] +const BASE_DISTANCE: [u16; D_NUM_SYMBOLS] = [ + 0, 1, 2, 3, 4, 6, 8, 12, 16, 24, + 32, 48, 64, 96, 128, 192, 256, 384, 512, 768, + 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576, +]; + +const fn init_short_distance_symbols() -> [u8; 256] { + let mut dcodes = [0; 256]; + let mut code = 0; + while code < 16 { + let extra_bits = D_EXTRA_BITS[code] as usize; + let base = BASE_DISTANCE[code] as usize; + let mut n = 0; + while n < (1 << extra_bits) { + dcodes[base + n] = code as u8; + n += 1; + } + code += 1; + } + dcodes +} + +const fn init_long_distance_symbols() -> [u8; 256] { + let mut dcodes = [0; 256]; + let mut code = 16; + while code < 30 { + let extra_bits = D_EXTRA_BITS[code] as usize; + let base = (BASE_DISTANCE[code] as usize) / 128; + let mut n = 0; + while n < (1 << (extra_bits - 7)) { + dcodes[base + n] = code as u8; + n += 1; + } + code += 1; + } + dcodes +} + +const SHORT_DISTANCE_SYMBOLS: [u8; 256] = init_short_distance_symbols(); +const LONG_DISTANCE_SYMBOLS: [u8; 256] = init_long_distance_symbols(); + +fn distance_symbol(distance: u16) -> usize { + if distance < 256 { + SHORT_DISTANCE_SYMBOLS[distance as usize] as usize + } else { + LONG_DISTANCE_SYMBOLS[(distance as usize) / 128] as usize + } +} + +// Elements in the compressed data stream + +#[derive(Clone, Copy)] +enum CodeElement { + Length { length: u8 }, + RepeatPrev { repeat: u8 }, + RepeatZero3Bits { repeat: u8 }, + RepeatZero7Bits { repeat: u8 }, +} + +#[derive(Clone, Copy)] +enum DataElement { + Literal { value: u8 }, + End, + Match { length: u8, distance: u16 }, +} + +fn write_symbol(output: &mut OutputStream, code: &HuffmanCode, symbol: usize) { + let huffman_symbol = code.table[symbol]; + output.write_bits(huffman_symbol.code, huffman_symbol.length); +} + +fn write_bit_lengths(output: &mut OutputStream, elems: &[CodeElement], bcode: &HuffmanCode) { + for elem in elems { + match elem { + CodeElement::Length { length } => { + write_symbol(output, bcode, *length as usize); + } + CodeElement::RepeatPrev { repeat } => { + write_symbol(output, bcode, 16); + output.write_bits((*repeat - 3) as u16, 2); + } + CodeElement::RepeatZero3Bits { repeat } => { + write_symbol(output, bcode, 17); + output.write_bits((*repeat - 3) as u16, 3); + } + CodeElement::RepeatZero7Bits { repeat } => { + write_symbol(output, bcode, 18); + output.write_bits((*repeat - 11) as u16, 7); + } + } + } +} + +fn write_compressed_data( + output: &mut OutputStream, + elems: &[DataElement], + lcode: &HuffmanCode, + dcode: &HuffmanCode, +) { + for elem in elems { + match elem { + DataElement::Literal { value } => { + write_symbol(output, lcode, *value as usize); + } + DataElement::End => { + write_symbol(output, lcode, END); + } + DataElement::Match { length, distance } => { + let lsymbol = length_symbol(*length); + write_symbol(output, lcode, lsymbol); + let extra_lbits = L_EXTRA_BITS[lsymbol]; + if extra_lbits > 0 { + output.write_bits(*length as u16 - BASE_LENGTH[lsymbol], extra_lbits); + } + + let dsymbol = distance_symbol(*distance); + write_symbol(output, dcode, dsymbol); + let extra_dbits = D_EXTRA_BITS[dsymbol]; + if extra_dbits > 0 { + output.write_bits(*distance - BASE_DISTANCE[dsymbol], extra_dbits); + } + } + } + } +} + +fn compressed_size_bits(freqs: &[u16], code: &HuffmanCode, extra_bits: &[u8]) -> usize { + let mut size_bits = 0; + for i in 0..freqs.len() { + size_bits += freqs[i] as usize * (code.table[i].length as usize + extra_bits[i] as usize); + } + size_bits +} + +// Tables for "fixed" Huffman codes. Literal/length symbols 286-287 are never +// used and distance symbols 30-31 are never used but are still included when +// constructing the code. +const fn init_fixed_lcode_lengths() -> [u8; 288] { + let mut fixed_lcode_lengths = [0; 288]; + let mut i = 0; + while i < 144 { + fixed_lcode_lengths[i] = 8; + i += 1; + } + while i < 256 { + fixed_lcode_lengths[i] = 9; + i += 1; + } + while i < 280 { + fixed_lcode_lengths[i] = 7; + i += 1; + } + while i < 288 { + fixed_lcode_lengths[i] = 8; + i += 1; + } + fixed_lcode_lengths +} + +const FIXED_LCODE_LENGTHS: [u8; 288] = init_fixed_lcode_lengths(); +const FIXED_LCODE_LENGTH_COUNTS: [u16; 10] = [0, 0, 0, 0, 0, 0, 0, 24, 152, 112]; + +const FIXED_DCODE_LENGTHS: [u8; 32] = [5; 32]; +const FIXED_DCODE_LENGTH_COUNTS: [u16; 5] = [0, 0, 0, 0, 32]; + +// Buffers compressed data into blocks +struct BlockWriter { + // Maximum number of elements in a block + buffer_size: usize, + // Elements for the current block + code_elements: Vec, + data_elements: Vec, + // Number of matches in the current block + num_matches: usize, + // Symbol frequencies + bfreqs: [u16; B_NUM_SYMBOLS], + lfreqs: [u16; L_NUM_SYMBOLS], + dfreqs: [u16; D_NUM_SYMBOLS], + // Fixed codes + fixed_lcode: HuffmanCode, + fixed_dcode: HuffmanCode, +} + +impl BlockWriter { + fn new(buffer_size: usize) -> BlockWriter { + BlockWriter { + buffer_size, + code_elements: Vec::with_capacity(L_NUM_SYMBOLS + D_NUM_SYMBOLS), + data_elements: Vec::with_capacity(buffer_size), + num_matches: 0, + bfreqs: [0; B_NUM_SYMBOLS], + lfreqs: [0; L_NUM_SYMBOLS], + dfreqs: [0; D_NUM_SYMBOLS], + fixed_lcode: HuffmanCode::new(&FIXED_LCODE_LENGTHS, &FIXED_LCODE_LENGTH_COUNTS), + fixed_dcode: HuffmanCode::new(&FIXED_DCODE_LENGTHS, &FIXED_DCODE_LENGTH_COUNTS), + } + } + + fn add_literal(&mut self, value: u8) { + self.data_elements.push(DataElement::Literal { value }); + self.lfreqs[value as usize] += 1; + } + + fn add_match(&mut self, match_length: usize, match_distance: usize) { + let length = (match_length - 3) as u8; + let distance = (match_distance - 1) as u16; + + self.data_elements + .push(DataElement::Match { length, distance }); + self.num_matches += 1; + self.lfreqs[length_symbol(length)] += 1; + self.dfreqs[distance_symbol(distance)] += 1; + } + + fn add_code_elements(&mut self, length: u8, repeat: u8) { + if repeat >= 3 { + let (elem, symbol) = if length != 0 { + (CodeElement::RepeatPrev { repeat }, 16) + } else if repeat <= 10 { + (CodeElement::RepeatZero3Bits { repeat }, 17) + } else { + (CodeElement::RepeatZero7Bits { repeat }, 18) + }; + self.code_elements.push(elem); + self.bfreqs[symbol] += 1; + } else if repeat > 0 { + let elem = CodeElement::Length { length }; + self.code_elements + .resize(self.code_elements.len() + repeat as usize, elem); + self.bfreqs[length as usize] += repeat as u16; + } + } + + fn generate_code_elements(&mut self, code: &HuffmanCode) { + let mut prev = 0; + let mut length = code.table[0].length; + let mut repeat = 0; + let mut max_repeat = if length == 0 { 138 } else { 6 }; + + for i in 0..code.num_symbols { + let next = if i + 1 < code.num_symbols { + code.table[i + 1].length + } else { + 0 + }; + repeat += 1; + if i + 1 == code.num_symbols + || (length != prev && length != 0) + || length != next + || repeat == max_repeat + { + self.add_code_elements(length, repeat); + repeat = 0; + max_repeat = if next == 0 { 138 } else { 6 }; + } + prev = length; + length = next; + } + } + + fn should_flush_block(&self, block_size: usize) -> bool { + let num_elements = self.data_elements.len(); + let num_matches = self.num_matches; + if num_elements == self.buffer_size - 1 { + return true; + } + if num_elements % 0x1000 == 0 { + let mut estimated_output_size_bits = num_elements * 8; + for (i, &freq) in self.dfreqs.iter().enumerate() { + estimated_output_size_bits += (5 + D_EXTRA_BITS[i] as usize) * freq as usize; + } + + let estimated_output_size = estimated_output_size_bits / 8; + if num_matches < num_elements / 2 && estimated_output_size < block_size / 2 { + return true; + } + } + false + } + + fn flush_block(&mut self, output: &mut OutputStream, input_bytes: Option<&[u8]>, eof: bool) { + self.data_elements.push(DataElement::End); + self.lfreqs[END] += 1; + + // Generate Huffman codes + let lcode = HuffmanCode::create_dynamic(&self.lfreqs, 15); + let dcode = HuffmanCode::create_dynamic(&self.dfreqs, 15); + + self.generate_code_elements(&lcode); + self.generate_code_elements(&dcode); + let bcode = HuffmanCode::create_dynamic(&self.bfreqs, 7); + + let mut num_bl_indices = 4; + for i in (4..B_NUM_SYMBOLS).rev() { + if bcode.table[B_SYMBOL_ORDER[i] as usize].length != 0 { + num_bl_indices = i + 1; + break; + } + } + + // Compute lengths to determine best compression method + let fixed_size_bits = 3 // block header + + compressed_size_bits(&self.lfreqs, &self.fixed_lcode, &L_EXTRA_BITS) + + compressed_size_bits(&self.dfreqs, &self.fixed_dcode, &D_EXTRA_BITS); + let dynamic_size_bits = 3 // block header + + 5 + 5 + 4 // hlit, hdist, hclen + + 3 * num_bl_indices // bit lengths + + compressed_size_bits(&self.bfreqs, &bcode, &B_EXTRA_BITS) + + compressed_size_bits(&self.lfreqs, &lcode, &L_EXTRA_BITS) + + compressed_size_bits(&self.dfreqs, &dcode, &D_EXTRA_BITS); + + let fixed_size_bytes = (fixed_size_bits + 7) / 8; + let dynamic_size_bytes = (dynamic_size_bits + 7) / 8; + + let uncompressed_size_bytes = if let Some(bytes) = input_bytes { + 4 + bytes.len() + } else { + usize::MAX + }; + let compressed_size_bytes = std::cmp::min(fixed_size_bytes, dynamic_size_bytes); + + // Write block + output.write_bits(eof as u16, 1); + if uncompressed_size_bytes <= compressed_size_bytes { + let data: &[u8] = input_bytes.unwrap(); + let len: u16 = data.len() as u16; + let nlen: u16 = !len; + output.write_bits(0b00, 2); + output.write_bytes(&len.to_le_bytes()); + output.write_bytes(&nlen.to_le_bytes()); + output.write_bytes(data); + } else if fixed_size_bytes <= dynamic_size_bytes { + output.write_bits(0b01, 2); + write_compressed_data( + output, + &self.data_elements, + &self.fixed_lcode, + &self.fixed_dcode, + ); + } else { + output.write_bits(0b10, 2); + output.write_bits(lcode.num_symbols as u16 - 257, 5); + output.write_bits(dcode.num_symbols as u16 - 1, 5); + output.write_bits(num_bl_indices as u16 - 4, 4); + for &bsymbol in B_SYMBOL_ORDER.iter().take(num_bl_indices) { + output.write_bits(bcode.table[bsymbol as usize].length as u16, 3); + } + write_bit_lengths(output, &self.code_elements, &bcode); + write_compressed_data(output, &self.data_elements, &lcode, &dcode); + } + + // Reset for next block + self.code_elements.clear(); + self.data_elements.clear(); + self.num_matches = 0; + self.bfreqs.fill(0); + self.lfreqs.fill(0); + self.dfreqs.fill(0); + } +} + +// Compression settings + +struct Config { + good_match: usize, + max_lazy_match: usize, + nice_match: usize, + max_chain_length: usize, +} + +const COMPRESSION_LEVELS: [Config; 10] = [ + Config { + good_match: 0, + max_lazy_match: 0, + nice_match: 0, + max_chain_length: 0, + }, + Config { + good_match: 4, + max_lazy_match: 4, + nice_match: 8, + max_chain_length: 4, + }, + Config { + good_match: 4, + max_lazy_match: 5, + nice_match: 16, + max_chain_length: 8, + }, + Config { + good_match: 4, + max_lazy_match: 6, + nice_match: 32, + max_chain_length: 32, + }, + Config { + good_match: 4, + max_lazy_match: 4, + nice_match: 16, + max_chain_length: 16, + }, + Config { + good_match: 8, + max_lazy_match: 16, + nice_match: 32, + max_chain_length: 32, + }, + Config { + good_match: 8, + max_lazy_match: 16, + nice_match: 128, + max_chain_length: 128, + }, + Config { + good_match: 8, + max_lazy_match: 32, + nice_match: 128, + max_chain_length: 256, + }, + Config { + good_match: 32, + max_lazy_match: 128, + nice_match: 258, + max_chain_length: 1024, + }, + Config { + good_match: 32, + max_lazy_match: 258, + nice_match: 258, + max_chain_length: 4096, + }, +]; + +const WINDOW_SIZE: usize = 0x8000; +const WINDOW_MASK: usize = WINDOW_SIZE - 1; + +const MIN_MATCH: usize = 3; +const MAX_MATCH: usize = 258; + +const MIN_LOOKAHEAD: usize = MAX_MATCH + MIN_MATCH + 1; +const MAX_DIST: usize = WINDOW_SIZE - MIN_LOOKAHEAD; +const TOO_FAR: usize = 4096; + +// Sentinel value for hash chains. Using 0 means we can't have any matches at +// the start of the window. +const NIL: usize = 0; + +fn update_hash(hash: usize, c: u8, mask: usize) -> usize { + ((hash << 5) ^ c as usize) & mask +} + +fn size_for_compressed_buffer(input_size: usize) -> Result { + // Upper bound based on fixed-Huffman-code blocks consisting of only 9-byte + // literals (stored blocks might be shorter but might fall out of the window + // before we can emit them). The minimum block size is 0x1000 bytes (if + // `should_flush_block` decides to end a block early) and each block + // requires a 3-bit header. + let upper_bound_bits = 3 * ((input_size + 0xFFF) / 0x1000) // block headers + + 9 * input_size // literals + + 8 * 8; // footer + Ok((upper_bound_bits + 7) / 8) +} + +pub fn compress(bytes: &[u8], level: usize, small_mem: bool) -> Result, Crunch64Error> { + let input_size = bytes.len(); + + // Levels 0-3 use a slightly different compression algorithm which is not + // implemented here + if !(4..=9).contains(&level) { + return Err(Crunch64Error::InvalidCompressionLevel); + } + + let config = &COMPRESSION_LEVELS[level]; + let buffer_size = if small_mem { 0x2000 } else { 0x8000 }; + let hash_bits = if small_mem { 13 } else { 15 }; + let hash_size = 1 << hash_bits; + let hash_mask = hash_size - 1; + + let mut output = OutputStream::new(size_for_compressed_buffer(bytes.len())?); + let mut writer = BlockWriter::new(buffer_size); + let mut hasher = crc32fast::Hasher::new(); + + // Old gzip versions can read past the window into memory used for other + // global variables, which can affect compression output. We allocate a + // little extra space and reproduce the original memory layout to match. + let mut window: Vec = vec![0; 2 * WINDOW_SIZE + MAX_MATCH]; + + const ORIGINAL_GZIP_GARBAGE: &[u8] = &[ + 0x00, 0x00, 0x00, 0x00, // inptr (0) + 0x03, 0x00, 0x00, 0x00, // ifd (3) + 0xB5, 0x2F, 0x05, 0x08, // z_suffix (0x08052FB5) + 0x00, 0x00, 0x00, 0x00, // bk (0) + 0x00, 0x00, 0x00, 0x00, // bb (0) + 0x52, 0xD0, 0xFF, 0xFF, // file_type (0xFFFFD052) + 0xD0, 0x4A, 0x05, 0x08, // file_method (0x08054AD0) + 0x00, 0x00, 0x00, 0x00, // decrypt (0) + 0x00, 0x00, 0x00, 0x00, // key (0) + 0x0A, 0x00, 0x00, 0x00, // header_bytes (10) + // Remaining bytes are 0 + ]; + window[2 * WINDOW_SIZE..2 * WINDOW_SIZE + ORIGINAL_GZIP_GARBAGE.len()] + .copy_from_slice(ORIGINAL_GZIP_GARBAGE); + + // Position in input buffer + let mut input_pos = std::cmp::min(2 * WINDOW_SIZE, input_size); + // True if we have reached the end of input + let mut eof: bool = input_size < 2 * WINDOW_SIZE; + // Length of current block + let mut block_length: usize = 0; + + // Copy start of input into window + window[0..input_pos].copy_from_slice(&bytes[0..input_pos]); + hasher.update(&bytes[0..input_pos]); + + // Current position in window + let mut pos: usize = 0; + // Number of bytes left in window + let mut lookahead = input_pos; + + // Heads of hash chains + let mut head: Vec = vec![NIL; hash_size]; + // Next pointers in hash chains + let mut next: Vec = vec![NIL; WINDOW_SIZE]; + + // Current hash value + let mut hash: usize = 0; + hash = update_hash(hash, window[0], hash_mask); + hash = update_hash(hash, window[1], hash_mask); + + // True if we haven't emitted the previous character yet (either as a + // literal or a match) + let mut has_prev_char: bool = false; + // Best match length for previous character + let mut prev_match_len: usize = MIN_MATCH - 1; + // Best match distance for previous character + let mut prev_match_dist: usize = 0; + + while lookahead > 0 { + // Insert new string into the hash table + hash = update_hash(hash, window[pos + MIN_MATCH - 1], hash_mask); + next[pos & WINDOW_MASK] = head[hash]; + head[hash] = pos; + + // Find the longest match + let mut match_pos = next[pos & WINDOW_MASK]; + let mut best_pos = 0; + let mut best_len = prev_match_len; + if match_pos != NIL && prev_match_len < config.max_lazy_match && pos - match_pos <= MAX_DIST + { + // Bound for number of potential matches to check. If the previous + // match is "good" we don't check as many. + let mut chain_length = if prev_match_len >= config.good_match { + config.max_chain_length / 4 + } else { + config.max_chain_length + }; + + // Earliest position to check for matches + let limit = if pos > MAX_DIST { pos - MAX_DIST } else { NIL }; + + loop { + if window[match_pos] == window[pos] + && window[match_pos + 1] == window[pos + 1] + && window[match_pos + best_len] == window[pos + best_len] + { + // The hash function guarantees that if the hashes are equal and + // the first two bytes match, the third byte will too + let candidate_length = 3 + utils::longest_common_prefix( + &window[match_pos + 3..match_pos + MAX_MATCH], + &window[pos + 3..pos + MAX_MATCH], + ); + if candidate_length > best_len { + best_pos = match_pos; + best_len = candidate_length; + if best_len >= config.nice_match { + break; + } + } + } + + match_pos = next[match_pos & WINDOW_MASK]; + chain_length -= 1; + if match_pos <= limit || chain_length == 0 { + break; + } + } + + best_len = std::cmp::min(best_len, lookahead); + if best_len == MIN_MATCH && pos - best_pos > TOO_FAR { + best_len = MIN_MATCH - 1; + } + } + + let mut should_flush = false; + if prev_match_len >= MIN_MATCH && prev_match_len >= best_len { + // Emit previous match + writer.add_match(prev_match_len, prev_match_dist); + should_flush = writer.should_flush_block(block_length); + + // Insert new strings in the hash table + for i in 1..prev_match_len - 1 { + hash = update_hash(hash, window[pos + i + MIN_MATCH - 1], hash_mask); + next[(pos + i) & WINDOW_MASK] = head[hash]; + head[hash] = pos + i; + } + + block_length += prev_match_len - 1; + pos += prev_match_len - 1; + lookahead -= prev_match_len - 1; + + has_prev_char = false; + prev_match_len = MIN_MATCH - 1; + prev_match_dist = 0; + } else { + // Remember current match and emit previous character as literal if it exists + if has_prev_char { + writer.add_literal(window[pos - 1]); + should_flush = writer.should_flush_block(block_length); + } + + block_length += 1; + pos += 1; + lookahead -= 1; + + has_prev_char = true; + prev_match_len = best_len; + prev_match_dist = pos - 1 - best_pos; + } + + if should_flush { + if pos >= block_length { + writer.flush_block(&mut output, Some(&window[pos - block_length..pos]), false); + } else { + writer.flush_block(&mut output, None, false); + } + block_length = 0; + } + + // Refill window + if lookahead < MIN_LOOKAHEAD && !eof && pos >= WINDOW_SIZE + MAX_DIST { + window.copy_within(WINDOW_SIZE..2 * WINDOW_SIZE, 0); + + pos -= WINDOW_SIZE; + for i in &mut head { + *i = if *i >= WINDOW_SIZE { + *i - WINDOW_SIZE + } else { + NIL + }; + } + for i in &mut next { + *i = if *i >= WINDOW_SIZE { + *i - WINDOW_SIZE + } else { + NIL + }; + } + + let refill_start = input_pos; + let refill_end = std::cmp::min(refill_start + WINDOW_SIZE, input_size); + let refill_size = refill_end - refill_start; + window[WINDOW_SIZE..WINDOW_SIZE + refill_size] + .copy_from_slice(&bytes[refill_start..refill_end]); + hasher.update(&bytes[refill_start..refill_end]); + + input_pos = refill_end; + lookahead += refill_size; + if refill_size == 0 { + eof = true; + } + } + } + + if has_prev_char { + writer.add_literal(window[pos - 1]); + } + + if pos >= block_length { + writer.flush_block(&mut output, Some(&window[pos - block_length..pos]), true); + } else { + writer.flush_block(&mut output, None, true); + } + + output.write_bytes(&hasher.finalize().to_le_bytes()); + output.write_bytes(&(input_size as u32).to_le_bytes()); + + Ok(output.into_boxed_slice()) +} + +#[cfg(feature = "c_bindings")] +mod c_bindings { + use std::ffi::c_int; + + #[no_mangle] + pub extern "C" fn crunch64_gzip_compress_bound( + dst_size: *mut usize, + src_len: usize, + src: *const u8, + ) -> super::Crunch64Error { + if dst_size.is_null() || src.is_null() { + return super::Crunch64Error::NullPointer; + } + + match super::size_for_compressed_buffer(src_len) { + Err(e) => return e, + Ok(uncompressed_size) => unsafe { *dst_size = uncompressed_size }, + } + + super::Crunch64Error::Okay + } + + #[no_mangle] + pub extern "C" fn crunch64_gzip_compress( + dst_len: *mut usize, + dst: *mut u8, + src_len: usize, + src: *const u8, + level: c_int, + small_mem: bool, + ) -> super::Crunch64Error { + if dst_len.is_null() || dst.is_null() || src.is_null() { + return super::Crunch64Error::NullPointer; + } + + let bytes = match super::utils::u8_vec_from_pointer_array(src_len, src) { + Err(e) => return e, + Ok(d) => d, + }; + + let data = match super::compress(&bytes, level as usize, small_mem) { + Err(e) => return e, + Ok(d) => d, + }; + + if let Err(e) = super::utils::set_pointer_array_from_u8_array(dst_len, dst, &data) { + return e; + } + + super::Crunch64Error::Okay + } +} + +#[cfg(feature = "python_bindings")] +pub(crate) mod python_bindings { + use pyo3::prelude::*; + use std::borrow::Cow; + + /** + * We use a `Cow` instead of a plain &[u8] because the latter only allows Python's + * `bytes` objects, while `Cow`` allows for both `bytes` and `bytearray`. + * This is important because an argument typed as `bytes` allows to pass a + * `bytearray` object too. + */ + + #[pyfunction] + #[pyo3(signature = (bytes, level=9, small_mem=false))] + pub(crate) fn compress_gzip( + bytes: Cow<[u8]>, + level: usize, + small_mem: bool, + ) -> Result, super::Crunch64Error> { + Ok(Cow::Owned( + super::compress(&bytes, level, small_mem)?.into(), + )) + } +} + +#[cfg(test)] +mod tests { + use crate::Crunch64Error; + use core::panic; + use rstest::rstest; + use std::{ + fs::File, + io::{BufReader, Read}, + path::PathBuf, + }; + + pub fn read_test_file(path: PathBuf) -> Vec { + let file = match File::open(path) { + Ok(file) => file, + Err(_error) => { + panic!("Failed to open file"); + } + }; + + let mut buf_reader = BufReader::new(file); + let mut buffer = Vec::new(); + + let _ = buf_reader.read_to_end(&mut buffer); + + buffer + } + + #[rstest] + fn test_matching_compression_level_9( + #[files("../test_data/*.gzip-9")] path: PathBuf, + ) -> Result<(), Crunch64Error> { + let compressed_file = &read_test_file(path.clone()); + let decompressed_file = &read_test_file(path.with_extension("")); + + let compressed = super::compress(decompressed_file.as_slice(), 9, false)?; + assert_eq!(compressed_file, compressed.as_ref()); + Ok(()) + } + + #[rstest] + fn test_matching_compression_level_9_small_mem( + #[files("../test_data/*.gzip-9-small-mem")] path: PathBuf, + ) -> Result<(), Crunch64Error> { + let compressed_file = &read_test_file(path.clone()); + let decompressed_file = &read_test_file(path.with_extension("")); + + let compressed = super::compress(decompressed_file.as_slice(), 9, true)?; + assert_eq!(compressed_file, compressed.as_ref()); + Ok(()) + } + + #[rstest] + fn test_matching_compression_level_6_small_mem( + #[files("../test_data/*.gzip-6-small-mem")] path: PathBuf, + ) -> Result<(), Crunch64Error> { + let compressed_file = &read_test_file(path.clone()); + let decompressed_file = &read_test_file(path.with_extension("")); + + let compressed = super::compress(decompressed_file.as_slice(), 6, true)?; + assert_eq!(compressed_file, compressed.as_ref()); + Ok(()) + } +} diff --git a/lib/src/lib.rs b/lib/src/lib.rs index 30cad5c..715a1d8 100644 --- a/lib/src/lib.rs +++ b/lib/src/lib.rs @@ -1,3 +1,4 @@ +pub mod gzip; pub mod mio0; pub mod yay0; pub mod yaz0; @@ -33,6 +34,8 @@ pub enum Crunch64Error { OutOfBounds, #[error("Pointer is null")] NullPointer, + #[error("Invalid compression level")] + InvalidCompressionLevel, } #[cfg(feature = "python_bindings")] @@ -51,5 +54,6 @@ fn crunch64(_py: Python<'_>, m: &PyModule) -> PyResult<()> { m.add_function(wrap_pyfunction!(yaz0::python_bindings::compress_yaz0, m)?)?; m.add_function(wrap_pyfunction!(mio0::python_bindings::decompress_mio0, m)?)?; m.add_function(wrap_pyfunction!(mio0::python_bindings::compress_mio0, m)?)?; + m.add_function(wrap_pyfunction!(gzip::python_bindings::compress_gzip, m)?)?; Ok(()) } diff --git a/python_bindings/tests.py b/python_bindings/tests.py index a90e195..86d944a 100755 --- a/python_bindings/tests.py +++ b/python_bindings/tests.py @@ -49,8 +49,8 @@ def test_matching_compression( def run_tests( name: str, file_extension: str, - compress: Callable[[bytes], bytes], - decompress: Callable[[bytes], bytes], + compress: Callable[[bytes], bytes] | None, + decompress: Callable[[bytes], bytes] | None, ): global errors @@ -72,9 +72,13 @@ def run_tests( print(f"Reading {comp_path}") comp_data = comp_path.read_bytes() - if not test_matching_decompression(decompress, bin_data, comp_data): + if decompress is not None and not test_matching_decompression( + decompress, bin_data, comp_data + ): errors += 1 - if not test_matching_compression(compress, bin_data, comp_data): + if compress is not None and not test_matching_compression( + compress, bin_data, comp_data + ): errors += 1 print() @@ -83,6 +87,24 @@ def run_tests( run_tests("yaz0", ".Yaz0", crunch64.yaz0.compress, crunch64.yaz0.decompress) run_tests("yay0", ".Yay0", crunch64.yay0.compress, crunch64.yay0.decompress) run_tests("mio0", ".MIO0", crunch64.mio0.compress, crunch64.mio0.decompress) +run_tests( + "gzip (level 9)", + ".gzip-9", + compress=lambda data: crunch64.gzip.compress(data), + decompress=None, +) +run_tests( + "gzip (level 9, small_mem)", + ".gzip-9-small-mem", + compress=lambda data: crunch64.gzip.compress(data, small_mem=True), + decompress=None, +) +run_tests( + "gzip (level 6, small_mem)", + ".gzip-6-small-mem", + compress=lambda data: crunch64.gzip.compress(data, level=6, small_mem=True), + decompress=None, +) if not errors: print("All tests passed") diff --git a/test_data/dirt.png.bin.gzip-6-small-mem b/test_data/dirt.png.bin.gzip-6-small-mem new file mode 100644 index 0000000000000000000000000000000000000000..7731597cf95c98e10861280e8d00b13a79e9775b GIT binary patch literal 319062 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

DuisryCmN+ zB3+$5dz+vr{pPqR1bu}!q&j5Uc^^zsqLGOlDU8M!J6fBZn60I>gy7pDpK;)TwOET| zQLTC&_)`gu4fP-z99=pSh|O)?9388f#)Q7aneJ=(I7thJ_Gvg1-vm*w?1NV!Nji}i zONSc)I)bl%t0`dY2-fddKAy(P;1!=sSdMDv@Ev~Kd#fb~sM~<&F z=RvRS%Izj~oi5s*VH5>~>0Zm>kzYo7%AeuG4z?xkr^^e5ibMF|KllO{1*+{v%9Q)Y z#-<(nSoGvS8a;(iw9Ek5qcH|i){DKq(1^ATyH$!kp^XbYFQKTBl*yIgko7Z6IQaZH z{9j$rqQ2y{%E5)GQR0{>8A^`XtGIoaoqChAJU>KVm}I{kn)a%#YPbDTJ1r4cGm=&0 z7ylrWH-u*fs2C4RMgv1(xIhO|swED*DcvD(QPxT+k|0cWMspxdy&9Dhp~9v7P0cg%&xr`XfNn=fp~!MQ z{PWNBo|KiZIzzu{QK&+!Sgk$nKedhVl~(N;pF?TQ;=4KpDzv+e7txR=gJUjnW-tD9 zPy3~^5|zXoe_TFk^D=r0bd*sk1eRF>WQp#UJ?@mtaNsimH084C4BFDpIp)if57{9hMg@v{YgmFyq z5ct+Hzc3H{1Ark-Yu7m(dOby*BF8)33v#kp|ErBeF_b-;UPKQyn!moMA~t3?=XYK~ zjfx~R%s47tRo5?d7{7#b!2o!Y_Cidh&IRRni)Z4rw;SYC!`_IQYIX)=6@x~js(+jn zls&1)*ZOz=LzzK9hR#!hjH6~>JQK+00U2h?QQg2PYlr{6Xgrsm;=?~=4cYfx0C|et zre8=|L~DTFd$`-H>n~kaFOMRECb%ltYadW|Z zWS)??i`i_w%D;oqs4Ed)Vm@IryV2$FN}wr?bwyKJwINI9S=1+j-M+t>P zG~EbzWapz9lHtP z{DX&&ktD9dFDYEuG7sSOHj^kbAvByfTtI)d_URNmXle=rhHriIJ_a{wBeP${gPe&z z81?Y1L5~XVSjbm<-K#n)p>t?k6s~CVE0Va)cxZW{*YgFo~LF@GK3nFrab*#QL?l9vMS0t4M4;RhStNB%NdRVIJn zfT^b+)X~lpuBQNp<;R67YJ4#&at_pj6=AmB(cNr$J(;@uS&BsO=Z=K;b* zY976|+w~WwlDOPAMYQ2oq5e?x^X_G!0^??aeyOt${%U!XH5=>2{<&+wIS=aJoj!Mb z2N+7|YLoO6AqLt6_7pVStNjH^h&)L!$Q!c!eHc)c^t*Zu?j6tVLS4$B#I1SPey#Ne z!`I**Z->&jS|uDs8*G(rI6w;ybN+Pg4FB6w!X_2oZ?vy9wLRCJ4kiF+J(wWG1OMSE zQ7jAFJY?D}n&PPa+VCkP?h?j%={54TYZsWkOZ}x)8YtWYzS3hBno-H^3s%%`xz_vf zX^5UU*O+)C`S)E`!qfQ7i1#x)(mIju1(?p|fu#2)+abusurFb!p50@ATs31zLjcS z=yE`gm8RFg((~t-tw|Aas?sHR2uee>vY-c?nsHrx+g&!xKkB?%MCg0QpX>3!y%b=d zx%Lx|H`)@CjtPtzgL=7><1=nhK))c4zCcAK$@1|5>ePHFe6+v&1Lh6ViGsfNKLPEi zL%0WqukiWwjaBCsMNFr+-Jt^EGm?@8834eBP^rf%aCEpF;SwpDGPr^_(l&Ya5H`^{`{24L36TTf z5R-UnX1EwBUjjOFk5O?B3cI-sDnd%C>yuKFkjf57yE*in9gsyT3d)d8?=gx?mjFsP zS&cIU=&W2&N#gUekWbjocP*P*Ch1GEJs3XnanUM#a|>v?27`s)D7RqwTF!33UcF5j z=0_Pc@X{{3ppB?5|EV}i{6R%#u?|NOoZG6$G+ykk!^0R~rDzE5cBf&d z;?3YeY&y1+-jTDn{SLBhsT;ofEEoYyZ$fAl@3E3rWa1_61vp3(kP3sl2Z;A1WStX~ zsUQVBSOlV78mYYW?Az+Y=Ex^c!~@jQ49^no0fKDTz|X*mtWXc9!k;S03~~Tdnkt&F zJ;1YS{5|Uw7C1+qiV~|TYrrC!maK4Ksto)`!}fX1R`0KS+DE~?Z}Ydv<%(4*vp;7> z@yDfV%*~WqsQw^FzKZ@8RYPCGCd%Mx+&x|?gf68d2{*?Q;to~#vAj?{MJy1Ju-X%3 zY_tpCm7 zYNaU8A#LBljJ~0l8}O+HEgp1Qi$rft1nESvKeAp|kS-Ku&kQ+V}1ujq&pS*C{F*|C zGHRq==#GCUc&DYcS30m<4E5@`*_`zXP>Boa!UGsqI)Kc7OXwAFmtOB#V6mI z{B38pmSr#P@$Ad0?{~Xr`>fBPblSX~U=cDc)+>CM!|=iOe{{0_#6Q3(O@zG3ZAX^j#~&vDXmLb-36P({!J>mJm#>NQZXO{3 zQ0V&yD=+xqqnU}FZ+gHj)U37BLlIa$yM|hmhR`d}?%<0e#efCRt6^jpA zap^+w;}(qxV7FF3&xACIQa=XNmvdR3I1@2JPoVoLCirPQ$t36s#_83zs?q#qjwz(I zU4;7b>SC@QqM-pPvr-)7L60o$XgI{UF^WLOEl5 zM(}T^e;X3ifxFm#R?%OOOL!G$M=!c%q7QtpulI0ML+VoEQWo=pi|})HqG_1QkEO@0 z+aYJSZ+5LK5`XBrs*S1F;6G2dk0aSzPk?-sl4=)UgGG2rkZySVt7Zwp9c|X{u zroV=2q|NmaEdM+LP5C5UmNXs^2RIY;?De`1#c*I>tYd5@1!IOE{P4d&Lhm3ADf3WR zF$VH21$bJQ-Cu%VRS%bV4{1m+>jeX?8+vFY1VDIvnJEkag+7z-9PF4G0YvQs&z{t5 zt+sAL1kQLT)JOpY;o8**sQzU4@)nM*di)(XJotg0s^a9fWl2rOItPFQvX*)({Qy$K-Tq;HqwiVOR*Ffkl^@)t;&mDi@!^uW_n?jg1>#4WT=u%Jy z8xilwT`m8R_HHe{lM34;I{g@4ouM=Yo3;DwjQvZq-2?Xs5{Ri~0PlYs+V6!&aqj)S zWo@bs4=JfK_?kbH@~`pfceC`v{O~&%t++7-o<}~o+jAhnauur{pLylA%;|>JxiZ|~ zmZdHo&@osE12(4@H(+lw4##F{2YVgf*K(B_1ZDkkhpU$(f|E)w1hyH75$5VM5V*MF zyZi~UM|H7ktvQIl!s!0Lf_p{vSGxrt)AC+xw*dnLIf5&B5rk@?qM5OfO|eUGFUk<+Jf1E?{Bj=;~`Vz&8IUp!RrHc!JU1N(NsO)^NV0IJQzW(cr6*Ppxp zh3cQ@@G$ni&ih4>=rCm0^V~v+83%Les0wHvv5F|>S9>6+fi$t`jEV9SW3()@#6Cgx z_U>U$D01L;**RbE?rY{q!X6+xxP#`><0&M@0`82@FqjHTd2QmLx48lsEygY0Fw6_7$9C>LfbJR zdyZqz2;k4e%+bP0l8bUI1>GTR)BMr3odZj!>1yv__?9Ql%G<*fMxY$j8$_cYINN@3 z2xbw*=@tg;jIa7c!cOK@iN@U^Y;G%CHk8H<#Y3*?5cZ#aL~xcp@tjdwy|$a9rF{M+g|ajng}uapVTz8?-+ z3QLi`rnq5$)@9nv+C!L?$P*}O+-h#$Yd390)VXfDC&C2UZ=$>hi(I`O=2PMPsX zu9=Dr;Dylqaraw38zj>s=6$0P98hw<^)dl$o{0;bLrfRyZFjhp8J1jZ<0_i1|9Dz1 z`~CKolHixfNe6_%FJxhvzu559v!$Ej@=PpXn2xO5c$v<1B#DT;R*bDk&e(ccxd}Pg zlJU~?y3x;aDkcz3|0j0El+E(M?PG!XbCd#tvwvSC+t|UbuQXS{GLX=B2fyb1>9@Mz zuUb~VnwVgF_}*-=6YL)VuMOo0PCyt(-Xtvqso;#WuzC}AJB`9+YF|Fk!Q%OA6+#Q& z0ANZEpm0tC9(A3^8{fN~nkK#xn)%vp9x(;GMUQb9mA$=}>r%HSnEGwg1MgNG7K5ul zNv9@s`mNytovJSecUgNn1&bI;h$NkLB`FqC<+vd@Ndgi8Mgg z@1@DdIL=oWX{@$!%08o+!X+6HuOMBQmv6=kju}f4u}_*-x8e_+zO*Zm>eYe=H~Prc zWsb3VoOF58b3(Jt1N>>sS|Ce*Yd1O!T@aqKKuLsLow-14 zm%95{ZVIw>Xb~@h!tKAE-KaCy*{KEV^FGSHA>lhkEkRM02a&6siZvN%{yL5H<9tj; z_X23fLON--Sl?*&C&Lo(QeM>MAdl?&Ksjm=eBs4^n%41z0-oL1Pq~b6tN*Gk!cQT@ z^|Z#CdE95q87KgdbFBKdkx9Ky1gChF-9d5grYac=uvG7Q+9+tf2wYp48Hy<%tFOP* z5+6~KlDRVyxU#F^z!Uj24g>VVXOA1K{Lid{#j(RYh|Y%i+5?|kk8Of2Ct#$8U7a=F zEvD;G`))(#K}`U9`JrPXFO%1L#3sSM<^@Q@meG2Gphj&~T|T?~ub9N>BK$V$BnkEO zOq{Nkg_0r%`&_*JMfk~$ztmolTFHp6cj7+j1-NrZ#93gTFjdL^Jp+6Qz`4n?Vy%`#B{(~x=)$K~)2A1zz99oqC3@-6=jzJ_s?3UcaZxuLK$ zZ$tA`V7YP-vhP7}ALa|ut2g1-?Ph8|V6tM{*N=H@V2+H+a2m#KcfS17L1xYz`ngeq zsyyjkM2d571E!(XdpGSJ%LPyy&1qmH+j;HFcaFnc5p7oVCl}`ZYbxUaw=vZCZPbn6 z=QCFU)(bn6mwhF$-6aN)WTAmvr6NsPHkUB4V&moBRug5dSI}-PKL0_>MRD4|p3EmK zT^A(mOE$+UMAGZkxR@B_+kmhRgQ(*p7kyZbPSs?aC4lo9pI!cl6QASxeixbjx)c+; zvse5U60=GxB#7&!ii`%y&mYjY_`l*)Bt1j__oVL?_k-%wAzxeWHW{h!e<#iXb0^{X z-N#SksJFl*iZ!M#HKSNfckp?Ky&yWJgkR+0aj{(#jKyzRq4gV`;-Mhdpfm1G+ z%IeLA|Bav#Z`S9EeQK#$P{nlj`(_R@0YZJXUk=RZXJG%9%3wv>vcyWa0$ZT4Dphy` z%%+$$kIq9yhO}dVNfaJkdrgJeuihVjL3>6p71}*k6!h3dcmleB<2F}vSlLg@2O=`p(M7)e39>voHkHpqzU zT6KZb7ly*fIl>sseyyf(C`O1hWDyuc86sCBQ#!(1yE&iaa(BPx*K_YnkwP+3SL#YpYd% z@s}pC^osU72OmR{U?kH1E^K7QNRK#l+oT>tJPLC%~Y%Wum*d(sx+S9%^UT0RbR0>EIZJ0@cV zj~4^OM|W+o+4%)Mte~u;3Z^=UyW> zj9$n)zX@H3joqW|rQY#4SRe{F2H*+v|dfiW4t#O`~kjO!ZD)=AXVu7`RB=Q{sSPp7jtlAc7}=rMJ8KN+tJ(v>1| z5SM6FOl3c^gBs+WVAonstP7?YtK#eOP9ktj>)^8Gw@$_9seP3{L*<|vH-H(r2 zxB%jkTY#869#v)N7rVzt1B+JZSnYJU-oXa&4(6g6{M5VR z#(aVTRPLjxyV!7sdSmOSu~cM#tobVC#cYzw>j7cUSGsU~h<(NYr9zJQkkpjNs;k$^ z+#3Oe?FA3fz3Sa#wMMO=XXvJq6M%9TzS9YQ-CF39q*gFnQi5c-r~=BU0kvQDap@Zr zs7cuM%Y=X90(MgWHCYR_7V*3`8~z^OxzN_EN*aM_ysio|?w=WbUcR}vAmuQ)8z4?Q zwj4`M5!X`Yl+fJs6t@`k9^8A?w7wgx7NPorz7><;{QBjl{qMNI`Vu~b!ERf*`^rr= zRspBrq&Bq3c$8rM%3D3Y_=39f$G6tcN4ezJo&TGtQ8~#8*zH3+%%)|dfG`Nd3Jp?D z-{H}uT8aWM%$|8a8gjHBH0u!lwA+=(7OToUiDBmVp?@j62aTjkMzn6H450YMyNOM5 z5^1k49@q}fAh{kUy0wyePcxyt(ms-$#ZMz_o}K}d$>lW%=jYr@XVx5dQT5bwkOQUR zvPu2>tM=xhp`Hnr<-^J@2iCTa)XQko5&7}56>7E0^y{=Jy-?;i>>Iqj$=Le@`b?1} z1-3h{h&0l@bl7z$7t=oA$ieXGbPV9t+Wi&-7DkxKQ#-QmkNQucJ zm1hV}$6~o71Ki=~b*?rd!^7L-DDk$!O`YQIkn)IR)Q<+tV8N6UHxN z+kp;}{9iLqPdXat@b${*!deL(8YZ$~=%-oJfg1+qTJdp?%d72Uv_I0UvT z63H(dN`ei6-^vprux52cYaAFsTLw305eeoiK+0el*|D*Fm>2#dbORppdej$Tjuop9 z3JVC;s?!0aN0~|eeR$v+<(T3-opcj#z!wcS5M@T!SUe+Vhmf|_IXnG->c$j}eGN9? za)R~%xr`{Ag3;5#DXDW%xe>VjppbYEVD(oFjFIXqpgAvxrkK>eNiP;93&Hz{ z!`t6i0WsRo3=*`7ie6FQx(kNOficR*SA;Jt?e%%w_{F1)c&?}Sw>#pGP~vvN`ow1raj zq9~%WR=waNY~?4?*NpEk^GP`1hu9>k&oavGdA?6TBBOM~+jkX_`Le0<)URcLWjsnFNVv6G#Wy>rG zD))CvpqM=o-0QgwM7U#lkLq^b=FE`P;TN}_0s^}>WSXIwYH|`ll|YPacXKVFi?kI8 zV2XLvV%dK7eQkl5j0LK`418xEaA_K}I9BaiwCbvk*=0WP=on^v?GOB59-y-lOwj)0 z`SqILH|f^WeVc%n(#?6L2bO^n*>g_zGCIK0jvqbGzx;lx`NtKcdW?n@6NB)_AOxT= z?HLn4CZ5$Qv)6js2Sx*C(Y< zY(>N;jX-m5>B7dMGu+d$mF|1st4Kr|Rxy(+(!0m#V`LK6d5ddb z$aZQ}Vb}j%1(gFxRH6<2x(#SJ*4XIWZF?0XBlfQ<ql7jIox~3q7mFMeRL=HsL zsL1I?A#)2XyNd;GL0L7#G5D6ReYbvE6l*GRh9#j^vwMyrvaP(3UWeSML@neE;FQx0 zop3%@`(X11odMtj_SwL8LdYgkkdOnJhkxLCunj3uuJUqdsKG@h9Dmpce^g})EogPW zEO9;U8FTd4l|`%C^V+X;o{OlQ;C~}Cp|_zLGW7CMsPocWYUth-3mbKjv$=jFBQ!U& zE#(0^WCOV2si09}n%<0q>PGpakTuv#>Cjf*H2-yvCX+jUk77a}XbWVpK}LXwMw0*l zY^xS$n8FrL2#X>2DL(kEMqH$1KiKc!i36vu{t&=2`cufrdq7g(sOCoWHg@^Pvmx@l zEu+MO>{TB*Hu~-|TyB|>XH05!3Q1Hx{fE(MOJmI2(#AU7X$jsMw1@;rbq>nv{I-RY zzI>00`OBOnt__Mrt-V2O+XKQ{40b-~!C7ZQ4Zx_>%h$+t46-kMVy!zsPD>}O8i_?U zH7G>sf3zZ#KJ{KOj1Q|K+q;};)vgIjE%PF+e7;el%;fJsFtDVYqWGjhTk}2%3-CYK zKGCDoD$tzHBoNB{+cyH&;;U5o%gvIO14GvKo=N#|LeV;!q9z>mjR@Ez6XNUVZa0uR znO^#ovo$N)Q96$7t+;&q8HW)mOLUoB5cL4M0IAsyE8Z<%WG)_P$plFpXmj5rJ~^&u zJbA^zbemdhL|t|c*^acxrDRIbW9Z7HN57L+R-HsoI#v>lTJrt6>;DRV8H0iy9p&74 z${ip$SwPE^p~T!PxSJWu6EqX>R`L9?g9RFC@#n7Hdjf}{n(8~#2q2b>u@F5Mi(wH8aAQr(! z>M478^+D1Y!9wWo5;OfC8SAn#&)xcoZ*SGh#)IdyTa^_)&bgouY&W7HretsUhFO6! zt0sA6*J}4rT;Ji|w&vrQ02g}^q8s*MUy;hTyDmlZu6I`H?#y%8ct-e`J=TTkv>{Jr z!N|_#pz>JT>fhXzn#Z?3((hi}*Qlkx7bX6uetWHo*q-W#IV^?Dq&vcf?{=bjXIA4)*=c1l59D%&1A2d zS|yaC2#`NDIJ9i2q`suLP@ur?p)ZbM~K8pOg)2)>fvt1D2m{cnLvExd^Ov#~z zTEfpMaVSUqeArX8xMds4^03Y6oX%{@JhKDL44kWPU55I3@RVd8QPdQJ)PA+ZjoYBd zqBBQUG8MHM>J-_)sWs_9&kqy9^Ooh;ozcq}yC$qiOI6CwCwrP(i_ z3$5d@{xIR3U_hGlTg%kOG81E-ugO1UKVaUd)6rhA(PlOTT4myX8**JUYg%Y;#}waN_x;3r~{QmZO;cMb9ejFTdH7w0|82 zpRbH9PhyzFUk-livTBw3Q@}UU9+>mE274DazG1fzGa)O>mpV=I7=ifxFF|lU_NUdj z=vl=dCwo^;D^xP+>L$)~?m_Uc#yc2+m<`k#`C=b;hS0$< zU`WR{%}s$m<^af$nc#BUPmr&4_@!ku92l|rHi!E@fsh&|>~A8~$Ijg``cU2)L~S5e zTD7(1Zlyg7yQlg5116i4D~K_(8B|idPJg!unn_q-DH94VP=OLhXi`aL?PU9gSow(; z*oI@r{|VuxyQgg_fwgN>EhtM3)a(Jcoq^YB_^p=;vUtl*RgEVZH}-CE4uPGgKI6d=HjdLN%5nsy z+I!!2w0Qc#IYs)uB2Xz|HI?gxao|U)c!QY9cvjMB7}fN{ruu0ACx7X~n<)PuUFl4s ziS;xy-?NI=u^|js^6(K?FKhn*QMmKy7XC8t1oq?C;4oYOkR|{SNiC@M6woXdxIwQj z=kdVr&HN@~5!aSK>LDWsS1qBGO8`>G^Ry^^1}Nu%ufF_XR0RI5D3!}G93rsVYs5W? zeIq>AXVt|Xs?GU^3ytG>a8s89GyD)RWV6B6@@ZHz(fm)4t_EQ82=$5qcQfH2C0+f| zWGWkdF)Z>k9qt-qUk+5Yh|wcZV2NEyvz(W^hxqPT_}g^V7Z2hx%mX-B9TCu66#}sj z*&AZ?&$fEE+wPmvlgIaZjP_d{THDM{1KEh)77OUwnT5QSo-;t)z{VMm9;g&ftPo*g zMmT3q$t$@<_>UW{Qt9cjbkn0mO0~81U&KcHKU>Y=Bt_LQ=8#$9OC2QxqyZH$OQ&%W zXp$5_w_Ya~f~Rr-dM}2{IrvMPFkIa{8cSpC#69{Bu4pt39vH2YKe!ol1mas&>&JW) zSIcGojvWo>$7B~)s9p4lR7<$B2ly&u)=&UXj-X@Ue=z901JQ^(}7J zX8s@z->16)z>+AJBhWlKdW`EmAVNEUK&3_ZRW<1aNX_}PQ_Wgdzq?OlM@2rSJw8zW zrW?N9L4AY?|9&!RsG?oVtZ%p@IJHUcK_))cWImn+u~BYLIRx7|a({{{6Ng(YzD>Ni z(LwQCC0<|C|0Ueww+*R_7_#1km*kEi;k|6Ip=_ICIL&(L4a;w?ffMFuh zJlVt39B>>VovaeliR~ndmOXq@&1zAnQnfy1DpTDbf@f<>)h5GDC`~WK_aelK_ev`b zrpXz==not%*w{~kD{(BWD;Y`&cJGY#A#WuY*3J3XEqD6oWxXkNbJXP3G8a){!rs-M zqA)TSYRfJ&uB^3uK^Vx*UQXvya5vvtr;K4_yP8(EG_F)m*!&!xt*Eg6LGZwXS)OgT zBk#H%M|yUB+4Y}BS$*d}NvNpx+V89Hd}sXtBpnY_+-uyenr_1(56E3&#bRTz+ehF$ z6Q|T1%e*Gc8xMUt)%j6WaCM7rFdh@aCI{rV*S!UO<%71FlU}v=iGKh_2iDm8*?Q2mK zkwgjc{;|0U3rWGGvD#^;GprB4L+@{Dg_I4B`#F1NnA)0ri7!`~*P@*iHJ%LabgtL!vp;40;}tfmb?slGN{epI@fR9@N()^pgnxTIY{6@x#G@0?j5 z$?=YsKVngGe;o@mgc+n$yYnWQLmMNBA%>&;qA{F|Aw7m zy&9Lk9ary6G96t$8*-?^g$NhyY?h@3(To73)6lyb=V zd|IrW4>``^mKeJ~nS255^ZR_%g@VUW3@8%8s)}@kRi&W&Ik(^!~42Z8C_t&3_mu@S0 z4~4I!1G=rX#3{nOkpF0*_v99r{nrSHb`l>Dq$cEwpU0N#XdyBg^|DQRknY4f;~l8q zGJ&{QlL>xSNe%A=iFlJBaQkG^++}np&=o>=sbWn@Ao3^ZPuYUsgn9+v-EBP=$(38U zeDtvk^t19V8`Ttd$Qa%xweCP=lPzR?aK;s_=Cc>~_rs^By9V4z(~t`$OY{zfsYB2H z?3Y?Ol2}e#r@a<^(e0Rd)NsaCs5pw|0<`0hlwd9C1D2N&^d?`O#w2<#$dT*w1mz6# zA0@>4MMRh(vSpro;#oVY|FY{Gu8^i*a&k12x<*mMXWrCXGxS>J%vyUH@N;*%C#2)x zzM%wA!DvB>ywz;qvz{)#IW58Dr-s{#RheAw0OjCdFVBvX6&~FwxQ%5}2mNr(%iI;w zDxQ1snc&tY@4SN0ZNd-g4R80r#wBifZ*jD2rgB#Vv>44der_Sx5ew56fGG@ea04=q zA}8P2-AUdUuva3Cbas(@@T+C%I|{pHz!TWng)|X=*eIEH0K9SuAq~p75X3kUiVnb1 zhRM5wf7fsWaR;pKGQya2YWI;#8zh`!fo_{ierqtp7a4sAZK};rqb&*#Zg*U2Qh=vB z>!Dz99L@bTQ0{~H;Ew|mqEPR_Ziiq$+`k?aFop0PN@~aTgS_PsFIB+m+rl-hd_(ac zAVVyD_2l7U>kEK1tb@R`7JyO;dSL7u?yFxch~P#h z8L>cT5U)jyGQf9Wxc?^`x4Yb@$5OMAQf%)MRcl!HA%FmsB6&e|9=z+ISYY~~Jn3r_OzxHPWa zx)l-VHHW#Q`=05ifFJwwG7@4dg}D=)hBRVu_kZBMOMoy59E!?$4;&#W=s5L!fJ^p- zq2%Rx#T%p&18fub_WpwA#T}v0;4nK0pga>IUgnTV;kk_bd$r6QsJ*s$q}gjJ*W1(rj0^mWSh+ph$B8{HS2#0Ei-=%p5~XEm_Ra6 zLA0xTHCo$~*l%G$z6J-pTx-7%bsa_ot$84D8kmAo+}Bv*24yS*@6Snq>B!!&&j9ae zY`gVq_{d{c|1IlWK&&bAh8Y6o;)?{wWo)7mYb@)P(XZ7FU)os`N@L#!jw(4q8RX~M zR9OZjP74Q@+UbSm36v8;6Dk3cNdyK#@1WURxwYSKo6o+N2eT~ zA!1aQ{PD*NrY3*s5Lym=h&KumONoHy4fD3f!nCz`p&&t|=jcps z`$sk^Odh($K6;tqc7m#PhaOQ z{joiXVm7eRU;Q`*KR~<3x1UeWDv_4Bq2u2~R!llCeU?B3`}c-gi#9HSXxSHI_7$0S zD+wD}kMKo<91VLRqjA+wM}biFL|441z+U{EMeU`!wKQTw+Xei*W=D9nSo~bcMXR8^ z0IRYsasJf=(TXXxyi#lu(e=C5eU>#)Yu%=C9kxxeMlf7@{H z`>BuL>N+Za%YhCmFE}N-mI0Pf{V<+01=t&KAj>U$QBvxNRd-pGON~!XGTNzS;c&dA( zuc+=f9jE+FF(%CTH8G^VZGuJhhz`r!`f6Y^O7Xb*h3LVk5)z#WEXrgdhl#vvH!M zg|&fuNLXN?ISRaLk5R&Rg#4~2IqHh|&Sp7>Ozgu$AldoaJlh zjuSY-=lqGwWU+}hk9$D-hYQ_&{dfFEAW`-ZJKoRRaF`@tH{b`Y8yLLAtRWEP&mHzxSTGMTL;?#(nwQgO#^Ghkoz z+=>G~lY5i}6W@LD8V&R&1l&g}rTF49_~PCi^3{DcGUT8WQ@GCIi*^v(b?MezfX4M+ zB&WX)LJ-|~bl#-r_$iqHY0%={dtqyO0KQXjlZNn^(uy!11X*j0eQw#4)Wjc)K)MgX z*1h3Z`$5Pvh=(nTOQ`E6ufr1x%3$yWk0KdRBo4?|Rx!|Wk=u^)IOcJ1e0%p)Wx&*} zQ{kgp=x=}a)}rgy8*&QVc~$N><6UOY(>Ohr%R4geqWPALmzgd~_$p>k081#GaoZS@ zcMuuKZH4t=&Q6lhwTnv3k~f%Xp0K;4sY*yK#-m>vV|h=uMjq4@Kf&$>ndVIXnV!M; z=0L?;3~YHQ&6M`y^+Oduj1G{7>C%Jwe0Zk=WEq`3e`c-kzYdUay_7S!7KuTub-^N= zztml9M!fCR^W!`OpTKuSD2BQ|R41wU=*Yu#qKWczg+QFcJ^ZO~5YV!=8f1E?1fVxq z)PSou8!&QD$N_7)SZ)u9V;AupeJw1}R125lo zqxI{$Mggx)ayoea*T1%7)7|vVmUY^H(C1esZ1Y0}YV7~^?|lgEW}L&}K&|*`LR82L z4z2D(T~o11dRoIGM3Us7xCaa4c08eh*?HY@CH%Q6lBYEzELpuDq_HK%koAeM-z}32bs-`QU*bp9MtfG zgMl?TFs@A(UBn|_{v`kO>+t3PY9Tl(e+g(5iv@e)&$Cfq*%0v?F!5fX4MREN1-i3j z5oPK$_)2NE(-mg$Gl`Wt?Re6U*Q!@J{;UX>>Y7xe1R86{u7ymMna zZ2Qsl)PuJ8mR^=%Zt;c@KSdyOS#;Xo+$s z+!1D%whmEPM#aPO0KCHk4;mDT&%4KciOkf9U8PlnaK(yVZjayOyl0~#ls)jkFYI~5 zp>u>z2dFiuan)bvH{(ilLe7_FF8rUyJwZ}ku9ac4%d+qdH@5SKT*wR}S6 z?|tB!U4`);-DaNqP9F~gVQOK~$S{(6wa@W!c=L5;wDZ?-C41Jy%klzK7;xV)G9;9x zXt11j%{fH=c)rkUpbWq!uj6u=zPj#@M(N~I4&U-qRyhf73;3+i#t|TaRkU#))p8Z+ zSmDF}D=JcL@#%LA5QnsP@JM3LW`OutUx(q}v7a=5ks3P$0XI%N%o^Xp#~QR0Q>bqi zQ-5ar?9ZxmpB5*L!rC~?pw z-#F4Y8|Zn|$=ORE`y|NX8uw12IM6(+;+}DLg9@Z1rXS3|&AorjoB)In7rDXv^QD_J z-IdL>tPZHj9DB>d&SsrW?4$Z|_RhP8MFpH}dK(!UGNE}I5>1S%ITATy$uZl-_AK7W zcAU<=w|Ub<1@Fs)!)32Ikq*J+=lX6>A}PzRRgoMt)w9I=vg)vmjgtwVyMk2fr2E>* za{&NW@^;frh22!ozyIHTQOM$1u4O_IoS=y4Q5L@0C7~C=nFtlHrWgR`vABoGh zp9?SznODt{&tD0-{|zQG3C6YZ#C~vAzrg&!1&4zX!EumF^vJWrE8b29PNN@-FDQ zpGfciHRIKvT1ji-tAxLVW92?-UKVZ$Sesg8_EjV{2Y61#rEJ+{iW7^WmeS;Re&O+8 z+q_A4TM~D8yE3CH?DaaGB-?HpD9?C z6pq_UA&tB_RPNHC@zfTUPB{#1CbH_*TgpaKV7xmvG;2F-m%VDp6*o;X$}PutR{M)W z9zN6(YtEqmA*}PQ84R-LoZ0!TbuJZwgD9HaJHzh&8D3f~Rd6v2f``}YdY-~N;)2ud znC(q7fn|(~5M|OpWJtYkNFb@k+ofzY(IY%c;e;*-BN;vwf8(fg^=pAgS)Pv2n4x;T z8egB<4>pC18e#C=%5c_+d>#50K@T;iuC)J1_c@O%}*Z?aQpbzY6E0r}OIb z6lXbiW|Qg};eP{2BO``?9Scl3kb$1xPcpwJ;Gb3Av>8T#Vp2PVtThc<4a!u)Q7*QG zZ~tyvcqnK{pE~M9QyJ&{V-u4@hX8>BF9+*vkbsy~3%^SDMYYBKF}FLk*(Ay4aT&Lf zjE#%)N+_#|>mn@|{BUW@+*r|rKtIhX8N3gCil|ROUt7P?B6c4C)_U{ukw=xb!cd@0-35J(kOwT12Wq~#^~w3%pcIy_S{rbFsfpnJV2G^z(NOUmJy<(g-g)07e=M|K>9qjB5~~}G509-T zrai*Byh2cIj+`TNe5W~r%+N4~2_o8Ktu@^j&lO#wAC&bSBu!Al7&7`@XCUCRcelWj zEOB2>kEJweDQqSE-WU4Y)#nPA`3G`3fcN#yZKkZ*Pj)k3px~T}7AoeIp?HC%{h83s z*VV$$GEU>)9f}Ns*mPD;g>UE+q#Rc?P?dJ${k53qbvvR5%jj?RUW*NPK2S+o zs2fr~X;S$p#51<*0ANMPXMxxrHtHEbja)O_CxB{aJ<#1KUZE@{5&F)yYZ8@(o=1%?qa{sr1s_XxBu+j3?-%``F=MUwW> zQ51NDSL_Qb8&DJbiMe~|>2?J+q^hYK_FwkD=kd@ZL4-;J>hM|`c>eKc%fj_jfrplz zLel7KF@3k782MkHzh{(^QT-5vM8)Bh_iX7w!1kevwCJi*uSD-U;~ls|@cZ2dtrr@9 zQgr(>jCn#U2AnpVw!ZYcsAx<}M1mII>+q#^`x+HJh=*Jqy(#-k*ruDCCea(nMd5E! z@WcE0TS+Q66r;eQMjp2wXvi$a^TB5Lusq=o;LU+|#FHK^M8~~#Mp$%2yLX@W#hC|> z@DQsUy=<5c5c$J}@bf@nHM%;F zn3r()^b7iPkG_*fm%YSv=VYM!?+mWfXeXlXFWsr0rwf{Zz$Q?DCFP?!7=oiT6EqA_zvj zPrjsN>WhD#a{T3;;fc8^Q3!6yt5HPU1qD1#^dP9Wk8=g6xVgEca4qN+DK8Au$x%37 zR=GFRy?!_sc)We|i3!kZA2JxpVpal+fuH^n`?rMc6ccKk_oLHMn0F7yUW9|wGai3) zK6)K*!Hu+ecO_%esmCsG))}X$JROGJJ_2zVkLsfK8)(wxzd)*KKR{fszz3o8*%yPa zFf_}LU(D2Z+8HOn;GcX=IIJ6-+17n$)_$$XETF#VEf$=>Z<7jQ2S7^d`m~Itruon? z(@TigdUV7?`$RiR8xYrj2m%MqVtjR~@5IV4L0l?M#nf5i^!pErqk8mTX#BiIMy$(e zl`Ink&1d-S*UUb;yCSmu5&>qcJjSw4``S{EW2KQGm%O9Cu9hO#I`I=Y|W zT}|xG-G&1VEv7Z1W`@*HabzN8*{B-- zOEtI(g(#SSzq|r0FC0`L14X4Il8$5nC;B`}Pkk7HWjWVst0FMXY z9}fLZ(eP3Ba)XZ?ETm=E9w6^{m2e_Vsd3f6Uuz=VX@coMPjU61>X@dFG~9?=hy5Pg zN}Ix6fg$Y;05fUnu~FGI_@#c1Ih*WVcl}8wa~u=JRtTEJP)S)UeKF9zd+Q@c$4z$8F=EuX?y{n~fHr}H7oaP6XNKJ=xSaw3 zIGEEF;hBudX>yd+BFxV9?o8JukrYdIfOB%=XQ8`^rjNM;awlOA+SEPDPMzK7p>UBL zhX$QuXm`AN_pst@p1r&LYht}?{)!0ql3L06L#1)WkU4O!!8T*^@Lr|HQjo(GySS{x zQYPVZ4U}A2HlfPtaI#hh4+7G6$SS>uB8iz|e0j7V@YlQvhT!tdxcI?#H+^J z+aMzDnuXMf;49e{j@rVo-}yAc$FfyTTVH!V0s1TFlqVV&l7iQ}i{B@P|Ma6>A>Y;@ zjNZKyI$1dAUUr|R@dTSw>>fjpXLK~UdQ|Q^YyDZMp*|%ub;v3am|Dlmq_B`lI_q>@ z8DZ*W>;8*T!RRlu{P+jev!-R~fzQq*#rvBoyC&f&H-7H<4cR`g%u>_h=@c3S9n4A+ ze15*!>T^r%&b?+64%Sx8eK0IKMweUdz!|QDGYU2}5Zkk-kJi7l$OjYFN{QvI1T(9nu%ZE@bg(lE z?1OFMtuDK0i35G5MqWatbb~GAKRi4gVu(GMO!Pa$X;#bt?^}dCJ z)5^EN$Q`19%}ZAFhS3%e(tXsz4IA9%13TRpw4@#SCAZM`ak=gUT6*W*P$|R&LYlzS zWF9-p|LuLV#6~=Y2$7GaJRDKl*e3`ai5P(p!Ahn(p#z)Ux~~K^4pg+z-j?|1Yie&F zYEW1&_Jj(_0UcN8olpyj>;5ga+V&2I$Vujb<{bwR?s>bz+MVAS`x{T@wG#MmwXxy}KZFA-SH{YWGjb;mK5lA+Ju7N0 ze4K;hbeO&}jr{7cQ1>OEbe(T2(sPbk;>jAGKeG^rW94vqd7&gl)4{@}&`?);7~wsQRQg}^NHIG|m6mi_rREx{l6 zfs&emj;b#B*j*JUX-i>jk0keePkJ67)LzG=iJj~fzu@w$iN zf7S$jbS8L3FrIyWoPF$kAdjNm6wE8#1rlr@!K&R@JoXJ&uB~RjI=URnF8aZ*Vn5&Z zMKH)`$fj)a;9Q10i9-^9ssd!Ieb9E6CP$~|+(Z{nUme3Q5sKE+bfMabydG6=@8}2q zThy!}0qySH0^|#PS{cJB;jPj3h4H69!7Bjy#U3P#XWRYg<%`AQ`Cos@eljq-Ti7gd z@o@@99F9Oa?dEA*P}YC8b+aF|AOaX)q^YAzEpB~%+`8VaT z<__oT<-xVQnk{zvWZ<8M*NmszW1G*=eE3WJsh@l}bCYL9LwLOMERP>bSDj{5q*Ugx zO2W^~{MTrggt@Ji_Qjh6eHUKi6uJ-0QPfN6U~|bG4T+Rg2_*3{i9W>mF9f8eRLdJ2 zff2J;;hg)}q?Waf=op7t_9Ka}ID9bVNxJjLBsJwX1NmdITMs6te}(<`6tLu@elIYq zMQ25L&&?`YUs(U#_c?<$~$V$hoqjtpQ0H9N~AChAx{Gksz`Wmds;>6jeli` zK%y(nd^pKt#5i|T?^PLfv4B6eeXJZPP63Wg}DLjTeNTSgg(&TDsT{(mHZ_sl#bZ_0lF=w zk$!yZ@Sc4fK*-KgxTOKN1=Qh*8Wk>zXx*AwX_Kpn#MccumFB7xeEe-%kKbP>4DUcs z0H>z8r@lJt*~5%o-1pl3VO_pQ=F6;)KSLcc0Kx`;VS>jw zmk5?Z9EhIGZa>_Myom;dH1N{K7Z}`k>3`+oyMTy`CGC$|ws&Lp3cLd1PPye(^W?l_ z(*Ng`Jp2JADQ&2Bt8m#Qf3ZK@9zVA^7HZHWWXsg4pqindO2Nd!tkQOnsqtggSt{)={Q2i)Z@IfMD&Ym#xJ`ewtU?s=5aEw7TV0BrrRb=&t*gpQy> z@9GU#J*F_7uYsj#oJM)uKw_f`Rvsj0f`L-nG)&4c$&T#2?K%4JHy-EC!IH0`UNP|} zM-lUcSuK3BF=+0=m18gX7o4W<+-2X^A47Xza{LvgOno`0^)(N{_^Di8Qi(DkXyU&2 zUi}9H)xDK0C|eeZ1R*l*JDO}~My+Qsd?i(eE=1lXwKj?fTl_H;j~oy^R%U?yuN={H~%4Wi#}fFhI%Cu z6F~!pY1zixdE3EvNTV|G)Kq%GGfkOY*H^6L%}iQ*;&t|Sva$4Ta~DO^0>Ys?*p@wf zG2wV_>1j4C*1c~u=Yq4t+!qBOjq#D%hx)fyY^Y`m7FxT%OiQ2t;*AD>o8dmy?(!kP z8XQCDRxTWEzL8)Qq&M()+#RL^&g3iE`>I3U#gMkHwP{M0mJlEk#4hi2cM1SyvMbvf zCZ#TtTT&Mo;F>K#24pg}%w$fqy)s0f#PJHo!9HE}Pq6l0$JM4jkFwDj@zu_VOr?=! z^7Wy(pa3ngO*PU~Uw;VFhb^h!FW5>QG!B~*0}FF#jvhPGD+zn?Fs$kLypW0IK$WB~ud9A*G9SKS zG{a;=L22c%Fw7xM46zL9CcoMmA5JRY$Xp~8C47F51}%;LXIFK|8tNoIVuw9q4= zWae}}YHV9-yxD^(;ZHGxpZ}a7xgw(?{QEDKIcw_K$f6iYD~F}RwY;V;*t|U{RmZ>9 zoEjGQt4Ug1MRieXJAzCRZRMM9BY660%y(S>9Z4sBmRWL=vAueDHNAmvt>LaOZxqj) zJ|BB+{KV%_Ns|wx^LuGgtA3od+Ba<@s~Or;A~DJj{5TBM$~DI2T;s&1n?n}rF0R>`)a%yPp7-hR61PD#2ABH{txP3g({IV^ zI-dvnhK!W#RA@BuOMW_kDu3l;&(ZzRPrr_JN6%eS_K6z;WvFPK^|kmeP$<-tHPIdw zF&4bxKmE(L^v0kvR!#rowN!WYE=uahvrA?^zi)1H`07aZ7?wW?(^YzE9Nel*dl%}6 zcBN1wBUqz!YzqQ4A>^w=lO$go%$aI_jE=JQP{A9F6Qebaa=^p>pFI8ctuln!tZk}2 zW7~EzuN3(pU@W2TXkHaNYkkv}Fv{U%x5tM^A{VGRpRkc>eg!o(0Rey##T|Muuv6DB zWFl5Wi)w7MJRY_06}h0dc0B7Ip_{2-3%Gd$@&?bn*_gwqx|*%HPl#0Opuo;5W_I{L zs@~=`Iv=qSjkxdUtaG=mOnhQzV2bFJtdX?OoE}iDv@OdWnFEbZod3_TfU52spa^;wtwSBT}lNraIE`l6O}O`zi_1& zWM#2V@?`$-E;#E&peOpiX^K`>iFu<#{hnGgkjFGAlKw29qLK6ukAc{5-5w0 z7^zHpw6H&gM&1t_`4)B!8a;VJvppj>OuNfd@wD6Hg$5>4W$UTk2-C9o4`bd}M+Kh* zD4(k-i>vG9hQj#2QWL_{fCi#4a_|#9hFWetUGS?69|B!xSGIzT0V`(sua~tJgjDb_ zPk|9W25uz@%*w=F&;s$Vv*NLfk9XWNw~#uApn2}izT4k5VDfli_8t@pFv|dU`AWil z>Z)<*r%PW!11$gCOmJ8D_~V=gfMvXPTe-+x?{WtZ zsb@=vWke!^)O1N6_2qO`AN+n=Itl@CF>7<&74cArFtM! zUQat|m^a}As>OA?0c}lG8^!G4xxZVf4tL2onAq5p5!|>63|ED}=QZjV;D_Olg zMlN$yLgio(`|;k#Injz#7~CiVwOVIPLG3b34~3?A5&0@2CIz@$fNU1! z>IEqTmM{^hSKu#f)ER(neKER#5}yt_L3&1Au=u^)=RgVF4G5z5t9}4iEVG^~U5h7n zWj0^8d0xV#jj4>uh|#C|>PYzxoXFFEbm=)BN$U0kq~cpA+JWm|uurMow{B_&FL5W0 z@B%-_Y*@6v7$DRf|MwlblPKurzz>1fcYqpMQ{xkNxBlwUtG2~HIEgTlFQW0R>JKzs zv}Se7;N$7<{=|W8%RaQV3-4|{CjW2Hw}(dWBdx)3Aj7k<_^yx6AHt{L;xXwy;cE!f zVh8-GIWAk@%cF&>AHfN1aS`FWAB$S;NB2b?s-Cn>ZMD!QMOb0pbxat{u8F}c^Id|^ z)K5%)AWRD*4no{Tj^7*#Yei3Yffll3*0#!j_WfbSL&V9X4&(yeQT1qaGM~zXGUwT( zx)n`cF<7tVor1F}`<@i;CS1W%6xe-t4afr?IR(k<3{Xl$`+^owiWc3}Ui>_i^x#ot zZ3F}u^z=j%4?!>3sL>;o^Ni`OegWM<&?H|I$$h(1T*a~|tK74up!S2cziYtz^{azU zRdawuWi4?}7I$9zMlTS17ocLRG1lZ){un>ZKfpme0txU%;=Jxf=v?^N-1oO-UL|W=C5JrI-D&hsorM@vLUZ7JhsHUwwz1xy_MwM3$h=Q7TQ&Qz1I!-ct z`wzc__v)`e{~iQA02vf5*K%1jHWmXy48S~Ux?V>Oay=UY2uJ`wM42m;qKrt81292} zNT0#cndr)9;`D%N>E4`lhJo8ZwAE>iJyPYHRl4SxO7MU5yxU%SWlg|4P$`hxcb>~M z1Kh!<#PbS(v4fEw?tv4G`T|3@oE`8Iqp(-MpY-Vn^lo7K2U&J^@;|X80;@60QIN=; zB)N}#8`1aJ$(`GH*4pZV>e%D552kYaDFAu%(I^eWhw}zV*Ld&=2c2tPGQfaf0+TV1 zE4c-~Pa8xoabp$)^o~H*o^g+IegVA$Vfc9J>%fYJBJ-)&10Q*AtQEWl9vl?TKvwFy zoIzB*O#&)sbvt*q1(I42ynQB}n5e@`0hzbb+5)g*iIMWthVjc$TZ3G5A+mm(bW+;R zhwzG@)~BMjCroS_O5}Lat1{CwH)pi!+Uy;5vqZnI6K?KR1|!$~If=LX-Lo@icn*MG zh38tVlDT2RjpEt7;#4mDlc%zm4a;Psz9gVK6UH)nNFNL4IHD=9E`G%dunS+T-M{4aP@kfl zuR>PLfJrW>tUiiTwqLL0L!esiH*9JxXc-oL{A)WI9tOJWXUTzvlkmuzu8roc&dRs@ z*Cv_KmavzRIvTt)8-xj(_5A%i6mDY5Rgq*Z4&1vydulVt%`(f?E^lzD{S_)8<-IXsW zPeW(8mZwd{?#y4F>7yw58>Q&N1L*nfiOG&dhLd63b2v|G@+)Y>@yott=NR9s&A(MI zE_)1}>)d)P*r-Ae4t|Ez%p~Doy;1sQKVYYDZ+;g%fl$flS~k7oIu_>jeOLE8O<*oB z9iOt2!PS0lEO~V)AipTx^nobnxLK?D@6Zlu_r(w=QKcCm1)|096^R;ZuT7uO>N_Iy zw%SUHC{=VHNnm-fkBP0&^!2*9F449u8jBX!m$2@nWg*oCV&}rO+R-0;I01QiHo0g_ zQ_=;qFNA$05(9CSxFMB>5m29FR#7`*%)`V2H7Bmc2p@zL|4%?=f_m(HI-uk^Me_2(>WW;-A-r)gI!B2jju%_le> zJsm2OCPm)8^=Jp#F^3L!7_BT|CC7sDszBTJ6NFFnyktS!q{8sJh9~~~tM~jq?pFzb z$^Ter=R-HVNX(18-w^%joVrHG>NZl^ByJPlDwu1LCT0o>srTMouc;R!MtBiZtF{!! zznbE|lkyV6GxPJ?Pt~7dgc>D{$XD|*+FZ|rlSDV1Dq@tsbwNXPxY zJWb*22^-8y&oCD0alW0j>hsA0@|VZf<`Di*6z-`1&sP3%N6au7)@Plyitpk^*#g(7tqu`&YYg-#Z0B z)Ae>4)j62_CDIRYPkjJJeqhu3K6Uy%IO#gt_Yx!HHKu=UD6@*Vxz)r(`_`oU>y!~+ zoQC^)jLz6D`$iJVMv=^HcOA5ME!$k2hr+#p zXj2E-f-qP}%{bE3FV-$k4UpFRcD@JO9%BRTf9c?mfTW)s2Q~=<<_5CYL;NYqJ!m_y z({1kvT-O2;HV-m~8X7kvK)SY6O#}oVJk5m&J9PvK$^x%4z(p$I2f<=&An(0#8tudg zB23y+J22dlIO}lyr|fz#Z}Wg5wkZuwT}#v#QdJ$t0NAcqZse6eZx!$uFj~pK5JCzE zA<#g+_!azj&)3x2doaKx_qS3gY`y&dEBgI$@1WXAw6+`S846kU$$zB#HBacS$hJ{X zcL3pP)elOY0x;SdKF$4+wK5WudsYm8@%6#RpzHlMQ!DL*T<|6YXi*u!c027&=c%eX zzs~PCD``-Y4ek(dOq{dd7(RO4`g*!UKyKnm{6g139|AzgZ@Hd3K;ManxmC#Ur~|%0P}7m zsI5+L?|_BG@r0W`I!ds-xyIt;S767-w4+OeZoylKDoz~e>?^RjyB{vL z`0+6{EY*_K=l=_qopgy2Ts;<^%BlqZCk7B%;y_6oOfqWnGvHx})F+{;W~qvhykGBs z`YY;XNuW-fL!#G!yzzGpSTELjW1zv*DNL}4u)nV~MtQuzJ$U7y)#eO*n02Uo68~=n zr+YxxsR+?^Ll z=F!vEX&7o4qPPRZauZ>5oBtuai{P2a{gX~gJynh9?AforCuSQ44gv9IcG z@zm+}P4hHZp1tTnfz#W6XCCkAc7pOI;`(VF(YAM!7k28B*Ice3Z#OOUfWRSa)zU%C z!m|C%R~tv;B-C38+*SM^j{pb2a^Y9M9OQUur-LYI*JeYA@Xiv)wgh5tAoy2_^*b}( z0FKlJGL*M@*b5=ucD6AC;_yX$#=Q#sJ3#^)Cmn?EePyHEj&*e5sPFy~4vM9YcF};t z^DdKKn+|qkg1He#M=y!H7aCoVjd)BaI%R0i@k~NicBI6!1GxMJf%N@5$M{JQF1LU3 zo*o0NDE2wIrnKCKrv9J8cI5F3e}5&;ry1ttsI4(7!ef+%n6bxihm(I|d|R`-KvesA zmymf;#2v&;3Pe2Tcy`7ZUsOUuQR&VI>7o|M_v)u?>i}q8W}fCku0XB(%QQ+M}trJTUwf2q^mql zE&erHpNiZL{VSJCFH8k@G2qY%mtM9KOThnJ8eKc4XrikEsvLMmQ~AmI>i1Go14OwSs>_cCu|@VFI*q`Gp=@MQ{9F` zka&G4QrJ~=v_jk}N0FbXaGDU10W}6~cI8y4%a2`J3UO z=>k_1D`jW4ePIlB72a+Cyuh8BD$f!mS6gnKTPfTY1VkQHV)-wy7gxW2^YFUoPrgR& z$?m!+d$HM^qg+2?&MsI23P0L2jRHrk8^H)^QgeaRwaI5RwIsm4;dCSBz<5wQdOxXi zWP9`8i0JvFxOVtZFJJi8)g3{5E*d$+e|+d~59G#KfY0s|6&X@@K0Zeq2obl>c=>_m za*Xa|aZ*~v$Kk&s?`~2uS&5d0&cFApQBw)o80~R;RbP|0HWyWUBNAZk8u?o|r6TJwi{NokRPK0mB)H_BvPqn8lHJn%RQPe7VBb6cEp;7nSh&RySq z^DaB^_teczsq8w0()BhKI10v~ySzq!?rnUC-$ur3-r7AiT@S=Gx{ zALDmx65n45$(r2D1S@!I_vh*zFT^C%bU@T1CHX{eOs-tDEr29&} zic9$k{^0kR3f(JRQ?7Jr^%5&`58pEIR$QGa*0EP{|4pjDK_(g;*L^jG|AC(DhFe?b z)@F6%ze}ElM}YGg<7vX?hP+_Z_PtJ_$hetTc~2wmD@`$k|S$R z@b8YSqQSSC1QD6o_%)N0PB5@Tdp@$z@H*l@`3fF9#DSDt7}F+us#@tQI;u%}^;KOD zh?6e zJ)(s#uob?deH+yjl@|DesBx6I&Rm!BXiz2ni^4WRe%kw2W*!RsEdVqdG+o8Mz5x~p z3)X{>bfAVac*%|PRSh4@msAK~H;b3k1JK@JBZq;#iF@VQU9)A!=k)Aq)A1L3KyB2w zGC-NoWZE7eUdz@bCA@WL9iKM)>|po+mSjfYvG%OHeN7ct`}<^&CobIfB#zHo;G*|) zfD`lK++P6LnnPy4Wm?{!oU<@1t%xX9`*rylS;U=cK$ouC19~RvuZy*ks z&ts;+&u8TDhhh5Nl?oJ~SV>}Q!4DbRB4E>6-UobVZPxKxXl{X#w!frJ-x5+s8u4Kg zI5+yJb6&CVi?tL;sZ_uVtb;5Oa0juCFAHM8Fznd(7yO9^!$MVbLqh||)#?oIQrvqH zaJz{o??*0x7`|3Mxz~Km*!)T0g|$N~)71+b8|038`b7cfzm`sC#zCjQ&TK9ie>KPL z3VwLc*F|pYqz%o?7bo0Me>mMDi>Y0qh?a8*`QsA1r<(FY7j!L%xg)0$uLD3N)beQ+ zPK!i06I!!@)e}D+{C7(AC{~gr6EA%M$=O?4aTx@33yKh440VR*RoXlwWXewfajALJ zts`LkL_DpGSzbgs9P6yv_wUl&CqLwC{LF#xKq{J(Xw*pH_BVwHAF5JVN9aR+dOSE^ zlVpx^IACpK7@5%SW`$Bn-W+ZEBP7oZ_2y5uW*!{>hZ80eF6+jj~f<2x7bOr`jIM%U_2qTc>#0?Ij^r@SlUn<$d(PLUfd}`npYf z(nRgNYr(gLJdPG9N z6mW{Jg9hkp?e6H5CCl;`gio0qz*mLBWk`wkKAa2()uV#uuV2cq0iNJdZ#PSNP8Tb7 zi+wqyX<_YU^Crnp*#+f$J>MthNd53>XFc^tpSxT=W=p;W8llybOGpMpoz7|=?b5O; z+VmX1_6&bcO&x=G%yT_fAP!u@DmWkk&f#wpYsN^O-52wV=xYzq zPX~XEM&gI*e?b7OQ0CY{|EORUU?rrMset{b?0|b#&%qCE(WBpKaVBg56b*#j6@Pd> zXk5i12N^#g4Ty`u-%{gO$LKk-tA02=pc?^GzJxS<4}OSN01C^gIg4oDI;UjuaqE9; zV!~!lBOW51ECqOC9o&G{)EiU~5Xg8W1S9|_0uo)hSI4XwDkp?wSi_lU9QW0F2-My8 zr3FdbC-7>?;Vr+hCaG8hX!Kcj|BhBSHKLCSiUJ!eQ*(etVHa~12(MNhlf_6EOSy?0 zl!+A{L6<42o2BW8|NHK=*2;kMtS@B@SbAGmAG`-Lu7`|cs(VNpHV8};0yAbpatC(S z{P6FLN#+?+HJb9+3>2yR`LFpIUqPl&^+|qbQ^{}vg&D%#FbvlTJvyR@{&08WN_dOoo@{$5-61)&?PR@UFlm1odF+DRNsM$q zW^UY_Fa%Y#s;MBt$b`R_lV90!&OC@v(M-3^G>{~?Obtdgf zqLh!glcP2dB1RgdmIHL=aBBIs!MW>i4@3@htt!6~#T}en2|lEgllH@6jo$xQY(D_W z_awnvhsQ5p>kC$r;;A^9dBXio2J^Ak>~HsDvTGsBhPd}5?!O(~qrL(0J|UY8j8`D5 zX+;h(fdyP#vCs<@?^AY z?UskVDgTy3mU`BvXI1NNNJrzFHKOzWZ}OAI{q3VmLvT5)K==s$u}!bwv=(Bc9R6|! zMld4uogQST*<@U@?5@)~H&aQW*s2$jZBHVsLQZlefEP&vnJ}wVT>P&3o!^2$K)F<} zwJ@yA;BSsur$ZqwkU7FzSv;Ep(NNhL5c zIs8UpfuUkt{b{ACAd81~ve2SGbu+3{JE>%MhoQizttH}U zX)p3gss4i|PeXIu*)MG-i652iJa@e!i-5R$X41~jQgrp@J@#tV$6nC;Yx!kFQg(NP za3IgEGXGY?L#kdy-Y`~+|6YZD1NPu|Ez6pju_Sv^m~%Fcz+yNSSNeNMq3_nomt|7_ zkE833O0s?bZ~11+wBbT?l$Dj4DXHMBOv}n$?vavG;zDx;;#-!Q;wo2)klAqWy(ezS z9Jm)KIZ;s%ar~a|?=Q~ba5(Th_jBLZ^|?O7Cjwz4NZh=F(fliZ6uFuZ`1sY7G9|p= z2QR+LR&KtCvKTQJWHL3Sb$$CwtQ{}GiuMWj%B-*clM0+x_1eseX*n{PdbxWwi+)0K z%eOfe1&cb~9)OW6ZgZjWuN|8V3p~#j_s&>PdFA^-!*uP}#=h;6qr`{pNdKbHA{O31 z8g48yEzDlo_vZ5A&VYC*-HS|`_@zBBWPWqNQ*EO|#7jNrLg1mr1eg3 zsbf$zjQlW2SN$b_Aa*P0H|~1RA?y9vyEMKY0ok>*r>#p{UUo%AkP(smsxWi; zu_5=tRdw6@(Tk@M)9xiFVf$543l|!K83>*2YIMvPQ-;7{uta_{Q*5AaCF9piw*y|0Sl{Nnu7&+I0GKFXj50UXhDH0RS0(Hm`+; zgKvx1C#Y9E8S+&a4Y_yH?;o4o7AbAlUhbSW2@>KamRA{CyN)}v3eQe3pMF;yq{NmS z05SzS+fT9hG}xqJPgIOXs_YU*ftACvZ6x1{gwXjGj3WFzZ$>>BjzX~^4F)Ujt)S-@ z2{yBM?~y&|>R=Q5T$R0WXmFps#KHK2$wp0O?#^9XrXU-oxKyto*zV5TMYH z2`o&RGm(C)3RrThvoqc>tOx!`lPX!ZN;an_-o5-&)QDDLC$&*>76-RfUIffZF4 z6}^G4WuVJ7>GX!Nl`63m<@<dj6@3Y_Bh_x2c~Jb9)I{7YghkD~S1@(BYPb95*S=oK z5yDHg`sjM3l3uMDDHbVO==`#Zd>cuc)+))&`B?73|CJk_BUc8G#~z(yVV&%=43|L~ z`4;o%fW#jxY*3__b#sn$=b+K^y(X2xC z%HO!v?lZJxA|s$&MRvmSZJgTGDX6G8fHqWoT@z=cnU8=ezEpU zr?#tn+r6f5{{di#QK+{_m4k$=w+howv|T9`LX_CxE^x=fnn4Cco6WSt@E&s{(HMva zTMm^sqCCp7f7k0T{2}P#8c(uBu+bznx@nWM)QM3{)f|FQ(}%$j2V>L?2v0e1A>zp& zUEfK4ny8UWF(yng4+^f*KHVEXVj(wQaG3}}!Y(bhRF@fl^HJ{@%&#;}ZC>;_U4cw}~vx?FTai|h6nQ3|3ZsadK>QIB?NT53>b`RVI zqi0}oL#$Os?F08;EItoPED!}Mm+w=jOd7^J;uO=od5I&MO`zH`OZ#HIXZZf>q>ezD zIleE!-=;8TDRqEln%55&Al~u{a@fg6d|JxPra0yHvKB_H%}e01H&DE2E|9|x_9sk9 zCw>>eHCgd!b#!#|i??X8>`pei_1}Qa&()lo2tIZ(Qx>@YmhHLvl zXnq-NTzDC)$W5oHx2(@nXW!@h+U_Ea`fmE9F2_YgPtrNXzkMy~-mdDhXd%}rn83QD ztwDrru|U``)o8^=^X}*pmPq@=j@zWBD#J$pm-PDtbldT;_Ibk0If#em#Kjt41ui7 zdb{}s%4`gLW4NhTtl2jA7}>|+8tJKck@<4U=^>3&x7Ah{O>&ex3;y{Cn(<01?~MfJ z=nl@B**wv0q#CKB{4kQ-xRd{JN^oQLgW`p?K@09-s;HR9!>5r zosf5q;CP%dB4}%MeOuvT@P8M(Jx|a{)rR#2*U8UTzHGt>KXU=2>3@T6w8Hs-_Mk>_ zRdQVvcye(>SABG7(ixd1cR}AatBhS`KR4bsxbX!0MNqM#U1ex|m@OUK`3?ft_~_R3 ztQYhx`WBt9)sQ=kg@k1yr>P^!SjK;-f0qKVsj2ZH1|*{riHBdPU$?R@Jj*28WsYd> ze28iL?~3GJqyx%q{|g5DtWNUiHLX=CMnRo{z;4(uLuXm4g>{~4b2?abtb)rh{U z%+y)vT?qW;I>`L|c5h;0!;t;CGZqgWC_SFpt%>Pv@Yf%}tB$#OB@|;azAq51cfsg& z%Qn!f%E#2tfwR(1VjYIn@8?5`ZA|6Q_xwm{82n25=M(mmgnNB^D!Dsn88k8O|C8J#T2kN@S};>=%dQSZmsd(|%{IcKv+CMd z1ve{3850byBJt&xPw;Pgy7y98Qa$fLgy)`e#HT=$?$_tZ8Jk6;kzCh!MqVu9nMr25 zY0u0%vZ>E=g>~D^aR;qU8^r4R-nXM=PjYsofxLAN$8dX(S`{1Ypl1Krw<} z!?_C@vU|P*uP9M4@zkYdn#Jc}SsesiZS|*c6YfgrWb-US5ps*#|X~1-WakN+Bc<965XO&C~EC} z3ebXQLPP~?>Ibv|(=|HNa}`LLG>Rq^WW*>XmBK#BGxc#ic=JsIhTI1Y?O#hP4fQn} z`=%k&^z+^>gq^*vSnlFDJFq$?50jtIHP^9+<{c0?dpFvW+-0IZ_9}noWFu!V?i}=f z=AmuKx#%L#Le1_S?^5VWn}%FUT^Y&#Q33I3cY{mP1~TrO=NH1k(55ZMHBA@h07M-| zf{jCFUi)TW)lhi-PV)?{C94J0Q}JjI-Ku|qZPF9i`h#*owAV=zNN2AC-{aoi&`B^Q zO`~GdFOy=owASp34B5)X546e3tPbwOxQ;{s5?em|w?_PFSk2G1z_HLYot;~Md;+AL z6d!JDF~YKUQ_LWyg)st(kO8xhgRv z?U4<0o;!vXKxX&CYESx|Y$Lw)?e$R&eyGVrVyahmdo~nJUe_yS&BL@Jp>8#8AcO5I z%n8@4-M_|X`9>SwYNKDa!{p=igE6VO>VxO?Y)aySBmAPVa)PAa@1cJFe)omiKFa!m zWH$(pcCXKFs~p2N(eD>hKK6Oar>3`o;vF)2g6qrx;%isDr%aig=GYfzP&cJz4z>5x zLT0tw$7IjNUc84Du$vt?2%XIr>6mR^>^LZt~Ht4Z(4}8ub90 z(tJyoYY>0q_~UO3o-y9u%a~gEB6p#Axp8WDb+FpJe7FBlv2sTW^^&|N4vq!MCk72W zAlz>(s=_T*h(Sdn_Y|l8`djn0d_YbsFDR3FW5_0N@Hy zzp!9I&+_t>7-nh!Qbc@B6mTxbx}u0!HjJOHy>hVap=I=$9foNYTzvQ#NjkP~;Gj2E zVeF5JD|z%$SST?|ruE`~a;HBZYVtg>wP~EOs^D>I{{rWcBTyFYK6&Fa@3V~dDV_&W z7f7{B{bu-U&%3A9)@&7pS3ri3VIxbWIMb?23?-8B?5%)tz(_pR2V@ZoZ19L{h=$KQ zS(|d}$~)$f)V5bi&PqgEW1CDet|*oEFd@d=oT;vR`FM zrbc;9#G)3KLZ)kY`qqQS!1oNQZewKW*pGnf9^gMNeSXf@>iE^;sO$3XG_!1zV$n5# zSmUMgX(=QOuWe6#1iz@4a5s1uQ!u+@F#qs#5qmQLk>YyK`=GrYuqb95_vYTE@~vp3 z&sBZDL5j`WvMM#7UJ51R?zS(1k9&@P0B;|BZ9jU1)TpVCQ%qUY3nD$Fd(DQqu(0C| zqwU4j!mRmNS;yNITh;4;pkN^FYQ)&B@0vWUBim{C8fHYTovM{>5Ran(S{=toJ;9+g z{u-|npv1nX_7A=ySS*HYBzVKb7eDWBzi8(^xErwB->=D#i#UHwbEQ|}V(RG;c;ms*@|1B4*E=ApBs3#hzQrfh`G0yNpf@@KQWT%)iu{J; z)gM)gz?tA$fWCz_`D*X^JR11o^&%SfdIHB_A_2Ui{0LoZzNsxuDtrnU9Pb5CR|AJr zXQV!i%Xb&yC0@0~3fa63_|M%x%CWt%nk}VY&+T?;=B9Mi(F@k=Y9;<6v+o7pygDGw zW5L;y8w$F#?Af{>qnWNmid__f8)GXrQ;U~DDc1pVvZ4~n5@fXd3xJ4CdLbD-@I`L} zc1-c!&(~8~YwWD%aUG1=uD?DhKy2?D_)B2JDqzqQ^S`A*1)vIqAq{sS_<<0-qkhPU z1QEeC1!hEm7lEDzK2QYrB2Ab5?=Ny?kyf0$6;YHVMSWS$lQKrg7Ju6dFOw%%wlw7$ zo|#=KkLDcoZ5Z@z{oX}>mAR~PUOBI87vKp_63Tf0SY-dg#c@`@W6XrjUjFe$bI|7D zurxuftDoPhm!9`Q39+y>tSrNJ>j}!W81nEBE>dN{^cSaKI?QH4^_e>m+vXiQqdIs= zHDONmM?3s>DLi*!9rRsI1^Wn?;?URao>$y?!s8}%Ql`oOxV0$fNkW^{l48ZmpJBSz zychy))xfS-{!M-Q;cBp;h#Q#976#+L?iD-fxF&D-wfMlIN zl-P<+)GR`=e8;+L!`69e^vq8$^v~tK>8cwd;TN%H$+EHCw7c8V_eqc$AAK{DrOAeW zYclQRnXx3zL}s`3OP$s0m+A3m%xK(|!vzeb#JQ?sh>r95$zSj5Om_mDV{|qCX<%Pt z=>Ew!YCo@A_198@FzeYtB3ondSM_xI7an<#zqTjamQQj^u?L3QUb994{M>PLze�wo@ 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