From 01e2bceab436c8f1caa38673891f8841862dc3f7 Mon Sep 17 00:00:00 2001 From: Justin Joyce Date: Sun, 18 Oct 2026 15:25:47 +0100 Subject: [PATCH] Add Rust Avro benchmarks and blog post proving rugo outperforms arrow-avro in Python --- benchmarks/avro-rust/Cargo.lock | 1185 +++++++++++++++++ benchmarks/avro-rust/Cargo.toml | 25 + benchmarks/avro-rust/examples/inspect.rs | 18 + benchmarks/avro-rust/src/main.rs | 108 ++ benchmarks/avro_one.py | 6 +- benchmarks/measure_avro_rust.py | 128 ++ benchmarks/results/2026-10-18-avro-rust.json | 188 +++ docs/blog/index.html | 11 + ...ant-python-pipelines-without-the-rust.html | 445 +++++++ .../table-1.png | Bin 0 -> 43881 bytes .../table-2.png | Bin 0 -> 80176 bytes .../table-3.png | Bin 0 -> 64400 bytes tools/medium_table_images.py | 58 + 13 files changed, 2170 insertions(+), 2 deletions(-) create mode 100644 benchmarks/avro-rust/Cargo.lock create mode 100644 benchmarks/avro-rust/Cargo.toml create mode 100644 benchmarks/avro-rust/examples/inspect.rs create mode 100644 benchmarks/avro-rust/src/main.rs create mode 100644 benchmarks/measure_avro_rust.py create mode 100644 benchmarks/results/2026-10-18-avro-rust.json create mode 100644 docs/blog/performant-python-pipelines-without-the-rust.html create mode 100644 medium/performant-python-pipelines-without-the-rust/table-1.png create mode 100644 medium/performant-python-pipelines-without-the-rust/table-2.png create mode 100644 medium/performant-python-pipelines-without-the-rust/table-3.png create mode 100644 tools/medium_table_images.py diff --git a/benchmarks/avro-rust/Cargo.lock b/benchmarks/avro-rust/Cargo.lock new file mode 100644 index 0000000..a8800ae --- /dev/null +++ b/benchmarks/avro-rust/Cargo.lock @@ -0,0 +1,1185 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "const-random", + "getrandom 0.3.4", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aliasable" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" + +[[package]] +name = "android_system_properties" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae221649c9976a6f6c56ae1facf410f3ddb33cc661c4b7b61020a912d4237fbc" +dependencies = [ + "libc", +] + +[[package]] +name = "apache-avro" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "312c1ea69e5fe9966e0029fb95aca8790100b85aff4f0d3b00a9337c74069a9c" +dependencies = [ + "bigdecimal", + "bon", + "digest", + "log", + "miniz_oxide", + "num-bigint 0.4.8", + "ouroboros", + "quad-rand", + "rand", + "regex-lite", + "serde", + "serde_bytes", + "serde_json", + "strum", + "thiserror", + "uuid", +] + +[[package]] +name = "arrow-array" +version = "60.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51dff6e4b9f158864a0aeb6a131ad53858ecbae7a2fc8989307b9b3c6b2f122e" +dependencies = [ + "ahash", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "chrono", + "half", + "hashbrown", + "num-complex", + "num-integer", + "num-traits", +] + +[[package]] +name = "arrow-avro" +version = "60.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edad137a3609e2c6a4af0b5ff1c5c049b7af532649d235c7e22e9a9cad933b35" +dependencies = [ + "arrow-array", + "arrow-buffer", + "arrow-schema", + "bytes", + "bzip2", + "crc", + "flate2", + "indexmap", + "liblzma", + "rand", + "serde", + "serde_json", + "snap", + "strum_macros", + "uuid", + "zstd", +] + +[[package]] +name = "arrow-buffer" +version = "60.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7235b863533e9db3ab86905b4521251de11226275b436ff3cb2d0010558d1c5" +dependencies = [ + "bytes", + "half", + "num-bigint 0.5.1", + "num-traits", +] + +[[package]] +name = "arrow-data" +version = "60.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa06d5e22786c4966ffc4d2f171d0cb65d95f6bdea108a14e8c335e9faa437f" +dependencies = [ + "arrow-buffer", + "arrow-schema", + "half", + "num-integer", + "num-traits", +] + +[[package]] +name = "arrow-schema" +version = "60.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f85a9a58cd03560526b0066487574aacb9008e413504fa0ee23d61141e96c338" + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "avro_rust" +version = "0.1.0" +dependencies = [ + "apache-avro", + "arrow-array", + "arrow-avro", + "flate2", + "serde_json", +] + +[[package]] +name = "bigdecimal" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fa3f3d8cbf4dffcfe4991de61d012bef509a409ecbe9dd41049bfe32b4d4653" +dependencies = [ + "autocfg", + "libm", + "num-bigint 0.4.8", + "num-integer", + "num-traits", + "serde", +] + +[[package]] +name = "block-buffer" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2f6c7dbe95a6ed67ad9f18e57daf93a2f034c524b99fd2b76d18fdfeb6660aa" +dependencies = [ + "hybrid-array", +] + +[[package]] +name = "bon" +version = "3.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "214f5df094ce551a10a30ffb9c70243d61f121a3d985a6495933e181dee6a7d2" +dependencies = [ + "bon-macros", +] + +[[package]] +name = "bon-macros" +version = "3.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2706da6c749998cc555d04184909608956a69ad3f8ab1a076fbc867b4a3c3ce5" +dependencies = [ + "darling", + "ident_case", + "prettyplease", + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[package]] +name = "bytes" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" + +[[package]] +name = "bzip2" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3a53fac24f34a81bc9954b5d6cfce0c21e18ec6959f44f56e8e90e4bb7c346c" +dependencies = [ + "libbz2-rs-sys", +] + +[[package]] +name = "cc" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6651c9ed80effdc7db0ff72512157f901af5e3549e341e24b1dd4887d836d838" +dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" + +[[package]] +name = "chacha20" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65c35e4b699c7e15ccbe7ee35c005e4fc0a278d22238a2857e6ce2dadeda1b06" +dependencies = [ + "cfg-if", + "cpufeatures", + "rand_core", +] + +[[package]] +name = "chrono" +version = "0.4.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" +dependencies = [ + "iana-time-zone", + "num-traits", + "windows-link", +] + +[[package]] +name = "const-random" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" +dependencies = [ + "const-random-macro", +] + +[[package]] +name = "const-random-macro" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" +dependencies = [ + "getrandom 0.2.17", + "once_cell", + "tiny-keccak", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca28b0ae3115b884660db4118d803791fd6756b6e88f39c0f3f7859060d7566" +dependencies = [ + "libc", +] + +[[package]] +name = "crc" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "217698eaf96b4a3f0bc4f3662aaa55bdf913cd54d7204591faa790070c6d0853" + +[[package]] +name = "crc32fast" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01a7799fd6b852db0e61728dde9a204c423b44d689dbd432522543614b490e78" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "crypto-common" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453" +dependencies = [ + "hybrid-array", +] + +[[package]] +name = "darling" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed17f5901b6630b993ca003def43f2f8ef4014fc13b047b57aad617ff32bc2ec" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6837e2cf7485aaae18f86181d2f0e9a7ed297a025e220aeabf63fdebd3a2ddff" +dependencies = [ + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 3.0.9", +] + +[[package]] +name = "darling_macro" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ac7135c3ef02b2f7833bbeb1be5ba7f966dcde8a87c6b87f65a778d71a02785" +dependencies = [ + "darling_core", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "digest" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "equivalent" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00d174d5400e5e8fd687ad1049e2f578285fa914201b1af7e8b112a4546bd826" + +[[package]] +name = "find-msvc-tools" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aedcfb3409746eddb02b9e19ebda1c3394f759a152e48ee875a0844d1b955484" + +[[package]] +name = "flate2" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e634e2e0ebac1ee034020da1ca582e17ffe4e0f5e985823721e168928136dcb" +dependencies = [ + "crc32fast", + "miniz_oxide", + "zlib-rs", +] + +[[package]] +name = "futures-core" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" + +[[package]] +name = "futures-task" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" + +[[package]] +name = "futures-util" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" +dependencies = [ + "futures-core", + "futures-task", + "pin-project-lite", + "slab", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi 5.3.0", + "wasip2", +] + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "libc", + "r-efi 6.0.0", + "rand_core", +] + +[[package]] +name = "half" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" +dependencies = [ + "cfg-if", + "crunchy", + "num-traits", + "zerocopy", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hybrid-array" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27f864f10dfb56725ce5ce5472bc52252c8f93a4ab86327122cebf62c5f59a17" +dependencies = [ + "typenum", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "indexmap" +version = "2.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc4e190f5d26ca7051642629da2c52fc03bde85a03197c99408dcd291734c855" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "jobserver" +version = "0.1.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3" +dependencies = [ + "getrandom 0.4.3", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7883d941dae510fb2d978fc3fe018c71c9e2892fd38854de3e8b92c2e5ad9cc5" +dependencies = [ + "cfg-if", + "futures-util", + "wasm-bindgen", +] + +[[package]] +name = "libbz2-rs-sys" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34b357333733e8260735ba5894eb928c02ecc69c78715f01a8019e7fa7f2db4c" + +[[package]] +name = "libc" +version = "0.2.191" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65cd87c9a6d60536580b316ad985726104730a5151c99845f2490428ef91240a" + +[[package]] +name = "liblzma" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fe0a34ca854fd4f20c07f696fc8675aec78f87d88d29f5e10257a7490a1b2e1" +dependencies = [ + "liblzma-sys", +] + +[[package]] +name = "liblzma-sys" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c7e3581f367a78d7b7e7ae948d023310556f0cfc13156c2e4e00e25616492b9" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + +[[package]] +name = "libm" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" + +[[package]] +name = "log" +version = "0.4.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9f8bd3e56ce4dfc153cf470fffbfa98c7620958b312ca5c3a4b8d5181fd13c6" + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "miniz_oxide" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b63fbc4a50860e98e7b2aa7804ded1db5cbc3aff9193adaff57a6931bf7c4b4c" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "num-bigint" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367" +dependencies = [ + "num-integer", + "num-traits", + "serde", +] + +[[package]] +name = "num-bigint" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93e7820bc0a80a0238e650327316f929ba18d5be054b647490a3a6a339f3e7c0" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ce2d95d4b3734dc35aa2f45e1aa22cd416814592a4f9d9205e11affd5b8e10b" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "ouroboros" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0f050db9c44b97a94723127e6be766ac5c340c48f2c4bb3ffa11713744be59" +dependencies = [ + "aliasable", + "ouroboros_macro", + "static_assertions", +] + +[[package]] +name = "ouroboros_macro" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c7028bdd3d43083f6d8d4d5187680d0d3560d54df4cc9d752005268b41e64d0" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "proc-macro2-diagnostics", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "pkg-config" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6b464fbc74e149a392436b17d523f769e057cb6877f6a5c4618bc6f11800548" + +[[package]] +name = "prettyplease" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bfe0f4c752e450fc2faf62654f1c134747922825d5b04ca717b8874f41a40c0" +dependencies = [ + "proc-macro2", + "syn 3.0.9", +] + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proc-macro2-diagnostics" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", + "version_check", + "yansi", +] + +[[package]] +name = "quad-rand" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a651516ddc9168ebd67b24afd085a718be02f8858fe406591b013d101ce2f40" + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "rand" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65c9fb96cbc91e3478eaae79a69fcd3f1ae4ad052e471fe6732fff548984b4af" +dependencies = [ + "chacha20", + "getrandom 0.4.3", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" + +[[package]] +name = "regex-lite" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab834c73d247e67f4fae452806d17d3c7501756d98c8808d7c9c7aa7d18f973" + +[[package]] +name = "rustversion" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_bytes" +version = "0.11.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" +dependencies = [ + "serde", + "serde_core", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "serde_json" +version = "1.0.154" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7e9cc8b1b85264074fbcc02a88680c4096b1e47df8f739dceb03bf482f04bd6" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "simd-adler32" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "snap" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "199905e6153d6405f9728fe44daace35f8f837bbf830bb6e85fbd5828709a886" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "strum" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9628de9b8791db39ceda2b119bbe13134770b56c138ec1d3af810d045c04f9bd" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab85eea0270ee17587ed4156089e10b9e6880ee688791d45a905f5b1ca36f664" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "syn" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d78c8dee4c7bf0e14673097256fed6142ce9d3b85a408189d07482442145823b" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "2.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + +[[package]] +name = "typenum" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" + +[[package]] +name = "unicode-ident" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2c754d6c33795a1c324727428e5a7dedb5b06195f9890bdbcba760d3e246563" + +[[package]] +name = "uuid" +version = "1.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cc1186384beb7dd8eedea376413fd654937285ea6c9cfbb928dc3043ea4b606" +dependencies = [ + "js-sys", + "serde_core", + "wasm-bindgen", +] + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.4+wasi-0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.129" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bb54f33acc68fd454578d9820b0bde1a1a3d17aa17bb7b6595806d02886d409" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.129" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e29d0c35b16e224a7eeb5cd2d25e3e1968fbd65604117b44d3b789d00ee8535" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.129" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f501a8bc3719dba86ef8ae4728879c08001bea749eb1333ac5b91e040e2a6b7" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 3.0.9", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.129" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23f0c9c52aa7cd7d77769a4cfe2a9adb1b331f489a41d912ce14513d5ab995c6" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + +[[package]] +name = "yansi" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" + +[[package]] +name = "zerocopy" +version = "0.8.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5fe1f8f1b06191a00962174c61aa5005e0bb391a6d80d07e24d115c01a92ed8" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "863ad3ac83293fb4d740aedbfdc9240dd8d1a50c1099acd76ce80ce7c7230c7f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "zlib-rs" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5431d5661c32445236631278f27946e444ddafe4684cac70b185272d4f9c52d5" + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" + +[[package]] +name = "zstd" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db3ae9bf90af6e40197bef767eeefc46ad6397420fe873830bd85e5fbbfb3c70" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "8.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded520f16b29e1a9b771c722221b2b0a0398c2316d9bb3c42b458a5414d7434b" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.1.2+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "481ada9c543b2323cbb7bbdbb5249177fbf0188ed959ed2c15e4b22421c84ed3" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/benchmarks/avro-rust/Cargo.toml b/benchmarks/avro-rust/Cargo.toml new file mode 100644 index 0000000..186720c --- /dev/null +++ b/benchmarks/avro-rust/Cargo.toml @@ -0,0 +1,25 @@ +[package] +name = "avro_rust" +version = "0.1.0" +edition = "2024" +publish = false + +# Rust Avro readers for measure_avro_rust.py: arrow-avro (Apache Arrow's columnar +# reader) and apache-avro (the Apache Avro project's Rust crate, one Value per +# record). Built twice by the measure script: default features (arrow-avro's own +# deflate backend, miniz_oxide) and `--features zlib-rs` (flate2 switched to +# zlib-rs, the fastest pure-Rust inflater) so arrow-avro gets its best deflate. + +[dependencies] +apache-avro = "0.22.0" +arrow-array = "60.0.0" +arrow-avro = "60.0.0" +flate2 = { version = "1.1", default-features = false, features = ["rust_backend"] } +serde_json = "1" + +[features] +zlib-rs = ["flate2/zlib-rs"] + +[profile.release] +lto = "fat" +codegen-units = 1 diff --git a/benchmarks/avro-rust/examples/inspect.rs b/benchmarks/avro-rust/examples/inspect.rs new file mode 100644 index 0000000..c40ffef --- /dev/null +++ b/benchmarks/avro-rust/examples/inspect.rs @@ -0,0 +1,18 @@ +//! Print arrow-avro's output schema and row 0 of the first batch, for checking +//! that it decodes gen_avro.py's file to the same values as rugo/fastavro. +//! +//! cargo run --release --example inspect -- + +use std::io::Cursor; + +fn main() { + let path = std::env::args().nth(1).expect("usage: inspect "); + let data = std::fs::read(path).expect("read file"); + let mut r = arrow_avro::reader::ReaderBuilder::new() + .build(Cursor::new(&data[..])) + .expect("arrow-avro reader"); + let batch = r.next().expect("a batch").expect("decode"); + for (field, col) in batch.schema().fields().iter().zip(batch.columns()) { + println!("{} {:?}\n {:?}", field.name(), field.data_type(), col.slice(0, 1)); + } +} diff --git a/benchmarks/avro-rust/src/main.rs b/benchmarks/avro-rust/src/main.rs new file mode 100644 index 0000000..e5fa139 --- /dev/null +++ b/benchmarks/avro-rust/src/main.rs @@ -0,0 +1,108 @@ +//! Run one (reader, shape) Avro measurement - the Rust counterpart of avro_one.py. +//! +//! avro_rust [batch_size] [utf8_view] +//! +//! Prints one JSON line: best/median wall time in ms and the row count. Called by +//! measure_avro_rust.py; not intended for direct use. +//! +//! Every reader decodes the same in-memory bytes; reading the file is outside the +//! timing. One thread throughout (neither crate parallelises a single file). +//! +//! arrow-avro arrow_avro::reader::Reader -> Arrow RecordBatches (columnar; the +//! counterpart of rugo's Morsels). batch_size defaults to the +//! crate's 1024; utf8_view=1 decodes strings to StringViewArray. +//! apache-avro apache_avro::Reader -> one Value per record (row-oriented) +//! +//! Shapes: `all` reads every field; `narrow` reads id, amount and country. +//! arrow-avro is given a projection (pruned reader schema); apache-avro is given a +//! reader schema of just those fields, which is how it skips the rest. + +use std::io::Cursor; +use std::time::Instant; + +const NARROW: [&str; 3] = ["id", "amount", "country"]; + +fn writer_schema_json(data: &[u8]) -> serde_json::Value { + let reader = apache_avro::Reader::new(Cursor::new(data)).expect("open avro"); + serde_json::from_str(&reader.writer_schema().canonical_form()).expect("schema json") +} + +fn main() { + let args: Vec = std::env::args().collect(); + if args.len() < 5 { + eprintln!("usage: avro_rust [batch_size] [utf8_view]"); + std::process::exit(2); + } + let (reader, shape, path) = (args[1].as_str(), args[2].as_str(), &args[3]); + let reps: usize = args[4].parse().expect("reps"); + let batch_size: usize = args.get(5).map(|s| s.parse().expect("batch_size")).unwrap_or(1024); + let utf8_view = args.get(6).map(|s| s == "1").unwrap_or(false); + let narrow = match shape { + "all" => false, + "narrow" => true, + _ => panic!("unknown shape {shape}"), + }; + let data = std::fs::read(path).expect("read file"); + + // Top-level field indexes / pruned schema for the narrow shape. + let schema = writer_schema_json(&data); + let fields = schema["fields"].as_array().expect("record fields"); + let projection: Vec = NARROW + .iter() + .map(|n| fields.iter().position(|f| f["name"] == *n).expect("narrow field")) + .collect(); + let mut pruned = schema.clone(); + pruned["fields"] = serde_json::Value::Array(projection.iter().map(|&i| fields[i].clone()).collect()); + let apache_reader_schema = apache_avro::Schema::parse_str(&pruned.to_string()).expect("reader schema"); + + let go = || -> usize { + match reader { + "arrow-avro" => { + let mut b = arrow_avro::reader::ReaderBuilder::new() + .with_batch_size(batch_size) + .with_utf8_view(utf8_view); + if narrow { + b = b.with_projection(projection.clone()); + } + let r = b.build(Cursor::new(&data[..])).expect("arrow-avro reader"); + r.map(|batch| batch.expect("arrow-avro batch").num_rows()).sum() + } + "apache-avro" => { + let r = if narrow { + apache_avro::Reader::builder(Cursor::new(&data[..])) + .reader_schema(&apache_reader_schema) + .build() + } else { + apache_avro::Reader::new(Cursor::new(&data[..])) + } + .expect("apache-avro reader"); + r.map(|v| { + v.expect("apache-avro record"); + 1usize + }) + .sum() + } + _ => panic!("unknown reader {reader}"), + } + }; + + let mut times = Vec::with_capacity(reps); + let mut rows = 0; + for _ in 0..reps { + let t = Instant::now(); + rows = std::hint::black_box(go()); + times.push(t.elapsed().as_secs_f64() * 1000.0); + } + let best = times.iter().cloned().fold(f64::INFINITY, f64::min); + let mut sorted = times.clone(); + sorted.sort_by(|a, b| a.partial_cmp(b).unwrap()); + let median = if reps % 2 == 1 { + sorted[reps / 2] + } else { + (sorted[reps / 2 - 1] + sorted[reps / 2]) / 2.0 + }; + println!( + "{{\"best_ms\": {:.1}, \"median_ms\": {:.1}, \"rows\": {}}}", + best, median, rows + ); +} diff --git a/benchmarks/avro_one.py b/benchmarks/avro_one.py index e70bded..56ed425 100644 --- a/benchmarks/avro_one.py +++ b/benchmarks/avro_one.py @@ -9,6 +9,7 @@ timing. rugo rugo.avro.read_avro -> columnar Morsels (no Python object per value) + rugo-1t the same, max_threads=1 rugo+pylist the same, then every column .to_pylist() - the cost of ending in Python objects, which is what the other two return fastavro fastavro.reader -> one dict per record @@ -32,14 +33,15 @@ def narrow_schema(): return {**schema, "fields": [f for f in schema["fields"] if f["name"] in NARROW]} -if reader in ("rugo", "rugo+pylist"): +if reader in ("rugo", "rugo-1t", "rugo+pylist"): from rugo.avro import read_avro columns = NARROW if shape == "narrow" else None to_python = reader == "rugo+pylist" + threads = 1 if reader == "rugo-1t" else 0 def go(): n = 0 - with read_avro(data, columns=columns) as r: + with read_avro(data, columns=columns, max_threads=threads) as r: for morsel in r: n += morsel.num_rows if to_python: diff --git a/benchmarks/measure_avro_rust.py b/benchmarks/measure_avro_rust.py new file mode 100644 index 0000000..5a7418f --- /dev/null +++ b/benchmarks/measure_avro_rust.py @@ -0,0 +1,128 @@ +#!/usr/bin/env python3 +"""Race rugo's Avro reader against the Rust Avro readers on this machine. + + python3 benchmarks/measure_avro_rust.py [--rows 200000] [--rounds 5] [--reps 5] + [--python 3.14] [--rugo-src /path/to/opteryx-core] + +Needs `uv` and `cargo` on PATH. Same file and method as measure_avro.py: gen_avro.py +writes a deterministic 20-field file with fastavro (so no reader is timed on its own +writer's output), each reader decodes the same in-memory bytes in a fresh process, +reading the file is outside the timing. Both codecs, `deflate` and `null` (`null` +isolates decode from inflate). + +Arms - single thread unless the name says otherwise: + rugo-1t PyPI rugo, read_avro(max_threads=1) -> Morsels (avro_one.py) + rugo PyPI rugo, every core (rugo's default) - NOT part of the race + rugo-src-1t / -src the same from an opteryx-core source tree (--rugo-src) + arrow-avro Apache Arrow's arrow-avro -> RecordBatches, crate defaults + (batch 1024, StringArray, miniz_oxide inflate) + arrow-avro-tuned the same with batch 65,536 (rugo's morsel size) and flate2 on + zlib-rs, the fastest Rust inflater - arrow-avro at its best + arrow-avro-tuned-view tuned + StringViewArray strings + apache-avro the Apache Avro Rust crate -> one Value per record + +Rounds interleave the arms (order rotated each round) so thermal drift and order +bias land on every arm; each (round, arm) is a fresh process running `reps` reads. +Per arm: best = min over every read, median = median of the per-process medians. +Writes benchmarks/results/-avro-rust.json. Results are only comparable to +earlier runs from the same machine. +""" +import argparse, datetime, json, os, platform, statistics, subprocess, tempfile + +HERE = os.path.dirname(os.path.abspath(__file__)) +CRATE = f"{HERE}/avro-rust" +ap = argparse.ArgumentParser() +ap.add_argument("--rows", type=int, default=200_000) +ap.add_argument("--rounds", type=int, default=5) +ap.add_argument("--reps", type=int, default=5) +ap.add_argument("--python", default="3.14") +ap.add_argument("--rugo-src") +ap.add_argument("--workdir", default=tempfile.mkdtemp(prefix="rugo-avro-rust-")) +a = ap.parse_args() +W = a.workdir + + +def sh(*cmd, env=None): + return subprocess.run(cmd, check=True, capture_output=True, text=True, env=env).stdout + + +def venv(name, pkgs): + p = f"{W}/venv-{name}" + sh("uv", "venv", "--python", a.python, p) + sh("uv", "pip", "install", "--python", f"{p}/bin/python", *pkgs) + return f"{p}/bin/python" + + +# --- builds: one binary per flate2 backend +print("building Rust readers", flush=True) +BIN = {} +for variant, extra in (("default", []), ("zlib-rs", ["--features", "zlib-rs"])): + sh("cargo", "build", "--release", "--quiet", "--manifest-path", f"{CRATE}/Cargo.toml", + "--target-dir", f"{CRATE}/target/{variant}", *extra) + BIN[variant] = f"{CRATE}/target/{variant}/release/avro_rust" +lock = open(f"{CRATE}/Cargo.lock").read().split("[[package]]") +crate_versions = {} +for block in lock: + fields = dict(line.split(" = ", 1) for line in block.strip().splitlines() if " = " in line) + name = fields.get("name", "").strip('"') + if name in ("arrow-avro", "apache-avro", "flate2", "zlib-rs", "miniz_oxide"): + crate_versions[name] = fields["version"].strip('"') + +# --- Python side +pypi = venv("pypi", ["rugo", "fastavro"]) +ARMS = {"rugo-1t": [pypi, f"{HERE}/avro_one.py", "rugo-1t"], + "rugo": [pypi, f"{HERE}/avro_one.py", "rugo"]} +ENV = {} +versions = {"rugo": sh(pypi, "-c", "import rugo;print(rugo.__version__)").strip(), + "rustc": sh("rustc", "--version").strip(), **crate_versions} +if a.rugo_src: + srcpy = venv("src", ["fastavro"]) + ENV = {**os.environ, "PYTHONPATH": os.path.abspath(a.rugo_src)} + ARMS["rugo-src-1t"] = [srcpy, f"{HERE}/avro_one.py", "rugo-1t"] + ARMS["rugo-src"] = [srcpy, f"{HERE}/avro_one.py", "rugo"] + versions["rugo-src"] = sh(srcpy, "-c", "import rugo;print(rugo.__version__, rugo.__file__)", env=ENV).strip() +ARMS.update({ + "arrow-avro": [BIN["default"], "arrow-avro"], + "arrow-avro-tuned": [BIN["zlib-rs"], "arrow-avro"], + "arrow-avro-tuned-view": [BIN["zlib-rs"], "arrow-avro"], + "apache-avro": [BIN["default"], "apache-avro"], +}) +RUST_TAIL = {"arrow-avro": ["1024", "0"], "arrow-avro-tuned": ["65536", "0"], + "arrow-avro-tuned-view": ["65536", "1"], "apache-avro": []} + +res = {"date": datetime.datetime.now(datetime.UTC).isoformat(timespec="seconds"), + "machine": {"platform": platform.platform(), "cpu": platform.processor() or platform.machine(), + "cores": os.cpu_count(), "python": a.python}, + "rows": a.rows, "rounds": a.rounds, "reps": a.reps, "versions": versions, + "files_mb": {}, "reads": {}} + +for codec in ("deflate", "null"): + path = f"{W}/events-{codec}.avro" + print("generating", codec, flush=True) + sh(pypi, f"{HERE}/gen_avro.py", path, str(a.rows), codec) + res["files_mb"][codec] = round(os.path.getsize(path) / 1e6, 1) + for shape in ("all", "narrow"): + runs = {arm: [] for arm in ARMS} + names = list(ARMS) + for rnd in range(a.rounds): + order = names[rnd % len(names):] + names[:rnd % len(names)] + for arm in order: + print(f"read: {codec} {shape} round {rnd + 1}/{a.rounds} {arm}", flush=True) + cmd = ARMS[arm] + [shape, path, str(a.reps)] + RUST_TAIL.get(arm, []) + env = ENV if arm.startswith("rugo-src") else None + out = json.loads(sh(*cmd, env=env).strip().splitlines()[-1]) + if out["rows"] != a.rows: + raise SystemExit(f"{arm} read {out['rows']} rows, expected {a.rows}") + runs[arm].append(out) + for arm, outs in runs.items(): + res["reads"][f"{codec}/{shape}/{arm}"] = { + "best_ms": min(o["best_ms"] for o in outs), + "median_ms": round(statistics.median(o["median_ms"] for o in outs), 1), + "rows": a.rows} + +os.makedirs(f"{HERE}/results", exist_ok=True) +fn = f"{HERE}/results/{res['date'][:10]}-avro-rust.json" +json.dump(res, open(fn, "w"), indent=2) +print("wrote", fn) +for key, value in res["reads"].items(): + print(f" {key:40s} best {value['best_ms']:9.1f} median {value['median_ms']:9.1f} ms") diff --git a/benchmarks/results/2026-10-18-avro-rust.json b/benchmarks/results/2026-10-18-avro-rust.json new file mode 100644 index 0000000..ebccb87 --- /dev/null +++ b/benchmarks/results/2026-10-18-avro-rust.json @@ -0,0 +1,188 @@ +{ + "date": "2026-10-18T14:08:56+00:00", + "machine": { + "platform": "macOS-26.6.2-arm64-arm-64bit-Mach-O", + "cpu": "arm", + "cores": 18, + "python": "3.14" + }, + "rows": 200000, + "rounds": 5, + "reps": 5, + "versions": { + "rugo": "0.5.4", + "rustc": "rustc 1.96.1 (31fca3adb 2026-06-26)", + "apache-avro": "0.22.0", + "arrow-avro": "60.0.0", + "flate2": "1.1.10", + "miniz_oxide": "0.9.1", + "zlib-rs": "0.6.5", + "rugo-src": "0.5.4 /Users/justin/Nextcloud/opteryx-core/rugo/__init__.py" + }, + "files_mb": { + "deflate": 21.6, + "null": 38.2 + }, + "reads": { + "deflate/all/rugo-1t": { + "best_ms": 84.1, + "median_ms": 85.1, + "rows": 200000 + }, + "deflate/all/rugo": { + "best_ms": 30.5, + "median_ms": 30.9, + "rows": 200000 + }, + "deflate/all/rugo-src-1t": { + "best_ms": 82.8, + "median_ms": 83.9, + "rows": 200000 + }, + "deflate/all/rugo-src": { + "best_ms": 30.1, + "median_ms": 30.3, + "rows": 200000 + }, + "deflate/all/arrow-avro": { + "best_ms": 116.4, + "median_ms": 117.6, + "rows": 200000 + }, + "deflate/all/arrow-avro-tuned": { + "best_ms": 101.4, + "median_ms": 102.3, + "rows": 200000 + }, + "deflate/all/arrow-avro-tuned-view": { + "best_ms": 113.1, + "median_ms": 114.7, + "rows": 200000 + }, + "deflate/all/apache-avro": { + "best_ms": 267.4, + "median_ms": 272.0, + "rows": 200000 + }, + "deflate/narrow/rugo-1t": { + "best_ms": 52.3, + "median_ms": 52.9, + "rows": 200000 + }, + "deflate/narrow/rugo": { + "best_ms": 18.2, + "median_ms": 18.3, + "rows": 200000 + }, + "deflate/narrow/rugo-src-1t": { + "best_ms": 51.1, + "median_ms": 51.5, + "rows": 200000 + }, + "deflate/narrow/rugo-src": { + "best_ms": 17.8, + "median_ms": 18.0, + "rows": 200000 + }, + "deflate/narrow/arrow-avro": { + "best_ms": 97.8, + "median_ms": 98.3, + "rows": 200000 + }, + "deflate/narrow/arrow-avro-tuned": { + "best_ms": 82.8, + "median_ms": 83.2, + "rows": 200000 + }, + "deflate/narrow/arrow-avro-tuned-view": { + "best_ms": 82.8, + "median_ms": 83.2, + "rows": 200000 + }, + "deflate/narrow/apache-avro": { + "best_ms": 398.0, + "median_ms": 402.0, + "rows": 200000 + }, + "null/all/rugo-1t": { + "best_ms": 46.3, + "median_ms": 47.9, + "rows": 200000 + }, + "null/all/rugo": { + "best_ms": 17.3, + "median_ms": 17.7, + "rows": 200000 + }, + "null/all/rugo-src-1t": { + "best_ms": 45.5, + "median_ms": 46.3, + "rows": 200000 + }, + "null/all/rugo-src": { + "best_ms": 17.1, + "median_ms": 17.4, + "rows": 200000 + }, + "null/all/arrow-avro": { + "best_ms": 40.2, + "median_ms": 40.7, + "rows": 200000 + }, + "null/all/arrow-avro-tuned": { + "best_ms": 40.2, + "median_ms": 40.6, + "rows": 200000 + }, + "null/all/arrow-avro-tuned-view": { + "best_ms": 51.0, + "median_ms": 51.6, + "rows": 200000 + }, + "null/all/apache-avro": { + "best_ms": 200.4, + "median_ms": 204.3, + "rows": 200000 + }, + "null/narrow/rugo-1t": { + "best_ms": 14.2, + "median_ms": 14.5, + "rows": 200000 + }, + "null/narrow/rugo": { + "best_ms": 5.0, + "median_ms": 5.1, + "rows": 200000 + }, + "null/narrow/rugo-src-1t": { + "best_ms": 13.9, + "median_ms": 14.2, + "rows": 200000 + }, + "null/narrow/rugo-src": { + "best_ms": 4.8, + "median_ms": 4.9, + "rows": 200000 + }, + "null/narrow/arrow-avro": { + "best_ms": 20.6, + "median_ms": 21.1, + "rows": 200000 + }, + "null/narrow/arrow-avro-tuned": { + "best_ms": 20.7, + "median_ms": 21.2, + "rows": 200000 + }, + "null/narrow/arrow-avro-tuned-view": { + "best_ms": 20.8, + "median_ms": 21.0, + "rows": 200000 + }, + "null/narrow/apache-avro": { + "best_ms": 328.4, + "median_ms": 335.5, + "rows": 200000 + } + } +} \ No newline at end of file diff --git a/docs/blog/index.html b/docs/blog/index.html index bccbf3b..cca54a3 100644 --- a/docs/blog/index.html +++ b/docs/blog/index.html @@ -31,6 +31,17 @@

Blog

PyArrow, pandas or NumPy. Measurements, not estimates.

+ +

Performant Python pipelines without the Rust

+ +

+ rugo's Avro reader, called from Python, against Apache + Arrow's Rust reader. On one thread Python won three of + four races, by 1.2–1.6×. On its defaults rugo was + 2.3–4.5× faster than any Rust result. +

+
+

When rugo makes your Lambda cheaper, and when it diff --git a/docs/blog/performant-python-pipelines-without-the-rust.html b/docs/blog/performant-python-pipelines-without-the-rust.html new file mode 100644 index 0000000..b13643a --- /dev/null +++ b/docs/blog/performant-python-pipelines-without-the-rust.html @@ -0,0 +1,445 @@ + + + + + + Performant Python pipelines without the Rust + + + + + + + +
+
+
+

Performant Python pipelines without the Rust

+ + +

+ Correct at time of publishing. For up-to-date + performance and feature information, see + rugo.dev. +

+
+ +

+ Called from Python, rugo reads Avro faster than + arrow-avro, Apache Arrow's own Rust reader. + On one thread it won three of four races, + by 1.2× to 1.6×. Left on its defaults, it uses every core + and was 2.3× to 4.5× faster than any Rust + result. +

+ +

+ There's a familiar arc in data engineering. The Python + pipeline gets slow, someone benchmarks it, and the + conclusion is always the same: rewrite the hot path in Rust. + Weeks later you have a second language, a build toolchain, + FFI glue, and a team that can't all read the code. +

+ +

+ We think that trade is usually unnecessary. To test it, we + raced rugo's Avro reader, called from Python, against the + best Avro readers Rust has, called from Rust. +

+ +

The contenders

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
ReaderCalled fromReturns
rugo 0.5.4Pythoncolumnar Morsels
+ arrow-avro + 60.0.0 + RustArrow RecordBatches
apache-avro 0.22.0Rustone Value per record
+
+ +

+ arrow-avro is the one to beat. It decodes straight into + columns, as rugo does, and in our runs it was 2.7× to 16× + faster than the older apache-avro crate. We ran it twice: + once on its defaults, and once tuned as far as we could push + it, with 65,536-row batches and its deflate switched to + zlib-rs, a faster Rust inflater than its default. +

+ +

The test

+ +

+ One file: 200,000 rows of a 20-field event record, the mix + you'd see in a Kafka topic or a log stream. Longs, doubles, + strings, enums, nullable unions, timestamps, dates, a + decimal, a fixed(16), a nested record, an array + and a map. fastavro wrote it, so no reader is timed on its + own output. +

+ +

+ We wrote it twice, once with deflate (21.6 MB) and once + uncompressed (38.2 MB), and read it two ways: +

+ +
    +
  • all fields: every one of the 20.
  • +
  • + 3 fields: id, + amount and country. rugo is + given columns; arrow-avro a projection; + apache-avro a reader schema of just those fields. +
  • +
+ +

+ Every reader decoded the same in-memory bytes, so disk wasn't + part of the timing. Each run was a fresh process on one + thread. The readers took turns across five rounds, and the + figures are medians. The machine is an 18-core Apple Silicon + Mac. +

+ +

One thread each

+ +

Median read time, shorter is faster:

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Racerugo (Python)arrow-avroapache-avrorugo vs arrow-avro
deflate, all fields85.1 ms102.3 ms272.0 ms1.20× faster
deflate, 3 fields52.9 ms83.2 ms402.0 ms1.57× faster
uncompressed, all fields47.9 ms40.6 ms204.3 ms1.18× slower
uncompressed, 3 fields14.5 ms21.0 ms335.5 ms1.45× faster
+
+ +

+ Python won three of the four. The arrow-avro figures are its + tuned build; on its defaults it was 15 ms slower on the + deflate races and level on the uncompressed ones. + apache-avro was never in it: it came last in every race, up + to 23× slower than rugo. +

+ +

Every core

+ +

+ One thread each keeps the race fair, but it isn't how anyone + runs rugo. On its defaults, rugo spreads a file's blocks + across every core. Neither Rust reader can do that for a + single file, so this compares rugo, untouched, with + arrow-avro at its best: +

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Racerugo, defaultsarrow-avro, tunedrugo vs arrow-avro
deflate, all fields30.9 ms102.3 ms3.3× faster
deflate, 3 fields18.3 ms83.2 ms4.5× faster
uncompressed, all fields17.7 ms40.6 ms2.3× faster
uncompressed, 3 fields5.1 ms21.0 ms4.1× faster
+
+ +

That's what you get without changing a setting.

+ +

Where we lost

+ +

+ One race went to Rust. Reading every field of the + uncompressed file on one thread, arrow-avro took 40.6 ms and + rugo took 47.9 ms, so arrow-avro was 18% faster. +

+ +

+ We're showing it because it's the purest test of the decoder + itself: no inflate, no skipping, just bytes into columns. + It's also the one we most want to win. +

+ +

+ Our best guess, not yet tested: rugo turns the nested record + and the map into JSON text, which is extra work. arrow-avro + builds native struct and map arrays instead. Reading the file + without those two fields would tell us whether the decoder + itself is behind. +

+ +

+ It doesn't change the headline. Kafka Connect, Spark and + Iceberg usually write Avro compressed, and on compressed + files Python wins. +

+ +

Why Python can be this fast

+ +

+ Python isn't doing the work. rugo is a native C++ engine with + a Python front door: you call it from Python, and the bytes + never pass through the interpreter. +

+ +
    +
  • + Compiled schema. rugo turns the Avro + schema into a flat program of decode steps once, then + runs that program over every block. Nothing is looked up + per row. +
  • +
  • + Straight into columns. Values land in + typed columnar vectors, with no Python object per value. + That's what you'd write in Rust; you just don't have to. +
  • +
  • + Fast inflate. Deflate blocks go through + libdeflate, a dedicated, heavily tuned inflate library. + On compressed files that's most of the time, and most of + the lead. +
  • +
  • + Cheap skipping. Fields you don't ask for + are stepped over, not decoded. On the uncompressed file, + reading 3 of 20 fields takes about a third of the time + of reading them all. +
  • +
  • + Every core. A file's blocks are + independent, so rugo spreads them across threads and + still hands back batches in file order. +
  • +
+ +

+ The point isn't that Rust is slow. arrow-avro is excellent + work. The point is that "fast" is a property of the engine, + not of the language you call it from. +

+ +

What this leaves out

+ +
    +
  • + One schema. A wide, flat record, or one + that's mostly strings, could move the margins either way. +
  • +
  • + One machine. Every figure here is from + Apple Silicon. We haven't run x86 yet. +
  • +
  • + Different outputs. rugo returns nested + records and maps as JSON text; arrow-avro returns native + struct and map arrays. Both end in columns, but they + aren't the same columns. +
  • +
  • + Other languages. We didn't test Go, + Java or C++ readers. The ones we know of decode a row at + a time, as apache-avro does. +
  • +
  • + Reading the file. Every reader got the + bytes already in memory. Reading from disk or object + storage adds the same time to each. +
  • +
+ +

Try it

+ +

+ pip install rugo is the whole install. There's + no toolchain to set up, and no PyArrow or NumPy: +

+ +
from rugo.avro import read_avro
+
+with read_avro(
+    "events.avro", columns=["id", "amount", "country"]
+) as reader:
+    for morsel in reader:
+        print(morsel.num_rows, morsel.column("amount").to_pylist()[:3])
+ +

Reproducing this

+ +

+ Measured 18 October 2026 on an 18-core Apple Silicon Mac, + against rugo 0.5.4 from PyPI on CPython 3.14, and arrow-avro + 60.0.0 and apache-avro 0.22.0 built with Rust 1.96.1 + (release profile, fat LTO). The tuned arrow-avro build + switches flate2 to zlib-rs + 0.6.5; the default build uses miniz_oxide. + rugo runs with max_threads=1 for the + one-thread races. +

+ +

+ Each of the five rounds runs every reader in a fresh + process, five reads each, with the order rotated each round + so no reader always goes first. The figures are the median + of the per-process medians. +

+ +

+ The harness, the data generator and the Rust readers are in + benchmarks: measure_avro_rust.py builds both Rust + readers, writes the file and runs the race on your machine. + We'd like to hear what you get, especially on x86. +

+
+
+ +
+
+ rugo is part of the + Opteryx project — Apache + 2.0 + + GitHub + · + PyPI + +
+
+ + + + diff --git a/medium/performant-python-pipelines-without-the-rust/table-1.png b/medium/performant-python-pipelines-without-the-rust/table-1.png new file mode 100644 index 0000000000000000000000000000000000000000..84f8135e4e91472599f60b909f12f60e216b27fd GIT binary patch literal 43881 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ȦQh&>4c@rq)wYFX`cDeezHHBFF?Ufs~Q6WNYuHo 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�r(zi3N6cP^HAnapMsag}#6|SGnyi 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 literal 0 HcmV?d00001 diff --git a/medium/performant-python-pipelines-without-the-rust/table-3.png b/medium/performant-python-pipelines-without-the-rust/table-3.png new file mode 100644 index 0000000000000000000000000000000000000000..750f2002056cdd9ed6ae0d7786df63e34da77450 GIT binary patch literal 64400 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%0DY5yQ@?U%zo0hu{uoW?no$5cIjU~ z-L2wV2cA(W8J#?|(K!ON(*Dbq;_H|qLoS7QbS)g;dLW4aMaPAm z^UR2dv|1G^;eZ%u!s+?&@gSc9D1Ej^@0mlrh&eGXF0P>)Is+SmiMu{|Ox3W_{tEYi zPS_}_b80Hgx4*csaJJdGr0)eeS?VsRW-U`BGi--8qt7+KpiJ0(O9HiRRwb)ZU^`>w z^maM2VJrMkf}$dp()i1y4ICHe^Np&8QTwI3-qJ|M*I0mCCnpQn4hLW!nEwue!&j;cb?S^ z41BgW?x#~+wl3@~3mgZPqc;SE8j?Rc45tYuCVkx^UJ{F8(hy4HOS_b5b~M^MrS%ME z<*dSb;T#%r2M7z7vdpi%W(l9T@S}Ur)^SWQO&^r86F!!OAwg&~!R6t-p4_ivBJ5cRCgx z4?904*y7#0r-Q#g6{Ia@lS|-t0%`Bkully?g*OU0Tx^Iv0BFo7HzmDs_Z@&dFf;Q` zU}%ED%|NlaOR=z=(bE$YxVBKUnFMRuab?b@6sB|G*S5v6gQ+1ZkBy`W^$=5uaqKQhV=g zRZ19aE;V5>dE=P`_PdRhXI~o5t;wZzv0du8SA)47Lbw~<{YD0L&5H`OY~TR73B7Sc zJYiwU6mR~c#+!VhF#*tn&@JkHR=*H^TeC#5sxC!9&jAyEN!&))_ZFzHT={>qQM!Lo z7+j;-MPr7{)-BoN7^!``WGy*{PY}_iM?y*(7CN7bZE`BsUWuD?I4v+x!Mo5};- zJ8g`DVj|pa*!a~oHOE$e6;2D?bYz?Vv01v+adWfU|M1Dxb+RUjd}xTQN7tV@F?4-M zWz@Y0(`px}4Vj!?O;nygUHWqExFlP^=&tLJ%|mjz8-sGUxf#EG!`6J?`!@}^iP}J+ zfSsPL<9)imwXwbH4NWQzD`&+^CUrHCuJAUDLXcC(hpx8x-86_`?E=%d$>yL=XWE7C zco_4PjRM#;xRm(W8q=BhtS)kF?tq_)?Kdgx?rvIqIpFsJ4K1y6`-KQ_6w?-&m=w;= zxf&djB%^_3{)nQ53@5LtxGr0u>>tgKyNmNxg}Vd(^N+5VyrH3$0Rc8u>SfKo0TenC zIo@UY@0VKYyZ)>NW6MVaWi303Wd&0ykehB=J<<76=jNH7o~VBQcqp>{_CU?*T1c%% zCwTY)ErXS>MvYjT-P@ZXn$EhAFvnCnZgVT_IGkKO1(e{t-`!OTdJaqMl-WBZurQ`& zW$I^U>CIJq-qDdIy!|3+@NdV2wvn;6j*hNg?99!~yl{hnaQ)nT-*Zt-k6PftOA85lsK6=h{BpVMLPg1|@I!11yG3866F+j&cxu{aQcWXa-?FTkiy@^uL6CN_qe2 z4*z-mf59Ix32j&>UMTFv#bz%Q>%X%Cd>k=L2YQOOfWrTmHZogd%cZRLzgkH&p>I+D zUljR&Z396(92`AGqN!j)B?fu>QG^PI8%9yt4Y>+)sMx@BC3fe}sXrr6Qf0MVD0sNs`VzyNKP{WeV<=Y+Iwjvim z<+psJ4=4}K4Y z0Qbnu%QM$oOe5%l=r_1X&Rp8jeV5?yx$Ye^?w(&*Foc8%x*xgt`T1#UKSpzZB+F7B za#4MFOpEELO{hKf?)7B%W}y?)Q83JvP@4_&-lu+cB+1wOa_Xh4R%MncW}$+U>iscFT?i~Bss>qDyJj{z4|ESCBIiBTpjAAC`S72^3`*6L;ps%joz_~ zA@Sz3_K@`+rSy*V)9HtD&)(6DK~cP@s4BCezM&!Cy%0jPbw)aQyX8vXl|R&jqF-0> zUQp^6k6GMb^oN;)pa&aUAs^Qch1~)JWjU^tQpC;=-5)YEm<+uyRniP`(JuJZdSBdH zR8&LRQJ_4Xy8`OHh`sRIE0IqLKUkB^vw0v?d zt3hvLqGAAHm~deT1!T?atEn4Z9p5>Ql)8#uV-bD9#g)N5gC2=Fy5jLB)JW z(p%d>gI4U2AWq&n?BLa#5p}D@iW<8T%<`sPqO2ciETU{Mm-P?Px4~- z2PiD*Cn+a~}kUcif4WU$+%f|C)G&YwzzxEzZBclc8TPXgQ@B2h0tX zyc8Dkr*pb2jJT{S(&m$abZmYjHh`B*7$;9MO*Pm*_+E^bUc#Fp7d$5`tAg{-{HhZ- z-XaqQX*?Id`LnLfhs?S6cL&z9QjRSb36MSbvu`ve8>rQEyT=FFdj>JYRG*XKK#5O| zpOTSE23tQVm+|+zyi99E^y>zGQEEcYgO%Qx!k0yVV8~pByu8`zxZ))#1b=3VyD$G5 z)~D#VSk3$X7gqb;C6Zn20Y1w~n~D0_e0Fw@6&N5k(0YF44a8dHcB{EV3%f(=MN`(T z4`#b-PYJpq$R0SHjgc_}deR=ou9&lB{1?rEKhW<19ll(1w_V3Z`nAS8w|2(tZKI^$ zL5gMBVR*`&&RXShb)2%Lgg0ra?4yR~;>kDyLL~HRIegfpkHSKJ(gaY&Dwt}-^{HJJAFjODnxyg`Chj(!2Rur#A{$R>M9-yMIAcVnd&FdOG1qB-yX61^C zn8UD~2t&CtgLg37Gc1qgJ8Pt+>!kw)=X3A7(`oQSY!5e-o1-*3RaJI&AoBV{@o}T5 z)a5B%?8{(_=4VNRV?!NadguJIGFEnGCYIjaJw69d5lX0pw=8jq3|K8z`*W=ISuF<& z9~W0#o4;&+zA!U@EHJaF$R10=IdMK=jxh8E&Y)CJRJ~5t$iV zx@N1>FR~+%A&zuDwVK8@NRJn(+5N@idqr;vd)BKp&A5(#{m{>mdTiSv`tduPSF=Hq zmRf>_sxPlpl2$l7zKfxQ!*g=;xr_B~m3!3RBheseMo7+p*7HD(x~jrLTSgS%(Itdi#)p9LsKdxna7lTKIr76OpI(T4yz)lccDyO$J-++X)@BrKR$%FN>-(N zBBZ@mPyRj$4D6P$RmYSbsxX$-D)s;xK;&cc?&=(+P(@hJUq%lc?(bX2;1ld}Of=n` z1MH+szu9TE-IIQ-QiAG@pq0|Y{S#7>JqWpQbX5BEG}b%(6i(wF>^B_cf2bb%;}kEf z9#QBHzbIHoQ!dF@^sr$S%{S0gO}ZIQKd~JNZ6bRag{R_KRvN(^bKN3FyZ;03;%bJJ z^o*=o_D_$$ySHx$LU_rGrbB!2&TO)L6TJm!(r2IrHXeq+vy*(J%J#&j`1p6GOH6qS6uS znF6e`%);Va5*xBZ_iW-W3)v?Dqa%H;eH@P8xJQG2QG+IKuPnGlr!Wm zFME0vF(XA+lT^DRAHzRo#mf+Rq^ulrxRLVsje~r%%))0qX*koo)Awfc3#O9X(kRU7 zeCF^U@rMj=8j+X*y>}bWQJP)CrFG(82lu~jJC|7U##dCCV!-uIbif;B0|}jq@#*jG{q@g|PC7GpFPU_OF{)(HxLA zTq4fD^xvx{?Hs->7-!*Ymly}9UXYD%vrp_?M7)d&ZuU{i-%dV#=Uukx>)Ot-`}z;5 zm9;fg|9o;N<#387mE*h600Fw=N!$H2#P76gJEhjfzTbHRDL_j%MOZ ziZK)Sm04^p(&O%qzrZVbigQb!d}Ir3f99PxNhT9B0Z*lCP@Yyr`D znfwMpXUICKpDqIPu82{Sh0|fdtSTjT_gy#hukU_?R+mC)YabMLv>}|3 zd7KN`R~W@lh;JfGX0*#X?w;OmZMw@KV0}M!mYB zP7k5nfGUddF@Rczukfr3E8N}R|FW&N-;W&>DR^(wq3#Ir`MXGfJY-7Y;Kray9tikr z!?RNL{bGyr)vae$61CtR^76s)-0geY#n0aL(`COaN?+8a_kM)7a4RPoZg_aD zTkYj5#+CW1Gbl5!uXl zyzAf>r*+{MuMFwf4)jBLtP$*MJ~hi#_)P{{2@VrR$)IVqH~bK&qR^3-b#M`~wNlV? zT4UXdrfM>Dkc;h;!|L9t;NE!-G}%Qo62!!lFyJc&{KyKB%8!JN8JlZp#hRIaN>E$i z^Jl{k#dt|UPWE9as17K}xzY0?vn1yX2$z8*d6XJ0u8?zUuf8djCr+2})f*7*Ge;K} zY|JoFc$U{=cRQ3CP0d>&r)Vf8Z$EN=s_JdQW6RAJ zfcNm%0fImLkdn_fRStbs!Zm(VtAkWkw@*3}pAQd_5?67n7Zx$;Ej7tNQW&FVvC!M2 zvhv80wxnaWGi7Nb{c<$VjZV*qcbcyj45aw8=K9p1(cSDso9{jc`T8EFEofI&MW^YD zWFlX>xt&tU58p}`)!HEq^=-X70#o%C8C1X)9%cRGKd<*a=XRG{Bv+%J92}+r#9Y~jYS;-fh{4(SBMCR7<=C#w+x2_9xNhf)$Ulp}KmZUW(4_xI|d3QxW5$+?F-;$Bc60s-gCqeMDKmY%!{L zX7Kskk*+deR;IafzH|1oO}O;qCtgc*2{?1Ol6ppXs1S(?E(b=l+vuOn^EepW4HvPT5 ziCm`rp>aiW(HrMCDq{7>v|4z!;r-seJrLiIk4N*vuLmv@6D5BHvw&-y*66I7#*1~F zmmg-lUFcq{WXPmVW2QGp*iurK5i^Wu5bS-BDzVJ-&q=YK*vC{h6`ctA(B;TiCa(uG z0B3CoD|Yaed}U}?k0X&mCg#|xI-~1F4}696j1{CHQ&P6ydlqx@Y43Q>B^P>Sq=b87 z_N~^jQ1qiarf#bzwZ8!n4Cy%&5H5B41zD~G?Ope?`Qh$}{LrGEtF@DenQX5#P+88h zF1RTB_|(sosj)d@W*0~)L<)Wtp!)F6q-Mn9%5Q}cpN+dkS<-Mu6^jLat?!bz=>=1Y zmD5%+s!6>1=%%G$b#|!Z9Fev427u;w$+;}Mmkqv+{I7{jCa&`GIyD*lF|acVuawj8 zcW~j&D&&rZOhq9I^h&BZ?~eyZaqW*KO0=@3to-kHQTGh1fMH2^IMFORt>P`cyLc{r$tj6Dkcr*U-1bto+C?5NYg_qI>_>En#7ENhPqG%s6y zLK32qDK(5CXLFoxIA zfGL>`x^t83OtdVrLlW-1ejJ;So?Wg#-X_X%4y`d{nRg25$Sbs{2+NztKF#BAbJTt9 zoM(_12ENW|i9#+p9(G1G8hlw3KoHOZQ_D^Z2yv8$MOv?@081{o}rGc z4ys`!CEuxs22dk=cXNAFl?D%=vQ7tLd3yQi;Zi%Nq}8j>1_pfI)01r2ttCZ8DT2P0 zA0&s`8a!#~89DFQRm8F=6_n&Y*L}fh_E|^5`W3nc%5H&9-R=-8QMb(?g)y}@ zNC90gkzvgwQ|`a|6p;x24Od9LTYAXKD4U@O-s^c;Hs{x2bRrb+HQkvMzT26DyIsp5 zJ5lW`BIkhxnpaq9`uXdXT19iM=CmkkQ>mpfDe<8s*-e291Wq+eZX2kv1L*iy*VLCk z#HdhqM@aDpO26s9IDnr&A^)2Zg)V|C_BajH=straT93Ox ziZ)J*!?u*&GReGR(G#ref=4#12t=SlEyt6mzM|)IXu4{83PTS_I^kogkqT*?;%*x5 zjvrHmFs06)%m*uS20-@8H^>nj3%F+A*1}s0o5LX+$3I~m2loez`ud0Eg#v_zH4rPy zg0Ld)hht(y>iK+UK>Ou({*TYJQTN>{cag1q>C*69`3OnM=#HqLo|8+tTnW}iq(*t9 z;NJk?Rc~&rIMmV3d6zRh%%&kR9fE8nr}VpJ6irYln`ylrKi8j+?o-bV`dK4al#uxQ z;u3a(6`lMz-g_&Y z%FlzbbD2zO{KR{Y(W(GXCP+zclxMLU2eZ6nWVgY&cM9a`=dg~pw!+H*>>wRlVN0T}-$CTMhEzHiDg@8$hXAi*eF3|@aYH{E1)7$g z(PD{bzMNWg(sFrrZhoDK@d9|k4c)t6$j$Y)pNE4bK?n-WynH7Tavr; zbb9C+zE|%{uwQz{88obj8Vyb>7yVk%=BZD|JF+t8l=*czoSy0U{RRIlVLNe+(`4$%G8QrRUlbTwIX1COsnT5$#$I*1#r+J2yJSM66nlcpM zC>SX5$m-Vxp)+PXf_kPD>YYjF( z<Q!$)z z$$JC=ZR!?oCDe!vv@qGg@qgHR%b>X0s7;q7pqj3x*u8u2=UMB%u2msJ@H}+I zz%0hO3EKwQ8qIc_`HvGe2So%>k3M9wDs&an5;pt=2z&5i~L3r8^sh3$@ zTtwD9>8ZhbT=ms#Tzy$wU({5MlR9HnH8i%j4QDC%oOhd3Tq7bW#NWLdz32ut0e|>R zwY5&~(7^BQF{C#t+K{nHc@-NGLF-dYK_MHIT>BoVs(@8i(p$SjHt~F4N=dcCIm0&E@B&C{nU7N}ZA6(GgLId1B&jv7rHYvrHv8&9H-DDLrg=b`$ z_Q!PQ!(zuiYjr@v`kiCAWkMYiBwp&7(kaJ~1ko>gjTjCf!M@^KlHoj)jAA7ubaY@I zmwEretUSVVB`ah{fgV}Va-q&_N=_Tnhv@C=jO3}Rs$o#+z3L<}>X4~n_Yh`EAte!-M!QHe2*)eY=SJ?tq1{Vq!l-A7y_ z4naFkA~an!o7vEUus-2LX_w}CJiLQAOg2%FT`ZoR$2rMuXU)Z9?>9`moSCVNr>yV< zX^0}#CMJ({LlBV4kT+FF&MW9u$@9G;La$EcZ*!8c%%)XE{LQT2A=*H*kRjeVUBos? z%-XqXO=y-?ub0lV)B*!(vfb6TVT+25uETc5JE?8bqtRKnP}TVJ^_u{?Gp<4ZL%Rs-u5ZQe!TY9-Z$3o~ zvkqlmoU!yzv6IFUlu!nT4Cs2vB=K&*yzi5B_-&V`Fdhs(SA7P!b^TGph4;f9kEeal z=mu3r+@k&U@z;1=H-_}rXi*ZD|Gao}-4VakIscuQ*hcn`n8)n4b6hkwv}KJeWzKR zq)+dbtCC)3kC-Aq-rcr8oqk(9IUniYHnQjNlzwc(;cYtO=il3A+yt4*G+-M?+bg}h zYY}td*c));FP*k?SD5gv3&eWx24X97IV#H(%+x=ei{l9xP-p3@fOHluZDm8n@2aXg zLG>khT@KGpte|xrh+)3TfETxui<)M7Y7%bzr18k)sA3xu5emv#;&URR)B$JhO{2s4 z%h+}?0^G%+DUSAmw&bp?k|I&E5um_WXx!*~ThM@xq0Uv9Ys5EU(CMYDmPa$=IkDEm z)X&Er`L>cHe=Q=nFb)58zs(Gas0qFyM|R9i>J6mu8IGCvEaaF|2*bTG+Dh0svFeZO zwxGSfkhv8fYgkjXgJWT~%AUUtIzvdH1j3Vso zy!6TRvx{-=&bBmqVB7c{M4AmkVfcc8_q=?lDc4D&#lCn zS?Z|yPt!xZu2zl`W9wNlcePZxLs%smj7VroplAHim*bq(-?Bx~s>MfMR^rL;8S`cW zlw&J8g+x8=GOENroP&ZGN4j6;YV$yFTQza62v>h-9CA(43uG!TqKB)^g_LszlUCZK z;5yuw7caLoeg$`}@Jts<<;Uo8=V)l_ga~pRfBe1r4q~RBVKvr3$l;v+D|dCtvc%dr zn3j!(5cx69ry_af1Pb;;Oz@2aWrfDZ%fL#K-xy>veWlTbg)i1b2x4CXDGy(Ls!+yv zumVaH^a-IWZX;>dVB_7)s2nRQZ+$mXP-3n^%NPO=Ho6ViBn= zThBR(tPRrz@rE=%f53e!lr|)5tIZp#Gr8wbR{qdsxRzBG{h(0HfFgWX!A%vNrYJ(3 zn?nY_w(Y<-=pJ30LEBgRFj(2WznIh(Y6?-hOM3PyFLu0RgKaa0C4zf^q}^IuC52g6 zt5%I|Q)S&t3i0QhNO5*)%5lcF{%dE(D<{7v{rwS7x6P_;mIye)Z=hl6A5XR;g{dMS ziQK6=?`dhRv?*yQSoZ^8CU5I8$1`YqocNp6#eH+>8sdFhT9f~sFFv?9H#Z3aBYK15 zFy+fx(a_KU+A5ETJKfwa%7^$KGQs!ImXnr5^J0o4?5Ppb+kc|?b@p-YcWjPI8WVcG z9_N{fSnZ9u+5D1SUVBw_{~>zoO*-A{KpTzd>vnEg_3Bkl^k3~9ZmEZZcZ`Yio#(hqI)4P^vt=@Hi+7b`^*nyqTrRwRqtAYNCy{A~%f{r!3U~11nRFkm^ zJ68}H`AP`(n{6+S${RbzEo;?aT$MwwaC7l0&IHf;#%Fzz$3_bZVi%%`+kXGuA3X_-r zVTIL#8DzDc-Fo#yr?j*nxAz42Z>ENR7g#bUW`%?V3KNdtCjkl+!fR#%phH&TP=ljo zx_H9Cx5LOn88Vxna`5%NAD!O-;{=2D$NmTBtB={UkG4Z+KO58uMzx)IP1s^eto2fc z+iMVo5d3*zU``WWxxIAh=KAME#Yw*le}vwbb1O`c2!8$j$5A@!wQ1S6Skz(1nU6;T zvRMyLy&F?fi6RZik39z8V2$oMsKocbVA`g%j)=H~?^)iYgXRUAVqPgME%tsFVw47L zC6}}2S0Vj0#O-m61pDZEIzCw*m*%}f=|;MlWY*%&$XJ>xaF8KhpcPSDck`jp!!Z6D z4!_tLa~@s);Gk!NO@!XHu<$XRgR<7|r&Yv{z5_pBVP9Y2>080Pv0}~JgU*+G+sU4p z{gyP%e#NA#Nlv7Puq_1Q)5eS$btf8u!|c+_=~Y{xTx$a=_I~`@ zxaT{}=}q|9CrG^0VD$)rIPHE{P)bVT&lo`jE;YI)y5`$7t=!+!_u7vh&esuPO1?x5 z1uKmFcRWlhRA)cr-)q$FGLm7&8tV_0RQf;d^RGb_R7G7+CUIqR z6K2~(5VgMTFl*D~7LlfAqzVLd$;lj&cDQsJFf&A#3=`(th^8+iyOUf#zQQ+E?)fIQWYut$gLz+&Z(d(kwJa6WEV_NgId0HRY)!LO_F|30UohYx>wX}Kc%z>x z`~>XxN{TZHG@mY|J-Z$vyYY(Z3cCTUH$C27^fM8D$e~=g9(#n;RNZZ1W0@ao51#~g z^A!8+NApprIf-I-5ifpTk(zWM^0VZ*8ri3+132m^+t5ICVwc+m?_NVEp^W3c(kAZ{ zR|EP3qdwJt{!vsRzi>l{lOO^SG_~_yAk(sQDQvla(51>?@u1z%028=gHo#N6vT1^! zP9XyNvrsVZtL!#teBU+RY~FT+Y~tbJ+aKC;rVMC0k1j~l#L_SvqL19-((Byxrr!&7 zd@m}bl6%v}z;w7{RFfG3GstCs-|Qz_Iy#w$E9v_(tJeSU6a;P5h(c6ef2eW7x<$hj zy24#3iZyweWeU?x+UG1HdA)Y*_=gZ5hvTU4@K+d)ZQG>444JR}vGF0bxP))F%ifj` z21)G8=eb8)lA;-e>EX$U#14{L{#uEB6A8h04zaF{thKAt#EpK%duv&iLJI@?WMSb2 zaM=!@*7@>#nN>muLrl9?gKbWhx?I_Gkqd(9Q{)yE8s_Z-3!? zTGb*IU=dTLabGQ%ijKC4kHK+qxef>rb>=UyEv<9gsHnF25g5oA*rr{#+A%+WzTc0N z3fbDj!+K?!pMg!{3`<2tpU89ja%&*h0LYIHvYu#*`=r=JW#xpu!TNT%_ULdhW-E+v5_Y`W$NN@}A)1)aYqvX67{qvN zp-!nyUofLbuLCc%-`77mZtjL(%Wuz8C!FD^k=dqkbnmmg##1CnMw#xV7W;U0c3=ep zlP_gSU-V7ps+sknFY52I#v+`^ue>{Z?(uC7(66tAX5P1bxr|D`-yYm5=8o@1@2#PG zGY|26U+B%9r25sQ1o70(7q&@bWU?51F`N(2*NiZm{RY5y0a-9bzGYWYg}0Bxwx$pRKU*GM9F+TAl=!c{_Z5cRx9l@1t87QUs^B) zt^#y?M!ho#12Pz3>tgJdyyJzBH%NjH;77-pif9Z1-Z&TvAR{g>H>2+tWt;XFf9p@A zgX|#)DQ)5HZcUK|c?x<>0;^?}z(H|I)#j9EGA>;vRx6sn&?Wl#PK6{I2YIGO3Kh75 z0=Yz&T#9fMQDXmB2Btx;RuVOcO0~k?v!C<;3@D&AM=Yj|L1a;2V#z0qjl0k3ja#QW zwoDMWYE91hO9krOl~nLrSwIPkGLu=Gz-L*uCGwo%?OoK)ZIvh-o8YvnXEY9$PXhJRIT>1ii%eTC8LtCl-)#dBc{C zOU(}#K31cJD;7emHG`dWK4`fo)fO<6Zu}|qDGDyED`ziU+bY5)3TifUbJ$^Ia>(|h zUrXh?e@I~@Ayln6(C@jF7U57vMC!OxPgTi<&{An=+hxqOa3(%f3v7?&?EefkL#8ez zJD4EecefJ|z&&2PtE$R4bb=hlcfoXXjlWb--XfNEqcvpYp1Am^Lm@=7_k4t7imT^t zYyN?dJebEx`$(HW^@OJ5>GUGdh!#xH|G_e^Ow#0Fv|2pYH4+ZN*?!@8W=IquW|iR3 zoaSu5zC38*ouXH&RXPO_aQ=VF7-wS@dang@8^QAkMGQ+_ibO1izY z{36$ssei{T92Gwv6W*oK)uF@p+gn<=4Uo}RBNapD?o)|J6YE8? zuR9s$l^s7_nH-S+^Rp)9gnN6937Q=-Ne+* zR>F&Qne2O~SC6#jz!o|_kvqg1r8vYQXOmP4e~ZcM`C-siZbcJ7hJs0vhq;;-I952aGvO6ndC>5MS{!z)#K~LkK#Vz$2`w9)EmY z7v;%RTrF5SrjjNpp>+>?T8lB4=$>N%|1qPOrOa~Px7NdGWk#o*@Z#5)MMdxapX@x2 znEm!+j%~eSxoyi**iGI*GCT7|=Sy7)*gfb8oo)8--+xN5X}pip>51)&pBc+tU0b6H zC3M`Il#MR`tx-G(lE|k)uVDl&861*b1TShXZ*6b|xc~0G7TiG3$;c>Yi0|xNV9CAu ziv6Eu{;33&xZm5!g|ueQTyIJ;GVao&5Kmk~C-bJAJ}0PXBl^^$giC^XL_BimBd>+R)6=^!ePZ z9={{Y`NPg*T#O2YqP7m0K@@BgvCsUOcGP&zWrHAwcH*g!ynH$ffuPW*6zq!P;#0s9 z7ks)3QGJAm)Xi#f@9UlMCvvCS8lmZ@CUR%}CLwJBb z-L0G*9TlRo==bzrw_Udr*VIfD%c7yBRje*V8^vd@a$>F}&zOpj!*#HG$(-ny+MkiD zks<#xm-GD1*ZO|;S@C5Wwau7`#hwGhc@YqV3p&Pe>%MS*oCRGk-KRG?Sr}{-L8XGPB1S!;6b)#4SvE)a8V1cE83UH(jxP>gtK@FfmFl z^k;*Ey)rTlC=+`~hbCG)WwN@AWlbR(3cAkJ@rftn1RvICUSbr=(R~ck{ajV$?z?43 zd+s3rS`BD6upGY|kpD)zTCeXTWRcp9dX6Sby}GOwwSMAY9yarM9rW>rm(-UjCM+C# z&lQclp3*3`2yZ_^TlE1umNVW7`nV*!t!+{k?9+d-n&v`vgage_F19>wh^&=D;+ubg zoVPDfS9#y1B$pGIu*Giwi!b@0yzu43Kt(|*Oj9;8`oPo2{O_xIKmNepdIT!39&hD} zCd?}TFRMAPkIR+YlbV$^ZZ5+4m9Wt*POCEBQksRkd{N zqWf8nlUzm$b<@Otl?Z*bv$+P@O|fi za{#;9`|qNE-s%5>kV>`k`ri>!MCkGFzTey=y|fUZKqceNe8~Rr9M$)Gt<&MD|JpaU za%YE=OLPYZJ9_#L-F*Y{%5fLtIs|M^Vh@kV(R^z#?N?Th#ObElzsg_tpLtWGW>#b` z=N&A~Z#40L!dUI46msUWFDK0sS;}X+l?e}PrW&2Aipb-fR#D3N6*5#5(r3~Ao|4|v zA|u{U)?3%C0z;h4RDvN>HQ@)?+-uhHBhljG%SzK z;@zn@i3Ybv45($3u<&2Urlxvc?(Zm3M@&slYTR%kEqjq3|2Q+my5!pp)^LP6QtLvV z!B>&C(9*H##Gj6K?o^2TPHS266r+*CLJ-bNz>xDYQPDKx_Npq(Op7cJMA zYn*0ocjK{7AldgZS?0ti#L2^Zj(~VSaV}9)iM?9Bp@t-qU~>I<_ua3_YCuMg?2s&~ zEs^C2`q!a_0p*-mFfaz_12Nwn%Sg~q6(08wlyG!DENV(PgwX>PiMF{C8^xoho4vKX z%>)2Da2Q`8v8^6C7tzob)l3-rfQx;631lL%+R58Ibgoyys&V1>GAOX*Hr5m~HD$5@ zaz_U%Xkbv=-PiX8rVKlJAdB}(mV)OEo%U(I;!LwwcURX{Ub=T=&%Q>J6a|(iV&H1Y z1F=!PUuzu z$xD&26rR`45|c9^;{*^rP<|D?XN20FY!mXazUK^n_kH9TF2 zZH>40fz+z>CQasJn+FbmRTDPzzYq5l$2urGvcy4qxI;}#OAFQ4Wu+s&+8SP#o12?j z?RC1t2HvxK#cyxYGd(J0yy>BtWAR3Fsc{5ZP$rSvYQvzY%6euznFk5U%^wl-9&~%H zOV+(mSEpZ|8Z61UTbanpY%aLFkArgfv%kk|+cbeJCh6wqOA55GZ8^sMnaYyi?~-)} zhX%Tb2Hprjt(BKZW!GR?JlO4K-i)tbZ(ME%Jo)^xYX;$=lRDBvU0+Nv&{)vVAnghb zsS=Z{#H1FxZsZHx*^a(E+vug3Exfr@+rH~YGEPhiuDrK|kMPvF#V!mZIcZ65GvM8D zu^BsZVdMH#g8s&nf6z1I1@4xYWNOy?ccK9t=y6(*r|Wq@@B8i_41A#|3Krt&zP`SR zfv_7Un%HtM(5!$5<$pOads%jSDU0WU1fEKa`X_Q z)98A3GurX|^6)k+E#Lngx)0l`#5F%4u&j64G@SCJw@!#dwQC(E{V#d~vciIr_S8j6 zF>kn;`exlGw8NH>n%nT(%bXpc_E&MUy}h(j&(6yC_Gb66vw}qQF&MppQ=(W^NnIf+ zIoetg-n}^D-?uS4E0vrMPB;n4}83 znTqcr;`6){C4)j0yd)LUG!_aHKOkv$Kn#8C~B1cvjle3UE zoGSZL%(oe>yjqJEUNA2)t~i?{BK%76?S^U8j-N{rdd&{ga^&X{uI1QXqwK7FT3oBP9e|FuZ6WMW_sZm1b@0WXkJv{`rgggR-N-RJMZW1wS1bQ zg0P-^&e$(b8@$w-@cdVj-|{Hh!z{=Z!9Ife_4wjoQEk%VU>wqCpB~e(>FH^==DyCC z0uAS!wI z@ukunW??LHxH=$iD%0!) zpLNpZii;$wm8gzOXEo4I`+2ypNu-P}cq^yv);x)&+F9G+q@=kT%Q7aZBwnT^Ax^py zMVV0J{eOT(d82v-ccr0;O*M8wh;OKp-;+6q{mF4nY4&!bo&oB)$V-l@!mST-{vY&^ zpYCA9i&t``Q5q)66}!I(_vA@#$3x8>{Jeie zVr=JaY&@EwTg{~H5y9XJdCv;rI}rFnk;+5GMj6LP-UA5d(ebBPk|BC=pbmm^X;V^C zNI^G|Z&_n||B-Enb*kU-XGtx7p7m=drjZq$;NZ7XOZJETEz_FuGo{3=hVwu4)@1E4 zl-zf!4^n?Uw{FoDC_MU6wq{aR4bq>!cfX!AS(_0XJl_6rQ6Oq&vmf;m!<_nimI^*& zdc_4zbd1+a{2cnU`C-9z1)}{$zzi|&O(X>yl+jmFXNU?JIl7`;K(+8NjNI@Xr7G9@ zz0k4A!;W5WuYRnQ+ohcY4N|?mbSzH7%(}-W1y(hId#9Lx5l+|$+2{R_nu5=O+waxm-9S~FeF;wQdl@52$Fzk%8$e~P zz(x>UKQd$%;^&tol<`i2nU=*bsQlx7jopl)wIk1er+Wl*CJDGKhvn+MPcGTDX!+se zV=5{WjJ(x1n*)1&am5}7Vbuwf9U+Xc(dp?LJNW8#-0K>!u)Er04}HTF?7Fm-<{k7* z4Wtn}_q<)3pK&6cV@cKoB5G_mjc=BmZX5Z>{-{7VI(t z4F7UGasP5W*$&D|S;MX)qgz#$ci9&SsSw5Yy>lP8N=-n>&hLkqDwV z%Us_E4kTV(m%0yBB-B4lrL#Kfxtvijvt!6LQL8mox~}EDym)`{jPKVOWzMd?eWL4y zR?sJ`6@~OK`*+R>Bk{1ofb~}NNhew!y%P>AzTJ<-9kb>(Tdz{7NbndOz?`9;m9xk9 zm7i2p`@rphA`tt$XSBU*l5G=zl)9deX%=yUYu`0(NzO~|?X@$QGK5OsYb-d_-P@~N zG~vO&)Y)m=+}y%ZqH7?)ZF!AamQd%bSTwQUxUCiYvmMQHNFuiL7Z5P?0>V1&hGYW>y_5N7s7 zN?4+k@Cgn*WnnVd-1kDD$fR*roe@4c9zK0&dfIQ-vshF})F+L6ysmGot}QijhI_*` z^R3oCXSMS#xNcg@s@P0CYq*beJ-KW9Rgk5!L~~%opAbDJOd^_V=JND94fUGKijHLQ zh)JlnA*W6yl|#Jvp$ETS$5qlMe@2?Xh<(rTz|e0L&T{B=!>|pBoQFQFu({t7EvgOe z&K7F2gxXB-+4+^pBsuMlg$o$il7tlxENfD0Sc{CD6umu(NnMMx|1VU|v&O8h!F=GS z8_Wz)w3)lB1*0uKx;WUPI#$|mjP~sJ8x|%*W^~>L|D|#;iT*Q{!*AJ6fgZTGy-k3H zn+lAG@4lzbHO73m3J6bG-@=o6)m~X-!lGCJ^>iG7A`@!v05S$ZGiH*49$GSz(8dTG zTOi^ClRV0%jaQ;foGlTBEE8FEhR4GvPf(NswZp`S&$?V|SD!qGoD+=9=*>}rmU+K&Yi0asxxQ_N z6-1xT_=efCwRWt@Q6J-xgK9^?w^QM=)L#hYnv)cukI)JtMJ77EFzDc6m|E;z>1l^N z5Bz;bg?rTS>qx&6l`n7?N?l7N`8(M|=o?_gI>UI0ESzv0G&RI+O+CavERC@G3WHt8 ztz@KVvR9rB_ka=Q-iRsf5arH<#?B{iDx~&uOm3Njw*H65+l}*amT_Jj z|FBo*4&^d2Gmn8UInj!=R=&oM&sjZwV8C=$hz>G!OD(xk)aVqr{3ACx`%f&SK(AN5 zH{dDQlf7RnPA@oG&m#&6wBB@RcfG5eSrqAgeYfBN!Y zJGxbdFIcs`e!fpF5_8x%JAn-=tO@pFbTWg0Yobl?k*P&NzYnsYOA~V}aSMp=^`_XR zDYvuoate8E-{fJ%d7Ci5`|eurbcy6MQMURnJkQyuv{X;O6%)%=0Vw`?j znnDsxcJtL~wA)#)6c`-tgV*Bk>;!>esOT$^rhD=d1hgvkjuZFpVn^{1NNbjYf@dHUrL9XNLr|lz>S;6jSKSQR;-FdQY#@iWhdT%FoF4qdw=K;Y~rB6|&Zy2(* z?T~Y;|7^+`UPN%+LN+tpJb9&-56NE@iHArCnto-qJ@eu% z0A!b|^s{+rRmv-x7>V04U8c`AI$wmF+1$1FS3EC zyT7S+e)_m&&*tvpg5$nWu>kq8aKCct)X`l1ZModT++?3xsjGEoXd;CqcYR%tQ2?j0 ztLx0Zx)S|ctlLvs@7z3bHg@*=zlq{|e@910P`*%opKqqcVbe}Q+39`PV{$GGXtn2f z{TcB#T1~3z1upQ{h2}O(riCwXtq#f0w*8x$&ZeHAcu}H~k@FpRr+a1R7kaGt$Gh?_ zW{OIKo31I!l^zz%99+SVry}wiekYFOuW}}x z&bCue`ajeJP_rTX7`FL77Eo8LW29PMqL)f@{#A8bAG` z+;0++L6Ohr+}gWBemb_yc)Bl5#F~B0J`p=Y%hdmPQzm$yn9-w44 z3DV*cBZ=_bV<7{5lhqHlAj3858g1DKCJUfGI{*`cf<>|3MwE`c*{pM($bGq)?6Wh# zmZr5(&{&U-_D#qHuW(Hp++>%=GHv8%^Z7ff8zlx;=+{T4kp+b;;~Q-15A$-2CU;iO z4`Vh=VWQeu+!u^Q?HrVW+8RETt z47=;;BB6;@);WgERykq=?1z}!VYw|rV1pI$Lg4PV=;6Ayz`;*H&cnk_)~zb`fTf@E z6y}l3@IXgG?~mti9)02gOmdG116Tw(2#^Sfn_4CT&&`{vmA8O|knl94wU5aC#SWdQ z1F=`QVw)vhz2GA!KMmF$dww2``@Jx0Yn_grZ%N4kER~P~{isQ^B0@mOB(#6ZM2gqp z9+{I1)(_12OS@PKUv!M08aNZ>DYDRPo2UKXu#3-+^~ zc4268a>6vf`W*`Y_yw)D^18Jwv{j2&$4J!}0NiD|)adO}l?#W-LBV@QGpU+sA;7!r z1KtH1;NL;8y9cljZ<<)W*5Yx&i1_M1HgX5Zz|U z5|lZsVBeSUDKJ}~yA#vCcc1z4%TXuMqwf>nVUgGs->F7(V2D=Si`P$+ zBu5_&liytIdBYCii7n{;QUY;-&KSK$L%E>x*C(hza-1~$v1J4{l)SJ?{rV2 zmd^7dfn)HYT7e3VQy2Q0in<9ApIiHST0lVVtgV}8f2F|m6)m7!*o~Z40qn(d-s=8v zcNMSeiHDDG)FO`LVjAS9y}7EUhEQ_DJ-YRVK@u;3KM^FaFcbVN66)ke;1zL4|vKYbFg-|{fcMu zoo-a$P7XFqHXZkXY^(MOpKenBUAfT#c3OV|SyHj>g1U(9vY>tkIk4BiaFvq^e%XRo z6}5_6sb(q^NlH;>x?_LvYi4XtU`op)BU(fV3I@ICKD-ha=ipB_QA90>&Q@%zkTb!H zh`+bgh>0PM#^O{VgfrWaL2e1k*0CRCmO2(%hNtV8V2TVszK>>^?puU{k=oD*9(e!ceSc3=c zkFDvv$+S zt*xy!;niZt?x-HpitiT2#1m0vB>6$xua-1S!*e51#0g4U^7$PhE(Ia(I-D+6{S%Zu z!*=W`6&Km3tJ<16>-mbXw?&!xg>GvT0@{rp3VCBt&J;{?F#x}AF((p7blpPFEU52>a@`^3JlTB&CWK$Cwa~`8Q)3T?N;m@DK|{z^vHv%i-0w|rHr}Msr?Y|!bF79 zkMt?H;*;|(!=)68rs+#O_K6!& zu&MD>2C50%G_BSY$qNnbQ5FGqV+CojeJ23n=Vd{t4-XgL4q(T-1@~MZR7oUtFVn%j@ZQa* zT9{X^P*U^&a*CK;e-wz8Q<*&#)cBDp$J3^Yq)|4E$7yO@ZQHK($Yl+1EejOxI z+613Mch>k{SQdpSr<%H2M1wm?y4*%n_t21LO|uJ|%hdY1;ZQ0I9|M0l+RZWiuDSW= zl+MH6z#N)GF%;>eG&@7+j?#!l#YFs=WoAQyw+FSsoXWQK(MMP*VqJnS&o7`Z_t)iQ zcEq-Kb>4k^`0_`PTPhC;e-7(UA+pLEaPZ)k*%@2WbjIoudsTOcHe^B#EI!=f%jc~@ zX=9x@43ZZ*F>yN+s%$cu7iDhA;=I8hJ7`Rtx zuvBVGpa&MB%rk34woc%_Peamjv7gY!_U`{$4?c~myCE?0O#PGL1@>OtO*B+1P%Ep8 zjx+Ju+3`-XoDR{(IWS5|LM|llImFc!j>kH*xQp3OLd&(|q}u1ez8{gB&pL)To7%)r z+{I;Y_W&fdh&!Rjeq_9!kJp)nPalSVo1zEWgVn*pwINcR0fs~_R_@y%HnYwRFUM9h zCvRh{Mk|4~(ALX71^l>5w`eCVPa#2V#SE)&CiZ$C2tAcvT$S{|hrZsGLO2Hq4FyP3 z%yED=f9iJO>1h2G%u&Bam?fh_F>P3%iTj{D=OCYZ3C!|pow|AMC& zcfohonc0kHLrO$MFo?;`r;hBK#7gDzn5o1K=|7AHdA>WJ4d zQ)VOMLibURk~et!B&y3OB9e*p)bZ5QUUf`l?KA*~M#i$N^X{4P9o9Tr zaFreV96vB@l*qWcT3oH+Sx1D$eS33e4yGgqROlO7`{x$6=$WTiJre-tdL5;a%yG$< z0Nf2?iMN4AUy5ilm}7Qg%pJkrXrcMZ(BA~Dk$;tz|gt5RsQuzpgu$Di=JamB2xiPRBdkU^%mQ%xned|XQ(K=R!6 zrnBCSub@}~*QQp!VdL>c<@VP4AD8^Kaef)R^x?U$!NQ~{r02-u)WSpXN_HC8r5e3A zJDdBKGMtrG{~0aOpvfuu_1Mps`^75iw^jrSdY_?Fz#mnXJckd7P#d5!Gl;^MOJqkJ zR6iW9i+JAUNXL_Ze=@Ap9UjnDLx;b6S(A~FRo6fT?a+v({(aV+FRj6fu@5>uFbj!` zi6pBSwQi1xyvCZu)RMu+eGbSuZ!GU9yGQBfJfkxw3G~Pg4+Hq&F@`KzQnG0c z4^zT}gX0m94Eg>fuAHjNMMF<4RDWPA1rLYoAn4t8q)G&SCr(YxvNG!MnFQ&Q(ai7T z0SgbE2T}?(Pgt4~qPi$l!moIQZNTA$abp|b3e-2sc0h_Lw(o+}n7q<#? zj~c(GGrYWUP#@0g^SEc98u`!J)6nX6v1%|*tVOVx}A^OHe&X2Qf) zLC{IRRd$m!L%zapLRUm~N8@r|L-X?&x~5Ur4I|1H(s5rugOKsPOY}j5&Llammi4iV z=cplI17E9KtOy#Fb+xWwTm)rb+EN{yh2CQL0^|wALX)IkiKv^63|a+@zVT@E8O+Wa zG2Pwc?*8MncH{qD!hHA|ILJ=z#zI0g3?)Mk1$@y=vN^i6+@y@fz};c<J_K<(VbYoe@IhuqPX#iuJ_2FtqwBtSGVATzIOB`gcY1({OLEO01)Xt zjY_-AM@m(-&k<#IjEom8pfib3I^ZiA=i0D|Tf8zjv(C zDJtTXtaR+fn0H9BrmI}L8r14aL==`9y`uPl?odU7H<&i5gJ(m9=fa5T)}5&Mb6m1p zLF2kjT~@t#c%Xtnm@Nk{LTJ|)wou8$Oio;7A4l?L?y z1h?OkycCaW=JHA<1@f+zXa;9 zz?5NHx(07!CEr+|W?K`yGyiI7sb?ix++3jC`?m|J{pK|vD=m3#l^8HrV&k*@fCy<7 zyf3Ho1v^g4j!{~S=SP5PlaXy48pUjv|W<2SI^%d z1rI&LkMjcUsfu@Y-{%6SY=mbH!gJu4Y}No`-i2bvD#zV`H;t&TqB%>*r5%*X(!IZf>D(NW_- zgZclSrD)SybF^s68l!M`b${5HnA*|*T-tOw<-EkUE}_$;$8v`2{}it4iAbFZyIc12 z2C1n9e@jk~IQ8Lu?az; zNfd9%)bsHU$WYq0r0=jY$M3vg>07weE&SAQwSh5QiL}uB4(qhz*``7s*OQb@dEzrm zw^W9Qkou{#M>T=Kv?Tnh9nONHz0d&0o5k!il%z4pPGo_Gd)fV?72dR+cQBA^kL)3C zCC^WX0sal4A?EkTYe+6GZ}e9ojhu8Cu;`h?PQi=>47sJrjFj>9>9RHBkvU0kWD~qA zauny$0$lIKlY`SP-Ay}J{YVN{I&Rkf=~Bq6_Kgtg?RExMY7^n!vVI4e7fTuGRi1n{ zD@r9L%2eUa%iX{fK9=8gATXGEAGZAzjAQLWKT2b_XJV6)JTzQd`cdoyMoD_j+!_S3 zHPzotHMt^$BtBQb=7T7>RxlB5nvjB`;$nV#J8uk6ekAF2PbZl~_1%lpm`iDad?|}j zorMer=Jh!9?)OFlv)xH?u_v1hz==^yXUg<(?wf`}{LQNBWszHQqe3)dMR2LwxXhj? z$-}S%zCNETM))b>JuQ7AzvC)MNo}La0yVabvcH0c#vhlFyI!d^n~eVomav5GWKQh~ zTn{x>+sw%&=jlBfdmCNwX(`EvWi$>9M7074N)`@3$p1*C!2@%BXT;VI~|S zKXh8tQWsLOJrB3K9xo;@O|p+K4E7*SYp(jnKi*XtHa%#1D(X@5zw((VUrphxK)AE# z=CtozbZXQBG6B#u;usGySD}?o|AU=KG&}>cPT=jBZCGjQ{pZY&VuGNuhmW9A&kNf< zb1c%2rxXDVfZ2f=)VG^Ch+8jKo?hW%MKHNF96!P!v#{`PE4`7Cft~LZct(K<;wvAb zuwdVx^fEn3zcE{PulnA#%NZEyib`#mu7Hl`Lt(F6+O&xva#z2Od82ri)rq{h)P7l8 zy?Jsp5z8Ou=<54x{Q9?Xja(~wdAe3#TzKEv!e z&n+cfH?{xzR>#RvF`!B(2lTF+u9Hi|Y|rUAG=~b$O-_UQy`JsPUK@JMuiBVnpI#*4 z3Yde24nt|r-PV17(-9@>CdM*S9LPZ>e6$`fh^8*okTohSEaZ1xz5WKxn#RsGJvo75 zcZStD?&T`ZWa^26Jofpm-`eTqPGqGW0V=wz9sBaZmt(rkE2995r6?oYa| znaK4GY?8-23yX^phjXQGwK=cSOtk*_t>{*H(w}3)YE_AA&6#Ioof=2dlvQj7RsJvo zU z=gGZFR@pwEB9UE|e<-Sl2)gP<0*Msj+SN{_gp;isX zp{uDe^3-~Yx|*4ptt|BKF<{Mca&p?&HtZHkfzhz8YWFw1Z`0EpRa7-ht2ptR`MN5r z%Yx2d-E!>_jDrg6MM1~6s)3pS&h{|s>Vn3k#YskqAyP`g5|Dk6BrPQ^u3_Lm;_u;X zv;S}Gy=7D!{o3VC5|SW6f(LhZcLISB+}%QOch}%ffZ)=>-Q9ybjW_P@)_B9zea@Mg zcdhv{&sy)7XRYaPT{KNs74`3{u50i8tEmq^-{yBZtrz867w=GrF|e@W zlaer;PAqATyqAWKzeW=>)F(VU>^Q2cr{hZKudd#Ec+9c$LHcI7=t~p;A=BRN8#v7< ztjpt&_p>xOMUhLgQ9u$r5ce$e{=tDN;GZA}Wzm!9tjZ!QHYI-!4MxRXHOsNSbkAdP zFqIUsLg8FWxn5sAHWDoJt-Nx(dZ8?f+OEc*3pliN04w@NEZcnS>TIgVK8E-KQ2+qH z{PS3UWdxlr_TQb!7~|oB+Kv{z|MzzP)(@f??}MD2)VInC$mRaM5$@by6n*d2#`@<( zys|Pz6Em%M|9SQMcaDG=0_ebiw=4ku1&-){RP_Gu(a-el;I2Oa*Mag1ZoTP$-slg{ z|MNEh3>>%s-v1ns|GK~7UkILm{dU#swpHIZJZ_b%zR3T1JO4*%B}4t#N=yoX`Sb5b z85~_A-^!8A|9tL``kfN>KTrOj#pIs@@n5!>{C`iu|1$Kz{a@K9{^myLZ&yOlwa7_Z}y+1>{ z+kzE5-5)-}UjPh8{6j0R#}hz!!2x~&^ej{H0iXuI>G8~yE3^+FUXLtI>o049uErYD z%8Ul2npevLgs2*&vt^GrYe~VX1z=4KJVGFs8Z6Msz&w03D)a6GzR-^u)c{g}rbaT)NI%!=8(lZ( z4Jj$>;Mi>RDjHoe9Y8v;IY|f`ETWQ0diyr?+~X-~^csM-WC=R7l?wc#9Lkr`_&_K) z4;iTJ=-{T_UA%WPvs-Bi7lHTZnsWLEXi^u7(0@i|>X)iu(^}dZLzai<)aSICzB1Dx zy4IeYSrHuMs}&z%0-DUrLzPIx@`_NNmE-ggsxA-@);_eUH~bo zpsu@M>HYZQLokr#9N-h%aX@)`M$&JAFW&Qi@LbT|6-vHyZx;;S#-ph&Xsc>w76$2~ zKL2IC@Agkp(2#1!R-TJz;to-pGF9ZCQD{1G3g*=4oUE4b+up_%rzA=#@6p^x* zwL+45UwnWS@zS$P_9c}4R$Tn+cp4WC56^8ejr#T;fp0gFr}64jZVMR6@?} zR5Jrw+ChVs?Mc^7NjQ6wcyV`lzlIEoysw%BA1E_SZvlz(jjR0Pkw7cIf1lA9FEDwW zzvY$v!@q~JT|u%W)(y}I-SIh z+wj6I8`U@%KKuCvtuXYM5}aT*U)=+G!eSXK{#tJ3zbH@c;Xn+qj>5UF(70`t-$S~{ z5rLPLa4YZNEM-7$g~h}it&5u#v)bLR+1qht&*lg1uMbBeE19=%tCYW4f3OERI&*)x zd@%us5U}A!L|z>P@d7MEfN&)2X%2ZfTb1-odjwg_n$Mi#e(ZYHR4Mq zFyu%E35uzU>0NcJ(ipQ&O#+>UaD`(sFn`qxLA66+&8zyT>Ok;VK| zG+Q$Bd)})~Z{lrC?c;qLe=Y}@@%}(s=aUWZ>xyYc%OGw!ol?%ny2~$(iF~GxI};hE zUpaC+pq7+$L7{1prAJQS&TlLREzX9$VM?Z;{;i9oN=+#iyVbgjt=Q);EOrY|MqfQ2 z7NG=)0b&0@OVAXgWv%y4p076iq~eE3D~n3fSZyhZVpv#MmYOy~1K*=%@WTXvRD|1e zJTA*oU{K}tQ2Y8b+LgC2`J?GjR%xF=rMXoiK+WjzOCN)G3#wpGr>$&hLY+cALRg)18it~vJs=Oee_8I0A6xzQxraQoX-PTafHGs(2-7z zQD@4Q6~4ds^C*8(_lK(aU{W%m*|VjPnt{7fF#)I{5v zN2^e-?(&j4ljU&b=;+#59jC6LfrGtGk7aTqsP%&adVQU|BrrFphKs!oB#~nXjj7W+ zx!k%|xiPb_Fb|Gc!=Oi~fZEeaa;Jkzs)Xndjk7%S>Gctsu64Xq1U~&r5S^a>_}^r%V`v#4LS9)zr8!yR!8F(Rx4B3NX0X;+J3T9u}(C z*C%9V=;h=-PL9~UKwbC)dT8mGpMl$~WR^lP31G@?D-uQlSjl<SUeHK zAM&o_3mh~H3m#9fH(z7$w}4~`Os5mTG<1@Yr>m z0!${MA2T`zT#c8V!cr_6Sy41^1=n~?*<%;QJ)QA-<6;r1Jo-gx5g9spGH?h~0bC5C z?s3NMhd(5n=N^RBpCR9^S)EKU)*xoaKIiERAJ_#Yb7N06VfGQ4P-$JF7;#u94su&EIC%K9Ulp`!LkxPKXras%K&q236 zG!U{N?iulAIhc8>fAbI!JGTUR_cc>e8=^zxWqBNVF?60VQdHqLUD%;s|eaXKTut)k}I+rGPtOHGyR#PgAjdQ)6Q##ap6}@FIo=hG?bj40Gkx7-<(AON&pebzA~^w(ccL`Ivj=su z=%L&8rlY!tBzRv#G0e5gsdo?W=e*KM!-_h-0O>dqm7z*N#KSs-signwNR|}MZ6>G7 zPw^ik9kn?**MFbK%H4!T<2g*3^COwrhDRb|2^XcV(O>+l=%#TI;h73hN>!uZ`>tsJ zf^f9sz}`g>3OWlqsW8Sf>e=qItyV)zFWF0qCjLusmiIYx6PFAF)EG;nI_G&q=|EHl zrsVC9CiGn4dfJm{y_yYCo3{>&Vo3MQG9jN{a1N+ks+;w+--x0MSALRwbHKIO9o^Y@ zWqj~i1W@jvD9jxU`?i0oHbI&0#k%KTKtWQJjrph7pKQ`21i|Yp6?1Fu3Hk=qO$BXD z!84yKRh!wR)(0YO#89fgMbxSi?r-we#{%TGS`l7Fk70C-*G^hD|lhB9-x0lX}^LBx_KS8I%?Q}n%bg9{w#>O=v$Gdf_%IBfU$%7+1$ju3X+*+se zr$nL`Ajtv@^Ye0hwbGwj|4I|Tno-Ntw19VXo|VR?$k1|%I{zfeV(Ij`b;&hdY*-H8 zc1kgwdvp|a(P4Bns>WJ|XLvwW^gams#h!3yv)JEgu)u1>2#paNZ{^S)o zs8k$w?(AC=dK3I{sPZXCDmRoY7?u0j=#%T}*Y4$_DTNg?qi+#@&a0ag($i=9?0yLMETm#I|_4M&-fTf@S=8jlr z)k0hGLM7&$ci#L0IfXr<;8|dFWxv^@A81C_zqmo%T%}DMG#&L_r3~n?79=kj2%DT{ zJO$$XkBX|Nn}GOK=?<$-eV-8d%=ZM-=`-zBvVcKSnJplpWWI8!rWwHAd z_X#55YQ%Oa$g+kPvQi84iICC;5Of(Xl0i=e>SP+9sTt5nxS-*N38Rf$8wZW%Lptp8 z2n8or+;7tbsb#aQfRDuyOPEmz)}_WF_;C}ZWK@tYZoi)l8FJ|_+rcQ_(8=q0KqKVv zozhJ}kXPY*Go+$|`!-a34fcgIc#41in=&O1IHi7>GNn7{XTMy=*5>A9Qgl#=%PG(I z-$MkH3By3l(9wZS_ElV9!cjn9WvWQgXHr5T+kSshqs13NVlFJHU0**+hoQ6>ImTN} z_7wC_sHj>7#O7x>SS#KpKbenXgO^wu+u6xMq+%WE14NX@^HAg)ZwGju03-J%1h79E zh}~M0JZkZ#O$k1<)hGM!8ElAIf#Bg8Zdt>zc}(D}4a^A0L|Gbq+fZUB3iI@uzGt(1 z&=|2SS=cO zO^@$xUoIwN)}DZJ{CHw_PfT0H>#Gr^bE*~uafPjj*ivaW8(CY|~IQ1o48|4UJuR;i?y*p}dXh%ut zw$5qq@zw5)Ubjb7yR4dxG$AV}j4A(k-UATzx#lZJ5*y0M%~gnx^2K+(DN8z$&e7>ZrUq7Eu%b_gB$* z*r{^yj9|^&X>7FkTzzW?)JR)fZ0dv{ICw!?=Mmt^0D6L}``&d!%u}gNAZDl#u#E%R zR#6LJ4p6>`TZPG~rHv&XNaW;T&zSuoO1HcsyxoD0gJN=_kD^2c5QL%$gWN42;-im* zE6Xj)l>!nXAHyb9ps{NDgnmcT@}?z?c8c!CJb;n->W(ya;AqJ%=$p77OOnQK!o}8l zAd%u9yp0ODNdB5Jka^`nPtdOp+UywHP?LL+?`1c)*PvNa;1U!)?@?n&Tg+VljmRss z*V<{-k0)qq@T*N%%iNUxX!tRs#-T&1SZ5#3!VOo(&;lCbp6mBn<3x1>spPlKKtWjZ z#gDo65gQiKA$U&e-F!)48Zxs`TL{h+n0^@M=6*nXIdLBu`hg!^a1a#`GqT)f!AT0f zyuAE@Q_-)R^|Y;W_Ob;Utz@N*XmP&SoT5Tbksh+yK9I7z+K=lIXs}Z&Rs}PAb*-&| z`OcoBc4Y~7BAqgiJpG#;B-Q7) z9?IL;t2z7v9c3&9orY~+A}vzvv8zA~GwY<^I;~EkkdOH^x9w_G zJd;^08ApiRH>(p{EfR34b+fN&@+_Ce%pxRkV z$rsqXnQu2_%neUg1>C(QJsQFqY+OWt`Zh>tOM4p^W_<~rZeEVd^wf{$v(Yc6e4b0p z4UHO~1rq#IbqONK{g$4ce6yYjXu0SrYI5o%Sz3A*!`PSgcLIA87KkW3=I``G8H8=P7 zhdb^Bh5aVbeVUk_gFl~C?|{GJOxsu1?U=UAD+DNf<~j2(vLLS z+#7CeLK1=Ks$yOG+R2#}n@@h3@*{0qSQ3}_@Icey=;4N79KPi6=*Um&g-YesPmkuT ztor4?SrtkQv`_pNXP|WLg~1{=j+7#RS~^q!HDG&HlatfNz*e|7>X(XmpL%|gALxT6 zVY_h0rE*tX#oAcK3S__hnlKjzkzg%Ky$}l}H4U{Bt=C)g@*q<`M!FVm%-&R{kk_-I?`2snN9OC#N;4dhdwOm5KT!$vn%nHovN-mbm*(fu;U|k#oUIvs zJTZw@QirPb-ozaf2YKpre^-KXPH2 zNi{=8-p|a7Ar?=-_AL>Whf~Hho(~2{e#PGD*z6eTb#PF+eEQ>bbj8^UYmcj)!;TnX{zW+ind&Ma9ap2?!fVWzExThaacJTP+en8F z&2`=mhA<_wS!|L?%VeDIC(LW0{nU#dLHG>UO-x>SZy26C8J*^3DO3 zXntJWUbC8q`R0%VK&eC%#7cs8f`TMCaO-B(utU*K*ZUV;_)k_>(nDhY1X5T>NZLE$ z4|c4iH=BeXRCSNZ{OpR8wUtqIKC3Ofbvm;#FEXRxl~oj>qN^}dDa$LO1$n(v0FMmH zqalUoD12IJ9}DEg9VarR;EmF$PJR>64SU+>(*p7#s6`3O8zw0OzJOL;PDU7eb%p!B z+T-nkiBW-0R-xl>sU0AF{lJdNYJ30(uh3OP^>^8GR}qHs5(GqWEmd%$<3!)6M|;O`$%Af9{Q&g{kCf6aGI$RmCd z&zAvMRTh9Uv5C*+viEoKb(M;`IyGjOAtxti?^?vsLS$C;e5soOb=cNsiHO}t1bA;@ zP1~^ z^3zVa2xhHD5Ueh&Rk|-V@A~#SaDu3yw78S+K&GRLuBe;>rI?w&#(s-$t&xUR}ANKBR6nV1z*SSpQwqefXXEY;YpR^4{1S8U^eqTR%Hoz&)E^JQ)R>$OCSGK{b z5F$l0`VU){oc!ui^4@&UCmtY0m5A$;xTg;7u2F`GV-pa-;9WqwLlg%Vh`X~fSB_IW z<*)!)94Wl)0Zs%t2YdV|L_sRTC;*5rDY)W`jEvfyW{*RF~Mcv%c){e`t9)7b? zG|Oo4mk|?Bj`e^21Qf~gu4(rS6BS$wKfajcOYE*RIi|}Xv^E_MkO-#T^7TxmC#J^r z8rPqnazzXzNEypI3d8m&xyv)Jzn>!p6kmwP^Iz2wl{Zv3GsKxr9$qYB^UeeaW*ey8KTDo{(ef+b#uKq4uc%$WF2 z6nd(?$OFde3tmPlE*h~VITz)=tn5Fz?DiZ`*H!-a4GrNLID@|(-rpfcmrpJ>x zQ>nOkYD#`gl^RX)vq~dQu=)8x<-EN3F zAMc@MVIdGO<(<}y7})aZ*i6tc@Uoix(XwrC|7|~SNTJ>VL#03~M)qsLv-MBJY5V-b zLN-yto6^G>DVW6X_VyltHZ)hE1v^R_yKNXF|7!$zjSQFBTYyXKzAsvKe)IGrM%)>} zmS7U9l$Tj6|LQ(rtb#I--HCK>8IzMB9Mhxbz)l7W^y0|qw-Khgaro6#6hxo;nMwo7 zlV%Qv_uT*Nq|cY0of~y|>UbBuc-NLjkUFcuUQ%i1phHp@EJp*&Qw@ni=Cq1MHjZiP&!J?X~7FwaUev$|a?x_3kYizbX}e#YxE( znv{$&r)cqCU3DkLdQldaR+O-I3U%IRFZ_C6+Mw=7Kh!q|mnH0^6^Zs$GWQ88nlZZF z-K`5LU_|@3<0^uDWH=%L)5uO=1aRdT`sJTk(I-B5s{-~eT!TsQ5__TLA=?_3(v;g* zM#id)5=9-Aa&zC<(~w35MNM%H1qG4R%b`rdU* zOJ6coDC%a|Vf1cXxYNX*X5DQAVqx@1Dxb&L{Utx~%&(cCbPw2K^YU>Wsu01S@Qg&% zo)2m*vqNvGU;S=4_w)!-;>tidk?+a&GPKuDP}a`9!D+$oS+kZQl8toh{iBm+Yg7fK979=$&ETKVhVy@I+0 z92$AcdhLeS7b!|TC8g0AE*jo94twL1D_+-|7w%5GqjpBB2-ZbG@DMrl08!ZM}V z*&B_S0$FKd8lRmU9erWZjRt;OClQyI3>rT=9&Js!ZIHKk;3hD@xS_4G*)Kt#eyb-p zS^M~Wl^W2m9`!rLprs7bwO*ppoa_tD#G|UIMSQlDU#_#04fuH7R+7vkVeOtI;L>6N zPqn2lVUIUV{7ftpI`~?5)Qc!(%XEK#06(`4OG)3h_EAM!ZzsPlz@_jge&4m!hRn6v z#z;z7SQOnc4v4#U`2eg^xx3j-@ILE{Sa3Lz(ERsIbv4`+Hd)uJ${X_$NU%xW89^*p zutOlJZsM3qk+t;L5k3=1{!G@1bD(V>Ew^8}sYI`+U`{)sknscZSx#L&CXxgiz!xjFSn20V zl*24wtZ9T8M5{KO|Ew&lQq1IG;J9xjvI6XfYrX8nf~2fZ#l?}yj9#75Ox1rgAZuTp z{Ek0!5r$sqH6=bpH0T|F#vfm?8l;!e?$Fn7Z3u9cNpk0a(_-X5QXqL5TyHLirlW*I9d!L7%%=@VPvcWHI#Cn(QvBv%~%u)LqV zn_7WPudNUZ*h-u#3@o%F#7#JTTDj^C>K&8cHeVc6!#}3yY_0BTGaw?mUXb+&^U@*b zb>1E6njgh}lzZok=binx!oYqX4Oul%cIm7k$XvmQPRw+JUk1|6i|G&bH0E$PeST=E z@K6uSt<`zXjCYu~#t$yvd3Kd|E+*3cf}EYyN@J59*T|Wrq4*X#Ai4u0S z50y7NxRXH#T3ZgoJBnB?PlFXklCJmn!SL@S+#ldsRVq@FX5mGv68)E&O!cnN&E@1~ z7gQc~7DFFAQ8@Uu)wO#m?|AuJwPgDZzsM7DJKq@>)Z?gFHCK@qmelB~Xp~lzo-F6v z0fwTp${x90{w6ys85Z134bapkx|Kt<@T-BYE=Py=?ljH`Ik*+&mT?|0)^W-> z4YpF<0cx^wX|0BsJ3E}B2JUf6AcJiAQHYuqr9SHNvzD$&Yh~g|>jo?Pu%WJ*hkxm3 z+qzKifb*C0A*&t{i;)?6o771`SQ|(I-$wdd7$Fvlg!8ww8BXq`xjNoAIO`vO0N~4; z>+T8-x~rsWP}TV7#cn&aclQI?d{ zkezZ_E_S8LV$8?`R#yp$R4KzPf#c6A&`$->rp(MOe=;K&tY=^Tq$}>X18%=S#gO{j z637e{)oQbKEz;7lGBH8}ucYqsngIC)x<> zkr5Lm+nA2Lfcp%(5EUoR333-3=xoZghLQZ$-P2$Z@tgOt*x|kKWMRiMTgSz&W^sbM z-ugsF86i$p?K<|UQz}KAy68AC&!3i6=)Zh^0kLg!y7{p*-rT5Y9aRH2vO$$4^oY~Teervc@RBmkyK zpdXtdXz>k5K*kiVjCCP2Gf&M^;h|*K>ruV7OJ)vTGcFxWJnoExg->ROurrTPRdFFf zBYX(E)tRU%laSdXe%GA4$k?$wN$EIhI1q-$DTTnuhUN>^YgAeY`^6ivdb1A(YhXMh zH`9ChuLYW~wok{WJ*zQ$_xaQ(g>gC`n%}-k|M4~CgF^%*GIy2@m24nDF{CC=x+f)4 zoLf#G>gwVY{Y;6o#Eq+VP_>=MYf47Snn7e^1Q^AH0HG3C@K*li=d}f)gwk0rTE z32Jh3FIMDF7U6A=1vn}17bI&C5*tC|8G_l?cXF5lw$l4CXc z_r(`cSrHLaLap5FazgujDsm1#8!A&1GKZI~&en}w4$`AkG|;tNZ2rTV-S`@OAUB9Fgtw7b{UFPW0;wVQJKWe@X}he z3%Co*%QM?^E!bn)18Xxgh0P+UlD?_Zzi(mx*mzDOu@celeH!IkwzSey7td2Czqyxp zZ0kO0iFq~KC^u~{J}zCU@io}aea>YSPR!QzhMII47xjl9`4Is!H~zz#&^Pb!iM{%2 zVLOHI&qHGSyrgPtnhh_e-2tE`rq_MUw||VW{UxB#w1)>z8{~OW+=!eM9ejKsX8q=5 zVT|#ggfSgZO7+t{ZfbDKNIA+?nL%fgmc5f(Bd?srvb)bt*z&R~r2P<2K>_?{{nwv$ z^af3ZX*Y*^ud@!1qon6iv-Lk+Xr^XxWpUsoOkg6@azFV*a)#FhRMzC%p~0^}qraT! zq1;&brd<3nVexl(nO4o?ha;I?ss`URwKli#Yze#Q7W}pjf4!(WE`CHvoI0W(oDZ*eYk(-v_4O@*!A`dSGZelhrRKtJ>LNZ!o5F0!?tcjZ!}v#r^V zKlkaJ$u(60oj4N3j90FF*yoML=m%{!2J=2fklTk~cQ|4j^^EYI-9&fK`yrd(%N45> zU*)+Df|p-uY0&{Of&K5|lDMakfnyYvn014wm2gnJISwSy5~vu~{bEK68$#zq3djfO~h_TZW&Cw3fp! zlu|^~DDA)yiklM)%eb}K12bs-Kx>4j;w3;JWTAcUkMEoP{voQqw>sRDOhzLk5ib1Y zpGkoh!WIn}X0)d*{~Y%CD?2InfIKcmYHP}}o?351j+2|4bqN;%p1Yr^M%bFjy^m8+X$v`(w>agSS;mc`aZFqeAYaSjuVNeRY&rpjR zs0OAUBsTf`KxWhm4w!VI5ecWJLK_TEkWRgfmk13;zW4}ji zX2!pICB?-DbA5``%e`J_e!Na|Kz@GX?%ph@@-D~=vfAFd=JP_4IIK<{SN60Uikrk@ za+bzrW&53!sH2efFhSwDXI0pI;up`VXQO=i^Le0Ks{c1_%i(4xvj-@_-@U8bV*yUn zYsCfu?AQUX$CcZKVtp&$=Yy^`2*~%wB$@e|bPRd~F$HJzxBnvx%L~MYOF8#2d)=7M zOO#zS2mds%uMn=3toaMNAZ)tOVDRhZeFF50Rr?z|`G% zuSi`}yy%jW1eCtOx_Ypb8SgdM&XKr>?TZn>m($VKXHG)}w6Rx^P& zvEAN{ngUpRd=ImtA}cbfBQ?#jHIH`lJZYWh70IDj6Sd>%irC-^Ynase%~9V zHR9+vRm+h;g^}v_y(u?W_|4|T&y(BMS63<397ruFgTu0$S9d=}|WZ_=PbSo8|FJt+y_Kt<(X3wLv8XHEGnF!c&`Jre#kq_o%! zMKuH8duZveUZ)GVburKlIehvg6@$tw+NH!KC+zu`S&w)3ga8mf%Ag0NI_VFN%Z~v; z(Na?omY{No6T_)A127teoF{uA8(Uh zFl6O(?v%fG^zC?VV0E&{Hf9L>& zLB#J2hIUX{P7`9g&~jDEqM@pxHl|Z${&W{UiUed6GSGAChL+uJGI&hS|BYbjAQrkr z-0g=L`0QLSM8b>CFDwuVJ04B|VWE5l)E>BtGJm0MDXaYzqAvgV;(~I}Tz1b1Z zlNfkwf68TGTm+3o*!^It@4V_!s3WXNRlZCzcp4u~kkf7648`vDSTm0pk zbMK(N*^N(Rw*5Pk9vXw+iN!$pinz3oo{X^QL^~bR49hN;`V5W@WDll<(h@HOSrC?^ z^3xxCUS{1+xS6~0e@QRF|D!O*`~cltX-iI|v2zM!XIAlSm?DV~_BT$nWS7b7cyRs1 zF0yydB|{s}nM#>I#IUFCUm?Q~?^yFIuS4FpLq08I3b>M-r3TP^(e5K+8aOhjU5z|- z9hE3kAJtk5L2oqa7*IEXe@PKv0}-QL_JBVed?|n41j_HzGBiJy9>wQ8t+aB>dpr87 zSkWx)kAEF7i2i!@IL@`Kv_0j+aEDXsC^*$=eEW{cMd_j^E1Cqdc-B5y>E1$c1QA)P$a59|wt7;rj z2YU;DB%Vwxe;z3+F6Q?&*6@N@dwLu-*gV_bJSC?*rA<_gXB%cVAAv-?0IyWf;5UUf zVBmb#;q35AC($R_7S>EzKw?{C8|JLK51$#njIF zYw%Bp6pfmd8kKI}zG?pAZ!iLdUdAV zE0)b@;L5#ie}7!0a^Y_~4}-u_K5lZg2nIZvm95%PK^-ecqVU5x3{Ch6R}>v7c(a&J zCG}>t%nDL5o@%lWcJJ)d?QnlyZtj5Xo7=gIi@OI+Vi&8I!q#DK#Pj2Dg4Bn#(usN> zc8m_E(m4w1jh~|IUTci1%2d4^2;* zn%79`3DBpMZ%Y>mv=$i9JQ^2A*ss?7(qg?{36_*KQKMoSFF=?06H0q8FE?#;e7`Rd ztmKbIaNVs|H@2k@f|BPq53KZPZz)3aNoL}mriNnJPXXIye{vuTmi#m z_qhG!!Ke(SvOr@+iz}2-;!_P1ZA4V3i_4m==V-YeFb(zCxs+i{UC>p zCg7Y~f;b2x;@GuOD4UVFg$!ws)8(H0%ClW!S<9y!a1eo$oj3vh^IWZU`l8qOzrpqf z@?L4_+xBOP@XX@78MDxhuK`66#+HJ>miqCI0e2bjeaC%2qo$g4I{&bhe>Jf9EKBmm zIB?RSnsY*e*cd?wvOHcpza3C!MZ4mZsa5ce-LHJ|XP<|5rI!}UK$8u;#d6-V`HRlr z1-TVLd~zlD`S6!VvIDRLA3AC;&m?kbTyvGf5sLv7gGT7lT-8bcCoG9fewWRm@U3t1 zo)l8?e#Z~d%>Ymi)O>U{-{EpSNaN@v*Ezl)6D=9L3_+0B%Y0T)$Yq1~25AYN1){B% z7PHa2mCRaBPbm+?5I1<;lHA()!4XqLhp3bV7>rj(R~%h2(92Wep%NYTZ<`z;@qjp9 za;($L^2QC^_<^o+o)+l%SmCCit)Wjapy%7mdgE_M!*(V2;m*uQetO^qRF8J{1TG2C zXpd5bZEuf>O{oCtdRp6I$UkF{+nYIcE2KufDA3gxib6bem@>9{AB(n{>oty+9d9(v z(T5SL&OS#j>$Db&$J{<8Y?|f;{iRtVeJaEfKh8{5-fy@bY zx!oemQ%-FUL?%Q3jk9OP>E@0gEJ{O7`^A(%H}C^W|&n~9553zfkTSDLsgC&V;E7$>Xa!RaV7WqGm(Bmv8s)o zqz12gsnxJ_g?FqeovGsW$#RGP8faZx< z=S$prIqD9aALRK+28-p-a{vB~#o4gTosZ3pqyzlD*c`xiu-NoAakxu;M^R5rN$F?S z=56MLQg+x)MawTsU-jE_4D?HM9*aLRMoKOx<<>QGo;QTVUefuFfH+?%GlvQTpm{xo zZ%JyGd^z6VpP5iJ(6hNenwlN6IbWw~aXr#6R4=5YdAZ*^qmKLiK8iGqS+7-qPoQtL zDGn6thyi!|(MNfu$3R2JZne_CFB!pxTxf^PRxqL@dZb)#a8C<=^sy8n6AMEj6cA+f zzxFYh5g@nj<=)65cWZs9%USI8&bk>_2;ICu2oIY&WE6J$DMo(bh9f{nM^r4uG`F3U zO@S>KLL5grZZr;95^c!hz9lpJfuwr)s%|yf%>QjiJO5RCdY}qNv^%3q1cZl8jQ+>f zww?`;00av%(o6BpIB#+Pg?WL4b59`)yP_qPiqH9GLs8;d9~cbN4b}q8P{P*U+2Ct`!|MQCf{~UV% zMSGY(>3?Ty9%G*~-5_PTKM%FPz-Q|J z&O80z{FFVFy1}iBk|MkkMaPmja9#{O!PZz@9Ll>aIh2;uV{(ctO~;MRK|*#CXp_rU z?A^NfmR1qnNsf+mFW30mhN}*G{1NUM z17Y*8(Z*15q@W-S(Bd7Eyyz5GG(Vy&(*D+8{b_qDJUhGNvG6H4m=8;$-U=C>EaiIp zH5!XS0Q$MRV13KO9*M~Ah5MU#u_ue=BC!Ll_)fdW2QZ>}o@(*S<4ZrFeBR7yGw{1_ zi0-U+UhopjE~=<-g`&M2{0$Ui02SVnZ=Z(J|?TvN=YZur@v#pJaq*HN=k+{rtu$}0zD9?ujEg-dt zJe!tD2zs9VMiP~z8=$l9fApG1RC7FKiZ5bvJy&BvMnGqy10m{*f?(TqSr~*=KFGOpTS0oA=;`@PpXd#UM z_ywmm^$JVpexX?ce!+*m-f?NuW}pl^Jn9rq8F=ds|9yt&Pq|>*(*lCLy6GjfbPwRm z*r?q+|J-PQ_+Zn5VNb|vehq|RoVC%}`I(aO2yFdbEnjXO&sa{5$CJ4z>JA`m-xASEAV(sNgCbu}9!|l1WvYieKDN%ao5X2)3;{Rkv z@|WVTukmm4_`(W#A=~4@_)YSM{qo|aItM+m z?h}_Io{M|$d}Y4xfB$fp$#Y3;pP&-+Wh>IA7>L+^Uz^D8>H9IQRfmHZ+`Ztm%RX`h zDZjtQ^hvBnIf4}A7d$svq6pD2u+uXN3IZ|mk2g`TfVFI!9HcQ&C8DfN^ccPNH3qZg zu8lwGR^!(lfAt8zOV67afD>ed-}_O9vVs1+r)qhLSZ*;#vqrY6l!;@eyoSCssFaN` zLl-eX5i(a~RSE!eRq3yg5o)WIaBz13Tb=o#98dS=)jc5DLPcdJkK+{)DJ5kog%*fN z>j(f2L7l`v^(9Ru{rJqxlIb-4EFe$X>%FI`uZe_((HkM;nSXl(OKKQtXfhYR^vnr* ztI`hyJRJkEJ6F%r)Zj?1wej)dk`h4?p4yt4GH7UlyC53cKPEwd7T~o-?j~2Py1TJs zXLnXMZ2`1)YipHt{5I(ma|>fTRp}WR2bt&xf!vd(N3K*`Ir;HZZth_Ks~pgF91#(( zuAa0+D+CvkD; zCWiU-&(GNtG%DZn9cgggT3E{qDq2bcIwZ(diuNDq)DlflpwNO=QS{Z-pQtg+z#`n1 zL&+o1&Q#ktdfPR&qEoDxn1sEvXX+?oeY*{N&1@@WWRuUo7a2(85 zzwc_(WoT{YQAALyo2;za^4P-IJLanyloMI`_iLFH6Z5=t19S5)t*!>QKhr@K@o;AP zxfKtdrhUb|X$+rsm$3Nhj^70hQV0U&>uZ8y>QeE{Um8vng%8S>16kC6VXXG+-%U5} zs&i%GL$RIie>gZ)M%WYGuu#-hX50kK!x#RCJ7p55jNQzsy?+AZV5Kot4{ zWB^4(ud|M4@VP*TcWhU@xJ{1QnvE|4=6JBt@r=#PD%ByZ8^i(vk2E09;jXUx%Y0YAWilIAeEu5W*EF7ed>Ee<8K&f9mVacI*`H_7LpoIj8kVY2}<(Gp3&_OImuLfJSgc0;2T*!_V?jpNl^Q=qY6E z%(3Uju79|>3!lO!FVr{pwjZ2HwESx)^hM`*xN$TzGUOTWujm!5X5`eq+ii7xhkG>I zC~z{?3p@-*c=L)TbXX`DH|J?m%7eYh8k zs#};(#>$~u`6nowymE)8n1>Z;n|ZhiF44Yclc9_L}27p^P(+!;WU9mT37W&*W10Z-C01Q)Y0))0%?Oxsj#@TsA&D- z-tUqwz8~z>9ktW=Z4p{I0hDy+=67aLM!f^<(&lKf zB0yO-SX~w^Pc*<)B4}P^A!hWy%yfn&pi#Z^h{jl@WTawoZljwkYK_6seu^B=C_JID zO=5ojmKc12vF%}Car6c1n@s*IEudY54F&n`5)DtbyU>vy7o~~1Vj)}ke2RLni-`*Lg^Ig z?vfZ#QIM8yhVE_{LO~j7q(fq0=#HVzI!MrA% zjBgfbp<5c2O2Dd*lf|27rpz3%D%BVA+Ul7+tdczNnw^Ek`>3nOtRVAM^e7>k+cVV$ z^H+3z2${3<03N>j?JqQ#BW9xJS7-Nd!V-BewS!xROHOdv2_5|eOWd6c0XYMHsev{#!`q}I7QyHd#EqH@~I_x-|cV5QCb4RvqmLfOnJz6bh{EgnBV*&1q5c4r*w_!Jih5hQdzYKtU52gsYi%fN&T?D-nsJ}M zeh-cudctll-5M-RvVP@drzB&heqi1I6?`19>o}}+1@dp-!EiXccE&;IRUN2EXdv)O z?gi01w?HH7OhQW<$7ZZwp15iFmwIWWabIlVrW`(?VC;K^i6Mi>*K=^uh+}T#h9G8D+&JfD6DD6-O27nXm?OP(N{{q9w1Q$bLbEKWp4j5Eo zV1hnksFEMu85JAz(4fVWUw}zJ+lf^09XnrBp7VG!Pn>eOv*AZ^VLZ|-{EcOkTn5HD zW-bmKoG={h;Mm?6%qOH!%YG0(`op?`o#gH(J~Jp+)G!u8I8^xeud&f+U49&O2M4vc z+?06OxH~H9+GY@<&h7+AMtl1kr7tb4k6wBmQLZDU;e`O*Eb`dzFAoWk%oZQZop)d| z_oNZyEjSO%^o_TXVXTbkws8@*UEJCT3>0WLl9RP?dF4P4RDwbXd~(Ry#DkI7FTA|a z+8{a|*x`{pS}v=f1X7+O%OK^5EKW{-Mg}1z)+itjyB#n{7Xbdk!Nu0!Cu{WQcGX6= zX7rU<>W!fL(`}>_Rr>+%y$z^Cm0k%!;195j#5^_!+={!GLqwm!u!*EtIeQQfNmSM1 zH)o_7{mBdnl!HeYF3lbs{3*br(fwuMr)C=`ZlWdw*>-EdjR4^CMd~#UVr+iLPZ-0Q2hMY0^C(1 z7b7E$pSiAo`?jl;;zji7TPKsn!dJ&!@RvQsYdHVFtErx&Z4Uz`uDzqBlF@lOm{^wM%E%N}8eybuiA z7#_A4Qd-lg*|}4>`81#0OC)~ty&(qlgd93m%T4a{CO$B5m+S98 zbhfduI6Y~(uD2hs6L3H226|7Oi+kV_yt_*wW;XNT(*5+#4Ghk>1lYumh;23F3Bnj$ zQ+vWX;Pg@nF*Hy$QqSnc< z%inX+)SU^M(23oVdp7WTUkimvH~d|v?@>PW~ms2{=$HFtxZc-$JE zoBnQ1pU_Dw>A&$Rh@OS=axnBE`oM4}PR4OH@il#ZH!C=YXk{*Y{}ZaFM=OHcboT}o zFkSq2T8-~kc19yT9~~-Tbq+lJr{1m8Of)RN8KY|cYgTO=CuK|2A-cFH71C!(E?}?K z{p+!uTu^Axc6;B&`k1+e_{FmW+Gn}S+X$Z{_R8dlh^Owq*^b>@%6WolYwgd{^S)5I za`gi#l_})OWn(>r6={RJ z7=_p&`N<`bo?D{91To zL%iHd5DX?ngm4Kk<5?MNXHe zIt694Kurx*+LN)+lbW@+FdwO&!X$E>LcN@$L+`Nrk1NT*z}R3Wuba7i>mljs-qYg{ zMXEIDLn5yUXXS8}xzlQ7!PWBz4W8wqvebO8q>lo@RiQ6heuW8M@-|k$POCG;ea5ga znLQ|D|A2#fy0EY?o+d0QK!)5;u)4Z>sUsvWFOBJe0fH>b;rv%F9A&IfyR?+6l+eX) z(BxF#*tnP-XOND?FHF9VWK{Ht)IRO>vfr6g49CdM&hZ9hLr~BDD%@9&nOF%9A$mda zzJ`dIo+|h#re;m`#P{;MHO_Mv40rKY8>jR!hZhYC_Q=YgWs+e%yLc~E=Vu-rw%gcY z<}T_vp+%;3C)G9u(RHhrNWokl^sUeTgpsBAD#9JET#76XKIe#h**$uh1#DHe_#^yN z*Jg^6Gg9K5TOfVxUSIK`I08kuwYJ=`H1s0*YncTj92U?%wv zP?DHM$(K6{aNWKm!&}esdZ=k2b#9=kHa$HxbYU={I7clwRk1uWBg1?9Atc20~G416bq8!6>djZl#?E_`;b9H25E<0AM$6HjF7vCN1=$3J9AFN0|4zepdfPM^m<#L;d1AS_I`5wo3qckaj zCJcf2eN(|O^V%=w>FsbWYmMtFvud9ZOpK}iRo6C~#YA##{F2y~FnLcO*lv%I&6!C= z6YXZM)Qmc?FUoGIU9zLj&ACEmahg>qoMj8;8WMdgq%Ak6KCh>#INPk!s zl_11`rcO>6Bm8}5`P&<6kS)%SU0bUCZcP$q_XQD9+O043 zIR{^HCq4Hs(hJJbHvoK0G^BYe38;o_hgEUGCa1%S9zOnew2Q&a$@%c?E@uh4{BAfB z)?apLW@<+NS`AA^mYr6vqNJpzq(mcgh+CKO?)L>IM)o&o#u2Oax&0G-<3|-0?1vQH z{lApk_Vz~uEZLn722W^YWy`pClLntw7qsn=REaOYCEm%aPl+pY`FZsE`lZK`rfcNy z=RcV4+9eI27pK=H1}<=q%H7`N%^q{ax-%B&k66335#AjIk(eFdXG!jb%w6kz>m1Qf z-R8iv*>Gj~W?du5h-9{C-R1;j&(du0s#DQkXwy&fv=10*tK*Th5qWQH8-TP)MQ zL=Pz5eG&^x5Oj65Ixr6GD5Axl#%!R0ZiG#%u^#cMZLC{yQ03w5AIaz@jJgEnG_1Id z3Lo$_#wzp5sdOIZ@kh*G4BB-0sq5;RHbZo8y+ikzazM0H=VaVe6`rv1)t7OPkHz%o z9q!>B@8RVzR}>Wq3h^8xj}DHKH56?PRP#rbKf1c@z1w@3X(-L9t{Q%p^Cc1@{#xs; zP(*r7j?T~p)ohcnE1tl^_SsqUHQ9!(LcNk?VHj!vdUZ1AwxGd!=rxzQxy;>-j*Tr-$kffAj1&=#jV5Knih)uW+!j<6jZb(mDL30wXRqk<`JF z&m}&cMJhUuwx`$D%~!s#urXSrY}{70Uv5lQA1-yhjp6(gL6Jym3O`tcfY1@7b_ z%B_BWH$basK)7bGXDUQ32me-OwUUCGS~NER7wb+6MiM$SN698Ny0YvQFI_JwCzJiP-zS zGalgEdSOf_h#rs1!tvo*H=wgjHNV>Jy%?v?4q(@OPsp0BMART<EeUE`}K68 z%@>cFCsNzzym(wW^=V>`XWT^m7dU)nQ#M=0*HJ}l;@3t3B045U$Z|2hPS??9P==oH z_MJOT$LQ&CyB~Z_9XHZA)FfJgv`>&ddrUn=xjb;+=sGa@p1BdByH^0u&@mmY$kzZT z8A1UOyLK^u&`h;(GY;@*5f)ynOxPzlsR1pFzBs?~1h(VKObw7d_aA_i?)EW&KA*18g@v6fW!?cWsKZYiM8u8vIcWN+TUSF)IQ_%BM z#BI=gnkWpbj`&3WxMRhpu2fp89`ec}q5+__Y7ag=XN@T*HwkPv3a*AvU-gT3jxwN_ zWO*?af4(S|`sM4k>I0iVbyFQnv}M1!&$#MwvtDoks%k$V(~kG9j@|bv8^veF+k1Ud zitm1HIaRyIsjjIxIX&{bcd%^t&}F2=8S}-Lc64x5v6S&?FN+{h<8#-9YEfoBa?p+9R9C(GShpcdR{P6Tqd?ZilHK}rSWQ-r&V08rV~lQJnptkcDA~AZ za{#Er`scbYjA4%j54`0=Pecn7_I0{!?|hp-%Ypq|kj*-dGkSAu)yA zv)O5Im=-)gN^HoIZ0L8{*gxP+Fq^O|d9zo}!+4@1N~K!92KsK20aC-R`^KE9T?3T_ zqlE>-<~EaEy1ide@7Iyanzpv;x^M7;gI?|@V4H#|{9{GMpY?jP-rLn4XgN$OC3i~B-S9<%J(SE=JqX@nPI5H$jC*n;d_Pp zqw6{~@q1lE#&fU}Y9%EXse=SQbC7N20N>rQWDJ|=d}1?ZbllkbNtOlIp!V>%6<)>Q z{;<<=fw(zcmiIV6#s>BnEKZKwjuyfdHrGEZE)Tm4zA0^s)*}w8-q@_Ndxoi3DQ~&r zl90^sb|~`DwV?>4B5#uq)a=tPN)l5^Xo#j16x9nv`T3>i<4F92FG8yPxbfllX5Hgn zDEB5Pn>~Qf3mQL5xr;f-$Xs8_t%BR0kG2A<@@s^d=cPBk>jvc8MMoa;@;9=->LW)q z`7h!}JWpaK>+0TtSD6$M7!|X|_^Fu@%NOP`&sJK~jimae`YkPk_32!3wAsyg+FOoBvbYa7Qt+om{Q!hW6#j>y-ks^ zWCQG{SpG={c(|X$k(3eg?72of`_4xna+UNwljf)ElbRVGYfjH|S==6z#W68L!p9HV zu*uuLOQuD8vQwF8MbU2@98ptw)CFAo=6t@Y8Z=bP4dBMiAR|N`9AhHk=Y+779CSz| zkp0DO^AL9-TI9vgv)%ti^2#$1mlJ+W1LVL&^jfIF?nCAz{fj+W`ubs z*!LXo34|>~Z?-tPcKNb$krsGj{~ZBxf0kwe2p|P_@rA>8PKh(K-Z0Ded|nz0m%rX2 z)nqi&Iknt{m*_HWWC9T@Oq}-HN&U=F?_hl-5$1_We!hCW{X$Rzn7!XFj$b(lODDkp zw$v8H=Qz7n#Vf8yFMk+yFXs=~OkYrX0bq>JY({}m z>uX$LX_6}&XO8{#1K@@t`=-1zMw^R*`rPTE`Aymm3(BX_4X7~_BIq4ca zVysI;9F$1L8kH4>@}E0?MovzKgHtg((}*p;dswtWKJJ@tUBdfqX%DpfNA15cqYDe` z-uC8{qKskM#DV#3XNJ2_Z{wHe6SwQ!J(1SN9m}*zVa(=c=-&Q**8+#@|#q9a&yt zn!v5A<%SF1U1-Z-zyA4Lom*-XTf<9(nj4S)_V`JG%+gh+BOX1_(Wt)6Zsl0rh{OeA zLkcE$5*EDl+8(}c1(WEq2Law9;g4hXVO}@0>3YLS`^~8C5aNr}Aeb&2DPqnFl`URc z(Wl-oxcZ(<)~!>+#Qe>mP0?~5MVO_?*qeBr&13QBGAq@HLwS-M`g z-rbo+0EP#ul5fL6*xh6A^Um;0#qAP|kM7(VZX#g`LN60ZxL%z1w70K>Ls9&RAe%f@ zXbY(*;U{hYZNbt@!TL58bLAnWY58;{pcnR=hQBqVn~m%8z)E$R5oXnL5==+YIU+O* z&YJA^X%9-DM2ug(Aa;>HU$wAs#fbr~+-GoT)t4P*YAVGl640e2Hd#UG?)S$4rg4V`I)k!vesRE{=Hh9DV2f^fuoEis}Z&rg~|)zHA~$^M}+oH@qP{#=k0(lMgrh zOadj5)TG;MdDKh7E^iSz^`reTUbD@Rk9M~}Kl@bF=j|){Bxc9$zVB0s{0~n!SbGo- z+p_SS^+qr#3SFNOq2nmeX=ojrW#TOmA);g}Wj4$uo^AALc843fte=(zZc{a*P}pM+ zO+kzmn28!`^mogdBjc)Jihu$;KRI$HX$Izez)cD_t}!7dA~_|2J&H|SJae*aw4M)Z za(1rP>)=!O!5T#VUjUu~`*d-Y(q;*SD|Od0^VW=KKo8|b4rE3_XJqhq6rISCtg<3A zXOHUCl!xaT7T{|dM%NRqH3#;$IfBqjwXVvFx_zre-=7RAaZ)9qI0?FYg&^6>$_h@2M^9RZ)+O(6|`&YKO(41G|@(%TbKn^a}a9U4-~%w&mtDi^>hGWdPc7vn@j z(quFoT5L!p>vg=@72H#O|kXIcQ^Fcew7wD#g-{lTMDLC1?$4_L~6six1> z+&T3y*1-RV>M00ty2HJ-k?Xlag6!TJ3Gihm%!XGAz2*U^dj*?!V*(a*Qh=%Iu3SMYdtO`%(<}VKv zPQt0*?kIX$dwsiBRL8q(=woBbG@Y@(Y-{(b!&H7i11<4PY*Izh3|n_!8@Wo+Y!-N? z{eiJmFUsg$kE^AW3UwPp(&%{i&vCgZRUKFU1gh4Hg_EzP$g&e*#ZBbXp*#irsMh53 znBO`W3wwruFsBMX>D<{c@6(eea52Lma(O$5ebbb|9Xgbm#q4`h5(<=0^P^MU{0)^u zqQw7C07nA9uDm}*C_dVOn#&SA3IzpDplR*yj;1~-sT!Tu;c#bxP?J>82%3iLRxo7``WlDO+2~r{1)p8EmRa{_3i#e_RiaOS;t#W&v$6d0=3) zZ!O*?9N_PYEb+bCG|Z95rK1zuTRbyvIvay zr`HJ^?pf)_G%vX5>+qb+p_BPz=zYKDdDS&i1TV$m5sePeXx-@gNazX1=GV z-xJktiodUjUTZt?xv(tOVvm)jU+PpgF_sHC)vfh8y`oxXxbb|0?4>nka?S$Y?X6T8 z{QSsJoYReLr2h0Io}$uzqUyx$)b}uYcA@N}qIqzLmqCr@O8aQygpCx_2%mWa#Mr3$ zKWLhtDLhcN!R6@e#)io?l(+Aw-E-NOv!x*4*tAr1`7*LODorZk`bstBZ9E!d_q1#= zQBdKl>A3xdg3kN6I1>Bm{ae$(G6*!fw$6-=rLtcyt#@?zZx)RnSwlG3c!JVY>FaF| z+`-o?H=LKRs;|G*z2r6ZP}(w3W4enyUf>gQFE2$`Qy<|On{n?2W)SU?z5XmviXKA- z|AcPoLAsA)&8QF2)y^BfSJVRVyz+Fzr712WPPmOl+D29xFt)PqG|;a_s~+Q7ohOF$ z^bFg!T)on=&7GyxNJo#&TH8$%mzs>HLWza>!hHFgzD_sbj6cmB2w!dw@5sM zP{{-75D{tf3!y(urCSl08!c^%%B}aq#k}9n^AEEhkIsRLKZ7Gb5Pqq@@|ifeSfFsJ z!hYcT1898L>dB9otg}S}m;^xG^Ly3VWC~E(Vmk7W`!vG+;hU>6Ejb+*uO!%@PHc7^ zwa@nI8I^-*yE}&055wJtE=Q|RAZggUaolG*=H8cMBx0;1-`hnn`<|$)T8dCTG4M^0bRX=284z*x-JYe?w%fpVv^Ss5 zMQuNr{N?fd0{=SW2Kj*oyz6Y3`QUTW_)hx&9gZ2S9Xz2U0MRI5u{82d#QN%mo>Zbu~yI*DRyP-CEzhvrjtumj~h0d_UtUD3XChu#lAv z=mR-YJ!>9F39QzrP6|aTQWouK2}&~)^Ef;IH_@0#lFEzhaLk*AV6Q`a!8rWf$}8QS z+>Z0qHA$9DXMYCIyirLA_4BKIPE%CCUYf_g^<2^C!}GO;HQJb-!onUl){vXgKs5MK z;|q+!265KyH(M2BrRZb2(v4|%>i_c5B4br$enT{Rw^pA(n8k)x^tO|ut#~tI=JM}( z!}nfYot*+~y-xEOKxb<7BQH;Bh%k^I0=fFJM^|58@4FSev$#(7a7?aPqf@WhgmC1> z`}0t)2UEv*D)aq(*yf^rpOkO{b0s7UO^uUO1MZTSE7s+9&6Yrl^Z0pMIOv3l!)0V8 z56iyxxAxrpEV;PD?xvz5tP-VD)XmYBa7PsRe_$`UBgm*IBmB+kR}{c#l5vrD$)~3{`&nl3EUSH?-YatG@tcbY;*lRbZeJef?)Oa^GJHBh$(3WJ9{iF zEc2XuHTR|d{%+sM(ij0QbBg(d5XV(`SOw1Y*SozB2-_{4yYar|j#MPxmJQb5p^IIT tRu|U4{sXA^|98_2|6@P>E|t$Uz6OOrP<6pQ*FRsjoRpGeiTK-({|0l2be8}C literal 0 HcmV?d00001 diff --git a/tools/medium_table_images.py b/tools/medium_table_images.py new file mode 100644 index 0000000..7d6b1c9 --- /dev/null +++ b/tools/medium_table_images.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python3 +"""Render every table in a rugo.dev blog post to a PNG, for Medium. + + uv run --with pillow python tools/medium_table_images.py docs/blog/.html + +Medium has no tables: a story imported from rugo.dev keeps its headings, text and +code, but each table has to go back in as an image. This renders each +`
` in the post on its own page with the blog's own +stylesheet (headless Microsoft Edge, 2x scale), trims the empty background, and +writes /table-1.png, table-2.png, ... in page order, printing which +section each one belongs under. +""" +import os, re, subprocess, sys, tempfile + +from PIL import Image + +EDGE = "/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge" +DOCS = os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "docs")) +PAD = 32 # px of background kept round the table, at 2x scale + +post, out = sys.argv[1], sys.argv[2] +html = open(post, encoding="utf-8").read() +os.makedirs(out, exist_ok=True) + +# Each table with the last

above it, so the caller knows where it goes. +tables = [] +for m in re.finditer(r'
.*?\s*
', html, re.S): + headings = re.findall(r"

(.*?)

", html[: m.start()], re.S) + tables.append((headings[-1].strip() if headings else "(top)", m.group(0))) +if not tables: + sys.exit(f"no tables in {post}") + +with tempfile.TemporaryDirectory() as tmp: + for n, (section, table) in enumerate(tables, 1): + page = f"{tmp}/table-{n}.html" + with open(page, "w", encoding="utf-8") as f: + f.write(f""" + + +{table}""") + raw = f"{tmp}/raw-{n}.png" + subprocess.run([EDGE, "--headless=new", "--disable-gpu", "--hide-scrollbars", + "--force-device-scale-factor=2", "--window-size=760,1600", + f"--screenshot={raw}", f"file://{page}"], + check=True, capture_output=True) + img = Image.open(raw).convert("RGB") + bg = img.getpixel((0, 0)) + diff = [(x, y) for y in range(0, img.height, 2) for x in range(0, img.width, 4) + if img.getpixel((x, y)) != bg] + if not diff: + sys.exit(f"table {n} rendered empty") + x0 = max(min(x for x, _ in diff) - PAD, 0) + y0 = max(min(y for _, y in diff) - PAD, 0) + x1 = min(max(x for x, _ in diff) + PAD, img.width) + y1 = min(max(y for _, y in diff) + PAD, img.height) + dest = f"{out}/table-{n}.png" + img.crop((x0, y0, x1, y1)).save(dest) + print(f"{dest} -> under '{section}'")