vec-collections-0.4.3/.github/workflows/rust.yml000064400000000000000000000007630072674642500200740ustar 00000000000000name: Rust on: push: branches: [ master ] pull_request: branches: [ master ] env: CARGO_TERM_COLOR: always jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: fmt run: cargo fmt --all -- --check - name: clippy run: cargo --locked clippy --all-targets -- -D warnings - name: Build run: cargo build --all-features --locked --verbose - name: Run tests run: cargo test --all-features --locked --verbose vec-collections-0.4.3/.gitignore000064400000000000000000000000250072674642500147360ustar 00000000000000**/target **/*.rs.bk vec-collections-0.4.3/.vscode/launch.json000064400000000000000000000007540072674642500164650ustar 00000000000000{ // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing attributes. // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "type": "lldb", "request": "launch", "name": "Debug", "program": "${workspaceFolder}/", "args": [], "cwd": "${workspaceFolder}" } ] }vec-collections-0.4.3/Cargo.lock0000644000001037250000000000100121140ustar # This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 3 [[package]] name = "ahash" version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" dependencies = [ "getrandom 0.2.3", "once_cell", "version_check", ] [[package]] name = "aho-corasick" version = "0.7.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" dependencies = [ "memchr", ] [[package]] name = "anyhow" version = "1.0.51" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b26702f315f53b6071259e15dd9d64528213b44d61de1ec926eca7715d62203" [[package]] name = "arrayvec" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" [[package]] name = "atty" version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ "hermit-abi", "libc", "winapi", ] [[package]] name = "autocfg" version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2" [[package]] name = "autocfg" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" [[package]] name = "binary-merge" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "597bb81c80a54b6a4381b23faba8d7774b144c94cbd1d6fe3f1329bd776554ab" [[package]] name = "bitflags" version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bstr" version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223" dependencies = [ "lazy_static", "memchr", "regex-automata", "serde", ] [[package]] name = "bumpalo" version = "3.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f1e260c3a9040a7c19a12468758f4c16f31a81a1fe087482be9570ec864bb6c" [[package]] name = "bytecheck" version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "314889ea31cda264cb7c3d6e6e5c9415a987ecb0e72c17c00d36fbb881d34abe" dependencies = [ "bytecheck_derive", "ptr_meta", ] [[package]] name = "bytecheck_derive" version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a2b3b92c135dae665a6f760205b89187638e83bed17ef3e44e83c712cf30600" dependencies = [ "proc-macro2 1.0.33", "quote 1.0.10", "syn 1.0.82", ] [[package]] name = "bytes" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" [[package]] name = "cast" version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c24dab4283a142afa2fdca129b80ad2c6284e073930f964c3a1293c225ee39a" dependencies = [ "rustc_version", ] [[package]] name = "cfg-if" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clap" version = "2.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" dependencies = [ "bitflags", "textwrap", "unicode-width", ] [[package]] name = "cloudabi" version = "0.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" dependencies = [ "bitflags", ] [[package]] name = "criterion" version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1604dafd25fba2fe2d5895a9da139f8dc9b319a5fe5354ca137cbbce4e178d10" dependencies = [ "atty", "cast", "clap", "criterion-plot", "csv", "itertools 0.10.3", "lazy_static", "num-traits", "oorandom", "plotters", "rayon", "regex", "serde", "serde_cbor", "serde_derive", "serde_json", "tinytemplate", "walkdir", ] [[package]] name = "criterion-plot" version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d00996de9f2f7559f7f4dc286073197f83e92256a59ed395f9aac01fe717da57" dependencies = [ "cast", "itertools 0.10.3", ] [[package]] name = "crossbeam-channel" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06ed27e177f16d65f0f0c22a213e17c696ace5dd64b14258b52f9417ccb52db4" dependencies = [ "cfg-if", "crossbeam-utils", ] [[package]] name = "crossbeam-deque" version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e" dependencies = [ "cfg-if", "crossbeam-epoch", "crossbeam-utils", ] [[package]] name = "crossbeam-epoch" version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ec02e091aa634e2c3ada4a392989e7c3116673ef0ac5b72232439094d73b7fd" dependencies = [ "cfg-if", "crossbeam-utils", "lazy_static", "memoffset", "scopeguard", ] [[package]] name = "crossbeam-utils" version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d82cfc11ce7f2c3faef78d8a684447b40d503d9681acebed6cb728d45940c4db" dependencies = [ "cfg-if", "lazy_static", ] [[package]] name = "csv" version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22813a6dc45b335f9bade10bf7271dc477e81113e89eb251a0bc2a8a81c536e1" dependencies = [ "bstr", "csv-core", "itoa", "ryu", "serde", ] [[package]] name = "csv-core" version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90" dependencies = [ "memchr", ] [[package]] name = "either" version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "env_logger" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aafcde04e90a5226a6443b7aabdb016ba2f8307c847d524724bd9b346dd1a2d3" dependencies = [ "log", "regex", ] [[package]] name = "fnv" version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fuchsia-cprng" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" [[package]] name = "futures" version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8cd0210d8c325c245ff06fd95a3b13689a1a276ac8cfa8e8720cb840bfb84b9e" dependencies = [ "futures-channel", "futures-core", "futures-executor", "futures-io", "futures-sink", "futures-task", "futures-util", ] [[package]] name = "futures-channel" version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fc8cd39e3dbf865f7340dce6a2d401d24fd37c6fe6c4f0ee0de8bfca2252d27" dependencies = [ "futures-core", "futures-sink", ] [[package]] name = "futures-core" version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "629316e42fe7c2a0b9a65b47d159ceaa5453ab14e8f0a3c5eedbb8cd55b4a445" [[package]] name = "futures-executor" version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b808bf53348a36cab739d7e04755909b9fcaaa69b7d7e588b37b6ec62704c97" dependencies = [ "futures-core", "futures-task", "futures-util", ] [[package]] name = "futures-io" version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e481354db6b5c353246ccf6a728b0c5511d752c08da7260546fc0933869daa11" [[package]] name = "futures-macro" version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a89f17b21645bc4ed773c69af9c9a0effd4a3f1a3876eadd453469f8854e7fdd" dependencies = [ "proc-macro2 1.0.33", "quote 1.0.10", "syn 1.0.82", ] [[package]] name = "futures-sink" version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "996c6442437b62d21a32cd9906f9c41e7dc1e19a9579843fad948696769305af" [[package]] name = "futures-task" version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dabf1872aaab32c886832f2276d2f5399887e2bd613698a02359e4ea83f8de12" [[package]] name = "futures-util" version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41d22213122356472061ac0f1ab2cee28d2bac8491410fd68c2af53d1cedb83e" dependencies = [ "futures-channel", "futures-core", "futures-io", "futures-macro", "futures-sink", "futures-task", "memchr", "pin-project-lite", "pin-utils", "slab", ] [[package]] name = "getrandom" version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ "cfg-if", "libc", "wasi 0.9.0+wasi-snapshot-preview1", ] [[package]] name = "getrandom" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" dependencies = [ "cfg-if", "libc", "wasi 0.10.2+wasi-snapshot-preview1", ] [[package]] name = "half" version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" [[package]] name = "hashbrown" version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" dependencies = [ "ahash", ] [[package]] name = "hermit-abi" version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" dependencies = [ "libc", ] [[package]] name = "hex" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "hexdump" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e40283dadb02f3af778878be1d717b17b4e4ab92e1d935ab03a730b0542905f2" dependencies = [ "arrayvec", "itertools 0.4.19", ] [[package]] name = "inplace-vec-builder" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf64c2edc8226891a71f127587a2861b132d2b942310843814d5001d99a1d307" dependencies = [ "smallvec", ] [[package]] name = "instant" version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" dependencies = [ "cfg-if", ] [[package]] name = "itertools" version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4a9b56eb56058f43dc66e58f40a214b2ccbc9f3df51861b63d51dec7b65bc3f" [[package]] name = "itertools" version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3" dependencies = [ "either", ] [[package]] name = "itoa" version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" [[package]] name = "js-sys" version = "0.3.55" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7cc9ffccd38c451a86bf13657df244e9c3f37493cce8e5e21e940963777acc84" dependencies = [ "wasm-bindgen", ] [[package]] name = "lazy_static" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" version = "0.2.109" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f98a04dce437184842841303488f70d0188c5f51437d2a834dc097eafa909a01" [[package]] name = "lock_api" version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712a4d093c9976e24e7dbca41db895dabcbac38eb5f4045393d17a95bdfb1109" dependencies = [ "scopeguard", ] [[package]] name = "log" version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" dependencies = [ "cfg-if", ] [[package]] name = "maplit" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" [[package]] name = "memchr" version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" [[package]] name = "memoffset" version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" dependencies = [ "autocfg 1.0.1", ] [[package]] name = "mio" version = "0.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8067b404fe97c70829f082dec8bcf4f71225d7eaea1d8645349cb76fa06205cc" dependencies = [ "libc", "log", "miow", "ntapi", "winapi", ] [[package]] name = "miow" version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" dependencies = [ "winapi", ] [[package]] name = "ntapi" version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f6bb902e437b6d86e03cce10a7e2af662292c5dfef23b65899ea3ac9354ad44" dependencies = [ "winapi", ] [[package]] name = "num-traits" version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" dependencies = [ "autocfg 1.0.1", ] [[package]] name = "num_cpus" version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" dependencies = [ "hermit-abi", "libc", ] [[package]] name = "obey" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3583e1a1bb89c185c4babc15360e3afdbadff10858e7511e22d8c36ad006c158" [[package]] name = "once_cell" version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" [[package]] name = "oorandom" version = "11.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" [[package]] name = "parking_lot" version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" dependencies = [ "instant", "lock_api", "parking_lot_core", ] [[package]] name = "parking_lot_core" version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" dependencies = [ "cfg-if", "instant", "libc", "redox_syscall", "smallvec", "winapi", ] [[package]] name = "pin-project-lite" version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443" [[package]] name = "pin-utils" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "plotters" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a3fd9ec30b9749ce28cd91f255d569591cdf937fe280c312143e3c4bad6f2a" dependencies = [ "num-traits", "plotters-backend", "plotters-svg", "wasm-bindgen", "web-sys", ] [[package]] name = "plotters-backend" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d88417318da0eaf0fdcdb51a0ee6c3bed624333bff8f946733049380be67ac1c" [[package]] name = "plotters-svg" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "521fa9638fa597e1dc53e9412a4f9cefb01187ee1f7413076f9e6749e2885ba9" dependencies = [ "plotters-backend", ] [[package]] name = "ppv-lite86" version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed0cfbc8191465bed66e1718596ee0b0b35d5ee1f41c5df2189d0fe8bde535ba" [[package]] name = "proc-macro2" version = "0.4.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" dependencies = [ "unicode-xid 0.1.0", ] [[package]] name = "proc-macro2" version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fb37d2df5df740e582f28f8560cf425f52bb267d872fe58358eadb554909f07a" dependencies = [ "unicode-xid 0.2.2", ] [[package]] name = "ptr_meta" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" dependencies = [ "ptr_meta_derive", ] [[package]] name = "ptr_meta_derive" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" dependencies = [ "proc-macro2 1.0.33", "quote 1.0.10", "syn 1.0.82", ] [[package]] name = "quickcheck" version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c35d9c36a562f37eca96e79f66d5fd56eefbc22560dacc4a864cabd2d277456" dependencies = [ "env_logger", "log", "rand 0.6.5", "rand_core 0.4.2", ] [[package]] name = "quickcheck_macros" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d7dfc1c4a1e048f5cc7d36a4c4118dfcf31d217c79f4b9a61bad65d68185752c" dependencies = [ "proc-macro2 0.4.30", "quote 0.6.13", "syn 0.15.44", ] [[package]] name = "quote" version = "0.6.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1" dependencies = [ "proc-macro2 0.4.30", ] [[package]] name = "quote" version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38bc8cc6a5f2e3655e0899c1b848643b2562f853f114bfec7be120678e3ace05" dependencies = [ "proc-macro2 1.0.33", ] [[package]] name = "rand" version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" dependencies = [ "autocfg 0.1.7", "libc", "rand_chacha 0.1.1", "rand_core 0.4.2", "rand_hc 0.1.0", "rand_isaac", "rand_jitter", "rand_os", "rand_pcg", "rand_xorshift", "winapi", ] [[package]] name = "rand" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ "getrandom 0.1.16", "libc", "rand_chacha 0.2.2", "rand_core 0.5.1", "rand_hc 0.2.0", ] [[package]] name = "rand_chacha" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" dependencies = [ "autocfg 0.1.7", "rand_core 0.3.1", ] [[package]] name = "rand_chacha" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" dependencies = [ "ppv-lite86", "rand_core 0.5.1", ] [[package]] name = "rand_core" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" dependencies = [ "rand_core 0.4.2", ] [[package]] name = "rand_core" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" [[package]] name = "rand_core" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" dependencies = [ "getrandom 0.1.16", ] [[package]] name = "rand_hc" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" dependencies = [ "rand_core 0.3.1", ] [[package]] name = "rand_hc" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" dependencies = [ "rand_core 0.5.1", ] [[package]] name = "rand_isaac" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" dependencies = [ "rand_core 0.3.1", ] [[package]] name = "rand_jitter" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" dependencies = [ "libc", "rand_core 0.4.2", "winapi", ] [[package]] name = "rand_os" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" dependencies = [ "cloudabi", "fuchsia-cprng", "libc", "rand_core 0.4.2", "rdrand", "winapi", ] [[package]] name = "rand_pcg" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" dependencies = [ "autocfg 0.1.7", "rand_core 0.4.2", ] [[package]] name = "rand_xorshift" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" dependencies = [ "rand_core 0.3.1", ] [[package]] name = "rayon" version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c06aca804d41dbc8ba42dfd964f0d01334eceb64314b9ecf7c5fad5188a06d90" dependencies = [ "autocfg 1.0.1", "crossbeam-deque", "either", "rayon-core", ] [[package]] name = "rayon-core" version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d78120e2c850279833f1dd3582f730c4ab53ed95aeaaaa862a2a5c71b1656d8e" dependencies = [ "crossbeam-channel", "crossbeam-deque", "crossbeam-utils", "lazy_static", "num_cpus", ] [[package]] name = "rdrand" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" dependencies = [ "rand_core 0.3.1", ] [[package]] name = "redox_syscall" version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff" dependencies = [ "bitflags", ] [[package]] name = "regex" version = "1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" dependencies = [ "aho-corasick", "memchr", "regex-syntax", ] [[package]] name = "regex-automata" version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" [[package]] name = "regex-syntax" version = "0.6.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" [[package]] name = "rend" version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1033f6fe7ce48c8333e5412891b933e85d6a3a09728c4883240edf64e7a6f11a" dependencies = [ "bytecheck", ] [[package]] name = "rkyv" version = "0.7.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "86c74fc6ea0317f1ba207eef55f5401b3180237625211866703183977b57dd45" dependencies = [ "bytecheck", "hashbrown", "ptr_meta", "rend", "rkyv_derive", "seahash", "smallvec", ] [[package]] name = "rkyv_derive" version = "0.7.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61f677bd46008257bfdf28d051a59a72b75c2714754be3f20bcb4cbd835d2723" dependencies = [ "proc-macro2 1.0.33", "quote 1.0.10", "syn 1.0.82", ] [[package]] name = "rustc_version" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ "semver", ] [[package]] name = "ryu" version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c9613b5a66ab9ba26415184cfc41156594925a9cf3a2057e57f31ff145f6568" [[package]] name = "same-file" version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" dependencies = [ "winapi-util", ] [[package]] name = "scopeguard" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "seahash" version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" [[package]] name = "semver" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "568a8e6258aa33c13358f81fd834adb854c6f7c9468520910a9b1e8fac068012" [[package]] name = "serde" version = "1.0.130" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f12d06de37cf59146fbdecab66aa99f9fe4f78722e3607577a5375d66bd0c913" [[package]] name = "serde_cbor" version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2bef2ebfde456fb76bbcf9f59315333decc4fda0b2b44b420243c11e0f5ec1f5" dependencies = [ "half", "serde", ] [[package]] name = "serde_derive" version = "1.0.130" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d7bc1a1ab1961464eae040d96713baa5a724a8152c1222492465b54322ec508b" dependencies = [ "proc-macro2 1.0.33", "quote 1.0.10", "syn 1.0.82", ] [[package]] name = "serde_json" version = "1.0.72" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0ffa0837f2dfa6fb90868c2b5468cad482e175f7dad97e7421951e663f2b527" dependencies = [ "itoa", "ryu", "serde", ] [[package]] name = "signal-hook-registry" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" dependencies = [ "libc", ] [[package]] name = "slab" version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9def91fd1e018fe007022791f865d0ccc9b3a0d5001e01aabb8b40e46000afb5" [[package]] name = "smallvec" version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ecab6c735a6bb4139c0caafd0cc3635748bbb3acf4550e8138122099251f309" [[package]] name = "sorted-iter" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f1341053f34bb13b5e9590afb7d94b48b48d4b87467ec28e3c238693bb553de" [[package]] name = "stats_alloc" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a260c96bf26273969f360c2fc2e2c7732acc2ce49d939c7243c7230c2ad179d0" [[package]] name = "syn" version = "0.15.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5" dependencies = [ "proc-macro2 0.4.30", "quote 0.6.13", "unicode-xid 0.1.0", ] [[package]] name = "syn" version = "1.0.82" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8daf5dd0bb60cbd4137b1b587d2fc0ae729bc07cf01cd70b36a1ed5ade3b9d59" dependencies = [ "proc-macro2 1.0.33", "quote 1.0.10", "unicode-xid 0.2.2", ] [[package]] name = "testdrop" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d39ee32a48eb5325bd3927d4533ac58344af21def4a43ddfc3734c43aebbeae" [[package]] name = "textwrap" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" dependencies = [ "unicode-width", ] [[package]] name = "tinytemplate" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" dependencies = [ "serde", "serde_json", ] [[package]] name = "tokio" version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70e992e41e0d2fb9f755b37446f20900f64446ef54874f40a60c78f021ac6144" dependencies = [ "autocfg 1.0.1", "bytes", "libc", "memchr", "mio", "num_cpus", "once_cell", "parking_lot", "pin-project-lite", "signal-hook-registry", "tokio-macros", "winapi", ] [[package]] name = "tokio-macros" version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c9efc1aba077437943f7515666aa2b882dfabfbfdf89c819ea75a8d6e9eaba5e" dependencies = [ "proc-macro2 1.0.33", "quote 1.0.10", "syn 1.0.82", ] [[package]] name = "unicode-width" version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" [[package]] name = "unicode-xid" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" [[package]] name = "unicode-xid" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" [[package]] name = "vec-collections" version = "0.4.3" dependencies = [ "anyhow", "binary-merge", "bytecheck", "criterion", "fnv", "futures", "hex", "hexdump", "inplace-vec-builder", "lazy_static", "maplit", "num-traits", "obey", "parking_lot", "quickcheck", "quickcheck_macros", "rand 0.7.3", "rkyv", "serde", "serde_json", "smallvec", "sorted-iter", "stats_alloc", "testdrop", "tokio", ] [[package]] name = "version_check" version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" [[package]] name = "walkdir" version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" dependencies = [ "same-file", "winapi", "winapi-util", ] [[package]] name = "wasi" version = "0.9.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasi" version = "0.10.2+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" [[package]] name = "wasm-bindgen" version = "0.2.78" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "632f73e236b219150ea279196e54e610f5dbafa5d61786303d4da54f84e47fce" dependencies = [ "cfg-if", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" version = "0.2.78" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a317bf8f9fba2476b4b2c85ef4c4af8ff39c3c7f0cdfeed4f82c34a880aa837b" dependencies = [ "bumpalo", "lazy_static", "log", "proc-macro2 1.0.33", "quote 1.0.10", "syn 1.0.82", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" version = "0.2.78" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d56146e7c495528bf6587663bea13a8eb588d39b36b679d83972e1a2dbbdacf9" dependencies = [ "quote 1.0.10", "wasm-bindgen-macro-support", ] [[package]] name = "wasm-bindgen-macro-support" version = "0.2.78" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7803e0eea25835f8abdc585cd3021b3deb11543c6fe226dcd30b228857c5c5ab" dependencies = [ "proc-macro2 1.0.33", "quote 1.0.10", "syn 1.0.82", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" version = "0.2.78" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0237232789cf037d5480773fe568aac745bfe2afbc11a863e97901780a6b47cc" [[package]] name = "web-sys" version = "0.3.55" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38eb105f1c59d9eaa6b5cdc92b859d85b926e82cb2e0945cd0c9259faa6fe9fb" dependencies = [ "js-sys", "wasm-bindgen", ] [[package]] name = "winapi" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" dependencies = [ "winapi-i686-pc-windows-gnu", "winapi-x86_64-pc-windows-gnu", ] [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" dependencies = [ "winapi", ] [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" vec-collections-0.4.3/Cargo.toml0000644000000053550000000000100121370ustar # THIS FILE IS AUTOMATICALLY GENERATED BY CARGO # # When uploading crates to the registry Cargo will automatically # "normalize" Cargo.toml files for maximal compatibility # with all versions of Cargo and also rewrite `path` dependencies # to registry (e.g., crates.io) dependencies. # # If you are reading this file be aware that the original Cargo.toml # will likely look very different (and much more reasonable). # See Cargo.toml.orig for the original contents. [package] edition = "2018" name = "vec-collections" version = "0.4.3" authors = ["Rüdiger Klaehn "] description = "Rust collections that are newtype wrappers around smallvec" homepage = "https://github.com/rklaehn" readme = "README.md" keywords = ["succinct", "vector", "array", "smallvec"] categories = ["data-structures"] license = "MIT OR Apache-2.0" repository = "https://github.com/rklaehn/vec-collections" [[example]] name = "radix_db" required-features = ["radixtree", "rkyv", "rkyv_validated"] [[example]] name = "radix_tree" required-features = ["radixtree", "lazy_radixtree"] [[bench]] name = "set_comparison" harness = false [[bench]] name = "set_ops" harness = false [dependencies.binary-merge] version = "0.1.1" [dependencies.bytecheck] version = "0.6.5" optional = true [dependencies.inplace-vec-builder] version = "0.1.0" features = ["smallvec"] [dependencies.lazy_static] version = "1.4.0" [dependencies.num-traits] version = "0.2" [dependencies.parking_lot] version = "0.11.2" optional = true [dependencies.rkyv] version = "0.7.18" optional = true [dependencies.serde] version = "1" optional = true default-features = false [dependencies.smallvec] version = "1.4" [dependencies.sorted-iter] version = "0.1" [dev-dependencies.anyhow] version = "1.0.32" [dev-dependencies.criterion] version = "0.3.0" [dev-dependencies.fnv] version = "1.0.7" [dev-dependencies.futures] version = "0.3.17" [dev-dependencies.hex] version = "0.4.3" [dev-dependencies.hexdump] version = "0.1.1" [dev-dependencies.lazy_static] version = "1.4.0" [dev-dependencies.maplit] version = "1.0.2" [dev-dependencies.num-traits] version = "0.2.8" [dev-dependencies.obey] version = "0.1.0" [dev-dependencies.quickcheck] version = "0.8" [dev-dependencies.quickcheck_macros] version = "0.8.0" [dev-dependencies.rand] version = "0.7.3" [dev-dependencies.rkyv] version = "0.7.19" features = ["validation", "smallvec"] [dev-dependencies.serde_json] version = "1.0.41" [dev-dependencies.stats_alloc] version = "0.1.8" [dev-dependencies.testdrop] version = "0.1.2" [dev-dependencies.tokio] version = "1.13.0" features = ["full"] [features] default = ["inplace", "serde"] inplace = [] lazy_radixtree = ["parking_lot"] radixtree = [] rkyv_validated = ["rkyv", "bytecheck"] std_support = [] total = [] vec-collections-0.4.3/Cargo.toml.orig000064400000000000000000000033300072674642500156370ustar 00000000000000[package] name = "vec-collections" version = "0.4.3" authors = ["Rüdiger Klaehn "] description = "Rust collections that are newtype wrappers around smallvec" repository = "https://github.com/rklaehn/vec-collections" license = "MIT OR Apache-2.0" keywords = ["succinct", "vector", "array", "smallvec"] categories = ["data-structures"] edition = "2018" readme = "README.md" homepage = "https://github.com/rklaehn" [features] default = ["inplace", "serde"] inplace = [] total = [] radixtree = [] lazy_radixtree = ["parking_lot"] rkyv_validated = ["rkyv", "bytecheck"] std_support = [] [dependencies] sorted-iter = "0.1" num-traits = "0.2" smallvec = "1.4" serde = { version = "1", default-features = false, optional = true } rkyv = { version= "0.7.18", optional = true } bytecheck = { version = "0.6.5", optional = true } parking_lot = { version = "0.11.2", optional = true } lazy_static = "1.4.0" binary-merge = "0.1.1" inplace-vec-builder = { version = "0.1.0", features = ["smallvec"] } [dev-dependencies] quickcheck = "0.8" maplit = "1.0.2" quickcheck_macros = "0.8.0" testdrop = "0.1.2" lazy_static = "1.4.0" rand = "0.7.3" num-traits = "0.2.8" serde_json = "1.0.41" criterion = "0.3.0" fnv = "1.0.7" anyhow = "1.0.32" stats_alloc = "0.1.8" rkyv = { version = "0.7.19", features = ["validation", "smallvec"] } hex = "0.4.3" hexdump = "0.1.1" futures = "0.3.17" tokio = { version = "1.13.0", features = ["full"] } obey = "0.1.0" [[bench]] name = "set_comparison" # name = "sort_dedup" harness = false [[bench]] name = "set_ops" harness = false [[example]] name = "radix_db" required-features = ["radixtree", "rkyv", "rkyv_validated"] [[example]] name = "radix_tree" required-features = ["radixtree", "lazy_radixtree"] vec-collections-0.4.3/README.md000064400000000000000000000057120072674642500142350ustar 00000000000000 # Vec-collections   [![Build Status]][travis] [![Latest Version]][crates.io] [![Docs Badge]][docs.rs] [Build Status]: https://api.travis-ci.org/rklaehn/vec-collections.svg?branch=master [travis]: https://travis-ci.org/rklaehn/vec-collections [Latest Version]: https://img.shields.io/crates/v/vec-collections.svg [crates.io]: https://crates.io/crates/vec-collections [Docs Badge]: https://img.shields.io/badge/docs-docs.rs-green [docs.rs]: https://docs.rs/vec-collections # About This crate provides collections (sets and maps) that wrap [SmallVec]. # Use cases ## Small collections It happens very frequently that you have collections that have on average just a very small number of elements. If you know the maximum size or even the maximum _typical_ size in advance, you can use this crate to store such collections without allocations. For a larger number of elements, the underlying [SmallVec] will allocate the elements on the heap as a single allocation. ## Read-heavy collections Another very frequent pattern is that you have a possibly large collection that is being created once and then used readonly for a long time. E.g. lookup tables. In these cases, ease of adding individual new elements is less important than compact in-memory representation and lookup performance. This crate provides succinct collections that have only a very small constant overhead over the contents of the collections. # Performance Performance for bulk creation as well as lookup is better than [BTreeMap]/[BTreeSet] and comparable with [HashMap]/[HashSet] for types with a cheap [Ord] instance, like primitive types, and small to medium sizes. Performance for insertion or removal of individual elements to/from large collections is bad, however. This is not the intended use case. # Collections overview ## [VecSet] Provides a set backed by a [SmallVec] of elements. ## [VecMap] Provides a map backed by a [SmallVec] of key value pairs. ## [TotalVecSet] A [VecSet] with an additional flag so it can support negation. This way it is possible to represent e.g. the set of all u64 except 1. ## [TotalVecMap] A [VecMap] with an additional default value, so lookup is a total function. ## [RadixTree] A generic radix tree, coming in different flavours # Unsafe The in place operations use unsafe code. If that is a problem for you, let me know and I can hide them behind a feature. [SmallVec]: https://docs.rs/smallvec/1.4.1/smallvec/struct.SmallVec.html [VecSet]: struct.VecSet.html [VecMap]: struct.VecMap.html [TotalVecSet]: struct.TotalVecSet [TotalVecMap]: struct.TotalVecMap [Ord]: https://doc.rust-lang.org/std/cmp/trait.Ord.html [BTreeSet]: https://doc.rust-lang.org/std/collections/struct.BTreeSet.html [BTreeMap]: https://doc.rust-lang.org/std/collections/struct.BTreeMap.html [HashSet]: https://doc.rust-lang.org/std/collections/struct.HashSet.html [HashMap]: https://doc.rust-lang.org/std/collections/struct.HashMap.html vec-collections-0.4.3/benches/set_comparison.rs000064400000000000000000000107240072674642500177570ustar 00000000000000use criterion::{black_box, criterion_group, criterion_main, BenchmarkId, Criterion}; use fnv::FnvHashSet; use std::collections::{BTreeSet, HashSet}; use vec_collections::*; fn vs_create(v: &[u32]) -> usize { let res: VecSet<[u32; 4]> = v.iter().cloned().collect(); res.len() } fn vs_contains(x: &VecSet<[u32; 4]>, values: &[u32]) -> usize { let mut res = 0; for e in values { if x.contains(e) { res += 1; } } res } fn bs_create(v: &[u32]) -> usize { let res: BTreeSet = v.iter().cloned().collect(); res.len() } fn bs_contains(x: &BTreeSet, values: &[u32]) -> usize { let mut res = 0; for e in values { if x.contains(e) { res += 1; } } res } fn hs_create(v: &[u32]) -> usize { let res: HashSet = v.iter().cloned().collect(); res.len() } fn hs_contains(x: &HashSet, values: &[u32]) -> usize { let mut res = 0; for e in values { if x.contains(e) { res += 1; } } res } fn fh_create(v: &[u32]) -> usize { let res: FnvHashSet = v.iter().cloned().collect(); res.len() } fn fh_contains(x: &FnvHashSet, values: &[u32]) -> usize { let mut res = 0; for e in values { if x.contains(e) { res += 1; } } res } use rand::seq::SliceRandom; use rand::SeedableRng; fn creation_bench(c: &mut Criterion, title: &str, range: impl Iterator) { let mut group = c.benchmark_group(format!("Creation {}", title)); let mut rand = rand::rngs::StdRng::from_seed([0u8; 32]); for i in range { let mut values = (0..i).collect::>(); values.shuffle(&mut rand); group.bench_with_input( BenchmarkId::new("VecSet<[u32; 4]> create", i), &values, |b, values| b.iter(|| vs_create(black_box(values))), ); group.bench_with_input( BenchmarkId::new("BTreeSet create", i), &values, |b, values| b.iter(|| bs_create(black_box(values))), ); group.bench_with_input( BenchmarkId::new("HashSet creaete", i), &values, |b, values| b.iter(|| hs_create(black_box(values))), ); group.bench_with_input( BenchmarkId::new("FnvHashSet creaete", i), &values, |b, values| b.iter(|| fh_create(black_box(values))), ); } } pub fn creation_medium(c: &mut Criterion) { creation_bench(c, "medium", (10..=100).step_by(10)) } pub fn creation_small(c: &mut Criterion) { creation_bench(c, "small", 1..=10) } pub fn lookup_bench(c: &mut Criterion, title: &str, range: impl Iterator) { let mut group = c.benchmark_group(format!("Lookup {}", title)); let mut rand = rand::rngs::StdRng::from_seed([0u8; 32]); let lookup = 10; for i in range { let mut values = (0..i).collect::>(); values.shuffle(&mut rand); let lookup = (0..lookup) .map(|x| values[x % values.len()]) .collect::>(); let coll: VecSet<[u32; 4]> = values.iter().cloned().collect(); group.bench_with_input( BenchmarkId::new("VecSet<[u32; 4]> lookup 10", i), &(coll, &lookup), |b, coll| b.iter(|| vs_contains(black_box(&coll.0), coll.1)), ); let coll: BTreeSet = values.iter().cloned().collect(); group.bench_with_input( BenchmarkId::new("BTreeSet lookup 10", i), &(coll, &lookup), |b, coll| b.iter(|| bs_contains(black_box(&coll.0), coll.1)), ); let coll: HashSet = values.iter().cloned().collect(); group.bench_with_input( BenchmarkId::new("HashSet lookup 10", i), &(coll, &lookup), |b, coll| b.iter(|| hs_contains(black_box(&coll.0), coll.1)), ); let coll: FnvHashSet = values.iter().cloned().collect(); group.bench_with_input( BenchmarkId::new("FnvHashSet lookup 10", i), &(coll, &lookup), |b, coll| b.iter(|| fh_contains(black_box(&coll.0), coll.1)), ); } } pub fn lookup_medium(c: &mut Criterion) { lookup_bench(c, "medium", (10..=100).step_by(10)) } pub fn lookup_small(c: &mut Criterion) { lookup_bench(c, "small", 1..=10) } criterion_group!( benches, creation_small, lookup_small, creation_medium, lookup_medium ); criterion_main!(benches); vec-collections-0.4.3/benches/set_ops.rs000064400000000000000000000015550072674642500164100ustar 00000000000000use criterion::{black_box, criterion_group, criterion_main, BenchmarkId, Criterion}; use vec_collections::{vecset, AbstractVecSet, VecSet}; type TestSet = VecSet<[u64; 4]>; fn union(a: &TestSet, b: &TestSet) -> TestSet { a | b } fn union_small(c: &mut Criterion) { let a = vecset! {1,2,3}; let b = vecset! {2,3,4}; c.bench_with_input( BenchmarkId::new("union", 0), &(&a, &b), |bencher, (a, b)| bencher.iter(|| union(black_box(a), black_box(b))), ); } fn is_subset_small(c: &mut Criterion) { let a: TestSet = vecset! {1,2,3,4}; let b: TestSet = vecset! {2,3,4}; c.bench_with_input( BenchmarkId::new("is_subset", 0), &(&a, &b), |bencher, (a, b)| bencher.iter(|| black_box(a).is_subset(black_box(*b))), ); } criterion_group!(benches, union_small, is_subset_small); criterion_main!(benches); vec-collections-0.4.3/benches/sort_dedup.rs000064400000000000000000000027620072674642500171050ustar 00000000000000// use criterion::{black_box, criterion_group, criterion_main, Criterion, BenchmarkId}; // use std::collections::{BTreeSet, HashSet}; // use vec_collections::*; // fn vs_create(v: &Vec) -> usize { // let res: Vec = sort_and_dedup(v.iter().cloned()); // res.len() // } // fn bs_create(v: &Vec) -> usize { // let res: BTreeSet = v.iter().cloned().collect(); // let res: Vec<_> = res.into_iter().collect(); // res.len() // } // fn hs_create(v: &Vec) -> usize { // let res: HashSet = v.iter().cloned().collect(); // let res: Vec<_> = res.into_iter().collect(); // res.len() // } // use rand::seq::SliceRandom; // use rand::SeedableRng; // pub fn creation(c: &mut Criterion) { // let mut group = c.benchmark_group("sort_dedup"); // let mut rand = rand::rngs::StdRng::from_seed([0u8; 32]); // for i in (100u64..=1000).step_by(100) { // let mut values = (0..i).collect::>(); // values.shuffle(&mut rand); // group.bench_with_input(BenchmarkId::new("via_vec", i), &values, // |b, values| b.iter(|| vs_create(black_box(values)))); // group.bench_with_input(BenchmarkId::new("via_btree", i), &values, // |b, values| b.iter(|| bs_create(black_box(values)))); // group.bench_with_input(BenchmarkId::new("via_hash", i), &values, // |b, values| b.iter(|| hs_create(black_box(values)))); // } // } // criterion_group!(benches, creation); // criterion_main!(benches); vec-collections-0.4.3/examples/alloc.csv000064400000000000000000001414300072674642500164010ustar 00000000000000n, BTreeSet alloc, BTreeSet persistent, BTreeSet nalloc, VecSet alloc, VecSet persistent, VecSet nalloc, HashSet alloc, HashSet persistent, HashSet nalloc 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 1, 56, 56, 1, 0, 0, 0, 28, 28, 1 2, 56, 56, 1, 0, 0, 0, 36, 36, 1 3, 56, 56, 1, 0, 0, 0, 36, 36, 1 4, 56, 56, 1, 0, 0, 0, 56, 56, 1 5, 56, 56, 1, 20, 20, 1, 56, 56, 1 6, 56, 56, 1, 24, 24, 1, 56, 56, 1 7, 56, 56, 1, 28, 28, 1, 56, 56, 1 8, 56, 56, 1, 32, 32, 1, 96, 96, 1 9, 56, 56, 1, 36, 36, 1, 96, 96, 1 10, 56, 56, 1, 40, 40, 1, 96, 96, 1 11, 56, 56, 1, 44, 44, 1, 96, 96, 1 12, 264, 264, 3, 48, 48, 1, 96, 96, 1 13, 264, 264, 3, 52, 52, 1, 96, 96, 1 14, 264, 264, 3, 56, 56, 1, 96, 96, 1 15, 264, 264, 3, 60, 60, 1, 176, 176, 1 16, 264, 264, 3, 64, 64, 1, 176, 176, 1 17, 264, 264, 3, 128, 68, 1, 176, 176, 1 18, 264, 264, 3, 128, 72, 1, 176, 176, 1 19, 320, 320, 4, 128, 76, 1, 176, 176, 1 20, 320, 320, 4, 128, 80, 1, 176, 176, 1 21, 320, 320, 4, 128, 84, 1, 176, 176, 1 22, 320, 320, 4, 128, 88, 1, 176, 176, 1 23, 320, 320, 4, 128, 92, 1, 176, 176, 1 24, 320, 320, 4, 128, 96, 1, 176, 176, 1 25, 320, 320, 4, 128, 100, 1, 176, 176, 1 26, 376, 376, 5, 128, 104, 1, 176, 176, 1 27, 376, 376, 5, 128, 108, 1, 176, 176, 1 28, 376, 376, 5, 128, 112, 1, 176, 176, 1 29, 376, 376, 5, 128, 116, 1, 336, 336, 1 30, 376, 376, 5, 128, 120, 1, 336, 336, 1 31, 376, 376, 5, 128, 124, 1, 336, 336, 1 32, 376, 376, 5, 128, 128, 1, 336, 336, 1 33, 432, 432, 6, 256, 132, 1, 336, 336, 1 34, 432, 432, 6, 256, 136, 1, 336, 336, 1 35, 432, 432, 6, 256, 140, 1, 336, 336, 1 36, 432, 432, 6, 256, 144, 1, 336, 336, 1 37, 432, 432, 6, 256, 148, 1, 336, 336, 1 38, 432, 432, 6, 256, 152, 1, 336, 336, 1 39, 432, 432, 6, 256, 156, 1, 336, 336, 1 40, 488, 488, 7, 256, 160, 1, 336, 336, 1 41, 488, 488, 7, 256, 164, 1, 336, 336, 1 42, 488, 488, 7, 256, 168, 1, 336, 336, 1 43, 488, 488, 7, 256, 172, 1, 336, 336, 1 44, 488, 488, 7, 256, 176, 1, 336, 336, 1 45, 488, 488, 7, 256, 180, 1, 336, 336, 1 46, 488, 488, 7, 256, 184, 1, 336, 336, 1 47, 544, 544, 8, 256, 188, 1, 336, 336, 1 48, 544, 544, 8, 256, 192, 1, 336, 336, 1 49, 544, 544, 8, 256, 196, 1, 336, 336, 1 50, 544, 544, 8, 256, 200, 1, 336, 336, 1 51, 544, 544, 8, 256, 204, 1, 336, 336, 1 52, 544, 544, 8, 256, 208, 1, 336, 336, 1 53, 544, 544, 8, 256, 212, 1, 336, 336, 1 54, 600, 600, 9, 256, 216, 1, 336, 336, 1 55, 600, 600, 9, 256, 220, 1, 336, 336, 1 56, 600, 600, 9, 256, 224, 1, 336, 336, 1 57, 600, 600, 9, 256, 228, 1, 656, 656, 1 58, 600, 600, 9, 256, 232, 1, 656, 656, 1 59, 600, 600, 9, 256, 236, 1, 656, 656, 1 60, 600, 600, 9, 256, 240, 1, 656, 656, 1 61, 656, 656, 10, 256, 244, 1, 656, 656, 1 62, 656, 656, 10, 256, 248, 1, 656, 656, 1 63, 656, 656, 10, 256, 252, 1, 656, 656, 1 64, 656, 656, 10, 256, 256, 1, 656, 656, 1 65, 656, 656, 10, 512, 260, 1, 656, 656, 1 66, 656, 656, 10, 512, 264, 1, 656, 656, 1 67, 656, 656, 10, 512, 268, 1, 656, 656, 1 68, 712, 712, 11, 512, 272, 1, 656, 656, 1 69, 712, 712, 11, 512, 276, 1, 656, 656, 1 70, 712, 712, 11, 512, 280, 1, 656, 656, 1 71, 712, 712, 11, 512, 284, 1, 656, 656, 1 72, 712, 712, 11, 512, 288, 1, 656, 656, 1 73, 712, 712, 11, 512, 292, 1, 656, 656, 1 74, 712, 712, 11, 512, 296, 1, 656, 656, 1 75, 768, 768, 12, 512, 300, 1, 656, 656, 1 76, 768, 768, 12, 512, 304, 1, 656, 656, 1 77, 768, 768, 12, 512, 308, 1, 656, 656, 1 78, 768, 768, 12, 512, 312, 1, 656, 656, 1 79, 768, 768, 12, 512, 316, 1, 656, 656, 1 80, 768, 768, 12, 512, 320, 1, 656, 656, 1 81, 768, 768, 12, 512, 324, 1, 656, 656, 1 82, 824, 824, 13, 512, 328, 1, 656, 656, 1 83, 824, 824, 13, 512, 332, 1, 656, 656, 1 84, 824, 824, 13, 512, 336, 1, 656, 656, 1 85, 824, 824, 13, 512, 340, 1, 656, 656, 1 86, 824, 824, 13, 512, 344, 1, 656, 656, 1 87, 824, 824, 13, 512, 348, 1, 656, 656, 1 88, 824, 824, 13, 512, 352, 1, 656, 656, 1 89, 1184, 1184, 16, 512, 356, 1, 656, 656, 1 90, 1184, 1184, 16, 512, 360, 1, 656, 656, 1 91, 1184, 1184, 16, 512, 364, 1, 656, 656, 1 92, 1184, 1184, 16, 512, 368, 1, 656, 656, 1 93, 1184, 1184, 16, 512, 372, 1, 656, 656, 1 94, 1184, 1184, 16, 512, 376, 1, 656, 656, 1 95, 1184, 1184, 16, 512, 380, 1, 656, 656, 1 96, 1240, 1240, 17, 512, 384, 1, 656, 656, 1 97, 1240, 1240, 17, 512, 388, 1, 656, 656, 1 98, 1240, 1240, 17, 512, 392, 1, 656, 656, 1 99, 1240, 1240, 17, 512, 396, 1, 656, 656, 1 100, 1240, 1240, 17, 512, 400, 1, 656, 656, 1 101, 1240, 1240, 17, 512, 404, 1, 656, 656, 1 102, 1240, 1240, 17, 512, 408, 1, 656, 656, 1 103, 1296, 1296, 18, 512, 412, 1, 656, 656, 1 104, 1296, 1296, 18, 512, 416, 1, 656, 656, 1 105, 1296, 1296, 18, 512, 420, 1, 656, 656, 1 106, 1296, 1296, 18, 512, 424, 1, 656, 656, 1 107, 1296, 1296, 18, 512, 428, 1, 656, 656, 1 108, 1296, 1296, 18, 512, 432, 1, 656, 656, 1 109, 1296, 1296, 18, 512, 436, 1, 656, 656, 1 110, 1352, 1352, 19, 512, 440, 1, 656, 656, 1 111, 1352, 1352, 19, 512, 444, 1, 656, 656, 1 112, 1352, 1352, 19, 512, 448, 1, 656, 656, 1 113, 1352, 1352, 19, 512, 452, 1, 1296, 1296, 1 114, 1352, 1352, 19, 512, 456, 1, 1296, 1296, 1 115, 1352, 1352, 19, 512, 460, 1, 1296, 1296, 1 116, 1352, 1352, 19, 512, 464, 1, 1296, 1296, 1 117, 1408, 1408, 20, 512, 468, 1, 1296, 1296, 1 118, 1408, 1408, 20, 512, 472, 1, 1296, 1296, 1 119, 1408, 1408, 20, 512, 476, 1, 1296, 1296, 1 120, 1408, 1408, 20, 512, 480, 1, 1296, 1296, 1 121, 1408, 1408, 20, 512, 484, 1, 1296, 1296, 1 122, 1408, 1408, 20, 512, 488, 1, 1296, 1296, 1 123, 1408, 1408, 20, 512, 492, 1, 1296, 1296, 1 124, 1464, 1464, 21, 512, 496, 1, 1296, 1296, 1 125, 1464, 1464, 21, 512, 500, 1, 1296, 1296, 1 126, 1464, 1464, 21, 512, 504, 1, 1296, 1296, 1 127, 1464, 1464, 21, 512, 508, 1, 1296, 1296, 1 128, 1464, 1464, 21, 512, 512, 1, 1296, 1296, 1 129, 1464, 1464, 21, 1024, 516, 1, 1296, 1296, 1 130, 1464, 1464, 21, 1024, 520, 1, 1296, 1296, 1 131, 1520, 1520, 22, 1024, 524, 1, 1296, 1296, 1 132, 1520, 1520, 22, 1024, 528, 1, 1296, 1296, 1 133, 1520, 1520, 22, 1024, 532, 1, 1296, 1296, 1 134, 1520, 1520, 22, 1024, 536, 1, 1296, 1296, 1 135, 1520, 1520, 22, 1024, 540, 1, 1296, 1296, 1 136, 1520, 1520, 22, 1024, 544, 1, 1296, 1296, 1 137, 1520, 1520, 22, 1024, 548, 1, 1296, 1296, 1 138, 1728, 1728, 24, 1024, 552, 1, 1296, 1296, 1 139, 1728, 1728, 24, 1024, 556, 1, 1296, 1296, 1 140, 1728, 1728, 24, 1024, 560, 1, 1296, 1296, 1 141, 1728, 1728, 24, 1024, 564, 1, 1296, 1296, 1 142, 1728, 1728, 24, 1024, 568, 1, 1296, 1296, 1 143, 1728, 1728, 24, 1024, 572, 1, 1296, 1296, 1 144, 1728, 1728, 24, 1024, 576, 1, 1296, 1296, 1 145, 1784, 1784, 25, 1024, 580, 1, 1296, 1296, 1 146, 1784, 1784, 25, 1024, 584, 1, 1296, 1296, 1 147, 1784, 1784, 25, 1024, 588, 1, 1296, 1296, 1 148, 1784, 1784, 25, 1024, 592, 1, 1296, 1296, 1 149, 1784, 1784, 25, 1024, 596, 1, 1296, 1296, 1 150, 1784, 1784, 25, 1024, 600, 1, 1296, 1296, 1 151, 1784, 1784, 25, 1024, 604, 1, 1296, 1296, 1 152, 1840, 1840, 26, 1024, 608, 1, 1296, 1296, 1 153, 1840, 1840, 26, 1024, 612, 1, 1296, 1296, 1 154, 1840, 1840, 26, 1024, 616, 1, 1296, 1296, 1 155, 1840, 1840, 26, 1024, 620, 1, 1296, 1296, 1 156, 1840, 1840, 26, 1024, 624, 1, 1296, 1296, 1 157, 1840, 1840, 26, 1024, 628, 1, 1296, 1296, 1 158, 1840, 1840, 26, 1024, 632, 1, 1296, 1296, 1 159, 1896, 1896, 27, 1024, 636, 1, 1296, 1296, 1 160, 1896, 1896, 27, 1024, 640, 1, 1296, 1296, 1 161, 1896, 1896, 27, 1024, 644, 1, 1296, 1296, 1 162, 1896, 1896, 27, 1024, 648, 1, 1296, 1296, 1 163, 1896, 1896, 27, 1024, 652, 1, 1296, 1296, 1 164, 1896, 1896, 27, 1024, 656, 1, 1296, 1296, 1 165, 1896, 1896, 27, 1024, 660, 1, 1296, 1296, 1 166, 1952, 1952, 28, 1024, 664, 1, 1296, 1296, 1 167, 1952, 1952, 28, 1024, 668, 1, 1296, 1296, 1 168, 1952, 1952, 28, 1024, 672, 1, 1296, 1296, 1 169, 1952, 1952, 28, 1024, 676, 1, 1296, 1296, 1 170, 1952, 1952, 28, 1024, 680, 1, 1296, 1296, 1 171, 1952, 1952, 28, 1024, 684, 1, 1296, 1296, 1 172, 1952, 1952, 28, 1024, 688, 1, 1296, 1296, 1 173, 2008, 2008, 29, 1024, 692, 1, 1296, 1296, 1 174, 2008, 2008, 29, 1024, 696, 1, 1296, 1296, 1 175, 2008, 2008, 29, 1024, 700, 1, 1296, 1296, 1 176, 2008, 2008, 29, 1024, 704, 1, 1296, 1296, 1 177, 2008, 2008, 29, 1024, 708, 1, 1296, 1296, 1 178, 2008, 2008, 29, 1024, 712, 1, 1296, 1296, 1 179, 2008, 2008, 29, 1024, 716, 1, 1296, 1296, 1 180, 2064, 2064, 30, 1024, 720, 1, 1296, 1296, 1 181, 2064, 2064, 30, 1024, 724, 1, 1296, 1296, 1 182, 2064, 2064, 30, 1024, 728, 1, 1296, 1296, 1 183, 2064, 2064, 30, 1024, 732, 1, 1296, 1296, 1 184, 2064, 2064, 30, 1024, 736, 1, 1296, 1296, 1 185, 2064, 2064, 30, 1024, 740, 1, 1296, 1296, 1 186, 2064, 2064, 30, 1024, 744, 1, 1296, 1296, 1 187, 2272, 2272, 32, 1024, 748, 1, 1296, 1296, 1 188, 2272, 2272, 32, 1024, 752, 1, 1296, 1296, 1 189, 2272, 2272, 32, 1024, 756, 1, 1296, 1296, 1 190, 2272, 2272, 32, 1024, 760, 1, 1296, 1296, 1 191, 2272, 2272, 32, 1024, 764, 1, 1296, 1296, 1 192, 2272, 2272, 32, 1024, 768, 1, 1296, 1296, 1 193, 2272, 2272, 32, 1024, 772, 1, 1296, 1296, 1 194, 2328, 2328, 33, 1024, 776, 1, 1296, 1296, 1 195, 2328, 2328, 33, 1024, 780, 1, 1296, 1296, 1 196, 2328, 2328, 33, 1024, 784, 1, 1296, 1296, 1 197, 2328, 2328, 33, 1024, 788, 1, 1296, 1296, 1 198, 2328, 2328, 33, 1024, 792, 1, 1296, 1296, 1 199, 2328, 2328, 33, 1024, 796, 1, 1296, 1296, 1 200, 2328, 2328, 33, 1024, 800, 1, 1296, 1296, 1 201, 2384, 2384, 34, 1024, 804, 1, 1296, 1296, 1 202, 2384, 2384, 34, 1024, 808, 1, 1296, 1296, 1 203, 2384, 2384, 34, 1024, 812, 1, 1296, 1296, 1 204, 2384, 2384, 34, 1024, 816, 1, 1296, 1296, 1 205, 2384, 2384, 34, 1024, 820, 1, 1296, 1296, 1 206, 2384, 2384, 34, 1024, 824, 1, 1296, 1296, 1 207, 2384, 2384, 34, 1024, 828, 1, 1296, 1296, 1 208, 2440, 2440, 35, 1024, 832, 1, 1296, 1296, 1 209, 2440, 2440, 35, 1024, 836, 1, 1296, 1296, 1 210, 2440, 2440, 35, 1024, 840, 1, 1296, 1296, 1 211, 2440, 2440, 35, 1024, 844, 1, 1296, 1296, 1 212, 2440, 2440, 35, 1024, 848, 1, 1296, 1296, 1 213, 2440, 2440, 35, 1024, 852, 1, 1296, 1296, 1 214, 2440, 2440, 35, 1024, 856, 1, 1296, 1296, 1 215, 2496, 2496, 36, 1024, 860, 1, 1296, 1296, 1 216, 2496, 2496, 36, 1024, 864, 1, 1296, 1296, 1 217, 2496, 2496, 36, 1024, 868, 1, 1296, 1296, 1 218, 2496, 2496, 36, 1024, 872, 1, 1296, 1296, 1 219, 2496, 2496, 36, 1024, 876, 1, 1296, 1296, 1 220, 2496, 2496, 36, 1024, 880, 1, 1296, 1296, 1 221, 2496, 2496, 36, 1024, 884, 1, 1296, 1296, 1 222, 2552, 2552, 37, 1024, 888, 1, 1296, 1296, 1 223, 2552, 2552, 37, 1024, 892, 1, 1296, 1296, 1 224, 2552, 2552, 37, 1024, 896, 1, 1296, 1296, 1 225, 2552, 2552, 37, 1024, 900, 1, 2576, 2576, 1 226, 2552, 2552, 37, 1024, 904, 1, 2576, 2576, 1 227, 2552, 2552, 37, 1024, 908, 1, 2576, 2576, 1 228, 2552, 2552, 37, 1024, 912, 1, 2576, 2576, 1 229, 2608, 2608, 38, 1024, 916, 1, 2576, 2576, 1 230, 2608, 2608, 38, 1024, 920, 1, 2576, 2576, 1 231, 2608, 2608, 38, 1024, 924, 1, 2576, 2576, 1 232, 2608, 2608, 38, 1024, 928, 1, 2576, 2576, 1 233, 2608, 2608, 38, 1024, 932, 1, 2576, 2576, 1 234, 2608, 2608, 38, 1024, 936, 1, 2576, 2576, 1 235, 2608, 2608, 38, 1024, 940, 1, 2576, 2576, 1 236, 2816, 2816, 40, 1024, 944, 1, 2576, 2576, 1 237, 2816, 2816, 40, 1024, 948, 1, 2576, 2576, 1 238, 2816, 2816, 40, 1024, 952, 1, 2576, 2576, 1 239, 2816, 2816, 40, 1024, 956, 1, 2576, 2576, 1 240, 2816, 2816, 40, 1024, 960, 1, 2576, 2576, 1 241, 2816, 2816, 40, 1024, 964, 1, 2576, 2576, 1 242, 2816, 2816, 40, 1024, 968, 1, 2576, 2576, 1 243, 2872, 2872, 41, 1024, 972, 1, 2576, 2576, 1 244, 2872, 2872, 41, 1024, 976, 1, 2576, 2576, 1 245, 2872, 2872, 41, 1024, 980, 1, 2576, 2576, 1 246, 2872, 2872, 41, 1024, 984, 1, 2576, 2576, 1 247, 2872, 2872, 41, 1024, 988, 1, 2576, 2576, 1 248, 2872, 2872, 41, 1024, 992, 1, 2576, 2576, 1 249, 2872, 2872, 41, 1024, 996, 1, 2576, 2576, 1 250, 2928, 2928, 42, 1024, 1000, 1, 2576, 2576, 1 251, 2928, 2928, 42, 1024, 1004, 1, 2576, 2576, 1 252, 2928, 2928, 42, 1024, 1008, 1, 2576, 2576, 1 253, 2928, 2928, 42, 1024, 1012, 1, 2576, 2576, 1 254, 2928, 2928, 42, 1024, 1016, 1, 2576, 2576, 1 255, 2928, 2928, 42, 1024, 1020, 1, 2576, 2576, 1 256, 2928, 2928, 42, 1024, 1024, 1, 2576, 2576, 1 257, 2984, 2984, 43, 2048, 1028, 1, 2576, 2576, 1 258, 2984, 2984, 43, 2048, 1032, 1, 2576, 2576, 1 259, 2984, 2984, 43, 2048, 1036, 1, 2576, 2576, 1 260, 2984, 2984, 43, 2048, 1040, 1, 2576, 2576, 1 261, 2984, 2984, 43, 2048, 1044, 1, 2576, 2576, 1 262, 2984, 2984, 43, 2048, 1048, 1, 2576, 2576, 1 263, 2984, 2984, 43, 2048, 1052, 1, 2576, 2576, 1 264, 3040, 3040, 44, 2048, 1056, 1, 2576, 2576, 1 265, 3040, 3040, 44, 2048, 1060, 1, 2576, 2576, 1 266, 3040, 3040, 44, 2048, 1064, 1, 2576, 2576, 1 267, 3040, 3040, 44, 2048, 1068, 1, 2576, 2576, 1 268, 3040, 3040, 44, 2048, 1072, 1, 2576, 2576, 1 269, 3040, 3040, 44, 2048, 1076, 1, 2576, 2576, 1 270, 3040, 3040, 44, 2048, 1080, 1, 2576, 2576, 1 271, 3096, 3096, 45, 2048, 1084, 1, 2576, 2576, 1 272, 3096, 3096, 45, 2048, 1088, 1, 2576, 2576, 1 273, 3096, 3096, 45, 2048, 1092, 1, 2576, 2576, 1 274, 3096, 3096, 45, 2048, 1096, 1, 2576, 2576, 1 275, 3096, 3096, 45, 2048, 1100, 1, 2576, 2576, 1 276, 3096, 3096, 45, 2048, 1104, 1, 2576, 2576, 1 277, 3096, 3096, 45, 2048, 1108, 1, 2576, 2576, 1 278, 3152, 3152, 46, 2048, 1112, 1, 2576, 2576, 1 279, 3152, 3152, 46, 2048, 1116, 1, 2576, 2576, 1 280, 3152, 3152, 46, 2048, 1120, 1, 2576, 2576, 1 281, 3152, 3152, 46, 2048, 1124, 1, 2576, 2576, 1 282, 3152, 3152, 46, 2048, 1128, 1, 2576, 2576, 1 283, 3152, 3152, 46, 2048, 1132, 1, 2576, 2576, 1 284, 3152, 3152, 46, 2048, 1136, 1, 2576, 2576, 1 285, 3360, 3360, 48, 2048, 1140, 1, 2576, 2576, 1 286, 3360, 3360, 48, 2048, 1144, 1, 2576, 2576, 1 287, 3360, 3360, 48, 2048, 1148, 1, 2576, 2576, 1 288, 3360, 3360, 48, 2048, 1152, 1, 2576, 2576, 1 289, 3360, 3360, 48, 2048, 1156, 1, 2576, 2576, 1 290, 3360, 3360, 48, 2048, 1160, 1, 2576, 2576, 1 291, 3360, 3360, 48, 2048, 1164, 1, 2576, 2576, 1 292, 3416, 3416, 49, 2048, 1168, 1, 2576, 2576, 1 293, 3416, 3416, 49, 2048, 1172, 1, 2576, 2576, 1 294, 3416, 3416, 49, 2048, 1176, 1, 2576, 2576, 1 295, 3416, 3416, 49, 2048, 1180, 1, 2576, 2576, 1 296, 3416, 3416, 49, 2048, 1184, 1, 2576, 2576, 1 297, 3416, 3416, 49, 2048, 1188, 1, 2576, 2576, 1 298, 3416, 3416, 49, 2048, 1192, 1, 2576, 2576, 1 299, 3472, 3472, 50, 2048, 1196, 1, 2576, 2576, 1 300, 3472, 3472, 50, 2048, 1200, 1, 2576, 2576, 1 301, 3472, 3472, 50, 2048, 1204, 1, 2576, 2576, 1 302, 3472, 3472, 50, 2048, 1208, 1, 2576, 2576, 1 303, 3472, 3472, 50, 2048, 1212, 1, 2576, 2576, 1 304, 3472, 3472, 50, 2048, 1216, 1, 2576, 2576, 1 305, 3472, 3472, 50, 2048, 1220, 1, 2576, 2576, 1 306, 3528, 3528, 51, 2048, 1224, 1, 2576, 2576, 1 307, 3528, 3528, 51, 2048, 1228, 1, 2576, 2576, 1 308, 3528, 3528, 51, 2048, 1232, 1, 2576, 2576, 1 309, 3528, 3528, 51, 2048, 1236, 1, 2576, 2576, 1 310, 3528, 3528, 51, 2048, 1240, 1, 2576, 2576, 1 311, 3528, 3528, 51, 2048, 1244, 1, 2576, 2576, 1 312, 3528, 3528, 51, 2048, 1248, 1, 2576, 2576, 1 313, 3584, 3584, 52, 2048, 1252, 1, 2576, 2576, 1 314, 3584, 3584, 52, 2048, 1256, 1, 2576, 2576, 1 315, 3584, 3584, 52, 2048, 1260, 1, 2576, 2576, 1 316, 3584, 3584, 52, 2048, 1264, 1, 2576, 2576, 1 317, 3584, 3584, 52, 2048, 1268, 1, 2576, 2576, 1 318, 3584, 3584, 52, 2048, 1272, 1, 2576, 2576, 1 319, 3584, 3584, 52, 2048, 1276, 1, 2576, 2576, 1 320, 3640, 3640, 53, 2048, 1280, 1, 2576, 2576, 1 321, 3640, 3640, 53, 2048, 1284, 1, 2576, 2576, 1 322, 3640, 3640, 53, 2048, 1288, 1, 2576, 2576, 1 323, 3640, 3640, 53, 2048, 1292, 1, 2576, 2576, 1 324, 3640, 3640, 53, 2048, 1296, 1, 2576, 2576, 1 325, 3640, 3640, 53, 2048, 1300, 1, 2576, 2576, 1 326, 3640, 3640, 53, 2048, 1304, 1, 2576, 2576, 1 327, 3696, 3696, 54, 2048, 1308, 1, 2576, 2576, 1 328, 3696, 3696, 54, 2048, 1312, 1, 2576, 2576, 1 329, 3696, 3696, 54, 2048, 1316, 1, 2576, 2576, 1 330, 3696, 3696, 54, 2048, 1320, 1, 2576, 2576, 1 331, 3696, 3696, 54, 2048, 1324, 1, 2576, 2576, 1 332, 3696, 3696, 54, 2048, 1328, 1, 2576, 2576, 1 333, 3696, 3696, 54, 2048, 1332, 1, 2576, 2576, 1 334, 3904, 3904, 56, 2048, 1336, 1, 2576, 2576, 1 335, 3904, 3904, 56, 2048, 1340, 1, 2576, 2576, 1 336, 3904, 3904, 56, 2048, 1344, 1, 2576, 2576, 1 337, 3904, 3904, 56, 2048, 1348, 1, 2576, 2576, 1 338, 3904, 3904, 56, 2048, 1352, 1, 2576, 2576, 1 339, 3904, 3904, 56, 2048, 1356, 1, 2576, 2576, 1 340, 3904, 3904, 56, 2048, 1360, 1, 2576, 2576, 1 341, 3960, 3960, 57, 2048, 1364, 1, 2576, 2576, 1 342, 3960, 3960, 57, 2048, 1368, 1, 2576, 2576, 1 343, 3960, 3960, 57, 2048, 1372, 1, 2576, 2576, 1 344, 3960, 3960, 57, 2048, 1376, 1, 2576, 2576, 1 345, 3960, 3960, 57, 2048, 1380, 1, 2576, 2576, 1 346, 3960, 3960, 57, 2048, 1384, 1, 2576, 2576, 1 347, 3960, 3960, 57, 2048, 1388, 1, 2576, 2576, 1 348, 4016, 4016, 58, 2048, 1392, 1, 2576, 2576, 1 349, 4016, 4016, 58, 2048, 1396, 1, 2576, 2576, 1 350, 4016, 4016, 58, 2048, 1400, 1, 2576, 2576, 1 351, 4016, 4016, 58, 2048, 1404, 1, 2576, 2576, 1 352, 4016, 4016, 58, 2048, 1408, 1, 2576, 2576, 1 353, 4016, 4016, 58, 2048, 1412, 1, 2576, 2576, 1 354, 4016, 4016, 58, 2048, 1416, 1, 2576, 2576, 1 355, 4072, 4072, 59, 2048, 1420, 1, 2576, 2576, 1 356, 4072, 4072, 59, 2048, 1424, 1, 2576, 2576, 1 357, 4072, 4072, 59, 2048, 1428, 1, 2576, 2576, 1 358, 4072, 4072, 59, 2048, 1432, 1, 2576, 2576, 1 359, 4072, 4072, 59, 2048, 1436, 1, 2576, 2576, 1 360, 4072, 4072, 59, 2048, 1440, 1, 2576, 2576, 1 361, 4072, 4072, 59, 2048, 1444, 1, 2576, 2576, 1 362, 4128, 4128, 60, 2048, 1448, 1, 2576, 2576, 1 363, 4128, 4128, 60, 2048, 1452, 1, 2576, 2576, 1 364, 4128, 4128, 60, 2048, 1456, 1, 2576, 2576, 1 365, 4128, 4128, 60, 2048, 1460, 1, 2576, 2576, 1 366, 4128, 4128, 60, 2048, 1464, 1, 2576, 2576, 1 367, 4128, 4128, 60, 2048, 1468, 1, 2576, 2576, 1 368, 4128, 4128, 60, 2048, 1472, 1, 2576, 2576, 1 369, 4184, 4184, 61, 2048, 1476, 1, 2576, 2576, 1 370, 4184, 4184, 61, 2048, 1480, 1, 2576, 2576, 1 371, 4184, 4184, 61, 2048, 1484, 1, 2576, 2576, 1 372, 4184, 4184, 61, 2048, 1488, 1, 2576, 2576, 1 373, 4184, 4184, 61, 2048, 1492, 1, 2576, 2576, 1 374, 4184, 4184, 61, 2048, 1496, 1, 2576, 2576, 1 375, 4184, 4184, 61, 2048, 1500, 1, 2576, 2576, 1 376, 4240, 4240, 62, 2048, 1504, 1, 2576, 2576, 1 377, 4240, 4240, 62, 2048, 1508, 1, 2576, 2576, 1 378, 4240, 4240, 62, 2048, 1512, 1, 2576, 2576, 1 379, 4240, 4240, 62, 2048, 1516, 1, 2576, 2576, 1 380, 4240, 4240, 62, 2048, 1520, 1, 2576, 2576, 1 381, 4240, 4240, 62, 2048, 1524, 1, 2576, 2576, 1 382, 4240, 4240, 62, 2048, 1528, 1, 2576, 2576, 1 383, 4448, 4448, 64, 2048, 1532, 1, 2576, 2576, 1 384, 4448, 4448, 64, 2048, 1536, 1, 2576, 2576, 1 385, 4448, 4448, 64, 2048, 1540, 1, 2576, 2576, 1 386, 4448, 4448, 64, 2048, 1544, 1, 2576, 2576, 1 387, 4448, 4448, 64, 2048, 1548, 1, 2576, 2576, 1 388, 4448, 4448, 64, 2048, 1552, 1, 2576, 2576, 1 389, 4448, 4448, 64, 2048, 1556, 1, 2576, 2576, 1 390, 4504, 4504, 65, 2048, 1560, 1, 2576, 2576, 1 391, 4504, 4504, 65, 2048, 1564, 1, 2576, 2576, 1 392, 4504, 4504, 65, 2048, 1568, 1, 2576, 2576, 1 393, 4504, 4504, 65, 2048, 1572, 1, 2576, 2576, 1 394, 4504, 4504, 65, 2048, 1576, 1, 2576, 2576, 1 395, 4504, 4504, 65, 2048, 1580, 1, 2576, 2576, 1 396, 4504, 4504, 65, 2048, 1584, 1, 2576, 2576, 1 397, 4560, 4560, 66, 2048, 1588, 1, 2576, 2576, 1 398, 4560, 4560, 66, 2048, 1592, 1, 2576, 2576, 1 399, 4560, 4560, 66, 2048, 1596, 1, 2576, 2576, 1 400, 4560, 4560, 66, 2048, 1600, 1, 2576, 2576, 1 401, 4560, 4560, 66, 2048, 1604, 1, 2576, 2576, 1 402, 4560, 4560, 66, 2048, 1608, 1, 2576, 2576, 1 403, 4560, 4560, 66, 2048, 1612, 1, 2576, 2576, 1 404, 4616, 4616, 67, 2048, 1616, 1, 2576, 2576, 1 405, 4616, 4616, 67, 2048, 1620, 1, 2576, 2576, 1 406, 4616, 4616, 67, 2048, 1624, 1, 2576, 2576, 1 407, 4616, 4616, 67, 2048, 1628, 1, 2576, 2576, 1 408, 4616, 4616, 67, 2048, 1632, 1, 2576, 2576, 1 409, 4616, 4616, 67, 2048, 1636, 1, 2576, 2576, 1 410, 4616, 4616, 67, 2048, 1640, 1, 2576, 2576, 1 411, 4672, 4672, 68, 2048, 1644, 1, 2576, 2576, 1 412, 4672, 4672, 68, 2048, 1648, 1, 2576, 2576, 1 413, 4672, 4672, 68, 2048, 1652, 1, 2576, 2576, 1 414, 4672, 4672, 68, 2048, 1656, 1, 2576, 2576, 1 415, 4672, 4672, 68, 2048, 1660, 1, 2576, 2576, 1 416, 4672, 4672, 68, 2048, 1664, 1, 2576, 2576, 1 417, 4672, 4672, 68, 2048, 1668, 1, 2576, 2576, 1 418, 4728, 4728, 69, 2048, 1672, 1, 2576, 2576, 1 419, 4728, 4728, 69, 2048, 1676, 1, 2576, 2576, 1 420, 4728, 4728, 69, 2048, 1680, 1, 2576, 2576, 1 421, 4728, 4728, 69, 2048, 1684, 1, 2576, 2576, 1 422, 4728, 4728, 69, 2048, 1688, 1, 2576, 2576, 1 423, 4728, 4728, 69, 2048, 1692, 1, 2576, 2576, 1 424, 4728, 4728, 69, 2048, 1696, 1, 2576, 2576, 1 425, 4784, 4784, 70, 2048, 1700, 1, 2576, 2576, 1 426, 4784, 4784, 70, 2048, 1704, 1, 2576, 2576, 1 427, 4784, 4784, 70, 2048, 1708, 1, 2576, 2576, 1 428, 4784, 4784, 70, 2048, 1712, 1, 2576, 2576, 1 429, 4784, 4784, 70, 2048, 1716, 1, 2576, 2576, 1 430, 4784, 4784, 70, 2048, 1720, 1, 2576, 2576, 1 431, 4784, 4784, 70, 2048, 1724, 1, 2576, 2576, 1 432, 4992, 4992, 72, 2048, 1728, 1, 2576, 2576, 1 433, 4992, 4992, 72, 2048, 1732, 1, 2576, 2576, 1 434, 4992, 4992, 72, 2048, 1736, 1, 2576, 2576, 1 435, 4992, 4992, 72, 2048, 1740, 1, 2576, 2576, 1 436, 4992, 4992, 72, 2048, 1744, 1, 2576, 2576, 1 437, 4992, 4992, 72, 2048, 1748, 1, 2576, 2576, 1 438, 4992, 4992, 72, 2048, 1752, 1, 2576, 2576, 1 439, 5048, 5048, 73, 2048, 1756, 1, 2576, 2576, 1 440, 5048, 5048, 73, 2048, 1760, 1, 2576, 2576, 1 441, 5048, 5048, 73, 2048, 1764, 1, 2576, 2576, 1 442, 5048, 5048, 73, 2048, 1768, 1, 2576, 2576, 1 443, 5048, 5048, 73, 2048, 1772, 1, 2576, 2576, 1 444, 5048, 5048, 73, 2048, 1776, 1, 2576, 2576, 1 445, 5048, 5048, 73, 2048, 1780, 1, 2576, 2576, 1 446, 5104, 5104, 74, 2048, 1784, 1, 2576, 2576, 1 447, 5104, 5104, 74, 2048, 1788, 1, 2576, 2576, 1 448, 5104, 5104, 74, 2048, 1792, 1, 2576, 2576, 1 449, 5104, 5104, 74, 2048, 1796, 1, 5136, 5136, 1 450, 5104, 5104, 74, 2048, 1800, 1, 5136, 5136, 1 451, 5104, 5104, 74, 2048, 1804, 1, 5136, 5136, 1 452, 5104, 5104, 74, 2048, 1808, 1, 5136, 5136, 1 453, 5160, 5160, 75, 2048, 1812, 1, 5136, 5136, 1 454, 5160, 5160, 75, 2048, 1816, 1, 5136, 5136, 1 455, 5160, 5160, 75, 2048, 1820, 1, 5136, 5136, 1 456, 5160, 5160, 75, 2048, 1824, 1, 5136, 5136, 1 457, 5160, 5160, 75, 2048, 1828, 1, 5136, 5136, 1 458, 5160, 5160, 75, 2048, 1832, 1, 5136, 5136, 1 459, 5160, 5160, 75, 2048, 1836, 1, 5136, 5136, 1 460, 5216, 5216, 76, 2048, 1840, 1, 5136, 5136, 1 461, 5216, 5216, 76, 2048, 1844, 1, 5136, 5136, 1 462, 5216, 5216, 76, 2048, 1848, 1, 5136, 5136, 1 463, 5216, 5216, 76, 2048, 1852, 1, 5136, 5136, 1 464, 5216, 5216, 76, 2048, 1856, 1, 5136, 5136, 1 465, 5216, 5216, 76, 2048, 1860, 1, 5136, 5136, 1 466, 5216, 5216, 76, 2048, 1864, 1, 5136, 5136, 1 467, 5272, 5272, 77, 2048, 1868, 1, 5136, 5136, 1 468, 5272, 5272, 77, 2048, 1872, 1, 5136, 5136, 1 469, 5272, 5272, 77, 2048, 1876, 1, 5136, 5136, 1 470, 5272, 5272, 77, 2048, 1880, 1, 5136, 5136, 1 471, 5272, 5272, 77, 2048, 1884, 1, 5136, 5136, 1 472, 5272, 5272, 77, 2048, 1888, 1, 5136, 5136, 1 473, 5272, 5272, 77, 2048, 1892, 1, 5136, 5136, 1 474, 5328, 5328, 78, 2048, 1896, 1, 5136, 5136, 1 475, 5328, 5328, 78, 2048, 1900, 1, 5136, 5136, 1 476, 5328, 5328, 78, 2048, 1904, 1, 5136, 5136, 1 477, 5328, 5328, 78, 2048, 1908, 1, 5136, 5136, 1 478, 5328, 5328, 78, 2048, 1912, 1, 5136, 5136, 1 479, 5328, 5328, 78, 2048, 1916, 1, 5136, 5136, 1 480, 5328, 5328, 78, 2048, 1920, 1, 5136, 5136, 1 481, 5536, 5536, 80, 2048, 1924, 1, 5136, 5136, 1 482, 5536, 5536, 80, 2048, 1928, 1, 5136, 5136, 1 483, 5536, 5536, 80, 2048, 1932, 1, 5136, 5136, 1 484, 5536, 5536, 80, 2048, 1936, 1, 5136, 5136, 1 485, 5536, 5536, 80, 2048, 1940, 1, 5136, 5136, 1 486, 5536, 5536, 80, 2048, 1944, 1, 5136, 5136, 1 487, 5536, 5536, 80, 2048, 1948, 1, 5136, 5136, 1 488, 5592, 5592, 81, 2048, 1952, 1, 5136, 5136, 1 489, 5592, 5592, 81, 2048, 1956, 1, 5136, 5136, 1 490, 5592, 5592, 81, 2048, 1960, 1, 5136, 5136, 1 491, 5592, 5592, 81, 2048, 1964, 1, 5136, 5136, 1 492, 5592, 5592, 81, 2048, 1968, 1, 5136, 5136, 1 493, 5592, 5592, 81, 2048, 1972, 1, 5136, 5136, 1 494, 5592, 5592, 81, 2048, 1976, 1, 5136, 5136, 1 495, 5648, 5648, 82, 2048, 1980, 1, 5136, 5136, 1 496, 5648, 5648, 82, 2048, 1984, 1, 5136, 5136, 1 497, 5648, 5648, 82, 2048, 1988, 1, 5136, 5136, 1 498, 5648, 5648, 82, 2048, 1992, 1, 5136, 5136, 1 499, 5648, 5648, 82, 2048, 1996, 1, 5136, 5136, 1 500, 5648, 5648, 82, 2048, 2000, 1, 5136, 5136, 1 501, 5648, 5648, 82, 2048, 2004, 1, 5136, 5136, 1 502, 5704, 5704, 83, 2048, 2008, 1, 5136, 5136, 1 503, 5704, 5704, 83, 2048, 2012, 1, 5136, 5136, 1 504, 5704, 5704, 83, 2048, 2016, 1, 5136, 5136, 1 505, 5704, 5704, 83, 2048, 2020, 1, 5136, 5136, 1 506, 5704, 5704, 83, 2048, 2024, 1, 5136, 5136, 1 507, 5704, 5704, 83, 2048, 2028, 1, 5136, 5136, 1 508, 5704, 5704, 83, 2048, 2032, 1, 5136, 5136, 1 509, 5760, 5760, 84, 2048, 2036, 1, 5136, 5136, 1 510, 5760, 5760, 84, 2048, 2040, 1, 5136, 5136, 1 511, 5760, 5760, 84, 2048, 2044, 1, 5136, 5136, 1 512, 5760, 5760, 84, 2048, 2048, 1, 5136, 5136, 1 513, 5760, 5760, 84, 4096, 2052, 1, 5136, 5136, 1 514, 5760, 5760, 84, 4096, 2056, 1, 5136, 5136, 1 515, 5760, 5760, 84, 4096, 2060, 1, 5136, 5136, 1 516, 5816, 5816, 85, 4096, 2064, 1, 5136, 5136, 1 517, 5816, 5816, 85, 4096, 2068, 1, 5136, 5136, 1 518, 5816, 5816, 85, 4096, 2072, 1, 5136, 5136, 1 519, 5816, 5816, 85, 4096, 2076, 1, 5136, 5136, 1 520, 5816, 5816, 85, 4096, 2080, 1, 5136, 5136, 1 521, 5816, 5816, 85, 4096, 2084, 1, 5136, 5136, 1 522, 5816, 5816, 85, 4096, 2088, 1, 5136, 5136, 1 523, 5872, 5872, 86, 4096, 2092, 1, 5136, 5136, 1 524, 5872, 5872, 86, 4096, 2096, 1, 5136, 5136, 1 525, 5872, 5872, 86, 4096, 2100, 1, 5136, 5136, 1 526, 5872, 5872, 86, 4096, 2104, 1, 5136, 5136, 1 527, 5872, 5872, 86, 4096, 2108, 1, 5136, 5136, 1 528, 5872, 5872, 86, 4096, 2112, 1, 5136, 5136, 1 529, 5872, 5872, 86, 4096, 2116, 1, 5136, 5136, 1 530, 6080, 6080, 88, 4096, 2120, 1, 5136, 5136, 1 531, 6080, 6080, 88, 4096, 2124, 1, 5136, 5136, 1 532, 6080, 6080, 88, 4096, 2128, 1, 5136, 5136, 1 533, 6080, 6080, 88, 4096, 2132, 1, 5136, 5136, 1 534, 6080, 6080, 88, 4096, 2136, 1, 5136, 5136, 1 535, 6080, 6080, 88, 4096, 2140, 1, 5136, 5136, 1 536, 6080, 6080, 88, 4096, 2144, 1, 5136, 5136, 1 537, 6136, 6136, 89, 4096, 2148, 1, 5136, 5136, 1 538, 6136, 6136, 89, 4096, 2152, 1, 5136, 5136, 1 539, 6136, 6136, 89, 4096, 2156, 1, 5136, 5136, 1 540, 6136, 6136, 89, 4096, 2160, 1, 5136, 5136, 1 541, 6136, 6136, 89, 4096, 2164, 1, 5136, 5136, 1 542, 6136, 6136, 89, 4096, 2168, 1, 5136, 5136, 1 543, 6136, 6136, 89, 4096, 2172, 1, 5136, 5136, 1 544, 6192, 6192, 90, 4096, 2176, 1, 5136, 5136, 1 545, 6192, 6192, 90, 4096, 2180, 1, 5136, 5136, 1 546, 6192, 6192, 90, 4096, 2184, 1, 5136, 5136, 1 547, 6192, 6192, 90, 4096, 2188, 1, 5136, 5136, 1 548, 6192, 6192, 90, 4096, 2192, 1, 5136, 5136, 1 549, 6192, 6192, 90, 4096, 2196, 1, 5136, 5136, 1 550, 6192, 6192, 90, 4096, 2200, 1, 5136, 5136, 1 551, 6248, 6248, 91, 4096, 2204, 1, 5136, 5136, 1 552, 6248, 6248, 91, 4096, 2208, 1, 5136, 5136, 1 553, 6248, 6248, 91, 4096, 2212, 1, 5136, 5136, 1 554, 6248, 6248, 91, 4096, 2216, 1, 5136, 5136, 1 555, 6248, 6248, 91, 4096, 2220, 1, 5136, 5136, 1 556, 6248, 6248, 91, 4096, 2224, 1, 5136, 5136, 1 557, 6248, 6248, 91, 4096, 2228, 1, 5136, 5136, 1 558, 6304, 6304, 92, 4096, 2232, 1, 5136, 5136, 1 559, 6304, 6304, 92, 4096, 2236, 1, 5136, 5136, 1 560, 6304, 6304, 92, 4096, 2240, 1, 5136, 5136, 1 561, 6304, 6304, 92, 4096, 2244, 1, 5136, 5136, 1 562, 6304, 6304, 92, 4096, 2248, 1, 5136, 5136, 1 563, 6304, 6304, 92, 4096, 2252, 1, 5136, 5136, 1 564, 6304, 6304, 92, 4096, 2256, 1, 5136, 5136, 1 565, 6360, 6360, 93, 4096, 2260, 1, 5136, 5136, 1 566, 6360, 6360, 93, 4096, 2264, 1, 5136, 5136, 1 567, 6360, 6360, 93, 4096, 2268, 1, 5136, 5136, 1 568, 6360, 6360, 93, 4096, 2272, 1, 5136, 5136, 1 569, 6360, 6360, 93, 4096, 2276, 1, 5136, 5136, 1 570, 6360, 6360, 93, 4096, 2280, 1, 5136, 5136, 1 571, 6360, 6360, 93, 4096, 2284, 1, 5136, 5136, 1 572, 6416, 6416, 94, 4096, 2288, 1, 5136, 5136, 1 573, 6416, 6416, 94, 4096, 2292, 1, 5136, 5136, 1 574, 6416, 6416, 94, 4096, 2296, 1, 5136, 5136, 1 575, 6416, 6416, 94, 4096, 2300, 1, 5136, 5136, 1 576, 6416, 6416, 94, 4096, 2304, 1, 5136, 5136, 1 577, 6416, 6416, 94, 4096, 2308, 1, 5136, 5136, 1 578, 6416, 6416, 94, 4096, 2312, 1, 5136, 5136, 1 579, 6624, 6624, 96, 4096, 2316, 1, 5136, 5136, 1 580, 6624, 6624, 96, 4096, 2320, 1, 5136, 5136, 1 581, 6624, 6624, 96, 4096, 2324, 1, 5136, 5136, 1 582, 6624, 6624, 96, 4096, 2328, 1, 5136, 5136, 1 583, 6624, 6624, 96, 4096, 2332, 1, 5136, 5136, 1 584, 6624, 6624, 96, 4096, 2336, 1, 5136, 5136, 1 585, 6624, 6624, 96, 4096, 2340, 1, 5136, 5136, 1 586, 6680, 6680, 97, 4096, 2344, 1, 5136, 5136, 1 587, 6680, 6680, 97, 4096, 2348, 1, 5136, 5136, 1 588, 6680, 6680, 97, 4096, 2352, 1, 5136, 5136, 1 589, 6680, 6680, 97, 4096, 2356, 1, 5136, 5136, 1 590, 6680, 6680, 97, 4096, 2360, 1, 5136, 5136, 1 591, 6680, 6680, 97, 4096, 2364, 1, 5136, 5136, 1 592, 6680, 6680, 97, 4096, 2368, 1, 5136, 5136, 1 593, 6736, 6736, 98, 4096, 2372, 1, 5136, 5136, 1 594, 6736, 6736, 98, 4096, 2376, 1, 5136, 5136, 1 595, 6736, 6736, 98, 4096, 2380, 1, 5136, 5136, 1 596, 6736, 6736, 98, 4096, 2384, 1, 5136, 5136, 1 597, 6736, 6736, 98, 4096, 2388, 1, 5136, 5136, 1 598, 6736, 6736, 98, 4096, 2392, 1, 5136, 5136, 1 599, 6736, 6736, 98, 4096, 2396, 1, 5136, 5136, 1 600, 6792, 6792, 99, 4096, 2400, 1, 5136, 5136, 1 601, 6792, 6792, 99, 4096, 2404, 1, 5136, 5136, 1 602, 6792, 6792, 99, 4096, 2408, 1, 5136, 5136, 1 603, 6792, 6792, 99, 4096, 2412, 1, 5136, 5136, 1 604, 6792, 6792, 99, 4096, 2416, 1, 5136, 5136, 1 605, 6792, 6792, 99, 4096, 2420, 1, 5136, 5136, 1 606, 6792, 6792, 99, 4096, 2424, 1, 5136, 5136, 1 607, 6848, 6848, 100, 4096, 2428, 1, 5136, 5136, 1 608, 6848, 6848, 100, 4096, 2432, 1, 5136, 5136, 1 609, 6848, 6848, 100, 4096, 2436, 1, 5136, 5136, 1 610, 6848, 6848, 100, 4096, 2440, 1, 5136, 5136, 1 611, 6848, 6848, 100, 4096, 2444, 1, 5136, 5136, 1 612, 6848, 6848, 100, 4096, 2448, 1, 5136, 5136, 1 613, 6848, 6848, 100, 4096, 2452, 1, 5136, 5136, 1 614, 6904, 6904, 101, 4096, 2456, 1, 5136, 5136, 1 615, 6904, 6904, 101, 4096, 2460, 1, 5136, 5136, 1 616, 6904, 6904, 101, 4096, 2464, 1, 5136, 5136, 1 617, 6904, 6904, 101, 4096, 2468, 1, 5136, 5136, 1 618, 6904, 6904, 101, 4096, 2472, 1, 5136, 5136, 1 619, 6904, 6904, 101, 4096, 2476, 1, 5136, 5136, 1 620, 6904, 6904, 101, 4096, 2480, 1, 5136, 5136, 1 621, 6960, 6960, 102, 4096, 2484, 1, 5136, 5136, 1 622, 6960, 6960, 102, 4096, 2488, 1, 5136, 5136, 1 623, 6960, 6960, 102, 4096, 2492, 1, 5136, 5136, 1 624, 6960, 6960, 102, 4096, 2496, 1, 5136, 5136, 1 625, 6960, 6960, 102, 4096, 2500, 1, 5136, 5136, 1 626, 6960, 6960, 102, 4096, 2504, 1, 5136, 5136, 1 627, 6960, 6960, 102, 4096, 2508, 1, 5136, 5136, 1 628, 7472, 7472, 106, 4096, 2512, 1, 5136, 5136, 1 629, 7472, 7472, 106, 4096, 2516, 1, 5136, 5136, 1 630, 7472, 7472, 106, 4096, 2520, 1, 5136, 5136, 1 631, 7472, 7472, 106, 4096, 2524, 1, 5136, 5136, 1 632, 7472, 7472, 106, 4096, 2528, 1, 5136, 5136, 1 633, 7472, 7472, 106, 4096, 2532, 1, 5136, 5136, 1 634, 7472, 7472, 106, 4096, 2536, 1, 5136, 5136, 1 635, 7528, 7528, 107, 4096, 2540, 1, 5136, 5136, 1 636, 7528, 7528, 107, 4096, 2544, 1, 5136, 5136, 1 637, 7528, 7528, 107, 4096, 2548, 1, 5136, 5136, 1 638, 7528, 7528, 107, 4096, 2552, 1, 5136, 5136, 1 639, 7528, 7528, 107, 4096, 2556, 1, 5136, 5136, 1 640, 7528, 7528, 107, 4096, 2560, 1, 5136, 5136, 1 641, 7528, 7528, 107, 4096, 2564, 1, 5136, 5136, 1 642, 7584, 7584, 108, 4096, 2568, 1, 5136, 5136, 1 643, 7584, 7584, 108, 4096, 2572, 1, 5136, 5136, 1 644, 7584, 7584, 108, 4096, 2576, 1, 5136, 5136, 1 645, 7584, 7584, 108, 4096, 2580, 1, 5136, 5136, 1 646, 7584, 7584, 108, 4096, 2584, 1, 5136, 5136, 1 647, 7584, 7584, 108, 4096, 2588, 1, 5136, 5136, 1 648, 7584, 7584, 108, 4096, 2592, 1, 5136, 5136, 1 649, 7640, 7640, 109, 4096, 2596, 1, 5136, 5136, 1 650, 7640, 7640, 109, 4096, 2600, 1, 5136, 5136, 1 651, 7640, 7640, 109, 4096, 2604, 1, 5136, 5136, 1 652, 7640, 7640, 109, 4096, 2608, 1, 5136, 5136, 1 653, 7640, 7640, 109, 4096, 2612, 1, 5136, 5136, 1 654, 7640, 7640, 109, 4096, 2616, 1, 5136, 5136, 1 655, 7640, 7640, 109, 4096, 2620, 1, 5136, 5136, 1 656, 7696, 7696, 110, 4096, 2624, 1, 5136, 5136, 1 657, 7696, 7696, 110, 4096, 2628, 1, 5136, 5136, 1 658, 7696, 7696, 110, 4096, 2632, 1, 5136, 5136, 1 659, 7696, 7696, 110, 4096, 2636, 1, 5136, 5136, 1 660, 7696, 7696, 110, 4096, 2640, 1, 5136, 5136, 1 661, 7696, 7696, 110, 4096, 2644, 1, 5136, 5136, 1 662, 7696, 7696, 110, 4096, 2648, 1, 5136, 5136, 1 663, 7752, 7752, 111, 4096, 2652, 1, 5136, 5136, 1 664, 7752, 7752, 111, 4096, 2656, 1, 5136, 5136, 1 665, 7752, 7752, 111, 4096, 2660, 1, 5136, 5136, 1 666, 7752, 7752, 111, 4096, 2664, 1, 5136, 5136, 1 667, 7752, 7752, 111, 4096, 2668, 1, 5136, 5136, 1 668, 7752, 7752, 111, 4096, 2672, 1, 5136, 5136, 1 669, 7752, 7752, 111, 4096, 2676, 1, 5136, 5136, 1 670, 7808, 7808, 112, 4096, 2680, 1, 5136, 5136, 1 671, 7808, 7808, 112, 4096, 2684, 1, 5136, 5136, 1 672, 7808, 7808, 112, 4096, 2688, 1, 5136, 5136, 1 673, 7808, 7808, 112, 4096, 2692, 1, 5136, 5136, 1 674, 7808, 7808, 112, 4096, 2696, 1, 5136, 5136, 1 675, 7808, 7808, 112, 4096, 2700, 1, 5136, 5136, 1 676, 7808, 7808, 112, 4096, 2704, 1, 5136, 5136, 1 677, 8016, 8016, 114, 4096, 2708, 1, 5136, 5136, 1 678, 8016, 8016, 114, 4096, 2712, 1, 5136, 5136, 1 679, 8016, 8016, 114, 4096, 2716, 1, 5136, 5136, 1 680, 8016, 8016, 114, 4096, 2720, 1, 5136, 5136, 1 681, 8016, 8016, 114, 4096, 2724, 1, 5136, 5136, 1 682, 8016, 8016, 114, 4096, 2728, 1, 5136, 5136, 1 683, 8016, 8016, 114, 4096, 2732, 1, 5136, 5136, 1 684, 8072, 8072, 115, 4096, 2736, 1, 5136, 5136, 1 685, 8072, 8072, 115, 4096, 2740, 1, 5136, 5136, 1 686, 8072, 8072, 115, 4096, 2744, 1, 5136, 5136, 1 687, 8072, 8072, 115, 4096, 2748, 1, 5136, 5136, 1 688, 8072, 8072, 115, 4096, 2752, 1, 5136, 5136, 1 689, 8072, 8072, 115, 4096, 2756, 1, 5136, 5136, 1 690, 8072, 8072, 115, 4096, 2760, 1, 5136, 5136, 1 691, 8128, 8128, 116, 4096, 2764, 1, 5136, 5136, 1 692, 8128, 8128, 116, 4096, 2768, 1, 5136, 5136, 1 693, 8128, 8128, 116, 4096, 2772, 1, 5136, 5136, 1 694, 8128, 8128, 116, 4096, 2776, 1, 5136, 5136, 1 695, 8128, 8128, 116, 4096, 2780, 1, 5136, 5136, 1 696, 8128, 8128, 116, 4096, 2784, 1, 5136, 5136, 1 697, 8128, 8128, 116, 4096, 2788, 1, 5136, 5136, 1 698, 8184, 8184, 117, 4096, 2792, 1, 5136, 5136, 1 699, 8184, 8184, 117, 4096, 2796, 1, 5136, 5136, 1 700, 8184, 8184, 117, 4096, 2800, 1, 5136, 5136, 1 701, 8184, 8184, 117, 4096, 2804, 1, 5136, 5136, 1 702, 8184, 8184, 117, 4096, 2808, 1, 5136, 5136, 1 703, 8184, 8184, 117, 4096, 2812, 1, 5136, 5136, 1 704, 8184, 8184, 117, 4096, 2816, 1, 5136, 5136, 1 705, 8240, 8240, 118, 4096, 2820, 1, 5136, 5136, 1 706, 8240, 8240, 118, 4096, 2824, 1, 5136, 5136, 1 707, 8240, 8240, 118, 4096, 2828, 1, 5136, 5136, 1 708, 8240, 8240, 118, 4096, 2832, 1, 5136, 5136, 1 709, 8240, 8240, 118, 4096, 2836, 1, 5136, 5136, 1 710, 8240, 8240, 118, 4096, 2840, 1, 5136, 5136, 1 711, 8240, 8240, 118, 4096, 2844, 1, 5136, 5136, 1 712, 8296, 8296, 119, 4096, 2848, 1, 5136, 5136, 1 713, 8296, 8296, 119, 4096, 2852, 1, 5136, 5136, 1 714, 8296, 8296, 119, 4096, 2856, 1, 5136, 5136, 1 715, 8296, 8296, 119, 4096, 2860, 1, 5136, 5136, 1 716, 8296, 8296, 119, 4096, 2864, 1, 5136, 5136, 1 717, 8296, 8296, 119, 4096, 2868, 1, 5136, 5136, 1 718, 8296, 8296, 119, 4096, 2872, 1, 5136, 5136, 1 719, 8352, 8352, 120, 4096, 2876, 1, 5136, 5136, 1 720, 8352, 8352, 120, 4096, 2880, 1, 5136, 5136, 1 721, 8352, 8352, 120, 4096, 2884, 1, 5136, 5136, 1 722, 8352, 8352, 120, 4096, 2888, 1, 5136, 5136, 1 723, 8352, 8352, 120, 4096, 2892, 1, 5136, 5136, 1 724, 8352, 8352, 120, 4096, 2896, 1, 5136, 5136, 1 725, 8352, 8352, 120, 4096, 2900, 1, 5136, 5136, 1 726, 8560, 8560, 122, 4096, 2904, 1, 5136, 5136, 1 727, 8560, 8560, 122, 4096, 2908, 1, 5136, 5136, 1 728, 8560, 8560, 122, 4096, 2912, 1, 5136, 5136, 1 729, 8560, 8560, 122, 4096, 2916, 1, 5136, 5136, 1 730, 8560, 8560, 122, 4096, 2920, 1, 5136, 5136, 1 731, 8560, 8560, 122, 4096, 2924, 1, 5136, 5136, 1 732, 8560, 8560, 122, 4096, 2928, 1, 5136, 5136, 1 733, 8616, 8616, 123, 4096, 2932, 1, 5136, 5136, 1 734, 8616, 8616, 123, 4096, 2936, 1, 5136, 5136, 1 735, 8616, 8616, 123, 4096, 2940, 1, 5136, 5136, 1 736, 8616, 8616, 123, 4096, 2944, 1, 5136, 5136, 1 737, 8616, 8616, 123, 4096, 2948, 1, 5136, 5136, 1 738, 8616, 8616, 123, 4096, 2952, 1, 5136, 5136, 1 739, 8616, 8616, 123, 4096, 2956, 1, 5136, 5136, 1 740, 8672, 8672, 124, 4096, 2960, 1, 5136, 5136, 1 741, 8672, 8672, 124, 4096, 2964, 1, 5136, 5136, 1 742, 8672, 8672, 124, 4096, 2968, 1, 5136, 5136, 1 743, 8672, 8672, 124, 4096, 2972, 1, 5136, 5136, 1 744, 8672, 8672, 124, 4096, 2976, 1, 5136, 5136, 1 745, 8672, 8672, 124, 4096, 2980, 1, 5136, 5136, 1 746, 8672, 8672, 124, 4096, 2984, 1, 5136, 5136, 1 747, 8728, 8728, 125, 4096, 2988, 1, 5136, 5136, 1 748, 8728, 8728, 125, 4096, 2992, 1, 5136, 5136, 1 749, 8728, 8728, 125, 4096, 2996, 1, 5136, 5136, 1 750, 8728, 8728, 125, 4096, 3000, 1, 5136, 5136, 1 751, 8728, 8728, 125, 4096, 3004, 1, 5136, 5136, 1 752, 8728, 8728, 125, 4096, 3008, 1, 5136, 5136, 1 753, 8728, 8728, 125, 4096, 3012, 1, 5136, 5136, 1 754, 8784, 8784, 126, 4096, 3016, 1, 5136, 5136, 1 755, 8784, 8784, 126, 4096, 3020, 1, 5136, 5136, 1 756, 8784, 8784, 126, 4096, 3024, 1, 5136, 5136, 1 757, 8784, 8784, 126, 4096, 3028, 1, 5136, 5136, 1 758, 8784, 8784, 126, 4096, 3032, 1, 5136, 5136, 1 759, 8784, 8784, 126, 4096, 3036, 1, 5136, 5136, 1 760, 8784, 8784, 126, 4096, 3040, 1, 5136, 5136, 1 761, 8840, 8840, 127, 4096, 3044, 1, 5136, 5136, 1 762, 8840, 8840, 127, 4096, 3048, 1, 5136, 5136, 1 763, 8840, 8840, 127, 4096, 3052, 1, 5136, 5136, 1 764, 8840, 8840, 127, 4096, 3056, 1, 5136, 5136, 1 765, 8840, 8840, 127, 4096, 3060, 1, 5136, 5136, 1 766, 8840, 8840, 127, 4096, 3064, 1, 5136, 5136, 1 767, 8840, 8840, 127, 4096, 3068, 1, 5136, 5136, 1 768, 8896, 8896, 128, 4096, 3072, 1, 5136, 5136, 1 769, 8896, 8896, 128, 4096, 3076, 1, 5136, 5136, 1 770, 8896, 8896, 128, 4096, 3080, 1, 5136, 5136, 1 771, 8896, 8896, 128, 4096, 3084, 1, 5136, 5136, 1 772, 8896, 8896, 128, 4096, 3088, 1, 5136, 5136, 1 773, 8896, 8896, 128, 4096, 3092, 1, 5136, 5136, 1 774, 8896, 8896, 128, 4096, 3096, 1, 5136, 5136, 1 775, 9104, 9104, 130, 4096, 3100, 1, 5136, 5136, 1 776, 9104, 9104, 130, 4096, 3104, 1, 5136, 5136, 1 777, 9104, 9104, 130, 4096, 3108, 1, 5136, 5136, 1 778, 9104, 9104, 130, 4096, 3112, 1, 5136, 5136, 1 779, 9104, 9104, 130, 4096, 3116, 1, 5136, 5136, 1 780, 9104, 9104, 130, 4096, 3120, 1, 5136, 5136, 1 781, 9104, 9104, 130, 4096, 3124, 1, 5136, 5136, 1 782, 9160, 9160, 131, 4096, 3128, 1, 5136, 5136, 1 783, 9160, 9160, 131, 4096, 3132, 1, 5136, 5136, 1 784, 9160, 9160, 131, 4096, 3136, 1, 5136, 5136, 1 785, 9160, 9160, 131, 4096, 3140, 1, 5136, 5136, 1 786, 9160, 9160, 131, 4096, 3144, 1, 5136, 5136, 1 787, 9160, 9160, 131, 4096, 3148, 1, 5136, 5136, 1 788, 9160, 9160, 131, 4096, 3152, 1, 5136, 5136, 1 789, 9216, 9216, 132, 4096, 3156, 1, 5136, 5136, 1 790, 9216, 9216, 132, 4096, 3160, 1, 5136, 5136, 1 791, 9216, 9216, 132, 4096, 3164, 1, 5136, 5136, 1 792, 9216, 9216, 132, 4096, 3168, 1, 5136, 5136, 1 793, 9216, 9216, 132, 4096, 3172, 1, 5136, 5136, 1 794, 9216, 9216, 132, 4096, 3176, 1, 5136, 5136, 1 795, 9216, 9216, 132, 4096, 3180, 1, 5136, 5136, 1 796, 9272, 9272, 133, 4096, 3184, 1, 5136, 5136, 1 797, 9272, 9272, 133, 4096, 3188, 1, 5136, 5136, 1 798, 9272, 9272, 133, 4096, 3192, 1, 5136, 5136, 1 799, 9272, 9272, 133, 4096, 3196, 1, 5136, 5136, 1 800, 9272, 9272, 133, 4096, 3200, 1, 5136, 5136, 1 801, 9272, 9272, 133, 4096, 3204, 1, 5136, 5136, 1 802, 9272, 9272, 133, 4096, 3208, 1, 5136, 5136, 1 803, 9328, 9328, 134, 4096, 3212, 1, 5136, 5136, 1 804, 9328, 9328, 134, 4096, 3216, 1, 5136, 5136, 1 805, 9328, 9328, 134, 4096, 3220, 1, 5136, 5136, 1 806, 9328, 9328, 134, 4096, 3224, 1, 5136, 5136, 1 807, 9328, 9328, 134, 4096, 3228, 1, 5136, 5136, 1 808, 9328, 9328, 134, 4096, 3232, 1, 5136, 5136, 1 809, 9328, 9328, 134, 4096, 3236, 1, 5136, 5136, 1 810, 9384, 9384, 135, 4096, 3240, 1, 5136, 5136, 1 811, 9384, 9384, 135, 4096, 3244, 1, 5136, 5136, 1 812, 9384, 9384, 135, 4096, 3248, 1, 5136, 5136, 1 813, 9384, 9384, 135, 4096, 3252, 1, 5136, 5136, 1 814, 9384, 9384, 135, 4096, 3256, 1, 5136, 5136, 1 815, 9384, 9384, 135, 4096, 3260, 1, 5136, 5136, 1 816, 9384, 9384, 135, 4096, 3264, 1, 5136, 5136, 1 817, 9440, 9440, 136, 4096, 3268, 1, 5136, 5136, 1 818, 9440, 9440, 136, 4096, 3272, 1, 5136, 5136, 1 819, 9440, 9440, 136, 4096, 3276, 1, 5136, 5136, 1 820, 9440, 9440, 136, 4096, 3280, 1, 5136, 5136, 1 821, 9440, 9440, 136, 4096, 3284, 1, 5136, 5136, 1 822, 9440, 9440, 136, 4096, 3288, 1, 5136, 5136, 1 823, 9440, 9440, 136, 4096, 3292, 1, 5136, 5136, 1 824, 9648, 9648, 138, 4096, 3296, 1, 5136, 5136, 1 825, 9648, 9648, 138, 4096, 3300, 1, 5136, 5136, 1 826, 9648, 9648, 138, 4096, 3304, 1, 5136, 5136, 1 827, 9648, 9648, 138, 4096, 3308, 1, 5136, 5136, 1 828, 9648, 9648, 138, 4096, 3312, 1, 5136, 5136, 1 829, 9648, 9648, 138, 4096, 3316, 1, 5136, 5136, 1 830, 9648, 9648, 138, 4096, 3320, 1, 5136, 5136, 1 831, 9704, 9704, 139, 4096, 3324, 1, 5136, 5136, 1 832, 9704, 9704, 139, 4096, 3328, 1, 5136, 5136, 1 833, 9704, 9704, 139, 4096, 3332, 1, 5136, 5136, 1 834, 9704, 9704, 139, 4096, 3336, 1, 5136, 5136, 1 835, 9704, 9704, 139, 4096, 3340, 1, 5136, 5136, 1 836, 9704, 9704, 139, 4096, 3344, 1, 5136, 5136, 1 837, 9704, 9704, 139, 4096, 3348, 1, 5136, 5136, 1 838, 9760, 9760, 140, 4096, 3352, 1, 5136, 5136, 1 839, 9760, 9760, 140, 4096, 3356, 1, 5136, 5136, 1 840, 9760, 9760, 140, 4096, 3360, 1, 5136, 5136, 1 841, 9760, 9760, 140, 4096, 3364, 1, 5136, 5136, 1 842, 9760, 9760, 140, 4096, 3368, 1, 5136, 5136, 1 843, 9760, 9760, 140, 4096, 3372, 1, 5136, 5136, 1 844, 9760, 9760, 140, 4096, 3376, 1, 5136, 5136, 1 845, 9816, 9816, 141, 4096, 3380, 1, 5136, 5136, 1 846, 9816, 9816, 141, 4096, 3384, 1, 5136, 5136, 1 847, 9816, 9816, 141, 4096, 3388, 1, 5136, 5136, 1 848, 9816, 9816, 141, 4096, 3392, 1, 5136, 5136, 1 849, 9816, 9816, 141, 4096, 3396, 1, 5136, 5136, 1 850, 9816, 9816, 141, 4096, 3400, 1, 5136, 5136, 1 851, 9816, 9816, 141, 4096, 3404, 1, 5136, 5136, 1 852, 9872, 9872, 142, 4096, 3408, 1, 5136, 5136, 1 853, 9872, 9872, 142, 4096, 3412, 1, 5136, 5136, 1 854, 9872, 9872, 142, 4096, 3416, 1, 5136, 5136, 1 855, 9872, 9872, 142, 4096, 3420, 1, 5136, 5136, 1 856, 9872, 9872, 142, 4096, 3424, 1, 5136, 5136, 1 857, 9872, 9872, 142, 4096, 3428, 1, 5136, 5136, 1 858, 9872, 9872, 142, 4096, 3432, 1, 5136, 5136, 1 859, 9928, 9928, 143, 4096, 3436, 1, 5136, 5136, 1 860, 9928, 9928, 143, 4096, 3440, 1, 5136, 5136, 1 861, 9928, 9928, 143, 4096, 3444, 1, 5136, 5136, 1 862, 9928, 9928, 143, 4096, 3448, 1, 5136, 5136, 1 863, 9928, 9928, 143, 4096, 3452, 1, 5136, 5136, 1 864, 9928, 9928, 143, 4096, 3456, 1, 5136, 5136, 1 865, 9928, 9928, 143, 4096, 3460, 1, 5136, 5136, 1 866, 9984, 9984, 144, 4096, 3464, 1, 5136, 5136, 1 867, 9984, 9984, 144, 4096, 3468, 1, 5136, 5136, 1 868, 9984, 9984, 144, 4096, 3472, 1, 5136, 5136, 1 869, 9984, 9984, 144, 4096, 3476, 1, 5136, 5136, 1 870, 9984, 9984, 144, 4096, 3480, 1, 5136, 5136, 1 871, 9984, 9984, 144, 4096, 3484, 1, 5136, 5136, 1 872, 9984, 9984, 144, 4096, 3488, 1, 5136, 5136, 1 873, 10192, 10192, 146, 4096, 3492, 1, 5136, 5136, 1 874, 10192, 10192, 146, 4096, 3496, 1, 5136, 5136, 1 875, 10192, 10192, 146, 4096, 3500, 1, 5136, 5136, 1 876, 10192, 10192, 146, 4096, 3504, 1, 5136, 5136, 1 877, 10192, 10192, 146, 4096, 3508, 1, 5136, 5136, 1 878, 10192, 10192, 146, 4096, 3512, 1, 5136, 5136, 1 879, 10192, 10192, 146, 4096, 3516, 1, 5136, 5136, 1 880, 10248, 10248, 147, 4096, 3520, 1, 5136, 5136, 1 881, 10248, 10248, 147, 4096, 3524, 1, 5136, 5136, 1 882, 10248, 10248, 147, 4096, 3528, 1, 5136, 5136, 1 883, 10248, 10248, 147, 4096, 3532, 1, 5136, 5136, 1 884, 10248, 10248, 147, 4096, 3536, 1, 5136, 5136, 1 885, 10248, 10248, 147, 4096, 3540, 1, 5136, 5136, 1 886, 10248, 10248, 147, 4096, 3544, 1, 5136, 5136, 1 887, 10304, 10304, 148, 4096, 3548, 1, 5136, 5136, 1 888, 10304, 10304, 148, 4096, 3552, 1, 5136, 5136, 1 889, 10304, 10304, 148, 4096, 3556, 1, 5136, 5136, 1 890, 10304, 10304, 148, 4096, 3560, 1, 5136, 5136, 1 891, 10304, 10304, 148, 4096, 3564, 1, 5136, 5136, 1 892, 10304, 10304, 148, 4096, 3568, 1, 5136, 5136, 1 893, 10304, 10304, 148, 4096, 3572, 1, 5136, 5136, 1 894, 10360, 10360, 149, 4096, 3576, 1, 5136, 5136, 1 895, 10360, 10360, 149, 4096, 3580, 1, 5136, 5136, 1 896, 10360, 10360, 149, 4096, 3584, 1, 5136, 5136, 1 897, 10360, 10360, 149, 4096, 3588, 1, 10256, 10256, 1 898, 10360, 10360, 149, 4096, 3592, 1, 10256, 10256, 1 899, 10360, 10360, 149, 4096, 3596, 1, 10256, 10256, 1 900, 10360, 10360, 149, 4096, 3600, 1, 10256, 10256, 1 901, 10416, 10416, 150, 4096, 3604, 1, 10256, 10256, 1 902, 10416, 10416, 150, 4096, 3608, 1, 10256, 10256, 1 903, 10416, 10416, 150, 4096, 3612, 1, 10256, 10256, 1 904, 10416, 10416, 150, 4096, 3616, 1, 10256, 10256, 1 905, 10416, 10416, 150, 4096, 3620, 1, 10256, 10256, 1 906, 10416, 10416, 150, 4096, 3624, 1, 10256, 10256, 1 907, 10416, 10416, 150, 4096, 3628, 1, 10256, 10256, 1 908, 10472, 10472, 151, 4096, 3632, 1, 10256, 10256, 1 909, 10472, 10472, 151, 4096, 3636, 1, 10256, 10256, 1 910, 10472, 10472, 151, 4096, 3640, 1, 10256, 10256, 1 911, 10472, 10472, 151, 4096, 3644, 1, 10256, 10256, 1 912, 10472, 10472, 151, 4096, 3648, 1, 10256, 10256, 1 913, 10472, 10472, 151, 4096, 3652, 1, 10256, 10256, 1 914, 10472, 10472, 151, 4096, 3656, 1, 10256, 10256, 1 915, 10528, 10528, 152, 4096, 3660, 1, 10256, 10256, 1 916, 10528, 10528, 152, 4096, 3664, 1, 10256, 10256, 1 917, 10528, 10528, 152, 4096, 3668, 1, 10256, 10256, 1 918, 10528, 10528, 152, 4096, 3672, 1, 10256, 10256, 1 919, 10528, 10528, 152, 4096, 3676, 1, 10256, 10256, 1 920, 10528, 10528, 152, 4096, 3680, 1, 10256, 10256, 1 921, 10528, 10528, 152, 4096, 3684, 1, 10256, 10256, 1 922, 10736, 10736, 154, 4096, 3688, 1, 10256, 10256, 1 923, 10736, 10736, 154, 4096, 3692, 1, 10256, 10256, 1 924, 10736, 10736, 154, 4096, 3696, 1, 10256, 10256, 1 925, 10736, 10736, 154, 4096, 3700, 1, 10256, 10256, 1 926, 10736, 10736, 154, 4096, 3704, 1, 10256, 10256, 1 927, 10736, 10736, 154, 4096, 3708, 1, 10256, 10256, 1 928, 10736, 10736, 154, 4096, 3712, 1, 10256, 10256, 1 929, 10792, 10792, 155, 4096, 3716, 1, 10256, 10256, 1 930, 10792, 10792, 155, 4096, 3720, 1, 10256, 10256, 1 931, 10792, 10792, 155, 4096, 3724, 1, 10256, 10256, 1 932, 10792, 10792, 155, 4096, 3728, 1, 10256, 10256, 1 933, 10792, 10792, 155, 4096, 3732, 1, 10256, 10256, 1 934, 10792, 10792, 155, 4096, 3736, 1, 10256, 10256, 1 935, 10792, 10792, 155, 4096, 3740, 1, 10256, 10256, 1 936, 10848, 10848, 156, 4096, 3744, 1, 10256, 10256, 1 937, 10848, 10848, 156, 4096, 3748, 1, 10256, 10256, 1 938, 10848, 10848, 156, 4096, 3752, 1, 10256, 10256, 1 939, 10848, 10848, 156, 4096, 3756, 1, 10256, 10256, 1 940, 10848, 10848, 156, 4096, 3760, 1, 10256, 10256, 1 941, 10848, 10848, 156, 4096, 3764, 1, 10256, 10256, 1 942, 10848, 10848, 156, 4096, 3768, 1, 10256, 10256, 1 943, 10904, 10904, 157, 4096, 3772, 1, 10256, 10256, 1 944, 10904, 10904, 157, 4096, 3776, 1, 10256, 10256, 1 945, 10904, 10904, 157, 4096, 3780, 1, 10256, 10256, 1 946, 10904, 10904, 157, 4096, 3784, 1, 10256, 10256, 1 947, 10904, 10904, 157, 4096, 3788, 1, 10256, 10256, 1 948, 10904, 10904, 157, 4096, 3792, 1, 10256, 10256, 1 949, 10904, 10904, 157, 4096, 3796, 1, 10256, 10256, 1 950, 10960, 10960, 158, 4096, 3800, 1, 10256, 10256, 1 951, 10960, 10960, 158, 4096, 3804, 1, 10256, 10256, 1 952, 10960, 10960, 158, 4096, 3808, 1, 10256, 10256, 1 953, 10960, 10960, 158, 4096, 3812, 1, 10256, 10256, 1 954, 10960, 10960, 158, 4096, 3816, 1, 10256, 10256, 1 955, 10960, 10960, 158, 4096, 3820, 1, 10256, 10256, 1 956, 10960, 10960, 158, 4096, 3824, 1, 10256, 10256, 1 957, 11016, 11016, 159, 4096, 3828, 1, 10256, 10256, 1 958, 11016, 11016, 159, 4096, 3832, 1, 10256, 10256, 1 959, 11016, 11016, 159, 4096, 3836, 1, 10256, 10256, 1 960, 11016, 11016, 159, 4096, 3840, 1, 10256, 10256, 1 961, 11016, 11016, 159, 4096, 3844, 1, 10256, 10256, 1 962, 11016, 11016, 159, 4096, 3848, 1, 10256, 10256, 1 963, 11016, 11016, 159, 4096, 3852, 1, 10256, 10256, 1 964, 11072, 11072, 160, 4096, 3856, 1, 10256, 10256, 1 965, 11072, 11072, 160, 4096, 3860, 1, 10256, 10256, 1 966, 11072, 11072, 160, 4096, 3864, 1, 10256, 10256, 1 967, 11072, 11072, 160, 4096, 3868, 1, 10256, 10256, 1 968, 11072, 11072, 160, 4096, 3872, 1, 10256, 10256, 1 969, 11072, 11072, 160, 4096, 3876, 1, 10256, 10256, 1 970, 11072, 11072, 160, 4096, 3880, 1, 10256, 10256, 1 971, 11432, 11432, 163, 4096, 3884, 1, 10256, 10256, 1 972, 11432, 11432, 163, 4096, 3888, 1, 10256, 10256, 1 973, 11432, 11432, 163, 4096, 3892, 1, 10256, 10256, 1 974, 11432, 11432, 163, 4096, 3896, 1, 10256, 10256, 1 975, 11432, 11432, 163, 4096, 3900, 1, 10256, 10256, 1 976, 11432, 11432, 163, 4096, 3904, 1, 10256, 10256, 1 977, 11432, 11432, 163, 4096, 3908, 1, 10256, 10256, 1 978, 11488, 11488, 164, 4096, 3912, 1, 10256, 10256, 1 979, 11488, 11488, 164, 4096, 3916, 1, 10256, 10256, 1 980, 11488, 11488, 164, 4096, 3920, 1, 10256, 10256, 1 981, 11488, 11488, 164, 4096, 3924, 1, 10256, 10256, 1 982, 11488, 11488, 164, 4096, 3928, 1, 10256, 10256, 1 983, 11488, 11488, 164, 4096, 3932, 1, 10256, 10256, 1 984, 11488, 11488, 164, 4096, 3936, 1, 10256, 10256, 1 985, 11544, 11544, 165, 4096, 3940, 1, 10256, 10256, 1 986, 11544, 11544, 165, 4096, 3944, 1, 10256, 10256, 1 987, 11544, 11544, 165, 4096, 3948, 1, 10256, 10256, 1 988, 11544, 11544, 165, 4096, 3952, 1, 10256, 10256, 1 989, 11544, 11544, 165, 4096, 3956, 1, 10256, 10256, 1 990, 11544, 11544, 165, 4096, 3960, 1, 10256, 10256, 1 991, 11544, 11544, 165, 4096, 3964, 1, 10256, 10256, 1 992, 11600, 11600, 166, 4096, 3968, 1, 10256, 10256, 1 993, 11600, 11600, 166, 4096, 3972, 1, 10256, 10256, 1 994, 11600, 11600, 166, 4096, 3976, 1, 10256, 10256, 1 995, 11600, 11600, 166, 4096, 3980, 1, 10256, 10256, 1 996, 11600, 11600, 166, 4096, 3984, 1, 10256, 10256, 1 997, 11600, 11600, 166, 4096, 3988, 1, 10256, 10256, 1 998, 11600, 11600, 166, 4096, 3992, 1, 10256, 10256, 1 999, 11656, 11656, 167, 4096, 3996, 1, 10256, 10256, 1 vec-collections-0.4.3/examples/alloc.gnuplot000064400000000000000000000007740072674642500173030ustar 00000000000000set datafile separator "," set terminal png size 1024, 768 set output 'alloc.png' set ylabel "bytes" set xlabel "size (u32)" # set key autotitle columnhead plot \ 'alloc.csv' using 1:2 title 'BTreeSet allocations' with lines, \ '' using 1:3 title 'BTreeSet permanent' with lines, \ '' using 1:5 title 'VecSet allocations' with lines, \ '' using 1:6 title 'VecSet permanent' with lines, \ '' using 1:8 title 'HashSet allocations' with lines, \ '' using 1:9 title 'HashSet permanent' with lines, \ vec-collections-0.4.3/examples/alloc.gnuplot~000064400000000000000000000007740072674642500175010ustar 00000000000000set datafile separator "," set terminal png size 1024, 768 set output 'alloc.png' set ylabel "bytes" set xlabel "size (u64)" # set key autotitle columnhead plot \ 'alloc.csv' using 1:2 title 'BTreeSet allocations' with lines, \ '' using 1:3 title 'BTreeSet permanent' with lines, \ '' using 1:2 title 'VecSet allocations' with lines, \ '' using 1:2 title 'VecSet permanent' with lines, \ '' using 1:2 title 'HashSet allocations' with lines, \ '' using 1:2 title 'HashSet permanent' with lines, \ vec-collections-0.4.3/examples/alloc.png000064400000000000000000000267530072674642500164040ustar 00000000000000PNG  IHDRd?VPLTE@Ai @0`@ԥ**@333MMMfff22U݂d"".Wp͇PErz挽k ܠ ݠݐP@Uk/@@``@@`pͷ|@ ߿___???sVBO9vVdr'bGH4{ pHYs+ IDATxm8a3sgTg60`lK$=՝podZ +J߲.j{nT7${W]QYUS i+7$g<0؇X =[[4Ího\5 pPQwãk\eQ( /St6G U}GO;'ȆptT_w/}v#l8 G70n=mM[@l G70qEӎKcn`6~@6| ̆?Ȇo8p G70@VT2,gꮹuӅs}۾.~ wRܽ=Q B_m[յݶ]ۢk_^RuT?,/_qnjj KS +rYu՛t5tc!snT];/Yޣ[}c0'T2`1{,<ȗETFUt~z8]>@W=x~u]6曱|R B_Ե{`w K^|^޵]4oᜢX{fbػp/r@%x*s ! ڎioSm9C뫗w QvW :*SXpKbūެ +' w_,XpOe`] <>,<}oQӇںv_YE?;/y`:\@ @~,G%x*sY/<9ԍ;JTRJT^b?;JT|/1^[_niEbnRW޷{X#-~iEyYSn+eWMg {=G%x*swVzO+eE>yl~F%x*swVY|jBL0-^(ӊ`"BOxX6ý M+?JT654O=a'"x\6p2?+-OZxX6޶;(}VV s?|d(2g: wve2 d2FWޚ- V?gH/Iʒ`++x*w/ V[YU_E̢\+ XyMr_t]݁+xŹ)HPr]]7Œ`+kݗrྨtf눆7+GP`yI5/u^;c0 +T2Ǿ&oW8 fs~X+ dR XQrɄv\dy; O:,H%x*s\r)Zﰽ`սv {)Œ`k=,<0}|sc4´#^fR ž\,Nߗ{^agWw_,Bh/<9}~Ú`&%[.|@yC( OǎD`-Oe ^I%x*sz+JTAe2G*S`|}K%x*s^/<9m߮ ~Oe`ۇ+\.e햋->Ͼ/Fe`ۇ+zM{`>\}tfyհw_22Sي`v]/>l_$`_[w=/ X\+; =S E+w5 ߋZl.ҽH;.p{LigS {W3w]. 6z_+{; {gOeɽ敻w_(T}-/@?}CT2d0,(شz_ w_,n7L%x*sO敻:x(ؼz_O;/aoJTdoJTT\%R ~= T2p ):V{m?\ߊ`'[|A%x*s[d/x^7^s#'_V<; ܗ[ Xl#-9xmݻ0pk8+w>s{`>^}tÖܦ]#@UܮQ8+; !>n_<]-69c7{7`N]棛?niM)qѣzE3ÇxX6tx.PڹxoWsn}fܦp@2]lq>Tˆٸ?yҷ+-돟Yo(AqizE:n)anӽOp=vaD~C?qB `v .F/ [~GTS8?) Yw( AGQw*s'8P@R{/ HɛGxkD-) 7ؠ2'GD[O1|ߡ}}"F2wk*sQm) b*sQF2po*s& w( BO?ʾEQ םb7D"@) v "  G|Cem^C(!οCBGߡEԜ?1'eߢ1_*sP~B2pgPAx2pg*sGPp qj- Pq~)@; \SYs\;pOWSXD׸:\B"p:Φ}N& 8οCQʾE?lEߡPQ22F\Gedp91 :*s cuT@(́QQ2*RC!iBQ@ ٷ( OP9 .[[<w(oQ??(.͍jQ8c`M1@WM[ PUSڍ3c-p݀_q,G]}qb,nomQ oߵE|9#[1+ w fxq@Ihw",fFaAξ&{:'q- `W=[ 7~ s {P9 p1 `#m.́$ O%x*s 1>́PT2CS H O%x*s  }ޖL)}*S tMtP(T2οC}H3J# x![/Sw ؔt- ؒ~)`M; <%@%x*s ig,e}(oT2b@x<9 ́PިOeĀF%x*s 7*S1Q JT@ (oT2b@x<9 ́PިOeĀF%x*s (T2"@<9 ́POeDG%x*s ?*SQ JT@(T2"@<9 ́POeDG%x*s@[^ :'[`e sߡ `*}FQH@X i"@3@*1ͭ*x$8Fv[_<R4 `0;MRy!o)QCC|i@[9 .q#o(<`I }*pk]prD uaJHFTEW wρHOi@]k@txw4 ` ھ0#k7>!(q:]S) o|6C|Gʢlr/uzvH@DA06DcbƧs D0G/j+ν>|ĂA)ꪩH?(@U,f({i{p:'sFP[7w7 3w7>)n5'(gE_0CLw~JL;@xSM}]XH /G7/9yĀQ}1@ZȿG"P7;0b@xQ7B`S7h:{p5A)t}4 ˶m˚U{QŻ-o Q8d04 sW`DA]weׇ%PJS aQPž ("' vOC@? 9<PQPBOF@ p2 J(QPB dQB lPg 8!(H`kP@A@% #Wp-) az.CG*_ Ⱦ '%U2v3<9`C>@JT +*S#o )\Oe'(\OeOSP u ̑_SP 2<9rEdJ%x*sȔJT)̑߯r<92EJ%x*sdȕJT+̑) W*S#S@T2G~Vr<9 ̑?)\Oe ̑)\Oe-OB%x*sdQP Yx?@.T2G ̑oMB%x*s$;~RP i;@.T2G(<9uߡr<9u8 ̑OdC%x*s$轝ȅJTHЛٷ(\Oe| *S#%_ȅJTHGw(\OePxI%x*sK*S#%^R )JTH T2GJ(<9RB%̑ /OePxI%x*sK*S# _ r<9E *S# _ȆJTݷ# *S#vgߢr<9")@6T2G<;@.BͯU]ȃ[@.,LTEՔEv95_K5Eg ._~%9 ,kS桾*Vn4G;@.oH)hn9sdo- gMGw7N#Od#TFk~6QnnŒw(䙴߁׍y.9 NS (n@= ~`# i  B }Hל}+xp)pOi?Q B;@zoOeyoQiy~䟨Oey޳~C%x*s;>50 e?JTGࠗ7T2< ߠ<9ԉ;<9Qs<9Qv ̡oOeu~8JTPG`*SC9((|~C%x*s;'/Oe]')JTPn-,_̡;$7T2" AoOeE@BP Z?w(NoP ZΏCH}K%x*sH*B?OT2GNʾ<9T\}ΙOeYK*Sz;.<9wq- \P S?p oOe+);9.<9$}87T2DžtOv *SW]H&JT渄P GJT*S@4oOeKP) <9.AJ;JT渂\)/oOe+Pzq -dR W#D%x*s\HCt7T2(E~C%x*sLE# -P '˾E *S\w(')P 'ξEA/<96}RJ*ScοCS ^AFOe}  G~*Sc‘ JT2> W#̱xa"̱z*¯J%x*s^Y-/,XʺKsnT7Θ' ~uU[CTEՔEv9^y(P]{9^ GH ^YP_+7Λ [?"Awhm>8o^`{Ȅ ^9D=7NÇW%G(`ʢRw< G*\:Ç`|οeND_'gʭx?rWMu7k7Θk? v@Q_οM4 ^;`41_ fgS)v<9>@Ӣ<9knIzT2It I%x*s? R D<9>>UOHT"VB@ <9"#>4'0Ƿ;N@ryFu G\s@tu&g߉(_V@sF\m}P< G~8@v@qG̿|~<)g@@H?6QIOcn}s|&d]7)QQ^]^oɳ;2-P8ݏdYM}|,?:H?]n?Y@C>x9x7@p;?|ʦN *\~CLGN7@J0w7'?ʠ - io)q 8 De@qT `@q <@q <@q <p_@q= <(@8_j2.F!'-wq,*Y@XaÛڢ>~|/?96zl or'džCo Mp3cáˆOC8OC H@2v)0H+|ܰP)lw7A$&;q9 l=}l몭BlxP|oA}M5UOŒvuiCݕÿa{ox'^H~yÞlkuC9Ap_ ollnj*۵ wENxް۵(ވFUArj C ` ]߰= XΜ3(Y@nUXR5?q{۶]": 8>M}p7>]9Sx``w!!Sz'C,6>1mw~v:{ÍQ: }O0#,k3(~7 } B3ϔmj{K B.ee c65Q@D٤3uyjV;Ѹr>!l]Nt/.C\ .% t)P`.Q E"2w%xU5pN8EѬK Q2+qXbEw_6J+ڣvh]Ә7C uo6;/ ǡcx@<ܻE4I Element { x as Element } fn creation_vecmap(name: &str, data: &[(Element, Element)]) { let elems = data; let t0 = std::time::Instant::now(); let a: VecMap1 = elems.iter().cloned().collect(); let dt = std::time::Instant::now() - t0; println!("creation vecmap {} {} {:?}", a.len(), name, dt); } fn creation_btreemap(name: &str, data: &[(Element, Element)]) { let elems = data; let t0 = std::time::Instant::now(); let a: BTreeMap = elems.iter().cloned().collect(); let dt = std::time::Instant::now() - t0; println!("creation btreemap {} {} {:?}", a.len(), name, dt); } fn creation_hashmap(name: &str, data: &[(Element, Element)]) { let elems = data; let t0 = std::time::Instant::now(); let a: HashMap = elems.iter().cloned().collect(); let dt = std::time::Instant::now() - t0; println!("creation hashmap {} {} {:?}", a.len(), name, dt); } fn main() { let mut x: Vec<(Element, Element)> = Vec::new(); for i in 0..1000000 { x.push((element(i * 3 % 100000), element(i))); } for _ in 0..10 { creation_vecmap("mixed", &x); creation_btreemap("mixed", &x); creation_hashmap("mixed", &x); } } vec-collections-0.4.3/examples/multimap.rs000064400000000000000000000041720072674642500167710ustar 00000000000000use core::iter::FromIterator; use vec_collections::{VecMap1, VecSet2}; #[derive(Debug)] struct Multimap(VecMap1>); impl Multimap { fn single(key: K, value: V) -> Self { Multimap(vec![(key, VecSet2::single(value))].into_iter().collect()) } fn combine_with(&mut self, rhs: Multimap) { self.0.combine_with(rhs.0, |a, b| &a | &b) } } impl Default for Multimap { fn default() -> Self { Self(VecMap1::default()) } } impl FromIterator<(K, V)> for Multimap { fn from_iter>(iter: T) -> Self { let mut res = Multimap::default(); for (k, v) in iter.into_iter() { res.combine_with(Self::single(k, v)) } res } } #[derive(Debug)] struct BiMultimap(VecMap1>, VecMap1>); impl Default for BiMultimap { fn default() -> Self { Self(VecMap1::default(), VecMap1::default()) } } impl BiMultimap { fn single(key: K, value: V) -> Self { Self( vec![(key.clone(), VecSet2::single(value.clone()))] .into_iter() .collect(), vec![(value, VecSet2::single(key))].into_iter().collect(), ) } fn combine_with(&mut self, rhs: BiMultimap) { self.0.combine_with(rhs.0, |a, b| &a | &b); self.1.combine_with(rhs.1, |a, b| &a | &b); } } impl FromIterator<(K, V)> for BiMultimap { fn from_iter>(iter: T) -> Self { let mut res = BiMultimap::default(); for (k, v) in iter.into_iter() { res.combine_with(Self::single(k, v)) } res } } fn main() { let _x: Multimap = [(0, 0), (0, 1), (1, 0)].iter().cloned().collect(); let _y: BiMultimap = [(0, 0), (0, 1), (1, 0)].iter().cloned().collect(); } vec-collections-0.4.3/examples/nalloc.gnuplot000064400000000000000000000005310072674642500174500ustar 00000000000000set datafile separator "," set terminal png size 1024, 768 set output 'nalloc.png' set ylabel "bytes" set xlabel "size (u64)" # set key autotitle columnhead plot \ 'alloc.csv' using 1:4 title 'BTreeSet allocations' with lines, \ '' using 1:7 title 'VecSet allocations' with lines, \ '' using 1:10 title 'HashSet allocations' with lines, \ vec-collections-0.4.3/examples/nalloc.png000064400000000000000000000206030072674642500165460ustar 00000000000000PNG  IHDRd?8PLTE@Ai @0`@ԥ**@333MMMfff22U݂d"".Wp͇PErz挽k ܠ ݠݐP@Uk/@@``@@`pͷ|@ ߿___???sV8 pHYs+IDATx v:PwО @`ٖtΧL aa!N' e]QN-뢞nUÍjGlmfUTMY{?0 :0}i: }h'1 S[TG9ay+%<\8de*f8O B!_ S:my3S 7o#z|І߶EO@`!P,C4tCYEd)p,C4tG8S:m#) 6iAP1M׵ꮙ2޷_>^/=V2/k}TW?~<4@y]uՏ }@-w:eroG] faœ _(xhsR$_US7[/?՟W/0]63h0}=꺜W7KIC}QRIeˍi{^Zs>?~\trkG=X gkq@C)t]\nԖCa\mwX k죬S(xh.ωl Mԥ+Eq)ON{PCK;Z@یn O `h3;<>֭|M7e;;.v.鉾)~p;| `)9j<4]8.vLF73ܵCO#~\/|aKý\MK0]]nT2ں~Wwfy PYL@dL@dL@dLgzeGvS];+vKcu 7vKcus}jG߷[ln~PmΛz}dK؝-6L%_[U˯\v{%[m#7kvkdK|G0o/OW[<+7կl-7 )xѡ>=U1== jG'[]cKwSbzj'%l v{ۖ`-y͖`cJv}K|G09S1S1S1SIJe=^`rO0OTw%SKpgO[kO *^-rٳ`6L3}ݎluٳΞ`wy-)Bv7R< z1 R O/g j' VE@/L@"ދL@P?L OW=Y˥ Ag KH@k+)Ș<` .ke *_@\di7Db!DDB@L /H' .\Y   K!ޡG6ʿ#Rm& DzU' e+8yt?Spf(dL@vȿP1S{`G;f`?{_di+7VcWu=~ꢮ"{gKXUQ5e<&D)ӹ  QJ˲k`|Dg `HXmќƯs@Yg軓{2(nNM+P0) [._kA i@=NˀpƦm]K ZgR` oЎ)ݏ 8 g pc.1 {8zrL؃81acG8S?QBW81a+} Ig VUK^LĕDkQ=&s1fc_'Z{= >"9&,BDH# DDuLXKo(xO"џ)x1a- cZ@DŽ( kQ> W%%R>?QTWPt?SXW 1MO J>w) /c?SM&ٟ(S|<&<;eEWp>߲.V5ܨ>jۺ +oVEՔE𘰂?Y5Uu `z +PkW^noQXkS[4Í@p0?`CFpl `PIxKtSL+ Rx^0gދ]ٿs~ _z9n-ʶsߎ,yVѴwx3=3@ȓ(cEȍ_QF\QåP?(~P@D@@ڜJ6 i;@r D+RP$JB& M % 4)(Ҥ^HS$G_HA@BߥHK  m x)R H n?D5 j 3 X@+_ R@ѱw= z)bV)"֦X " `m ()"֦X :@<PSCN:@<PS.`Ʈ(VuQW77 ~ jʢdAj4@=~I@ kq*fzίAI RmL_ˍ$eTˍ$a@XL+Ę(^d- pK_yL$[X5p_@@la0󬢱OopD; )Ĺ"[SoNp `s C0߇d #(@D/~wؗJ/+㴻WlzLR'z=~UQ|#1Iai~ՎI^p04WpVI )@;~ge :dyY@1I;a6_PfEaqPx=UUC݆$Iqq-@1I[N?*ga,-ڪ.7<&iQF?Ͽȑ1ƶ]aȒKPGꍫ/>pPnR+ƪ+)C{c?IQkl18E_m|Lbfwvu~ cVYƦ싾?|1@dA:hq8 uw.^nV1{,PSx=M7 u7e۶emW`Px+MAyBMAxؼ1W<$y1堮 CX(F 8)V!qRA#XCf1S|HcGM5_Y_~$)PHA0"pl?amCTEՔŷSd N4(:@3=W?1aX-F9'&P(H&_$F&Hz0X84X)?ߋ4=8M$ֻ ?0a: ҡd)0Dy3PRB$J (LL;Ow i ӧxHӧxD3xDd@7gCgCCp͹fd?3 +ĕ<)&'DI0QyR3ϙȞLNr2fȘ2PS(|? c 1Ȓտ,@DȐs28Sy1ȋsCdEra  =  {@,1<1: u _(HHH)$^$FHyHuEEyH- - (?QIQG$E{@*,틺oTuQW3s cSwM56@UTMY[3s_ c_!i̜/„q>'A,)$hN9Xw (F@0(SO8<'px p)QG780'4p\Op pH6?QG؈8Fْ8gS XRGa/;PG!@p =(?g7 `w~Q;r韽)>{S;RMH7 AB9 1(](AA9A(=(Bl?DlL9-Pb/"؈sD `# #RsX <@pq)ǥB2@H)䟣SAXK…ǯU]f< 'XcTEՔE1CD06E7@]_~c ؗe=_};H`OLqHXmќƯs `o,ɨ䟨 cߝ_0Vusm q)얱ˬ^}$ͨOa.p O0-R'pdX7E!@ZR>'DK|L ^ &DN|B;''O(ҠD&R$DGIx ) e&GLIx *@s.,,. ] 7&$NFI q 7 )_?SPNB:p dA'dA%Aܥȃ{ɉFɉ%dERdE\p!G?Rg )?R'OK?S ] `ʺZq2-eW `σ(Ș)Ș)ȘeTVwXE]7F1}.Ljbhh83? W7? cYɿv  ƾ;E3h/r\ cYT'*SEC_q />*Ls~ _.?.:ȹ? HezXH 2^,CR+)XB`/+3,$,x%Q&7iB&dL@dL@R(?R1S1,O^ > c` c@"-5(X|`Vz@| \T> @@d,00(9x8^pJ@ƎZ[p؂La3,p؎ac*Mpؚ,}vx1 @a' 2sÞ.)Ș..1Wߎ7:m{jʢ}tL`MG6Cr ȆpA3=WRBhfz;(/JCo57t~o)T#2V#záO }z8"hC _]dR` VtEy;j(uixb,ޛǡ~m쬿6tzctEՖ 3,XkMk:ȟۮ6mr݌пeUw7 HUeՎsĵnU'qP k= ѶaY}a tzcLbbq2t/>tSUSy2ن+%ՇO.f%L2@)S^ljc  4dK 1"`5:m 0lv T)`x#!ӫyz8B  "ǿew2ȃ_^ fyՎQp݌4`?zbû|#g廸XN bE4G 꼹,)]>k@<ψhO| ќX>.}=\Ou j\ _|S 79 fAoH8?hj 0ݣ|*V@cQ>f<>rl3]>ī;o*Dv^-O{3.~:H]$fgw)}݀[MЖIENDB`vec-collections-0.4.3/examples/plot.png000064400000000000000000000117340072674642500162610ustar 00000000000000PNG  IHDR,2PLTE@Ai @0`@ԥ**@333MMMfff22U݂d"".Wp͇PErz挽k ܠ ݠݐP@Uk/@@``@@`pͷ|@ ߿___???% pHYs+PIDATxk8@aXuڂrns~XSpoM./+Ϻ)zQfeVeu(Xu]Lg?l .7nٽ߸QyL7z7n|hG? ֟@vt? GBJ~28?a˝OmJqSxԟ<wUyyD"MY|Q3Sr }+SǦ?>ᨿMSɦ?>ѨHRT^Η6F/}I5[G6gMNlwS}(qX/ZY@?,vqcMoj,ٯڲ߳?ڨ]pUOv7Yζ af>w 1to+a {@# C;g}ӵ~7ݘwwnwz!+5U۹qp{Wp藯nŨg `A_4}?k7=  ˿so)_w㧎;?jXv.}@z{պ;_g<V ?. ?,W,` \~quYnn'd\|;}\[3?hv0lx;_>ݡX(q"cM^ZwȧwS4QݔȠ>XAz>7}yNS}yf8dYފʖ5/+~r9"/w0Z Ӯ?tFv.ff}@ G}H!HHv1@ !~0 R 0?RHIpѿ<Eȟ>*)dtT2+%04T_v7Eez=Rrv`ৣ}@ywʟ,;uRVvJ"j͝y REPz ظhζ^N!歸LF_;{1@~ H?3?) Nl*H@:?ҙ~I"?8U$Y_I2?(u$AH t4Ï)ұ +W@k!K>Cξ.TZl;w|.PT\ab+tRRB]Og¦+f:!K@ $eBƗ}L,VX~cHP1AѱRR]u&bY))  s":x+F.@z;n@w?Rqٗ5ҝH~]̽;w?fy`w?̈́?f ~5_L3Yf̐?旝ݯ e˘?f5*[/|(Q0,Nɨ?fQ~J׈j>SQѹJI\!hv%g.Y}RᴱT,SSɱNlRwd/ӻ_uʼ?%8v2OKtR]ƲOOĴL Ku:)% 'M? ?>h`?,"~L?&VdX`R ?)F~L80D`E)W0bc/r0>`%?[ _hKc-d0K#,):*.Q—?mӷ*ٿG*;VJJIKju_˒LCқ %MeB5aK@(CU0hiS~.8`SQQ+%+IZ"HUJIJcJCEW;Dt[q0?>`K?.y4]h pY@%~M?,~X>_@?+74UVS4Th N9N͔'?Z)WQh|B9e?\gr{ß_]˳I~Rwc-?B5$ >VJ)M\%.2 ߜ 8]JI8XSSJIǃ#5t8=fc]ᦻ/Y)H{Mgp"{/wx+n;F0F,mf&K^"O0t0lC0}߁*v`w, `P=Iv@8@' 1^;ՂߙN@w.-Ml;t@%N-{0וw>CU5RQ1s\?rQB5-ZlTM[d fs *rn$Ui0𧐖*H`VoO%>p.?OO1f?( P$@A_x4 _x, Gb,~0~ !4~Ïc ?> n"KN&nV,n[}2~e$.φKP7uWUߵi\unWJb:5ÐJI<]7]4֊+:jwCZ* HME]qwK*?Ft1 )fy$ݕjDthRq~o 2 n/krBğ?e Jyğ?; ,@^*73Vfg2+'3XFg|ddkLjyğٲ?eK L<@.qLK ̗4@/奺A*KuuW[ 1}.Ku/TTIzk_,iFsfVJbOJ**Kk/tTޚ]0bJV_@M-,閦Iɨn7-!; w NUiP4 7&[S= F3Y&9؎qIQ6DpOD'NV˹N~G9Q5I PT9~z6h,ÙwS?ٷ*[qp潧3o-әpԹ'ph V?#~~IENDB`vec-collections-0.4.3/examples/radix_db.rs000064400000000000000000000354230072674642500167200ustar 00000000000000use std::{ collections::{hash_map, BTreeMap}, fs, io, io::Write, path::PathBuf, sync::Arc, }; use bytecheck::CheckBytes; use futures::{ channel::mpsc::{UnboundedReceiver, UnboundedSender}, future, stream::BoxStream, StreamExt, }; use parking_lot::Mutex; use rkyv::{ archived_root, de::{deserializers::SharedDeserializeMapError, SharedDeserializeRegistry, SharedPointer}, ser::{ serializers::{AllocScratch, FallbackScratch, HeapScratch}, Serializer, }, ser::{ serializers::{CompositeSerializer, SharedSerializeMapError, WriteSerializer}, SharedSerializeRegistry, }, validation::validators::DefaultValidator, AlignedVec, Archived, Deserialize, Fallible, Serialize, }; use vec_collections::radix_tree::{ AbstractRadixTree, AbstractRadixTreeMut, ArcRadixTree, TKey, TValue, }; struct Batch { v0: ArcRadixTree, v1: ArcRadixTree, } impl Batch { pub fn added(&self) -> ArcRadixTree { let mut res = self.v1.clone(); res.difference_with(&self.v0); res } pub fn removed(&self) -> ArcRadixTree { let mut res = self.v0.clone(); res.difference_with(&self.v1); res } } #[derive(Debug, Default)] pub struct SharedSerializeMap2 { /// mapping from the rc/arc to the position in the buffer shared_resolvers: hash_map::HashMap<*const u8, usize>, } impl Fallible for SharedSerializeMap2 { type Error = SharedSerializeMapError; } impl SharedSerializeRegistry for SharedSerializeMap2 { fn get_shared_ptr(&mut self, value: *const u8) -> Option { self.shared_resolvers.get(&value).copied() } fn add_shared_ptr(&mut self, value: *const u8, pos: usize) -> Result<(), Self::Error> { match self.shared_resolvers.entry(value) { hash_map::Entry::Occupied(_) => { Err(SharedSerializeMapError::DuplicateSharedPointer(value)) } hash_map::Entry::Vacant(e) => { e.insert(pos); Ok(()) } } } } #[derive(Default)] pub struct SharedDeserializeMap2 { /// mapping from the position in the buffer to the rc/arc shared_pointers: hash_map::HashMap<*const u8, Box>, } impl SharedDeserializeMap2 { pub fn to_shared_serializer_map(&self, base: *const u8) -> SharedSerializeMap2 { let shared_resolvers = self .shared_pointers .iter() .map(|(k, v)| { let offset: usize = (*k as usize) - (base as usize); let address = v.data_address() as *const u8; (address, offset) }) .collect(); SharedSerializeMap2 { shared_resolvers } } } impl Fallible for SharedDeserializeMap2 { type Error = SharedDeserializeMapError; } /// these are safe, because a *const u8 is safe to send and sync /// /// see discussion in https://internals.rust-lang.org/t/shouldnt-pointers-be-send-sync-or/8818 unsafe impl Send for SharedSerializeMap2 {} unsafe impl Sync for SharedSerializeMap2 {} unsafe impl Send for SharedDeserializeMap2 {} unsafe impl Sync for SharedDeserializeMap2 {} impl SharedDeserializeRegistry for SharedDeserializeMap2 { fn get_shared_ptr(&mut self, ptr: *const u8) -> Option<&dyn SharedPointer> { self.shared_pointers.get(&ptr).map(|p| p.as_ref()) } fn add_shared_ptr( &mut self, ptr: *const u8, shared: Box, ) -> Result<(), Self::Error> { match self.shared_pointers.entry(ptr) { hash_map::Entry::Occupied(_) => { Err(SharedDeserializeMapError::DuplicateSharedPointer(ptr)) } hash_map::Entry::Vacant(e) => { e.insert(shared); Ok(()) } } } } trait AbstractRadixDb { fn tree(&self) -> &ArcRadixTree; fn tree_mut(&mut self) -> &mut ArcRadixTree; fn flush(&mut self) -> anyhow::Result<()>; fn vacuum(&mut self) -> anyhow::Result<()>; fn watch(&mut self) -> futures::channel::mpsc::UnboundedReceiver>; fn watch_prefix(&mut self, prefix: Vec) -> BoxStream<'static, Batch> { let tree = self.tree().clone(); self.watch() .scan(tree, move |prev, curr| { let v0 = prev.filter_prefix(&prefix); let v1 = curr.filter_prefix(&prefix); future::ready(Some(Batch { v0, v1 })) }) .boxed() } } trait Storage { /// appends to a file. Should only return when the data is safely on disk (flushed)! /// appending will usually be done in large chunks. /// appending to a non existing file creates it. /// appending an empty chunk is a noop. fn append(&self, file: &str, chunk: &[u8]) -> io::Result<()>; /// load a file. The callback will get to look at the data and do something with it. /// loading a non-existing file is like loading an empty file. It will not create the file. fn load(&self, file: &str, f: impl FnMut(&[u8]) -> T) -> io::Result; /// atomically move a file. target will be atomically overwritten. /// if the source file does not exist, the target file will be deleted. fn mv(&self, from: &str, to: &str) -> io::Result<()>; } #[derive(Default, Clone)] struct MemStorage { data: Arc>>, } impl Storage for MemStorage { fn append(&self, file: &str, chunk: &[u8]) -> std::io::Result<()> { if !chunk.is_empty() { let mut data = self.data.lock(); let vec = if let Some(vec) = data.get_mut(file) { vec } else { data.entry(file.to_owned()).or_default() }; vec.extend_from_slice(chunk); } Ok(()) } fn load(&self, file: &str, mut f: impl FnMut(&[u8]) -> T) -> std::io::Result { let data = self.data.lock(); let res = if let Some(vec) = data.get(file) { f(vec) } else { f(&[]) }; Ok(res) } fn mv(&self, from: &str, to: &str) -> std::io::Result<()> { if from != to { let mut data = self.data.lock(); if let Some(vec) = data.remove(from) { if !vec.is_empty() { data.insert(to.to_owned(), vec); } else { data.remove(to); } } else { data.remove(to); } } Ok(()) } } #[derive(Default, Clone)] pub struct FileStorage { base: PathBuf, } impl FileStorage { pub fn new(base: impl AsRef) -> Self { Self { base: base.as_ref().to_path_buf(), } } } impl Storage for FileStorage { fn append(&self, file: &str, chunk: &[u8]) -> io::Result<()> { if !chunk.is_empty() { let mut file = fs::OpenOptions::new() .create(true) .append(true) .open(self.base.join(file))?; file.write_all(chunk)?; } Ok(()) } fn load(&self, file: &str, mut f: impl FnMut(&[u8]) -> T) -> io::Result { let res = match std::fs::read(self.base.join(file)) { Ok(data) => f(&data), Err(e) if e.kind() == io::ErrorKind::NotFound => f(&[]), Err(e) => return Err(e), }; Ok(res) } fn mv(&self, from: &str, to: &str) -> std::io::Result<()> { if from != to { let from = self.base.join(from); let to = self.base.join(to); match fs::rename(from, &to) { Ok(()) => {} Err(e) if e.kind() == std::io::ErrorKind::NotFound => { fs::remove_file(to)?; } Err(e) => return Err(e), } } Ok(()) } } #[allow(clippy::type_complexity)] struct RadixDb { storage: S, name: String, serializers: Option<( SharedSerializeMap2, BTreeMap>>>, )>, pos: usize, tree: ArcRadixTree, watchers: Vec>>, } impl RadixDb where Archived: Deserialize + for<'x> CheckBytes>, Archived: Deserialize + for<'x> CheckBytes>, { fn memory(name: impl Into) -> anyhow::Result { RadixDb::load(MemStorage::default(), name) } } impl RadixDb where Archived: Deserialize + for<'x> CheckBytes>, Archived: Deserialize + for<'x> CheckBytes>, { fn _open(base: impl AsRef, name: impl Into) -> anyhow::Result { RadixDb::load(FileStorage::new(base), name) } } impl RadixDb { pub fn storage(&self) -> &S { &self.storage } pub fn load(storage: S, name: impl Into) -> anyhow::Result where Archived: Deserialize + for<'x> CheckBytes>, Archived: Deserialize + for<'x> CheckBytes>, { let name = name.into(); let (tree, map, arcs, pos) = storage.load(&name, |data| -> anyhow::Result<_> { Ok(if data.is_empty() { let pos = Default::default(); let arcs = Default::default(); let tree = Default::default(); let map = Default::default(); (tree, map, arcs, pos) } else { let mut deserializer = SharedDeserializeMap2::default(); // let tree: &Archived> = // check_archived_root::>(data) // .map_err(|e| anyhow::anyhow!("{}", e))?; let tree: &Archived> = unsafe { archived_root::>(data) }; let tree: ArcRadixTree = tree .deserialize(&mut deserializer) .map_err(|e| anyhow::anyhow!("Error while deserializing: {}", e))?; let map = deserializer.to_shared_serializer_map(&data[0] as *const u8); let mut arcs = BTreeMap::default(); tree.all_arcs(&mut arcs); let pos = data.len(); (tree, map, arcs, pos) }) })??; Ok(Self { tree, name, storage, pos, serializers: Some((map, arcs)), watchers: Default::default(), }) } fn notify(&mut self) { let tree = self.tree.clone(); self.watchers .retain(|sender| sender.unbounded_send(tree.clone()).is_ok()) } } type MySerializer<'a> = CompositeSerializer< WriteSerializer<&'a mut AlignedVec>, FallbackScratch, AllocScratch>, SharedSerializeMap2, >; impl AbstractRadixDb for RadixDb where K: TKey + for<'x> Serialize>, V: TValue + for<'x> Serialize>, S: Storage, { fn tree(&self) -> &ArcRadixTree { &self.tree } fn tree_mut(&mut self) -> &mut ArcRadixTree { &mut self.tree } fn vacuum(&mut self) -> anyhow::Result<()> { // write ourselves to a new file let mut file = AlignedVec::new(); let mut serializer = CompositeSerializer::new( WriteSerializer::new(&mut file), Default::default(), Default::default(), ); serializer .serialize_value(&self.tree) .map_err(|e| anyhow::anyhow!("Error while serializing: {}", e))?; let (_, _, map) = serializer.into_components(); // compute just the current arcs of the current tree let mut arcs = BTreeMap::default(); self.tree.all_arcs(&mut arcs); // store the new file and the new arcs let tmp = format!("{}.tmp", self.name); self.storage.append(&tmp, &file)?; self.storage.mv(&tmp, &self.name)?; self.pos = file.len(); self.serializers = Some((map, arcs)); self.notify(); Ok(()) } fn flush(&mut self) -> anyhow::Result<()> { let (map, mut arcs) = self.serializers.take().unwrap_or_default(); let mut t = AlignedVec::new(); let mut serializer = CompositeSerializer::new( WriteSerializer::with_pos(&mut t, self.pos), Default::default(), map, ); serializer .serialize_value(&self.tree) .map_err(|e| anyhow::anyhow!("Error while serializing: {}", e))?; self.tree.all_arcs(&mut arcs); let (_, _, map) = serializer.into_components(); self.storage.append(&self.name, &t)?; self.pos += t.len(); self.serializers = Some((map, arcs)); self.notify(); Ok(()) } fn watch(&mut self) -> UnboundedReceiver> { let (s, r) = futures::channel::mpsc::unbounded(); self.watchers.push(s); r } } #[tokio::main] async fn main() -> anyhow::Result<()> { // let mut db = RadixDb::open(std::env::current_dir()?, "test")?; let mut db = RadixDb::memory("test")?; let mut stream = db.watch_prefix("9".as_bytes().to_vec()); tokio::spawn(async move { while let Some(x) = stream.next().await { for (added, _) in x.added().iter() { let text = std::str::from_utf8(&added).unwrap(); println!("added {}", text); } for (removed, _) in x.removed().iter() { let text = std::str::from_utf8(&removed).unwrap(); println!("removed {}", text); } } }); for i in 0..100 { for j in 0..100 { let key = format!("{}-{}", i, j); db.tree_mut().insert(key.as_bytes(), ()); } if i % 10 == 0 { db.vacuum()?; } else { db.flush()?; } // db.flush()?; println!("{} {}", i, db.pos); } db.flush()?; println!("{}", db.pos); println!("db"); for (k, _) in db.tree().iter() { println!("{}", std::str::from_utf8(&k)?); } let mut db2: RadixDb = RadixDb::load(db.storage().clone(), "test")?; db2.vacuum()?; println!("db2"); for (k, _) in db2.tree().iter() { println!("{}", std::str::from_utf8(&k)?); } println!("{} {}", db.pos, db2.pos); Ok(()) } vec-collections-0.4.3/examples/radix_tree.rs000064400000000000000000000044420072674642500172670ustar 00000000000000use rkyv::*; use ser::Serializer; use std::time::Instant; use vec_collections::radix_tree::{ AbstractRadixTree, AbstractRadixTreeMut, LazyRadixTree, RadixTree, }; fn main() { let t0 = Instant::now(); let mut eager = RadixTree::default(); for i in 0..2 { let key = i.to_string(); let chars = key.as_bytes().to_vec(); let node = RadixTree::single(&chars, i); eager.union_with(&node); } println!("eager create {}", t0.elapsed().as_secs_f64()); let mut serializer = ser::serializers::AllocSerializer::<256>::default(); serializer.serialize_value(&eager).unwrap(); let bytes = serializer.into_serializer().into_inner(); println!( "hex dump of eager tree {:?}", eager.iter().collect::>() ); hexdump::hexdump(&bytes); let t0 = Instant::now(); let mut lazy = LazyRadixTree::default(); for i in 0..2 { let key = i.to_string(); let chars = key.as_bytes().to_vec(); let node = LazyRadixTree::single(&chars, i); lazy.union_with(&node); } println!("lazy create {}", t0.elapsed().as_secs_f64()); let mut serializer = ser::serializers::AllocSerializer::<256>::default(); serializer.serialize_value(&lazy).unwrap(); let bytes = serializer.into_serializer().into_inner(); println!( "hex dump of lazy tree {:?}", lazy.iter().collect::>() ); hexdump::hexdump(&bytes); let archived = unsafe { rkyv::archived_root::>(&bytes) }; let mut tree = LazyRadixTree::from(archived); for (k, v) in tree.iter() { println!("{:?} {}", k, v); } tree.insert(&"fnord".as_bytes().to_vec(), 1); let mut serializer = ser::serializers::AllocSerializer::<256>::default(); serializer.serialize_value(&tree).unwrap(); let bytes2 = serializer.into_serializer().into_inner(); println!( "hex dump of modified tree {:?}", tree.iter().collect::>() ); hexdump::hexdump(&bytes2); // println!("{:#?}", res); let mut a: RadixTree = RadixTree::single(b"aabbcc", 1); let b: RadixTree = RadixTree::single(b"aabb", 2); let _c: RadixTree = RadixTree::single(b"aabbee", 3); println!("{:?}", a); a.union_with(&b); println!("{:?}", a); } vec-collections-0.4.3/examples/set_alloc2.rs000064400000000000000000000042020072674642500171620ustar 00000000000000extern crate stats_alloc; use stats_alloc::{Region, StatsAlloc, INSTRUMENTED_SYSTEM}; use std::alloc::System; #[global_allocator] static GLOBAL: &StatsAlloc = &INSTRUMENTED_SYSTEM; use std::collections::{BTreeSet, HashSet}; use vec_collections::VecSet; struct PlotStats { bytes_allocated: usize, bytes_persistent: usize, allocations: usize, } impl From for PlotStats { fn from(value: stats_alloc::Stats) -> Self { Self { bytes_allocated: value.bytes_allocated, bytes_persistent: value.bytes_allocated - value.bytes_deallocated, allocations: value.allocations, } } } fn main() { let n = 1000; let mut bs = Vec::::new(); for i in 0..n { let reg = Region::new(GLOBAL); let r = (0..i).collect::>(); let stats: stats_alloc::Stats = reg.change(); bs.push(stats.into()); std::mem::drop(r); } let mut vs = Vec::::new(); for i in 0..n { let reg = Region::new(GLOBAL); let mut r = (0..i).collect::>(); r.shrink_to_fit(); let stats: stats_alloc::Stats = reg.change(); vs.push(stats.into()); } let mut hs = Vec::::new(); for i in 0..n { let reg = Region::new(GLOBAL); let mut r = (0..i).collect::>(); r.shrink_to_fit(); let stats: stats_alloc::Stats = reg.change(); hs.push(stats.into()); std::mem::drop(r); } println!("n,\tBTreeSet alloc,\tBTreeSet persistent,\tBTreeSet nalloc,\tVecSet alloc,\tVecSet persistent,\tVecSet nalloc,\tHashSet alloc,\tHashSet persistent,\tHashSet nalloc"); for i in 0..(n as usize) { println!( "{},\t{},\t{},\t{},\t{},\t{},\t{},\t{},\t{},\t{}", i, bs[i].bytes_allocated, bs[i].bytes_persistent, bs[i].allocations, vs[i].bytes_allocated, vs[i].bytes_persistent, vs[i].allocations, hs[i].bytes_allocated, hs[i].bytes_persistent, hs[i].allocations, ); } } vec-collections-0.4.3/examples/set_benches.rs000064400000000000000000000144360072674642500174270ustar 00000000000000extern crate vec_collections; use std::collections::{BTreeSet, HashSet}; use vec_collections::{AbstractVecSet, VecSet2}; // #[macro_use] // extern crate lazy_static; // extern crate rand; // use rand::Rng; // type Element = Vec; // lazy_static! { // static ref ELEMENTS: Vec = make_elements(); // } // fn make_elements() -> Vec { // let mut rng = rand::thread_rng(); // (0..100000).map(move |_| { // // add zeros at the start // let mut random_bytes: Vec = (0..990).map(|_| 0).collect(); // random_bytes.extend((0..10).map(|_| { rng.gen::() })); // random_bytes // }).collect() // } // fn element(x: usize) -> Element { // ELEMENTS.get(x).unwrap().clone() // } type Element = u32; fn element(x: usize) -> Element { x as Element } struct TestData { params: String, a: Vec, b: Vec, } impl TestData { fn interleaved(n: usize) -> TestData { TestData { params: format!("interleaved {}", n), a: (0..n).map(|x| element(2 * x)).collect(), b: (0..n).map(|x| element(2 * x + 1)).collect(), } } fn non_overlapping(n: usize) -> TestData { TestData { params: format!("non_overlapping {}", n), a: (0..n).map(|x| element(2 * x)).collect(), b: (0..n).map(|x| element(2 * x + 2 * n)).collect(), } } } fn union_arrayset(data: &TestData) { let a: VecSet2 = data.a.clone().into(); let b: VecSet2 = data.b.clone().into(); let t0 = std::time::Instant::now(); let _r = &a | &b; let dt = std::time::Instant::now() - t0; println!("union vecset {} {:?}", data.params, dt); } fn union_btreeset(data: &TestData) { let a: BTreeSet = data.a.iter().cloned().collect(); let b: BTreeSet = data.b.iter().cloned().collect(); let t0 = std::time::Instant::now(); let _r = &a | &b; let dt = std::time::Instant::now() - t0; println!("union btreeset {} {:?}", data.params, dt); } fn union_hashset(data: &TestData) { let a: HashSet = data.a.iter().cloned().collect(); let b: HashSet = data.b.iter().cloned().collect(); let t0 = std::time::Instant::now(); let _r = &a | &b; let dt = std::time::Instant::now() - t0; println!("union hashset {} {:?}", data.params, dt); } fn intersection_arrayset(data: &TestData) { let a: VecSet2 = data.a.clone().into(); let b: VecSet2 = data.b.clone().into(); let t0 = std::time::Instant::now(); let _r = &a & &b; let dt = std::time::Instant::now() - t0; println!("intersection vecset {} {:?}", data.params, dt); } fn intersection_btreeset(data: &TestData) { let a: BTreeSet = data.a.iter().cloned().collect(); let b: BTreeSet = data.b.iter().cloned().collect(); let t0 = std::time::Instant::now(); let _r = &a & &b; let dt = std::time::Instant::now() - t0; println!("intersection btreeset {} {:?}", data.params, dt); } fn intersection_hashset(data: &TestData) { let a: HashSet = data.a.iter().cloned().collect(); let b: HashSet = data.b.iter().cloned().collect(); let t0 = std::time::Instant::now(); let _r = &a & &b; let dt = std::time::Instant::now() - t0; println!("intersection hashset {} {:?}", data.params, dt); } fn is_disjoint_arrayset(data: &TestData) { let a: VecSet2 = data.a.clone().into(); let b: VecSet2 = data.b.clone().into(); let t0 = std::time::Instant::now(); let _r = a.is_disjoint(&b); let dt = std::time::Instant::now() - t0; println!("is_disjoint vecset {} {} {:?}", _r, data.params, dt); } fn is_disjoint_btreeset(data: &TestData) { let a: BTreeSet = data.a.iter().cloned().collect(); let b: BTreeSet = data.b.iter().cloned().collect(); let t0 = std::time::Instant::now(); let _r = a.is_disjoint(&b); let dt = std::time::Instant::now() - t0; println!("is_disjoint btreeset {} {} {:?}", _r, data.params, dt); } fn is_disjoint_hashset(data: &TestData) { let a: HashSet = data.a.iter().cloned().collect(); let b: HashSet = data.b.iter().cloned().collect(); let t0 = std::time::Instant::now(); let _r = a.is_disjoint(&b); let dt = std::time::Instant::now() - t0; println!("is_disjoint hashset {} {} {:?}", _r, data.params, dt); } fn creation_arrayset(name: &str, data: &[Element]) { let elems = data; let t0 = std::time::Instant::now(); let a: VecSet2 = elems.iter().cloned().collect(); let dt = std::time::Instant::now() - t0; println!("creation vecset {} {} {:?}", a.len(), name, dt); } fn creation_btreeset(name: &str, data: &[Element]) { let elems = data; let t0 = std::time::Instant::now(); let a: BTreeSet = elems.iter().cloned().collect(); let dt = std::time::Instant::now() - t0; println!("creation btreeset {} {} {:?}", a.len(), name, dt); } fn creation_hashset(name: &str, data: &[Element]) { let elems = data; let t0 = std::time::Instant::now(); let a: HashSet = elems.iter().cloned().collect(); let dt = std::time::Instant::now() - t0; println!("creation hashset {} {} {:?}", a.len(), name, dt); } fn main() { let interleaved = TestData::interleaved(10000); let non_overlapping = TestData::non_overlapping(10000); let mut x: Vec = Vec::new(); for i in 0..1000000 { x.push(element(i * 3 % 10000)); } union_arrayset(&interleaved); union_btreeset(&interleaved); union_hashset(&interleaved); union_arrayset(&non_overlapping); union_btreeset(&non_overlapping); union_hashset(&non_overlapping); intersection_arrayset(&interleaved); intersection_btreeset(&interleaved); intersection_hashset(&interleaved); intersection_arrayset(&non_overlapping); intersection_btreeset(&non_overlapping); intersection_hashset(&non_overlapping); is_disjoint_arrayset(&interleaved); is_disjoint_btreeset(&interleaved); is_disjoint_hashset(&interleaved); is_disjoint_arrayset(&non_overlapping); is_disjoint_btreeset(&non_overlapping); is_disjoint_hashset(&non_overlapping); creation_arrayset("mixed", &x); creation_btreeset("mixed", &x); creation_hashset("mixed", &x); } vec-collections-0.4.3/flamegraph.svg000064400000000000000000005444550072674642500156210ustar 00000000000000Flame Graph Reset ZoomSearch perf (5 samples, 2.39%)p..[[kernel.kallsyms]] (5 samples, 2.39%)[..[[kernel.kallsyms]] (5 samples, 2.39%)[..[[kernel.kallsyms]] (5 samples, 2.39%)[..[[kernel.kallsyms]] (5 samples, 2.39%)[..[[kernel.kallsyms]] (5 samples, 2.39%)[..[[kernel.kallsyms]] (5 samples, 2.39%)[..[[kernel.kallsyms]] (5 samples, 2.39%)[..[[kernel.kallsyms]] (5 samples, 2.39%)[..[unknown] (1 samples, 0.48%)vec_collections::radix_tree::RadixTree<K,V>::combine_with (1 samples, 0.48%)vec_collections::radix_tree::RadixTree<K,V>::combine_children_with (1 samples, 0.48%)vec_collections::binary_merge::MergeOperation::merge0 (1 samples, 0.48%)vec_collections::binary_merge::MergeOperation::merge0 (1 samples, 0.48%)vec_collections::binary_merge::MergeOperation::merge0 (1 samples, 0.48%)<vec_collections::radix_tree::MergeOp<F> as vec_collections::binary_merge::MergeOperation<I>>::collision (1 samples, 0.48%)vec_collections::radix_tree::RadixTree<K,V>::combine_with (1 samples, 0.48%)vec_collections::radix_tree::RadixTree<K,V>::combine_children_with (1 samples, 0.48%)vec_collections::binary_merge::MergeOperation::merge0 (1 samples, 0.48%)vec_collections::binary_merge::MergeOperation::merge0 (1 samples, 0.48%)vec_collections::binary_merge::MergeOperation::merge0 (1 samples, 0.48%)vec_collections::binary_merge::MergeOperation::merge0 (1 samples, 0.48%)<vec_collections::radix_tree::MergeOp<F> as vec_collections::binary_merge::MergeOperation<I>>::collision (1 samples, 0.48%)vec_collections::radix_tree::RadixTree<K,V>::combine_with (1 samples, 0.48%)vec_collections::radix_tree::RadixTree<K,V>::combine_children_with (1 samples, 0.48%)std::rt::lang_start_internal::_$u7b$$u7b$closure$u7d$$u7d$::h18134365fc5b7101 (1 samples, 0.48%)std::sys_common::rt::init (1 samples, 0.48%)std::sys::unix::thread::guard::init (1 samples, 0.48%)std::sys::unix::thread::guard::get_stack_start_aligned (1 samples, 0.48%)std::sys::unix::thread::guard::get_stack_start (1 samples, 0.48%)pthread_getattr_np (1 samples, 0.48%)_IO_getdelim (1 samples, 0.48%)_IO_new_file_underflow (1 samples, 0.48%)__GI___read_nocancel (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)core::fmt::Formatter::debug_struct (1 samples, 0.48%)core::fmt::builders::debug_struct_new (1 samples, 0.48%)core::fmt::Formatter::write_str (1 samples, 0.48%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (1 samples, 0.48%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (1 samples, 0.48%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (1 samples, 0.48%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (1 samples, 0.48%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (1 samples, 0.48%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (1 samples, 0.48%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (1 samples, 0.48%)core::str::traits::<impl core::ops::index::Index<I> for str>::index (1 samples, 0.48%)core::str::traits::<impl core::slice::index::SliceIndex<str> for core::ops::range::RangeTo<usize>>::index (1 samples, 0.48%)core::str::traits::<impl core::slice::index::SliceIndex<str> for core::ops::range::RangeTo<usize>>::get (1 samples, 0.48%)core::str::<impl str>::is_char_boundary (1 samples, 0.48%)core::slice::<impl [T]>::get (1 samples, 0.48%)<usize as core::slice::index::SliceIndex<[T]>>::get (1 samples, 0.48%)core::fmt::Formatter::debug_list (1 samples, 0.48%)core::fmt::builders::debug_list_new (1 samples, 0.48%)core::fmt::Formatter::write_str (1 samples, 0.48%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (1 samples, 0.48%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (1 samples, 0.48%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (1 samples, 0.48%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (1 samples, 0.48%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (1 samples, 0.48%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (1 samples, 0.48%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (1 samples, 0.48%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (1 samples, 0.48%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (1 samples, 0.48%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (1 samples, 0.48%)<std::io::Write::write_fmt::Adaptor<T> as core::fmt::Write>::write_str (1 samples, 0.48%)<std::io::stdio::StdoutLock as std::io::Write>::write_all (1 samples, 0.48%)<std::io::buffered::linewriter::LineWriter<W> as std::io::Write>::write_all (1 samples, 0.48%)<std::io::buffered::linewritershim::LineWriterShim<W> as std::io::Write>::write_all (1 samples, 0.48%)std::sys_common::memchr::memrchr (1 samples, 0.48%)std::sys::unix::memchr::memrchr (1 samples, 0.48%)std::sys::unix::memchr::memrchr::memrchr_specific (1 samples, 0.48%)__memrchr_sse2 (1 samples, 0.48%)<&T as core::fmt::Debug>::fmt (7 samples, 3.35%)<&T..core::fmt::builders::DebugSet::entry (6 samples, 2.87%)co..core::fmt::builders::DebugInner::entry (6 samples, 2.87%)co..core::result::Result<T,E>::and_then (6 samples, 2.87%)co..core::fmt::builders::DebugInner::entry::_$u7b$$u7b$closure$u7d$$u7d$::h9a3dc54fa8fd789f (6 samples, 2.87%)co..core::fmt::Formatter::write_str (6 samples, 2.87%)co..<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (6 samples, 2.87%)<c..<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (6 samples, 2.87%)<c..<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (6 samples, 2.87%)<c..<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (6 samples, 2.87%)<c..<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (6 samples, 2.87%)<c..<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (6 samples, 2.87%)<c..<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (6 samples, 2.87%)<c..<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (6 samples, 2.87%)<c..<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (6 samples, 2.87%)<c..<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (6 samples, 2.87%)<c..<std::io::Write::write_fmt::Adaptor<T> as core::fmt::Write>::write_str (6 samples, 2.87%)<s..<std::io::stdio::StdoutLock as std::io::Write>::write_all (6 samples, 2.87%)<s..<std::io::buffered::linewriter::LineWriter<W> as std::io::Write>::write_all (6 samples, 2.87%)<s..<std::io::buffered::linewritershim::LineWriterShim<W> as std::io::Write>::write_all (6 samples, 2.87%)<s..std::io::buffered::bufwriter::BufWriter<W>::flush_buf (6 samples, 2.87%)st..<std::io::stdio::StdoutRaw as std::io::Write>::write (6 samples, 2.87%)<s..<std::sys::unix::stdio::Stdout as std::io::Write>::write (6 samples, 2.87%)<s..std::sys::unix::fd::FileDesc::write (6 samples, 2.87%)st..__libc_write (6 samples, 2.87%)__..[[kernel.kallsyms]] (6 samples, 2.87%)[[..[[kernel.kallsyms]] (6 samples, 2.87%)[[..[[kernel.kallsyms]] (6 samples, 2.87%)[[..[[kernel.kallsyms]] (6 samples, 2.87%)[[..[[kernel.kallsyms]] (6 samples, 2.87%)[[..[[kernel.kallsyms]] (6 samples, 2.87%)[[..[[kernel.kallsyms]] (6 samples, 2.87%)[[..[[kernel.kallsyms]] (6 samples, 2.87%)[[..[[kernel.kallsyms]] (6 samples, 2.87%)[[..[[kernel.kallsyms]] (6 samples, 2.87%)[[..[[kernel.kallsyms]] (6 samples, 2.87%)[[..[[kernel.kallsyms]] (6 samples, 2.87%)[[..[[kernel.kallsyms]] (6 samples, 2.87%)[[..[[kernel.kallsyms]] (6 samples, 2.87%)[[..[[kernel.kallsyms]] (6 samples, 2.87%)[[..[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (2 samples, 0.96%)<std::io::Write::write_fmt::Adaptor<T> as core::fmt::Write>::write_str (2 samples, 0.96%)<std::io::stdio::StdoutLock as std::io::Write>::write_all (1 samples, 0.48%)<std::io::buffered::linewriter::LineWriter<W> as std::io::Write>::write_all (1 samples, 0.48%)<std::io::buffered::linewritershim::LineWriterShim<W> as std::io::Write>::write_all (1 samples, 0.48%)std::io::buffered::bufwriter::BufWriter<W>::flush_buf (1 samples, 0.48%)<std::io::stdio::StdoutRaw as std::io::Write>::write (1 samples, 0.48%)<std::sys::unix::stdio::Stdout as std::io::Write>::write (1 samples, 0.48%)std::sys::unix::fd::FileDesc::write (1 samples, 0.48%)__libc_write (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)<&T as core::fmt::Debug>::fmt (11 samples, 5.26%)<&T as..core::fmt::builders::DebugTuple::field (11 samples, 5.26%)core::..core::result::Result<T,E>::and_then (11 samples, 5.26%)core::..core::fmt::builders::DebugTuple::field::_$u7b$$u7b$closure$u7d$$u7d$::h01735522e2823ac2 (11 samples, 5.26%)core::..core::fmt::Formatter::write_str (4 samples, 1.91%)c..<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (4 samples, 1.91%)<..<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (4 samples, 1.91%)<..<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (4 samples, 1.91%)<..<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (4 samples, 1.91%)<..<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (4 samples, 1.91%)<..<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (4 samples, 1.91%)<..<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (4 samples, 1.91%)<..<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (4 samples, 1.91%)<..<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (4 samples, 1.91%)<..<std::io::Write::write_fmt::Adaptor<T> as core::fmt::Write>::write_str (2 samples, 0.96%)<std::io::stdio::StdoutLock as std::io::Write>::write_all (2 samples, 0.96%)<std::io::buffered::linewriter::LineWriter<W> as std::io::Write>::write_all (2 samples, 0.96%)<std::io::buffered::linewritershim::LineWriterShim<W> as std::io::Write>::write_all (2 samples, 0.96%)std::io::buffered::bufwriter::BufWriter<W>::flush_buf (2 samples, 0.96%)<std::io::stdio::StdoutRaw as std::io::Write>::write (2 samples, 0.96%)<std::sys::unix::stdio::Stdout as std::io::Write>::write (2 samples, 0.96%)std::sys::unix::fd::FileDesc::write (2 samples, 0.96%)__libc_write (2 samples, 0.96%)[[kernel.kallsyms]] (2 samples, 0.96%)[[kernel.kallsyms]] (2 samples, 0.96%)[[kernel.kallsyms]] (2 samples, 0.96%)[[kernel.kallsyms]] (2 samples, 0.96%)[[kernel.kallsyms]] (2 samples, 0.96%)[[kernel.kallsyms]] (2 samples, 0.96%)[[kernel.kallsyms]] (2 samples, 0.96%)[[kernel.kallsyms]] (1 samples, 0.48%)__libc_write (9 samples, 4.31%)__lib..[[kernel.kallsyms]] (9 samples, 4.31%)[[ker..[[kernel.kallsyms]] (9 samples, 4.31%)[[ker..[[kernel.kallsyms]] (9 samples, 4.31%)[[ker..[[kernel.kallsyms]] (9 samples, 4.31%)[[ker..[[kernel.kallsyms]] (9 samples, 4.31%)[[ker..[[kernel.kallsyms]] (9 samples, 4.31%)[[ker..[[kernel.kallsyms]] (9 samples, 4.31%)[[ker..[[kernel.kallsyms]] (7 samples, 3.35%)[[k..[[kernel.kallsyms]] (5 samples, 2.39%)[..[[kernel.kallsyms]] (5 samples, 2.39%)[..[[kernel.kallsyms]] (5 samples, 2.39%)[..[[kernel.kallsyms]] (5 samples, 2.39%)[..[[kernel.kallsyms]] (5 samples, 2.39%)[..[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (10 samples, 4.78%)<core:..<std::io::Write::write_fmt::Adaptor<T> as core::fmt::Write>::write_str (10 samples, 4.78%)<std::..<std::io::stdio::StdoutLock as std::io::Write>::write_all (10 samples, 4.78%)<std::..<std::io::buffered::linewriter::LineWriter<W> as std::io::Write>::write_all (10 samples, 4.78%)<std::..<std::io::buffered::linewritershim::LineWriterShim<W> as std::io::Write>::write_all (10 samples, 4.78%)<std::..std::io::buffered::bufwriter::BufWriter<W>::flush_buf (10 samples, 4.78%)std::i..<std::io::stdio::StdoutRaw as std::io::Write>::write (10 samples, 4.78%)<std::..<std::sys::unix::stdio::Stdout as std::io::Write>::write (10 samples, 4.78%)<std::..std::sys::unix::fd::FileDesc::write (10 samples, 4.78%)std::s..std::sys::unix::cvt (1 samples, 0.48%)<isize as std::sys::unix::IsMinusOne>::is_minus_one (1 samples, 0.48%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (11 samples, 5.26%)<core:..<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (11 samples, 5.26%)<core:..<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (11 samples, 5.26%)<core:..<std::io::Write::write_fmt::Adaptor<T> as core::fmt::Write>::write_str (1 samples, 0.48%)<std::io::stdio::StdoutLock as std::io::Write>::write_all (1 samples, 0.48%)<std::io::buffered::linewriter::LineWriter<W> as std::io::Write>::write_all (1 samples, 0.48%)<std::io::buffered::linewritershim::LineWriterShim<W> as std::io::Write>::write_all (1 samples, 0.48%)std::io::buffered::bufwriter::BufWriter<W>::flush_buf (1 samples, 0.48%)<std::io::stdio::StdoutRaw as std::io::Write>::write (1 samples, 0.48%)<std::sys::unix::stdio::Stdout as std::io::Write>::write (1 samples, 0.48%)std::sys::unix::fd::FileDesc::write (1 samples, 0.48%)__libc_write (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)core::fmt::builders::DebugStruct::field (24 samples, 11.48%)core::fmt::builde..core::result::Result<T,E>::and_then (24 samples, 11.48%)core::result::Res..core::fmt::builders::DebugStruct::field::_$u7b$$u7b$closure$u7d$$u7d$::h4f234df4a18180a6 (24 samples, 11.48%)core::fmt::builde..core::fmt::Formatter::write_str (13 samples, 6.22%)core::fm..<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (13 samples, 6.22%)<core::f..<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (13 samples, 6.22%)<core::f..<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (13 samples, 6.22%)<core::f..<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (13 samples, 6.22%)<core::f..<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (12 samples, 5.74%)<core::..core::str::traits::<impl core::ops::index::Index<I> for str>::index (1 samples, 0.48%)core::str::traits::<impl core::slice::index::SliceIndex<str> for core::ops::range::RangeTo<usize>>::index (1 samples, 0.48%)core::str::traits::<impl core::slice::index::SliceIndex<str> for core::ops::range::RangeTo<usize>>::get (1 samples, 0.48%)core::str::<impl str>::is_char_boundary (1 samples, 0.48%)core::slice::<impl [T]>::get (1 samples, 0.48%)<usize as core::slice::index::SliceIndex<[T]>>::get (1 samples, 0.48%)<&T as core::fmt::Debug>::fmt (27 samples, 12.92%)<&T as core::fmt::D..core::fmt::builders::DebugStruct::finish (2 samples, 0.96%)core::result::Result<T,E>::and_then (2 samples, 0.96%)core::fmt::builders::DebugStruct::finish::_$u7b$$u7b$closure$u7d$$u7d$::hfda3e4b6fa3acec0 (2 samples, 0.96%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (2 samples, 0.96%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (2 samples, 0.96%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (2 samples, 0.96%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (2 samples, 0.96%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (2 samples, 0.96%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (2 samples, 0.96%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (2 samples, 0.96%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (2 samples, 0.96%)<std::io::Write::write_fmt::Adaptor<T> as core::fmt::Write>::write_str (2 samples, 0.96%)<std::io::stdio::StdoutLock as std::io::Write>::write_all (2 samples, 0.96%)<std::io::buffered::linewriter::LineWriter<W> as std::io::Write>::write_all (2 samples, 0.96%)<std::io::buffered::linewritershim::LineWriterShim<W> as std::io::Write>::write_all (2 samples, 0.96%)std::sys_common::memchr::memrchr (2 samples, 0.96%)std::sys::unix::memchr::memrchr (2 samples, 0.96%)std::sys::unix::memchr::memrchr::memrchr_specific (2 samples, 0.96%)__memrchr_sse2 (2 samples, 0.96%)core::fmt::builders::DebugSet::entry (28 samples, 13.40%)core::fmt::builders:..core::fmt::builders::DebugInner::entry (28 samples, 13.40%)core::fmt::builders:..core::result::Result<T,E>::and_then (28 samples, 13.40%)core::result::Result..core::fmt::builders::DebugInner::entry::_$u7b$$u7b$closure$u7d$$u7d$::h9a3dc54fa8fd789f (28 samples, 13.40%)core::fmt::builders:..core::fmt::Formatter::write_str (1 samples, 0.48%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (1 samples, 0.48%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (1 samples, 0.48%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (1 samples, 0.48%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (1 samples, 0.48%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (1 samples, 0.48%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (1 samples, 0.48%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (1 samples, 0.48%)<std::io::Write::write_fmt::Adaptor<T> as core::fmt::Write>::write_str (1 samples, 0.48%)<std::io::stdio::StdoutLock as std::io::Write>::write_all (1 samples, 0.48%)<std::io::buffered::linewriter::LineWriter<W> as std::io::Write>::write_all (1 samples, 0.48%)<std::io::buffered::linewritershim::LineWriterShim<W> as std::io::Write>::write_all (1 samples, 0.48%)std::io::buffered::bufwriter::BufWriter<W>::flush_buf (1 samples, 0.48%)<std::io::stdio::StdoutRaw as std::io::Write>::write (1 samples, 0.48%)<std::sys::unix::stdio::Stdout as std::io::Write>::write (1 samples, 0.48%)std::sys::unix::fd::FileDesc::write (1 samples, 0.48%)__libc_write (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)core::fmt::builders::DebugTuple::field (1 samples, 0.48%)core::result::Result<T,E>::and_then (1 samples, 0.48%)core::fmt::builders::DebugTuple::field::_$u7b$$u7b$closure$u7d$$u7d$::h01735522e2823ac2 (1 samples, 0.48%)core::fmt::num::imp::<impl core::fmt::Display for i32>::fmt (1 samples, 0.48%)core::fmt::num::imp::fmt_u64 (1 samples, 0.48%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (1 samples, 0.48%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (1 samples, 0.48%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (1 samples, 0.48%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (1 samples, 0.48%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (1 samples, 0.48%)<&T as core::fmt::Debug>::fmt (30 samples, 14.35%)<&T as core::fmt::Deb..core::fmt::builders::DebugTuple::finish (1 samples, 0.48%)core::result::Result<T,E>::and_then (1 samples, 0.48%)core::fmt::builders::DebugTuple::finish::_$u7b$$u7b$closure$u7d$$u7d$::ha2862bd96b4e5cd8 (1 samples, 0.48%)core::fmt::Formatter::write_str (1 samples, 0.48%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (1 samples, 0.48%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (1 samples, 0.48%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (1 samples, 0.48%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (1 samples, 0.48%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (1 samples, 0.48%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (1 samples, 0.48%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (1 samples, 0.48%)<std::io::Write::write_fmt::Adaptor<T> as core::fmt::Write>::write_str (1 samples, 0.48%)<std::io::stdio::StdoutLock as std::io::Write>::write_all (1 samples, 0.48%)<&T as core::fmt::Debug>::fmt (31 samples, 14.83%)<&T as core::fmt::Debu..core::fmt::builders::DebugSet::entry (31 samples, 14.83%)core::fmt::builders::D..core::fmt::builders::DebugInner::entry (31 samples, 14.83%)core::fmt::builders::D..core::result::Result<T,E>::and_then (31 samples, 14.83%)core::result::Result<T..core::fmt::builders::DebugInner::entry::_$u7b$$u7b$closure$u7d$$u7d$::h9a3dc54fa8fd789f (31 samples, 14.83%)core::fmt::builders::D..<&T as core::fmt::Debug>::fmt (31 samples, 14.83%)<&T as core::fmt::Debu..core::fmt::builders::DebugStruct::field (31 samples, 14.83%)core::fmt::builders::D..core::result::Result<T,E>::and_then (31 samples, 14.83%)core::result::Result<T..core::fmt::builders::DebugStruct::field::_$u7b$$u7b$closure$u7d$$u7d$::h4f234df4a18180a6 (31 samples, 14.83%)core::fmt::builders::D..core::fmt::Formatter::write_str (1 samples, 0.48%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (1 samples, 0.48%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (1 samples, 0.48%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (1 samples, 0.48%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (1 samples, 0.48%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (1 samples, 0.48%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (1 samples, 0.48%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (1 samples, 0.48%)<std::io::Write::write_fmt::Adaptor<T> as core::fmt::Write>::write_str (1 samples, 0.48%)<std::io::stdio::StdoutLock as std::io::Write>::write_all (1 samples, 0.48%)<std::io::buffered::linewriter::LineWriter<W> as std::io::Write>::write_all (1 samples, 0.48%)<std::io::buffered::linewritershim::LineWriterShim<W> as std::io::Write>::write_all (1 samples, 0.48%)std::io::buffered::bufwriter::BufWriter<W>::flush_buf (1 samples, 0.48%)<std::io::stdio::StdoutRaw as std::io::Write>::write (1 samples, 0.48%)<std::sys::unix::stdio::Stdout as std::io::Write>::write (1 samples, 0.48%)std::sys::unix::fd::FileDesc::write (1 samples, 0.48%)__libc_write (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)std::io::stdio::_print (32 samples, 15.31%)std::io::stdio::_printstd::io::stdio::print_to (32 samples, 15.31%)std::io::stdio::print_to<std::io::stdio::Stdout as std::io::Write>::write_fmt (32 samples, 15.31%)<std::io::stdio::Stdout..<&std::io::stdio::Stdout as std::io::Write>::write_fmt (32 samples, 15.31%)<&std::io::stdio::Stdou..std::io::Write::write_fmt (32 samples, 15.31%)std::io::Write::write_f..core::fmt::write (32 samples, 15.31%)core::fmt::writecore::fmt::run (32 samples, 15.31%)core::fmt::run<vec_collections::radix_tree::RadixTree<K,V> as core::fmt::Debug>::fmt (32 samples, 15.31%)<vec_collections::radix..core::fmt::builders::DebugStruct::field (32 samples, 15.31%)core::fmt::builders::De..core::result::Result<T,E>::and_then (32 samples, 15.31%)core::result::Result<T,..core::fmt::builders::DebugStruct::field::_$u7b$$u7b$closure$u7d$$u7d$::h4f234df4a18180a6 (32 samples, 15.31%)core::fmt::builders::De..<&T as core::fmt::Debug>::fmt (32 samples, 15.31%)<&T as core::fmt::Debug..core::fmt::builders::DebugSet::entry (32 samples, 15.31%)core::fmt::builders::De..core::fmt::builders::DebugInner::entry (32 samples, 15.31%)core::fmt::builders::De..core::result::Result<T,E>::and_then (32 samples, 15.31%)core::result::Result<T,..core::fmt::builders::DebugInner::entry::_$u7b$$u7b$closure$u7d$$u7d$::h9a3dc54fa8fd789f (32 samples, 15.31%)core::fmt::builders::De..<&T as core::fmt::Debug>::fmt (32 samples, 15.31%)<&T as core::fmt::Debug..core::fmt::builders::DebugStruct::field (32 samples, 15.31%)core::fmt::builders::De..core::result::Result<T,E>::and_then (32 samples, 15.31%)core::result::Result<T,..core::fmt::builders::DebugStruct::field::_$u7b$$u7b$closure$u7d$$u7d$::h4f234df4a18180a6 (32 samples, 15.31%)core::fmt::builders::De..<&T as core::fmt::Debug>::fmt (32 samples, 15.31%)<&T as core::fmt::Debug..core::fmt::builders::DebugSet::entry (32 samples, 15.31%)core::fmt::builders::De..core::fmt::builders::DebugInner::entry (32 samples, 15.31%)core::fmt::builders::De..core::result::Result<T,E>::and_then (32 samples, 15.31%)core::result::Result<T,..core::fmt::builders::DebugInner::entry::_$u7b$$u7b$closure$u7d$$u7d$::h9a3dc54fa8fd789f (32 samples, 15.31%)core::fmt::builders::De..<&T as core::fmt::Debug>::fmt (32 samples, 15.31%)<&T as core::fmt::Debug..core::fmt::builders::DebugStruct::field (32 samples, 15.31%)core::fmt::builders::De..core::result::Result<T,E>::and_then (32 samples, 15.31%)core::result::Result<T,..core::fmt::builders::DebugStruct::field::_$u7b$$u7b$closure$u7d$$u7d$::h4f234df4a18180a6 (32 samples, 15.31%)core::fmt::builders::De..core::fmt::Formatter::write_str (1 samples, 0.48%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (1 samples, 0.48%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (1 samples, 0.48%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (1 samples, 0.48%)<core::fmt::builders::PadAdapter as core::fmt::Write>::write_str (1 samples, 0.48%)<std::io::Write::write_fmt::Adaptor<T> as core::fmt::Write>::write_str (1 samples, 0.48%)<std::io::stdio::StdoutLock as std::io::Write>::write_all (1 samples, 0.48%)<std::io::buffered::linewriter::LineWriter<W> as std::io::Write>::write_all (1 samples, 0.48%)<std::io::buffered::linewritershim::LineWriterShim<W> as std::io::Write>::write_all (1 samples, 0.48%)std::io::buffered::bufwriter::BufWriter<W>::flush_buf (1 samples, 0.48%)<std::io::stdio::StdoutRaw as std::io::Write>::write (1 samples, 0.48%)<std::sys::unix::stdio::Stdout as std::io::Write>::write (1 samples, 0.48%)std::sys::unix::fd::FileDesc::write (1 samples, 0.48%)__libc_write (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)<T as alloc::slice::hack::ConvertVec>::to_vec (4 samples, 1.91%)<..<smallvec::SmallVec<A> as core::iter::traits::collect::Extend<<A as smallvec::Array>::Item>>::extend (14 samples, 6.70%)<smallvec..smallvec::SmallVec<A>::reserve (8 samples, 3.83%)smal..[[kernel.kallsyms]] (4 samples, 1.91%)[..[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)[[kernel.kallsyms]] (1 samples, 0.48%)<T as alloc::slice::hack::ConvertVec>::to_vec (120 samples, 57.42%)<T as alloc::slice::hack::ConvertVec>::to_vec__GI___libc_malloc (13 samples, 6.22%)__GI___l.._int_malloc (13 samples, 6.22%)_int_mal..[[kernel.kallsyms]] (2 samples, 0.96%)[[kernel.kallsyms]] (2 samples, 0.96%)[[kernel.kallsyms]] (2 samples, 0.96%)[[kernel.kallsyms]] (2 samples, 0.96%)[[kernel.kallsyms]] (2 samples, 0.96%)[[kernel.kallsyms]] (2 samples, 0.96%)[[kernel.kallsyms]] (2 samples, 0.96%)[[kernel.kallsyms]] (2 samples, 0.96%)<smallvec::SmallVec<A> as core::iter::traits::collect::Extend<<A as smallvec::Array>::Item>>::extend (1 samples, 0.48%)smallvec::SmallVec<A>::reserve (1 samples, 0.48%)<T as alloc::slice::hack::ConvertVec>::to_vec (139 samples, 66.51%)<T as alloc::slice::hack::ConvertVec>::to_vec<T as alloc::slice::hack::ConvertVec>::to_vec (139 samples, 66.51%)<T as alloc::slice::hack::ConvertVec>::to_vec__GI___libc_malloc (3 samples, 1.44%)_int_malloc (3 samples, 1.44%)__GI___libc_free (1 samples, 0.48%)<smallvec::SmallVec<A> as core::ops::drop::Drop>::drop (17 samples, 8.13%)<smallvec::..core::ptr::drop_in_place<vec_collections::radix_tree::RadixTree<char,i32>> (17 samples, 8.13%)core::ptr::..core::ptr::drop_in_place<vec_collections::radix_tree::RadixTree<char,i32>> (16 samples, 7.66%)core::ptr:..core::ptr::drop_in_place<vec_collections::radix_tree::RadixTree<char,i32>> (15 samples, 7.18%)core::ptr..core::ptr::drop_in_place<vec_collections::radix_tree::RadixTree<char,i32>> (11 samples, 5.26%)core::..<vec_collections::radix_tree::MergeOp<F> as vec_collections::binary_merge::MergeOperation<I>>::collision (2 samples, 0.96%)vec_collections::radix_tree::RadixTree<K,V>::combine_with (2 samples, 0.96%)vec_collections::radix_tree::RadixTree<K,V>::combine_children_with (2 samples, 0.96%)<T as alloc::slice::hack::ConvertVec>::to_vec (2 samples, 0.96%)<T as alloc::slice::hack::ConvertVec>::to_vec (2 samples, 0.96%)<smallvec::SmallVec<A> as core::iter::traits::collect::Extend<<A as smallvec::Array>::Item>>::extend (2 samples, 0.96%)smallvec::SmallVec<A>::reserve (1 samples, 0.48%)<vec_collections::radix_tree::MergeOp<F> as vec_collections::binary_merge::MergeOperation<I>>::collision (3 samples, 1.44%)vec_collections::radix_tree::RadixTree<K,V>::combine_with (3 samples, 1.44%)vec_collections::radix_tree::RadixTree<K,V>::combine_children_with (3 samples, 1.44%)<T as alloc::slice::hack::ConvertVec>::to_vec (3 samples, 1.44%)<T as alloc::slice::hack::ConvertVec>::to_vec (2 samples, 0.96%)__GI___libc_malloc (1 samples, 0.48%)_int_malloc (1 samples, 0.48%)<vec_collections::radix_tree::MergeOp<F> as vec_collections::binary_merge::MergeOperation<I>>::collision (6 samples, 2.87%)<v..vec_collections::radix_tree::RadixTree<K,V>::combine_with (6 samples, 2.87%)ve..vec_collections::radix_tree::RadixTree<K,V>::combine_children_with (6 samples, 2.87%)ve..<T as alloc::slice::hack::ConvertVec>::to_vec (6 samples, 2.87%)<T..<T as alloc::slice::hack::ConvertVec>::to_vec (6 samples, 2.87%)<T..__GI___libc_malloc (1 samples, 0.48%)all (209 samples, 100%)radix_tree (204 samples, 97.61%)radix_tree_start (203 samples, 97.13%)_start__libc_start_main (203 samples, 97.13%)__libc_start_mainmain (203 samples, 97.13%)mainstd::rt::lang_start_internal (203 samples, 97.13%)std::rt::lang_start_internalstd::panic::catch_unwind (203 samples, 97.13%)std::panic::catch_unwindstd::panicking::try (203 samples, 97.13%)std::panicking::trystd::panicking::try::do_call (203 samples, 97.13%)std::panicking::try::do_callstd::rt::lang_start_internal::_$u7b$$u7b$closure$u7d$$u7d$::h8163422320d11405 (202 samples, 96.65%)std::rt::lang_start_internal::_$u7b$$u7b$closure$u7d$$u7d$::h8163422320d11405std::panic::catch_unwind (202 samples, 96.65%)std::panic::catch_unwindstd::panicking::try (202 samples, 96.65%)std::panicking::trystd::panicking::try::do_call (202 samples, 96.65%)std::panicking::try::do_callcore::ops::function::impls::<impl core::ops::function::FnOnce<A> for &F>::call_once (202 samples, 96.65%)core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &F>::call_oncestd::rt::lang_start::_$u7b$$u7b$closure$u7d$$u7d$::h9e5d4b7b93d845e8 (202 samples, 96.65%)std::rt::lang_start::_$u7b$$u7b$closure$u7d$$u7d$::h9e5d4b7b93d845e8std::sys_common::backtrace::__rust_begin_short_backtrace (202 samples, 96.65%)std::sys_common::backtrace::__rust_begin_short_backtraceradix_tree::main (202 samples, 96.65%)radix_tree::mainvec_collections::radix_tree::RadixTree<K,V>::combine_with (170 samples, 81.34%)vec_collections::radix_tree::RadixTree<K,V>::combine_withvec_collections::radix_tree::RadixTree<K,V>::combine_children_with (170 samples, 81.34%)vec_collections::radix_tree::RadixTree<K,V>::combine_children_withvec_collections::binary_merge::MergeOperation::merge0 (14 samples, 6.70%)vec_colle..vec_collections::binary_merge::MergeOperation::merge0 (12 samples, 5.74%)vec_col..vec_collections::binary_merge::MergeOperation::merge0 (9 samples, 4.31%)vec_c..vec_collections::binary_merge::MergeOperation::merge0 (3 samples, 1.44%)<vec_collections::radix_tree::MergeOp<F> as vec_collections::binary_merge::MergeOperation<I>>::collision (3 samples, 1.44%)vec_collections::radix_tree::RadixTree<K,V>::combine_with (3 samples, 1.44%)vec_collections::radix_tree::RadixTree<K,V>::combine_children_with (3 samples, 1.44%)<T as alloc::slice::hack::ConvertVec>::to_vec (3 samples, 1.44%)<T as alloc::slice::hack::ConvertVec>::to_vec (3 samples, 1.44%)vec-collections-0.4.3/perf.data000064400000000000000000067502300072674642500145550ustar 00000000000000PERFILE2hhpc/7 hO A=(^\("?"?perf @!a"?"?V a(¯.ר(((C:!JUU0\]ر\!3+б\M ! @!a"?"?+V a(¯.ר(((C:!JUU0\]ر\!3+б\M ! @!a"?"?KV a(¯.ר(((C:!JUU0\]ر\!3+б\M ! @!a"?"?DjV? a(¯.ר(((C:!JUU0\]ر\!3+б\M ! @!a"?"?ˆV0) a(¯.ר(((C:!JUU0\]ر\!3+б\M ! 0"?"?radix_tree"?"?MV  `"?"? //anon"?"?!V  `"?"?P  [stack]"?"?vV "?"?'Vp%* /home/rklaehn/projects_git/vec-collections/target/release/examples/radix_tree"?"? V  "?"?'VP * /home/rklaehn/projects_git/vec-collections/target/release/examples/radix_tree"?"?])V "?"?7*G"G]!Z/lib/x86_64-linux-gnu/ld-2.27.so"?"?sV  "?"?Y*G G]!Z/lib/x86_64-linux-gnu/ld-2.27.so"?"?V  `"?"?Y*GY*G//anon"?"?V `"?"?0  [vdso]"?"?V  `"?"? 0[vvar]"?"?V  p"?"?W*G(/etc/ld.so.cache"?"?ݷV  `"?"?`W*G `W*G//anon"?"?,V "?"?*G!6 O/lib/x86_64-linux-gnu/libgcc_s.so.1"?"?5VV  "?"?*Gp6 O/lib/x86_64-linux-gnu/libgcc_s.so.1"?"?&V  "?"?6*G `6 O/lib/x86_64-linux-gnu/libgcc_s.so.1"?"?V "?"?)G z09~/lib/x86_64-linux-gnu/librt-2.27.so"?"?=V  "?"?p)Gpz09~/lib/x86_64-linux-gnu/librt-2.27.so"?"?0cV  "?"?`*G `z09~/lib/x86_64-linux-gnu/librt-2.27.so"?"?V "?"?)G!suzg/lib/x86_64-linux-gnu/libpthread-2.27.so"?"?V  "?"?)Gsuzg/lib/x86_64-linux-gnu/libpthread-2.27.so"?"?L0V  "?"?)G suzg/lib/x86_64-linux-gnu/libpthread-2.27.so"?"?PV  `"?"?)G@)G//anon"?"? rV "?"?0)G9g/lib/x86_64-linux-gnu/libm-2.27.so"?"?MV  "?"?)Gg/lib/x86_64-linux-gnu/libm-2.27.so"?"? V  "?"?)G g/lib/x86_64-linux-gnu/libm-2.27.so"?"?!9V "?"?x)G@ fU*/lib/x86_64-linux-gnu/libdl-2.27.so"?"?MV  "?"? y)G0fU*/lib/x86_64-linux-gnu/libdl-2.27.so"?"?DV  "?"?)G fU*/lib/x86_64-linux-gnu/libdl-2.27.so"?"?fV "?"?9)G?aJ~/lib/x86_64-linux-gnu/libc-2.27.so"?"?HzV  "?"?PX)G paJ~/lib/x86_64-linux-gnu/libc-2.27.so"?"?"V  "?"?Px)G`paJ~/lib/x86_64-linux-gnu/libc-2.27.so"?"?LV  `"?"?x)G@x)G//anon"?"?V  `"?"?@W*G@@W*G//anon"?"?OV  `"?"?W*GpW*G//anon"?"?V  "?"?Px)G@paJ~/lib/x86_64-linux-gnu/libc-2.27.so"?"?A!V  "?"?)G fU*/lib/x86_64-linux-gnu/libdl-2.27.so"?"?O!V  "?"?)Gg/lib/x86_64-linux-gnu/libm-2.27.so"?"?"V  "?"?)Gsuzg/lib/x86_64-linux-gnu/libpthread-2.27.so"?"?OK"V  "?"?`*G`z09~/lib/x86_64-linux-gnu/librt-2.27.so"?"?w"V  "?"?6*G`6 O/lib/x86_64-linux-gnu/libgcc_s.so.1"?"?"V  "?"?'V@ * /home/rklaehn/projects_git/vec-collections/target/release/examples/radix_tree"?"?#V  "?"?Y*GG]!Z/lib/x86_64-linux-gnu/ld-2.27.so"?"?t#V  `"?"?`Y*G0`Y*G//anon"?"?.%V  `"?"?`Y*G`Y*G//anon"?"?%V  `"?"?'V'V[heap]"?"?&V h!6)"?"?)V+6)))C**//d*9(N:(>(C:J)G'VC J)GF3+729f4a000 ---p 0F B)G`'VC 44 A)G`'VC 'VV) 'VC `'VC C C c)Gآ'V)GW*GD `F  'V)G)GpY*G2آ'VQ)G'VE  Ԡ'V7*GE sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 29  A C 'V 0;'V 8 'V p8 pC  9 H> 9  A 9[7*L9 :  -'V 8*G9 G9[7*L9 :  -'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 2 G9[7*L9 : p'V 3 G9[7*L9 : @'V 4 G9[7*L9 : 9'V 5 G9[7*L9 : i'V 6 G9[7*L9 : 'V 7 G9[7*L9 : 'V 8 G9[7*L9 : P'V 9 G9[7*L9 :  -'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA $A @ _'VA B $A 2'V1828'V@001828'V@00C C B B 5,'V1828'V@00$,B 1828'V@00$$'VB $'V'V$1828|wn[ 'V``$1828|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t'V 8 'V p8 pC  9 H> 9 G9[7*L9 : ='V 8*G9 G9[7*L9 :  ='V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 :  'V 2 G9[7*L9 : Pn'V 3 G9[7*L9 :  'V 4 G9[7*L9 : 'V 5 G9[7*L9 : 'V 6 G9[7*L9 : 1'V 7 G9[7*L9 : `b'V 8 G9[7*L9 : 0'V 9 G9[7*L9 : 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V1992'V@001992'V@00C C B B 5,'V1992'V@00,B 1992'V@00'VB 'V'V1992|wn[ 'V``1992|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'V'V p ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 8 G9[7*L9 : *'V 8*G9 G9[7*L9 :  Z'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 0'V 2 G9[7*L9 : p'V 3 G9[7*L9 : P'V 4 G9[7*L9 :  'V 5 G9[7*L9 : A'V 6 G9[7*L9 : r'V 7 G9[7*L9 : 'V 8 G9[7*L9 : `'V 9 G9[7*L9 : 0'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA wA @ _'VA B wA 2'V2167'V@002167'V@00C C B B 5,'V2167'V@00w,B 2167'V@00ww'VB w'V'Vw2167|wn[ 'V``w2167|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 2 G9[7*L9 : 'V 8*G3 G9[7*L9 :  A'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : `'V 3 G9[7*L9 :  'V 4 G9[7*L9 : 'V 5 G9[7*L9 : 'V 6 G9[7*L9 : M'V 7 G9[7*L9 : `~'V 8 G9[7*L9 : 0'V 9 G9[7*L9 : 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA  A @ _'VA B  A 2'V2310'V@002310'V@00C C B B 5,'V2310'V@00 ,B 2310'V@00  'VB  'V'V 2310|wn[ 'V`` 2310|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t'V 8 'V p8 pC  9 H> 9 G9[7*L9 : 0'V 8*G9 G9[7*L9 :  0'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : @'V 3 G9[7*L9 : %'V 4 G9[7*L9 : pV'V 5 G9[7*L9 : @'V 6 G9[7*L9 : 'V 7 G9[7*L9 : 'V 8 G9[7*L9 : 'V 9 G9[7*L9 : J'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA  A @ _'VA B  A 2'V2432'V@002432'V@00C C B B 5,'V2432'V@00 ,B 2432'V@00 'VB  'V'V 2432|wn[ 'V`` 2432|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'V'V p ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 29  A C 'V 0;'V 8 'V p8 pC  9 H> 9  A 9[7*L9 : @k'V 8*G9 G9[7*L9 :  @k'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : u'V 2 G9[7*L9 : 3 G9[7*L9 : `F'V 4 G9[7*L9 : 0w'V 5 G9[7*L9 : 'V 6 G9[7*L9 : 'V 7 G9[7*L9 :  'V 8 G9[7*L9 : p:'V 9 G9[7*L9 : @k'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA  A @ _'VA B  A 2'V2541'V@002541'V@00C C B B 5,'V2541'V@00 ,B 2541'V@00 'VB  'V'V 2541|wn[ 'V`` 2541|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 0 G9[7*L9 : 8*G1 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 :  'V 2 G9[7*L9 : 'V 3 G9[7*L9 : @&'V 4 G9[7*L9 : W'V 5 G9[7*L9 : 'V 6 G9[7*L9 : 'V 7 G9[7*L9 : 'V 8 G9[7*L9 : P'V 9 G9[7*L9 :  K'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA O A @ _'VA B O A 2'V2639'V@002639'V@00C C B B 5,'V2639'V@00O ,B 2639'V@00O O 'VB O 'V'VO 2639|wn[ 'V``O 2639|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 0 G9[7*L9 : 8*G1 G9[7*L9 :  ''V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : o'V 2 G9[7*L9 : f'V 3 G9[7*L9 : /'V 4 G9[7*L9 : `'V 5 G9[7*L9 : 'V 6 G9[7*L9 : P'V 7 G9[7*L9 :  'V 8 G9[7*L9 : #'V 9 G9[7*L9 : T'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA  A @ _'VA B  A 2'V2730'V@002730'V@00C C B B 5,'V2730'V@00 ,B 2730'V@00 'VB  'V'V 2730|wn[ 'V`` 2730|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t'V 8 'V p8 pC  9 H> 9 G9[7*L9 : 'V 8*G9 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : @'V 2 G9[7*L9 : i'V 3 G9[7*L9 : v'V 4 G9[7*L9 : 'V 5 G9[7*L9 : 'V 6 G9[7*L9 : P 'V 7 G9[7*L9 :  :'V 8 G9[7*L9 : j'V 9 G9[7*L9 : 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA  A @ _'VA B  A 2'V2814'V@002814'V@00C C B B 5,'V2814'V@00 ,B 2814'V@00 'VB  'V'V 2814|wn[ 'V`` 2814|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'V'V p ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 0 G9[7*L9 : 8*G1 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 0h'V 2 G9[7*L9 : D'V 3 G9[7*L9 : p'V 4 G9[7*L9 : @3'V 5 G9[7*L9 : d'V 6 G9[7*L9 : 'V 7 G9[7*L9 : 'V 8 G9[7*L9 : 'V 9 G9[7*L9 : P''V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA O A @ _'VA B O A 2'V2895'V@002895'V@00C C B B 5,'V2895'V@00O ,B 2895'V@00O O 'VB O 'V'VO 2895|wn[ 'V``O 2895|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 29  A C 'V 0;'V 8 'V p8 pC  9 H> 9  A 9[7*L9 : 8'V 8*G9 G9[7*L9 :  8'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : 3 G9[7*L9 : 'V 4 G9[7*L9 : D'V 5 G9[7*L9 : u'V 6 G9[7*L9 : P'V 7 G9[7*L9 :  'V 8 G9[7*L9 : 'V 9 G9[7*L9 : 8'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA  A @ _'VA B  A 2'V2971'V@002971'V@00C C B B 5,'V2971'V@00 ,B 2971'V@00 'VB  'V'V 2971|wn[ 'V`` 2971|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 0 G9[7*L9 : 8*G1 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : w'V 3 G9[7*L9 : 'V 4 G9[7*L9 : |'V 5 G9[7*L9 : 'V 6 G9[7*L9 : P'V 7 G9[7*L9 :  'V 8 G9[7*L9 : ?'V 9 G9[7*L9 : p'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA  A @ _'VA B  A 2'V3058'V@003058'V@00C C B B 5,'V3058'V@00 ,B 3058'V@00 'VB  'V'V 3058|wn[ 'V`` 3058|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 5 G9[7*L9 : @'V 8*G6 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : @'V 2 G9[7*L9 : y'V 3 G9[7*L9 : ;'V 4 G9[7*L9 : 'V 5 G9[7*L9 : `'V 6 G9[7*L9 : 0.'V 7 G9[7*L9 : _'V 8 G9[7*L9 : Џ'V 9 G9[7*L9 : 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA L A @ _'VA B L A 2'V3148'V@003148'V@00C C B B 5,'V3148'V@00L ,B 3148'V@00L L 'VB L 'V'VL 3148|wn[ 'V``L 3148|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 4 G9[7*L9 : @'V 8*G5 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : 'V 3 G9[7*L9 :  v'V 4 G9[7*L9 : p'V 5 G9[7*L9 : @M'V 6 G9[7*L9 : ~'V 7 G9[7*L9 : 'V 8 G9[7*L9 : 'V 9 G9[7*L9 : 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA  A @ _'VA B  A 2'V3234'V@003234'V@00C C B B 5,'V3234'V@00 ,B 3234'V@00 'VB  'V'V 3234|wn[ 'V`` 3234|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 0 G9[7*L9 : 8*G1 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : @B'V 2 G9[7*L9 : @'V 3 G9[7*L9 : 'V 4 G9[7*L9 : >'V 5 G9[7*L9 : `o'V 6 G9[7*L9 : 0'V 7 G9[7*L9 : 'V 8 G9[7*L9 : 'V 9 G9[7*L9 : 2'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA  A @ _'VA B  A 2'V3317'V@003317'V@00C C B B 5,'V3317'V@00 ,B 3317'V@00 'VB  'V'V 3317|wn[ 'V`` 3317|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 0 G9[7*L9 : 8*G1 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : j'V 2 G9[7*L9 : b'V 3 G9[7*L9 : 'V 4 G9[7*L9 : p'V 5 G9[7*L9 : @'V 6 G9[7*L9 :  'V 7 G9[7*L9 : <'V 8 G9[7*L9 : m'V 9 G9[7*L9 : 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA D A @ _'VA B D A 2'V3396'V@003396'V@00C C B B 5,'V3396'V@00D ,B 3396'V@00D D 'VB D 'V'VD 3396|wn[ 'V``D 3396|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 2 G9[7*L9 : 'V 8*G3 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : @1'V 2 G9[7*L9 : 'V 3 G9[7*L9 : G'V 4 G9[7*L9 : p'V 5 G9[7*L9 : @"'V 6 G9[7*L9 : S'V 7 G9[7*L9 : 'V 8 G9[7*L9 : 'V 9 G9[7*L9 : 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA  A @ _'VA B  A 2'V3472'V@003472'V@00C C B B 5,'V3472'V@00 ,B 3472'V@00 'VB  'V'V 3472|wn[ 'V`` 3472|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t'V5 'V 7 r 7 6 ` 'VT'V 8;  A ,A 5,'V54 8;  A ,A 5,'V53 8;  A ,A 5,'V5O'V ?'Vp'V 7 'V9  9 8  ` ?'V='V 8 O'V1 8 O'V0 8 O'V 'V pL'V9 9 Y='V8 'V p8 pC  9 H> 0 G9[7*L9 : 8*G1 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : >'V 2 G9[7*L9 : 'V 3 G9[7*L9 : 'V 4 G9[7*L9 : /'V 5 G9[7*L9 : ``'V 6 G9[7*L9 : 0'V 7 G9[7*L9 : 'V 8 G9[7*L9 : 'V 9 G9[7*L9 : #'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA  A @ _'VA B  A 2'V3546'V@003546'V@00C C B B 5,'V3546'V@00 ,B 3546'V@00 'VB  'V'V 3546|wn[ 'V`` 3546|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t = b'V C H> d'V C 9 >'V 8 'V p8 pC  9 H> 9 G9[7*L9 : <'V 8*G9 G9[7*L9 :  <'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : 'V 3 G9[7*L9 : 1'V 4 G9[7*L9 : m'V 5 G9[7*L9 : 'V 6 G9[7*L9 : P'V 7 G9[7*L9 :  'V 8 G9[7*L9 : 0'V 9 G9[7*L9 : a'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA  A @ _'VA B  A 2'V3616'V@003616'V@00C C B B 5,'V3616'V@00 ,B 3616'V@00  'VB  'V'V 3616|wn[ 'V`` 3616|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'V'V p ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 1 G9[7*L9 : }'V 8*G2 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : p'V 3 G9[7*L9 : 'V 4 G9[7*L9 : `'V 5 G9[7*L9 : 0'V 6 G9[7*L9 : 'V 7 G9[7*L9 : J'V 8 G9[7*L9 : {'V 9 G9[7*L9 : p'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA eA @ _'VA B eA 2'V3685'V@003685'V@00C C B B 5,'V3685'V@00e,B 3685'V@00ee'VB e'V'Ve3685|wn[ 'V``e3685|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t'V 8 'V p8 pC  9 H> 9 G9[7*L9 : 'V 8*G9 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : @x'V 3 G9[7*L9 : 'V 4 G9[7*L9 : 'V 5 G9[7*L9 : p'V 6 G9[7*L9 : @'V 7 G9[7*L9 : F'V 8 G9[7*L9 : v'V 9 G9[7*L9 : 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V3751'V@003751'V@00C C B B 5,'V3751'V@00,B 3751'V@00'VB 'V'V3751|wn[ 'V``3751|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'V'V p ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 29  A C 'V 0;'V 8 'V p8 pC  9 H> 9  A 9[7*L9 : @'V 8*G9 G9[7*L9 :  @'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : 'V 3 G9[7*L9 : 4 G9[7*L9 : 0'V 5 G9[7*L9 : P'V 6 G9[7*L9 : Ѐ'V 7 G9[7*L9 : 'V 8 G9[7*L9 : p'V 9 G9[7*L9 : @'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V3816'V@003816'V@00C C B B 5,'V3816'V@00,B 3816'V@00'VB 'V'V3816|wn[ 'V``3816|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t'V 8 'V p8 pC  9 H> 9 G9[7*L9 : Ђ'V 8*G9 G9[7*L9 :  Ђ'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : @'V 2 G9[7*L9 : 8'V 3 G9[7*L9 : `'V 4 G9[7*L9 : pT'V 5 G9[7*L9 : @'V 6 G9[7*L9 : 'V 7 G9[7*L9 : 'V 8 G9[7*L9 : 'V 9 G9[7*L9 : H'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA &A @ _'VA B &A 2'V3878'V@003878'V@00C C B B 5,'V3878'V@00&,B 3878'V@00&&'VB &'V'V&3878|wn[ 'V``&3878|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'V'V p ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 29  A C 'V 0;'V 8 'V p8 pC  9 H> 9  A 9[7*L9 : 'V 8*G9 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 :  'V 2 G9[7*L9 : F'V 3 G9[7*L9 : 4 G9[7*L9 : 'V 5 G9[7*L9 : `'V 6 G9[7*L9 : 0'V 7 G9[7*L9 : %'V 8 G9[7*L9 : U'V 9 G9[7*L9 : 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA dA @ _'VA B dA 2'V3940'V@003940'V@00C C B B 5,'V3940'V@00d,B 3940'V@00dd'VB d'V'Vd3940|wn[ 'V``d3940|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 1 G9[7*L9 : 00'V 8*G2 G9[7*L9 :  0'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : p'V 2 G9[7*L9 : `'V 3 G9[7*L9 : 'V 4 G9[7*L9 : 'V 5 G9[7*L9 : 'V 6 G9[7*L9 : 'V 7 G9[7*L9 : ,'V 8 G9[7*L9 : P]'V 9 G9[7*L9 :  'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V3999'V@003999'V@00C C B B 5,'V3999'V@00,B 3999'V@00'VB 'V'V3999|wn[ 'V``3999|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t'V 1|wn]'V'V'V 4  4 _'V'V'V 4 'V5 ,C)5  'Vp'Vp0Ex)G@x)G1C)G`A8'V0GA|wn]6 6 5 _'V6  A 6 2'V0711,A 5,'V990711,A 5,'V9; ;  A ,A 5,'V0711,A 5,'V990711,A 5,'V999 8 8 (*'VN'V`2@'V8 O'V8  XN'VH> 29  A C 'V 0;'V 8 'V p8 pC  9 H> 9  A 9[7*L9 : 'V 8*G9 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : 'V 3 G9[7*L9 : 'V 4 G9[7*L9 : 5 G9[7*L9 : B'V 6 G9[7*L9 : s'V 7 G9[7*L9 : P'V 8 G9[7*L9 :  'V 9 G9[7*L9 : 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V4071'V@004071'V@00C C B B 5,'V4071'V@00,B 4071'V@00'VB 'V'V4071|wn[ 'V``4071|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 0 G9[7*L9 : 8*G1 G9[7*L9 :  z'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : P'V 2 G9[7*L9 : 'V 3 G9[7*L9 : 'V 4 G9[7*L9 : p'V 5 G9[7*L9 : t'V 6 G9[7*L9 : 'V 7 G9[7*L9 : 'V 8 G9[7*L9 : P'V 9 G9[7*L9 :  8'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA ,A @ _'VA B ,A 2'V4140'V@004140'V@00C C B B 5,'V4140'V@00,,B 4140'V@00,,'VB ,'V'V,4140|wn[ 'V``,4140|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 2 G9[7*L9 : 0y'V 8*G3 G9[7*L9 :  4'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : 'V 3 G9[7*L9 : 'V 4 G9[7*L9 : 'V 5 G9[7*L9 : P'V 6 G9[7*L9 :  'V 7 G9[7*L9 : ?'V 8 G9[7*L9 : p'V 9 G9[7*L9 : 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA oA @ _'VA B oA 2'V4207'V@004207'V@00C C B B 5,'V4207'V@00o,B 4207'V@00oo'VB o'V'Vo4207|wn[ 'V``o4207|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 2 G9[7*L9 : 'V 8*G3 G9[7*L9 :  @'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 :  V'V 2 G9[7*L9 : 8'V 3 G9[7*L9 : q'V 4 G9[7*L9 : 'V 5 G9[7*L9 : 'V 6 G9[7*L9 : P'V 7 G9[7*L9 :  'V 8 G9[7*L9 : 0'V 9 G9[7*L9 : a'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V4273'V@004273'V@00C C B B 5,'V4273'V@00,B 4273'V@00'VB 'V'V4273|wn[ 'V``4273|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 3 G9[7*L9 : 'V 8*G4 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : l'V 3 G9[7*L9 : @@'V 4 G9[7*L9 : 'V 5 G9[7*L9 : 'V 6 G9[7*L9 : 'V 7 G9[7*L9 : 'V 8 G9[7*L9 : P''V 9 G9[7*L9 :  X'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V4337'V@004337'V@00C C B B 5,'V4337'V@00,B 4337'V@00'VB 'V'V4337|wn[ 'V``4337|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 1 G9[7*L9 : 'V 8*G2 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : `'V 3 G9[7*L9 : p'V 4 G9[7*L9 : 'V 5 G9[7*L9 :  K'V 6 G9[7*L9 : {'V 7 G9[7*L9 : 'V 8 G9[7*L9 : 'V 9 G9[7*L9 : `'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA /A @ _'VA B /A 2'V4399'V@004399'V@00C C B B 5,'V4399'V@00/,B 4399'V@00//'VB /'V'V/4399|wn[ 'V``/4399|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 0 G9[7*L9 : 8*G1 G9[7*L9 :  X'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : }'V 2 G9[7*L9 : Џ'V 3 G9[7*L9 : 'V 4 G9[7*L9 : j'V 5 G9[7*L9 : 'V 6 G9[7*L9 : 'V 7 G9[7*L9 : 'V 8 G9[7*L9 : P#'V 9 G9[7*L9 :  T'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA lA @ _'VA B lA 2'V4460'V@004460'V@00C C B B 5,'V4460'V@00l,B 4460'V@00ll'VB l'V'Vl4460|wn[ 'V``l4460|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 2 G9[7*L9 : 2'V 8*G3 G9[7*L9 :  %'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : L'V 2 G9[7*L9 : D'V 3 G9[7*L9 :  'V 4 G9[7*L9 : ` 'V 5 G9[7*L9 : О'V 6 G9[7*L9 : 'V 7 G9[7*L9 : p'V 8 G9[7*L9 : @1'V 9 G9[7*L9 : b'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V4519'V@004519'V@00C C B B 5,'V4519'V@00,B 4519'V@00'VB 'V'V4519|wn[ 'V``4519|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 5 'V `,'V7p0Ex)G@x)G1C)G6p0Ex)G@x)G1C)G6p0Ex)G@x)G1C)G'V,'V5 'V 7  7 7 `'VK'V 5777x)G@x)G1C)G6 5777x)G@x)G1C)G5 5777x)G@x)G1C)G G'V @_'VP 'V 7 'V9 9  `L_'V,'V 8 N'V3 8 N'V2 8 N'V'V +'V9 9 Y='V8 *'V p8 pC  9 H> 1 G9[7*L9 : p'V 8*G2 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : ]'V 3 G9[7*L9 : p'V 4 G9[7*L9 : 'V 5 G9[7*L9 : 'V 6 G9[7*L9 : P'V 7 G9[7*L9 :  'V 8 G9[7*L9 : 'V 9 G9[7*L9 : E'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V4577'V@004577'V@00C C B B 5,'V4577'V@00,B 4577'V@00'VB 'V'V4577|wn[ 'V``4577|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 29  A C Y'V 0;'V 8 Y'V p8 pC  9 H> 9  A 9[7*L9 : 'V 8*G9 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : @^'V 2 G9[7*L9 : 'V 3 G9[7*L9 : 00'V 4 G9[7*L9 : 5 G9[7*L9 : ''V 6 G9[7*L9 : X'V 7 G9[7*L9 : `'V 8 G9[7*L9 : 0'V 9 G9[7*L9 : 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V4634'V@004634'V@00C C B B 5,'V4634'V@00,B 4634'V@00'VB 'V'V4634|wn[ 'V``4634|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\tV `!"?"?"_VI3 >O ze|i595  4 ,4 33 'V3+'V 5 ,C) 5 'V `'V3p0Ex)G@x)G1C)G2p0Ex)G@x)G1C)G2p0Ex)G@x)G1C)GP'Vp\'V5 'V 7  7 9 `\'VГ'V 6899x)G@x)G1C)G1 6899x)G@x)G1C)G0 6899x)G@x)G1C)G`'V C'V'V 7 'V9 9  `C'V'V 8 N'V8 8 N'V7 8 N'V Z'V #'V9 9 Y='V8 P#'V p8 pC  9 H> 1 G9[7*L9 : ''V 8*G2 G9[7*L9 :  0'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : F'V 2 G9[7*L9 : @@'V 3 G9[7*L9 : 'V 4 G9[7*L9 : 'V 5 G9[7*L9 : o'V 6 G9[7*L9 : 'V 7 G9[7*L9 : 'V 8 G9[7*L9 : 'V 9 G9[7*L9 : P2'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA QA @ _'VA B QA 2'V4689'V@004689'V@00C C B B 5,'V4689'V@00Q,B 4689'V@00QQ'VB Q'V'VQ4689|wn[ 'V``Q4689|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 0 G9[7*L9 : 8*G1 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : d'V 3 G9[7*L9 : \'V 4 G9[7*L9 : P'V 5 G9[7*L9 : `'V 6 G9[7*L9 : 0'V 7 G9[7*L9 : 'V 8 G9[7*L9 : 'V 9 G9[7*L9 : L'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V4744'V@004744'V@00C C B B 5,'V4744'V@00,B 4744'V@00'VB 'V'V4744|wn[ 'V``4744|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 2 G9[7*L9 : 'V 8*G3 G9[7*L9 :  0'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 :  'V 3 G9[7*L9 : ''V 4 G9[7*L9 :  r'V 5 G9[7*L9 : 'V 6 G9[7*L9 : 'V 7 G9[7*L9 : 'V 8 G9[7*L9 : `5'V 9 G9[7*L9 : 0f'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V4797'V@004797'V@00C C B B 5,'V4797'V@00,B 4797'V@00'VB 'V'V4797|wn[ 'V``4797|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 2 G9[7*L9 : 'V 8*G3 G9[7*L9 :  Y'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : K'V 3 G9[7*L9 : p8'V 4 G9[7*L9 : 'V 5 G9[7*L9 : 'V 6 G9[7*L9 : 'V 7 G9[7*L9 : L'V 8 G9[7*L9 : p}'V 9 G9[7*L9 : @'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V4850'V@004850'V@00C C B B 5,'V4850'V@00,B 4850'V@00'VB 'V'V4850|wn[ 'V``4850|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 0 G9[7*L9 : 8*G1 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : X'V 2 G9[7*L9 : 'V 3 G9[7*L9 : 'V 4 G9[7*L9 : 'V 5 G9[7*L9 : `'V 6 G9[7*L9 : 0H'V 7 G9[7*L9 : y'V 8 G9[7*L9 : Щ'V 9 G9[7*L9 : 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA &A @ _'VA B &A 2'V4902'V@004902'V@00C C B B 5,'V4902'V@00&,B 4902'V@00&&'VB &'V'V&4902|wn[ 'V``&4902|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 29  A C 'V 0;'V 8 'V p8 pC  9 H> 9  A 9[7*L9 : 'V 8*G9 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : y'V 3 G9[7*L9 : 0f'V 4 G9[7*L9 : 5 G9[7*L9 : C'V 6 G9[7*L9 : t'V 7 G9[7*L9 : `'V 8 G9[7*L9 : 0'V 9 G9[7*L9 : 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA XA @ _'VA B XA 2'V4952'V@004952'V@00C C B B 5,'V4952'V@00X,B 4952'V@00XX'VB X'V'VX4952|wn[ 'V``X4952|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 2 G9[7*L9 : P{'V 8*G3 G9[7*L9 :  Pj'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : y'V 2 G9[7*L9 : Q'V 3 G9[7*L9 : j'V 4 G9[7*L9 : 'V 5 G9[7*L9 : 'V 6 G9[7*L9 : P'V 7 G9[7*L9 :  -'V 8 G9[7*L9 : ]'V 9 G9[7*L9 : 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V5001'V@005001'V@00C C B B 5,'V5001'V@00,B 5001'V@00'VB 'V'V5001|wn[ 'V``5001|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\tV''V5  4  4 3 'VF3+'V'V 5  5 'V `'Vp0Ex)G@x)G1C)G7p0Ex)G@x)G1C)G7p0Ex)G@x)G1C)Gm'V'V5 'V 7  7 9 ` m'V'V _'VX7  A H7 4 _'VX7  A H7 3 _'VX7  A H7 @'V 'VP\Z'V 7 'V9 8+9  `'V'V 05883 05882 0588'V 'V9 9 Y='V8 'V p8 pC  9 H> 3 G9[7*L9 : 0'V 8*G4 G9[7*L9 :  Y'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 :  'V 2 G9[7*L9 : 'V 3 G9[7*L9 : p'V 4 G9[7*L9 : P'V 5 G9[7*L9 : 'V 6 G9[7*L9 : P'V 7 G9[7*L9 :  'V 8 G9[7*L9 : .'V 9 G9[7*L9 : _'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V5058'V@005058'V@00C C B B 5,'V5058'V@00,B 5058'V@00'VB 'V'V5058|wn[ 'V``5058|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\tvV  'V"?"?E?GV$ 4 0'V,4 1 4 3 'V3+'Vp<'V 5  5 'V `<'V1p0Ex)G@x)G1C)G0p0Ex)G@x)G1C)G0p0Ex)G@x)G1C)GP'V'V5 'V 7  7 9 `\'V'V _'VX7  A H7 2 _'VX7  A H7 1 _'VX7  A H7 `'V 'Vx'V 7 'V9 309  `,'V'V g'V11338 g'V11337 g'V1133'V L'V9 9 Y='V8 'V p8 pC  9 H> 3 G9[7*L9 : 'V 8*G4 G9[7*L9 :  x'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : P'V 3 G9[7*L9 : `'V 4 G9[7*L9 : 'V 5 G9[7*L9 : @'V 6 G9[7*L9 : 'V 7 G9[7*L9 : p'V 8 G9[7*L9 : @&'V 9 G9[7*L9 : W'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V5113'V@005113'V@00C C B B 5,'V5113'V@00,B 5113'V@00'VB 'V'V5113|wn[ 'V``5113|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t.!`'V6 5 5 `5 f'VF3+w'Vp<8'V 7 c 7 9 `'V_'VX7  A /H7 1_'VX7  A /H7 1_'VX7  A /H7 'Vp\/'V 7 'V9 7=9  `'V7'V /g'V1677.1 /g'V1677.0 /g'V1677.`3'V g'V9 9 Y='V8 @g'V p8 pC  9 H> 5 G9[7*L9 : 'V 8*G6 G9[7*L9 :  .'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : 'V 3 G9[7*L9 : 0'V 4 G9[7*L9 : 'V 5 G9[7*L9 : 0'V 6 G9[7*L9 : 'V 7 G9[7*L9 : p'V 8 G9[7*L9 : @O'V 9 G9[7*L9 : 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA /A @ _'VA B /A 2'V5167'V@005167'V@00C C B B 5,'V5167'V@00/,B 5167'V@00//'VB /'V'V/5167|wn[ 'V``/5167|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 3 G9[7*L9 : 'V 8*G4 G9[7*L9 :  0s'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : L'V 3 G9[7*L9 : 'V 4 G9[7*L9 : 'V 5 G9[7*L9 : PR'V 6 G9[7*L9 : 0d'V 7 G9[7*L9 : 'V 8 G9[7*L9 : 'V 9 G9[7*L9 : 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA dA @ _'VA B dA 2'V5220'V@005220'V@00C C B B 5,'V5220'V@00d,B 5220'V@00dd'VB d'V'Vd5220|wn[ 'V``d5220|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 3 G9[7*L9 : 'V 8*G4 G9[7*L9 :  \'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : 'V 3 G9[7*L9 : P'V 4 G9[7*L9 : 'V 5 G9[7*L9 : 'V 6 G9[7*L9 : 'V 7 G9[7*L9 : `'V 8 G9[7*L9 : 0'V 9 G9[7*L9 : #'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V5272'V@005272'V@00C C B B 5,'V5272'V@00,B 5272'V@00'VB 'V'V5272|wn[ 'V``5272|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 5 G9[7*L9 : 'V 8*G6 G9[7*L9 :  z'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : ='V 2 G9[7*L9 : L'V 3 G9[7*L9 : l'V 4 G9[7*L9 : 'V 5 G9[7*L9 : K'V 6 G9[7*L9 : 'V 7 G9[7*L9 : 'V 8 G9[7*L9 : 'V 9 G9[7*L9 : `O'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V5322'V@005322'V@00C C B B 5,'V5322'V@00,B 5322'V@00'VB 'V'V5322|wn[ 'V``5322|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 1 G9[7*L9 : 0u'V 8*G2 G9[7*L9 :  p'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 0'V 2 G9[7*L9 : 'V 3 G9[7*L9 :  'V 4 G9[7*L9 : g'V 5 G9[7*L9 : ~'V 6 G9[7*L9 : P'V 7 G9[7*L9 :  'V 8 G9[7*L9 : J'V 9 G9[7*L9 : {'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V5372'V@005372'V@00C C B B 5,'V5372'V@00,B 5372'V@00'VB 'V'V5372|wn[ 'V``5372|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 7 'V ` 'V 'V _'VX7  A *H7 8 _'VX7  A *H7 7 _'VX7  A *H7 'V p'Vp\'V 7 'V9 89  `|'V0'V *g'V4188)1 *g'V4188)0 *g'V4188)`'V PL'V9 9 Y='V8 'V p8 pC  9 H> 2 G9[7*L9 : p'V 8*G3 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : 'V 3 G9[7*L9 : 'V 4 G9[7*L9 : ''V 5 G9[7*L9 : 'V 6 G9[7*L9 :  'V 7 G9[7*L9 : ='V 8 G9[7*L9 : pn'V 9 G9[7*L9 : @'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA *A @ _'VA B *A 2'V5418'V@005418'V@00C C B B 5,'V5418'V@00*,B 5418'V@00**'VB *'V'V*5418|wn[ 'V``*5418|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 2 G9[7*L9 : 'V 8*G3 G9[7*L9 :  f'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : 2'V 3 G9[7*L9 : 0'V 4 G9[7*L9 : p'V 5 G9[7*L9 :  E'V 6 G9[7*L9 : u'V 7 G9[7*L9 : 'V 8 G9[7*L9 : 'V 9 G9[7*L9 : `'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA YA @ _'VA B YA 2'V5465'V@005465'V@00C C B B 5,'V5465'V@00Y,B 5465'V@00YY'VB Y'V'VY5465|wn[ 'V``Y5465|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 2 G9[7*L9 : 'V 8*G3 G9[7*L9 :  B'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : 'V 3 G9[7*L9 : M'V 4 G9[7*L9 : @'V 5 G9[7*L9 : P'V 6 G9[7*L9 : 'V 7 G9[7*L9 : 'V 8 G9[7*L9 : -'V 9 G9[7*L9 : `^'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V5511'V@005511'V@00C C B B 5,'V5511'V@00,B 5511'V@00'VB 'V'V5511|wn[ 'V``5511|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 3 G9[7*L9 : @'V 8*G4 G9[7*L9 :  0u'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : #'V 2 G9[7*L9 : 'V 3 G9[7*L9 : 'V 4 G9[7*L9 : p'V 5 G9[7*L9 : 0'V 6 G9[7*L9 : 'V 7 G9[7*L9 : 'V 8 G9[7*L9 : 'V 9 G9[7*L9 : 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V5556'V@005556'V@00C C B B 5,'V5556'V@00,B 5556'V@00'VB 'V'V5556|wn[ 'V``5556|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t'V 8 'V p8 pC  9 H> 9 G9[7*L9 : 'V 8*G9 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : `'V 2 G9[7*L9 : P'V 3 G9[7*L9 : 'V 4 G9[7*L9 :  'V 5 G9[7*L9 : 'V 6 G9[7*L9 : p'V 7 G9[7*L9 : @'V 8 G9[7*L9 : 'V 9 G9[7*L9 : G'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V5600'V@005600'V@00C C B B 5,'V5600'V@00,B 5600'V@00'VB 'V'V5600|wn[ 'V``5600|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'V'V p ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t'V 8 @'V p8 pC  9 H> 9 G9[7*L9 : Q'V 8*G9 G9[7*L9 :  Q'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : 'V 3 G9[7*L9 : H'V 4 G9[7*L9 : 'V 5 G9[7*L9 : 'V 6 G9[7*L9 : 'V 7 G9[7*L9 :  'V 8 G9[7*L9 : :'V 9 G9[7*L9 : `k'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA  A @ _'VA B  A 2'V5644'V@005644'V@00C C B B 5,'V5644'V@00 ,B 5644'V@00  'VB  'V'V 5644|wn[ 'V`` 5644|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'V@'V p ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 0 G9[7*L9 : 8*G1 G9[7*L9 :  I'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : p'V 3 G9[7*L9 : -'V 4 G9[7*L9 : 'V 5 G9[7*L9 : !'V 6 G9[7*L9 : R'V 7 G9[7*L9 : 'V 8 G9[7*L9 : `'V 9 G9[7*L9 : 0'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA 7A @ _'VA B 7A 2'V5687'V@005687'V@00C C B B 5,'V5687'V@007,B 5687'V@0077'VB 7'V'V75687|wn[ 'V``75687|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 29  A C S'V 0;'V 8 S'V p8 pC  9 H> 9  A 9[7*L9 : @'V 8*G9 G9[7*L9 :  @'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : @X'V 2 G9[7*L9 : 'V 3 G9[7*L9 : @'V 4 G9[7*L9 : 'V 5 G9[7*L9 : 6 G9[7*L9 : ('V 7 G9[7*L9 : Y'V 8 G9[7*L9 : p'V 9 G9[7*L9 : @'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA bA @ _'VA B bA 2'V5730'V@005730'V@00C C B B 5,'V5730'V@00b,B 5730'V@00bb'VB b'V'Vb5730|wn[ 'V``b5730|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 0 G9[7*L9 : 8*G1 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : `'V 3 G9[7*L9 : @'V 4 G9[7*L9 : ;'V 5 G9[7*L9 : 0'V 6 G9[7*L9 :  'V 7 G9[7*L9 : 'V 8 G9[7*L9 : 'V 9 G9[7*L9 : @'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V5771'V@005771'V@00C C B B 5,'V5771'V@00,B 5771'V@00'VB 'V'V5771|wn[ 'V``5771|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 3 G9[7*L9 : 'V 8*G4 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : P'V 3 G9[7*L9 : ^'V 4 G9[7*L9 :  K'V 5 G9[7*L9 : 'V 6 G9[7*L9 : 'V 7 G9[7*L9 : 'V 8 G9[7*L9 : 1'V 9 G9[7*L9 : `b'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V5811'V@005811'V@00C C B B 5,'V5811'V@00,B 5811'V@00'VB 'V'V5811|wn[ 'V``5811|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 0 G9[7*L9 : 8*G1 G9[7*L9 :  p'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : 0'V 3 G9[7*L9 :  'V 4 G9[7*L9 : 'V 5 G9[7*L9 : w'V 6 G9[7*L9 : 'V 7 G9[7*L9 : p'V 8 G9[7*L9 : @ 'V 9 G9[7*L9 : Q'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V5853'V@005853'V@00C C B B 5,'V5853'V@00,B 5853'V@00'VB 'V'V5853|wn[ 'V``5853|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t'V5 'V 7 ,C)8 7 'V `'VK'V _'VX7  A H7 2 _'VX7  A H7 1 _'VX7  A H7  G'V w'Vpl 'V 7 'V9 49  `w'V@>'V g'V89441 g'V89440 g'V8944p 'V P'V9 9 Y='V8 0'V p8 pC  9 H> 2 G9[7*L9 : 'V 8*G3 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 :  'V 2 G9[7*L9 : 'V 3 G9[7*L9 : w'V 4 G9[7*L9 : 'V 5 G9[7*L9 : 'V 6 G9[7*L9 : ж'V 7 G9[7*L9 : 'V 8 G9[7*L9 : p'V 9 G9[7*L9 : @I'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V5894'V@005894'V@00C C B B 5,'V5894'V@00,B 5894'V@00'VB 'V'V5894|wn[ 'V``5894|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 29  A C 'V 0;'V 8 'V p8 pC  9 H> 9  A 9[7*L9 : p'V 8*G9 G9[7*L9 :  p'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : 0'V 3 G9[7*L9 : 'V 4 G9[7*L9 : 'V 5 G9[7*L9 : 6 G9[7*L9 : 'V 7 G9[7*L9 : *'V 8 G9[7*L9 : ['V 9 G9[7*L9 : p'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA /A @ _'VA B /A 2'V5935'V@005935'V@00C C B B 5,'V5935'V@00/,B 5935'V@00//'VB /'V'V/5935|wn[ 'V``/5935|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 1 G9[7*L9 : 'V 8*G2 G9[7*L9 :  %'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 6'V 2 G9[7*L9 : 0J'V 3 G9[7*L9 : 'V 4 G9[7*L9 :  'V 5 G9[7*L9 : ='V 6 G9[7*L9 : \'V 7 G9[7*L9 : `'V 8 G9[7*L9 : 0'V 9 G9[7*L9 : 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA WA @ _'VA B WA 2'V5975'V@005975'V@00C C B B 5,'V5975'V@00W,B 5975'V@00WW'VB W'V'VW5975|wn[ 'V``W5975|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t'V 8 'V p8 pC  9 H> 9 G9[7*L9 : 'V 8*G9 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : 'V 3 G9[7*L9 : 'V 4 G9[7*L9 :  'V 5 G9[7*L9 : ` 'V 6 G9[7*L9 : 'V 7 G9[7*L9 : 0.'V 8 G9[7*L9 : _'V 9 G9[7*L9 : Џ'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V6017'V@006017'V@00C C B B 5,'V6017'V@00,B 6017'V@00'VB 'V'V6017|wn[ 'V``6017|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'V'V p ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 0 G9[7*L9 : 8*G1 G9[7*L9 :  +'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : @v'V 2 G9[7*L9 : T'V 3 G9[7*L9 : 'V 4 G9[7*L9 : 'V 5 G9[7*L9 : _'V 6 G9[7*L9 : 4'V 7 G9[7*L9 : ~'V 8 G9[7*L9 : P'V 9 G9[7*L9 :  'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V6064'V@006064'V@00C C B B 5,'V6064'V@00,B 6064'V@00'VB 'V'V6064|wn[ 'V``6064|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 3 G9[7*L9 : 'V 8*G4 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : `'V 2 G9[7*L9 : p'V 3 G9[7*L9 :  6'V 4 G9[7*L9 : М'V 5 G9[7*L9 :  'V 6 G9[7*L9 : 'V 7 G9[7*L9 : 'V 8 G9[7*L9 : P'V 9 G9[7*L9 :  G'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V6109'V@006109'V@00C C B B 5,'V6109'V@00,B 6109'V@00'VB 'V'V6109|wn[ 'V``6109|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 2 G9[7*L9 :  'V 8*G3 G9[7*L9 :  p'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : )'V 2 G9[7*L9 :  R'V 3 G9[7*L9 : ('V 4 G9[7*L9 : B'V 5 G9[7*L9 : 'V 6 G9[7*L9 : 0'V 7 G9[7*L9 : 'V 8 G9[7*L9 : 'V 9 G9[7*L9 : F'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA  A @ _'VA B  A 2'V6155'V@006155'V@00C C B B 5,'V6155'V@00 ,B 6155'V@00  'VB  'V'V 6155|wn[ 'V`` 6155|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 2 G9[7*L9 : @k'V 8*G3 G9[7*L9 :  P]'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : 'V 3 G9[7*L9 : p'V 4 G9[7*L9 : 0'V 5 G9[7*L9 : 'V 6 G9[7*L9 : 'V 7 G9[7*L9 : 'V 8 G9[7*L9 : +'V 9 G9[7*L9 : `\'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA 8A @ _'VA B 8A 2'V6200'V@006200'V@00C C B B 5,'V6200'V@008,B 6200'V@0088'VB 8'V'V86200|wn[ 'V``86200|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t3 8 O'V T'V ?4 8 O'VX'V @5 8 O'V]'V A6 8 O'Vpa'V B7 8 O'Ve'V C8 8 O'VPj'V D9 8 O'Vn'V E8'V0GA|wn]l 'V0'Vp 'V 4 `5 _'V`5 ` 'V'V 4 'V5 ,C)e5 'Vl 'Vp0Ex)G@x)G1C)G`Ah6 ft6 `5 _'Vh6  A fX6 2'V2466'V ` 'V2466'V ` 'V< <  A ,A 5,'V2466'V ` 'Vf2466'V ` 'Vf9 8 8 (*'VN'V@'V 8 XN'V`2'V8 XN'V'V`8 O'VH>  A C 'V 0;'V 8 'V p8 pC  9 H> 9  A 9[7*L9 : 'V 8*G9 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : ('V 2 G9[7*L9 : @'V 3 G9[7*L9 : @'V 4 G9[7*L9 : 0'V 5 G9[7*L9 : f'V 6 G9[7*L9 : 7 G9[7*L9 : @'V 8 G9[7*L9 : O'V 9 G9[7*L9 : 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA fA @ _'VA B fA 2'V6246'V@006246'V@00C C B B 5,'V6246'V@00f,B 6246'V@00ff'VB f'V'Vf6246|wn[ 'V``f6246|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t'V9 9 Y='V8 >'V p8 pC  9 H> 1 G9[7*L9 : 'V 8*G2 G9[7*L9 :  @v'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : ~'V 2 G9[7*L9 : Pl'V 3 G9[7*L9 : ='V 4 G9[7*L9 : P2'V 5 G9[7*L9 : w'V 6 G9[7*L9 : C'V 7 G9[7*L9 : J'V 8 G9[7*L9 : p{'V 9 G9[7*L9 : @'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V6290'V@006290'V@00C C B B 5,'V6290'V@00,B 6290'V@00'VB 'V'V6290|wn[ 'V``6290|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 0 G9[7*L9 : 8*G1 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 :  'V 2 G9[7*L9 : `$'V 3 G9[7*L9 : p+'V 4 G9[7*L9 : 'V 5 G9[7*L9 : 'V 6 G9[7*L9 : 'V 7 G9[7*L9 :  n'V 8 G9[7*L9 : 'V 9 G9[7*L9 : 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V6334'V@006334'V@00C C B B 5,'V6334'V@00,B 6334'V@00'VB 'V'V6334|wn[ 'V``6334|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 2 G9[7*L9 : 0'V 8*G3 G9[7*L9 :  `'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 :  T'V 2 G9[7*L9 : 'V 3 G9[7*L9 : 'V 4 G9[7*L9 : 'V 5 G9[7*L9 : J'V 6 G9[7*L9 : 'V 7 G9[7*L9 : 'V 8 G9[7*L9 : 'V 9 G9[7*L9 : `D'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V6377'V@006377'V@00C C B B 5,'V6377'V@00,B 6377'V@00'VB 'V'V6377|wn[ 'V``6377|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 4 G9[7*L9 : d'V 8*G5 G9[7*L9 :  Y'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : ,'V 3 G9[7*L9 :  /'V 4 G9[7*L9 : 'V 5 G9[7*L9 : 'V 6 G9[7*L9 : 'V 7 G9[7*L9 : 'V 8 G9[7*L9 : 'V 9 G9[7*L9 : 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V6420'V@006420'V@00C C B B 5,'V6420'V@00,B 6420'V@00'VB 'V'V6420|wn[ 'V``6420|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 4 G9[7*L9 : P'V 8*G5 G9[7*L9 :  V'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : `'V 2 G9[7*L9 :  'V 3 G9[7*L9 : 'V 4 G9[7*L9 : P='V 5 G9[7*L9 : P'V 6 G9[7*L9 : 'V 7 G9[7*L9 : 0'V 8 G9[7*L9 : Pa'V 9 G9[7*L9 :  'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA ?A @ _'VA B ?A 2'V6463'V@006463'V@00C C B B 5,'V6463'V@00?,B 6463'V@00??'VB ?'V'V?6463|wn[ 'V``?6463|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 0 G9[7*L9 : 8*G1 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : `'V 2 G9[7*L9 : p'V 3 G9[7*L9 : 'V 4 G9[7*L9 : 'V 5 G9[7*L9 : 'V 6 G9[7*L9 : 'V 7 G9[7*L9 : 'V 8 G9[7*L9 : 5'V 9 G9[7*L9 : f'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA jA @ _'VA B jA 2'V6506'V@006506'V@00C C B B 5,'V6506'V@00j,B 6506'V@00jj'VB j'V'Vj6506|wn[ 'V``j6506|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 2 G9[7*L9 : @'V 8*G3 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : p'V 2 G9[7*L9 : 6'V 3 G9[7*L9 : 'V 4 G9[7*L9 : d'V 5 G9[7*L9 : `Q'V 6 G9[7*L9 : p'V 7 G9[7*L9 : ('V 8 G9[7*L9 : PY'V 9 G9[7*L9 :  'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V6548'V@006548'V@00C C B B 5,'V6548'V@00,B 6548'V@00'VB 'V'V6548|wn[ 'V``6548|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 6 G9[7*L9 : ('V 8*G7 G9[7*L9 :  T'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 :  C'V 2 G9[7*L9 : 'V 3 G9[7*L9 : 1'V 4 G9[7*L9 : t'V 5 G9[7*L9 : pR'V 6 G9[7*L9 : 'V 7 G9[7*L9 :  )'V 8 G9[7*L9 : Y'V 9 G9[7*L9 : 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V6589'V@006589'V@00C C B B 5,'V6589'V@00,B 6589'V@00'VB 'V'V6589|wn[ 'V``6589|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t'V 8 0J'V p8 pC  9 H> 9 G9[7*L9 :  'V 8*G9 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : 'V 3 G9[7*L9 : 'V 4 G9[7*L9 : `'V 5 G9[7*L9 : 'V 6 G9[7*L9 : N'V 7 G9[7*L9 : `x'V 8 G9[7*L9 : 0'V 9 G9[7*L9 : 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V6630'V@006630'V@00C C B B 5,'V6630'V@00,B 6630'V@00'VB 'V'V6630|wn[ 'V``6630|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'V0J'V p ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 0 G9[7*L9 : 8*G1 G9[7*L9 :  &'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : 'V 3 G9[7*L9 : pr'V 4 G9[7*L9 : 'V 5 G9[7*L9 : 'V 6 G9[7*L9 :  'V 7 G9[7*L9 : 4'V 8 G9[7*L9 : d'V 9 G9[7*L9 : 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V6671'V@006671'V@00C C B B 5,'V6671'V@00,B 6671'V@00'VB 'V'V6671|wn[ 'V``6671|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 1 G9[7*L9 : P'V 8*G2 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : 'V 3 G9[7*L9 : 'V 4 G9[7*L9 : 0'V 5 G9[7*L9 : 'V 6 G9[7*L9 : p'V 7 G9[7*L9 : 0'V 8 G9[7*L9 : #'V 9 G9[7*L9 : S'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA 7A @ _'VA B 7A 2'V6711'V@006711'V@00C C B B 5,'V6711'V@007,B 6711'V@0077'VB 7'V'V76711|wn[ 'V``76711|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 0 G9[7*L9 : 8*G1 G9[7*L9 :  p'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : p<'V 3 G9[7*L9 : y'V 4 G9[7*L9 : 'V 5 G9[7*L9 : @'V 6 G9[7*L9 : 'V 7 G9[7*L9 : 'V 8 G9[7*L9 : 'V 9 G9[7*L9 :  'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA _A @ _'VA B _A 2'V6751'V@006751'V@00C C B B 5,'V6751'V@00_,B 6751'V@00__'VB _'V'V_6751|wn[ 'V``_6751|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 5 G9[7*L9 : 'V 8*G6 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : S'V 2 G9[7*L9 : P]'V 3 G9[7*L9 : I'V 4 G9[7*L9 : 'V 5 G9[7*L9 : 'V 6 G9[7*L9 : 0'V 7 G9[7*L9 : `'V 8 G9[7*L9 : 07'V 9 G9[7*L9 : h'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V6790'V@006790'V@00C C B B 5,'V6790'V@00,B 6790'V@00'VB 'V'V6790|wn[ 'V``6790|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 0 G9[7*L9 : 8*G1 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : r'V 2 G9[7*L9 : 0'V 3 G9[7*L9 :  'V 4 G9[7*L9 : 'V 5 G9[7*L9 : @x'V 6 G9[7*L9 : $'V 7 G9[7*L9 : )'V 8 G9[7*L9 : Z'V 9 G9[7*L9 : 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V6830'V@006830'V@00C C B B 5,'V6830'V@00,B 6830'V@00'VB 'V'V6830|wn[ 'V``6830|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 0 G9[7*L9 : 8*G1 G9[7*L9 :  p%'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : @'V 2 G9[7*L9 : 0'V 3 G9[7*L9 : {'V 4 G9[7*L9 : Ph'V 5 G9[7*L9 : 'V 6 G9[7*L9 : 'V 7 G9[7*L9 : pX'V 8 G9[7*L9 : @'V 9 G9[7*L9 : 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V6869'V@006869'V@00C C B B 5,'V6869'V@00,B 6869'V@00'VB 'V'V6869|wn[ 'V``6869|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 1 G9[7*L9 : P'V 8*G2 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : `'V 3 G9[7*L9 : @m'V 4 G9[7*L9 : Y'V 5 G9[7*L9 : P%'V 6 G9[7*L9 : 'V 7 G9[7*L9 : 'V 8 G9[7*L9 : 'V 9 G9[7*L9 : 3'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V6907'V@006907'V@00C C B B 5,'V6907'V@00,B 6907'V@00'VB 'V'V6907|wn[ 'V``6907|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t9 8  ` 'VF'V 8 O'V2 8 O'V1 8 O'V@'V L'V9 9 Y='V8 'V p8 pC  9 H> 5 G9[7*L9 : p'V 8*G6 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : f'V 3 G9[7*L9 : p'V 4 G9[7*L9 : P]'V 5 G9[7*L9 : `'V 6 G9[7*L9 :  'V 7 G9[7*L9 : 'V 8 G9[7*L9 : 'V 9 G9[7*L9 : `'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA 7A @ _'VA B 7A 2'V6967'V@006967'V@00C C B B 5,'V6967'V@007,B 6967'V@0077'VB 7'V'V76967|wn[ 'V``76967|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t9 8  ` 'VF'V 8 O'V2 8 O'V1 8 O'V@'V L'V9 9 Y='V8 'V p8 pC  9 H> 5 G9[7*L9 : p'V 8*G6 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : f'V 3 G9[7*L9 : p'V 4 G9[7*L9 : P]'V 5 G9[7*L9 : `'V 6 G9[7*L9 :  'V 7 G9[7*L9 : 'V 8 G9[7*L9 : 'V 9 G9[7*L9 : `'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA 7A @ _'VA B 7A 2'V6967'V@006967'V@00C C B B 5,'V6967'V@007,B 6967'V@0077'VB 7'V'V76967|wn[ 'V``76967|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t9 8  ` 'VF'V 8 O'V2 8 O'V1 8 O'V@'V L'V9 9 Y='V8 'V p8 pC  9 H> 5 G9[7*L9 : p'V 8*G6 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : f'V 3 G9[7*L9 : p'V 4 G9[7*L9 : P]'V 5 G9[7*L9 : `'V 6 G9[7*L9 :  'V 7 G9[7*L9 : 'V 8 G9[7*L9 : 'V 9 G9[7*L9 : `'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA 7A @ _'VA B 7A 2'V6967'V@006967'V@00C C B B 5,'V6967'V@007,B 6967'V@0077'VB 7'V'V76967|wn[ 'V``76967|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t9 8  ` 'VF'V 8 O'V2 8 O'V1 8 O'V@'V L'V9 9 Y='V8 'V p8 pC  9 H> 5 G9[7*L9 : p'V 8*G6 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : f'V 3 G9[7*L9 : p'V 4 G9[7*L9 : P]'V 5 G9[7*L9 : `'V 6 G9[7*L9 :  'V 7 G9[7*L9 : 'V 8 G9[7*L9 : 'V 9 G9[7*L9 : `'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA 7A @ _'VA B 7A 2'V6967'V@006967'V@00C C B B 5,'V6967'V@007,B 6967'V@0077'VB 7'V'V76967|wn[ 'V``76967|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t'V 8 'V p8 pC  9 H> 9 G9[7*L9 : 'V 8*G9 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : f'V 3 G9[7*L9 : p'V 4 G9[7*L9 : P]'V 5 G9[7*L9 : `'V 6 G9[7*L9 :  'V 7 G9[7*L9 : 'V 8 G9[7*L9 : 'V 9 G9[7*L9 : `'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA 7A @ _'VA B 7A 2'V6967'V@006967'V@00C C B B 5,'V6967'V@007,B 6967'V@0077'VB 7'V'V76967|wn[ 'V``76967|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'V'V p ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t  A C 'V 0;'V 8 'V p8 pC  9 H> 9  A 9[7*L9 : 'V 8*G9 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : "'V 3 G9[7*L9 : P'V 4 G9[7*L9 : PL'V 5 G9[7*L9 : 7'V 6 G9[7*L9 : 'V 7 G9[7*L9 : 8 G9[7*L9 : 'V 9 G9[7*L9 : 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V7047'V@007047'V@00C C B B 5,'V7047'V@00,B 7047'V@00'VB  !  `"?"?'V'V[heap]"?"?I?$V  `"?"?'V'V[heap]"?"?W/'V  `"?"?'V'V[heap]"?"??G'V  3C)G"?"?.(V9,@x)Gp'V'V'V!p4 3C)G3+'V'VEx)G@x)G `A8'V0GA|wn]@x)Gx)G`0ܛ'V 7 QC)G\'V @'V`Ɯ'V 7  7 6 `l'VP'V 4766,A 5,'V99 4766,A 5,'V99 476'Vܛ'V'V 7  7 _'V'Vܛ'V 7 'V9 B9  `'V6 8 N'V6 8 N'V5 8 N'V'V L'V9 9 Y='V8 'V p8 pC  9 H> 5 G9[7*L9 : q'V 8*G6 G9[7*L9 :  p'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : `'V 3 G9[7*L9 : `3'V 4 G9[7*L9 : 'V 5 G9[7*L9 : 'V 6 G9[7*L9 : 'V 7 G9[7*L9 : W'V 8 G9[7*L9 : 'V 9 G9[7*L9 : 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA 4A @ _'VA B 4A 2'V7476'V@007476'V@00C C B B 5,'V7476'V@004,B 7476'V@0044'VB 4'V'V47476|wn[ 'V``47476|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 6 G9[7*L9 : 'V 8*G7 G9[7*L9 :  0'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : @'V 2 G9[7*L9 : !'V 3 G9[7*L9 : 'V 4 G9[7*L9 : H'V 5 G9[7*L9 : 4'V 6 G9[7*L9 : P'V 7 G9[7*L9 : Ѐ'V 8 G9[7*L9 : 'V 9 G9[7*L9 : 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA vA @ _'VA B vA 2'V7542'V@007542'V@00C C B B 5,'V7542'V@00v,B 7542'V@00vv'VB v'V'Vv7542|wn[ 'V``v7542|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 5 G9[7*L9 : ж'V 8*G6 G9[7*L9 :  C'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : 6'V 3 G9[7*L9 : @z'V 4 G9[7*L9 : f'V 5 G9[7*L9 : Y'V 6 G9[7*L9 : 'V 7 G9[7*L9 : 'V 8 G9[7*L9 : 0'V 9 G9[7*L9 : .'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V7592'V@007592'V@00C C B B 5,'V7592'V@00,B 7592'V@00'VB 'V'V7592|wn[ 'V``7592|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 1 G9[7*L9 : 0'V 8*G2 G9[7*L9 :  K'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : `'V 3 G9[7*L9 : 'V 4 G9[7*L9 : 'V 5 G9[7*L9 : @k'V 6 G9[7*L9 : 'V 7 G9[7*L9 : `'V 8 G9[7*L9 : %'V 9 G9[7*L9 : V'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V7637'V@007637'V@00C C B B 5,'V7637'V@00,B 7637'V@00'VB 'V'V7637|wn[ 'V``7637|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 3 G9[7*L9 : }'V 8*G4 G9[7*L9 :  `\'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : @'V 2 G9[7*L9 : @'V 3 G9[7*L9 : P'V 4 G9[7*L9 : J'V 5 G9[7*L9 : 7'V 6 G9[7*L9 : 9'V 7 G9[7*L9 :  T'V 8 G9[7*L9 : 0D'V 9 G9[7*L9 : u'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V7678'V@007678'V@00C C B B 5,'V7678'V@00,B 7678'V@00'VB 'V'V7678|wn[ 'V``7678|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 0 G9[7*L9 : 8*G1 G9[7*L9 :  0'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 :  'V 2 G9[7*L9 : 'V 3 G9[7*L9 : @'V 4 G9[7*L9 : К'V 5 G9[7*L9 : 'V 6 G9[7*L9 : 'V 7 G9[7*L9 : P'V 8 G9[7*L9 : 'V 9 G9[7*L9 : 6'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA %A @ _'VA B %A 2'V7717'V@007717'V@00C C B B 5,'V7717'V@00%,B 7717'V@00%%'VB %'V'V%7717|wn[ 'V``%7717|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 2 G9[7*L9 : P)'V 8*G3 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : М'V 2 G9[7*L9 :  'V 3 G9[7*L9 : `B'V 4 G9[7*L9 : .'V 5 G9[7*L9 : `'V 6 G9[7*L9 : l'V 7 G9[7*L9 : 'V 8 G9[7*L9 : 0'V 9 G9[7*L9 : 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA JA @ _'VA B JA 2'V7754'V@007754'V@00C C B B 5,'V7754'V@00J,B 7754'V@00JJ'VB J'V'VJ7754|wn[ 'V``J7754|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 4 G9[7*L9 : ^'V 8*G5 G9[7*L9 :  >'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 0S'V 2 G9[7*L9 : J'V 3 G9[7*L9 : 7'V 4 G9[7*L9 : P'V 5 G9[7*L9 : N'V 6 G9[7*L9 : ;'V 7 G9[7*L9 : 0j'V 8 G9[7*L9 : 'V 9 G9[7*L9 : 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA nA @ _'VA B nA 2'V7790'V@007790'V@00C C B B 5,'V7790'V@00n,B 7790'V@00nn'VB n'V'Vn7790|wn[ 'V``n7790|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 2 G9[7*L9 : 'V 8*G3 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : @x'V 2 G9[7*L9 : 'V 3 G9[7*L9 : 'V 4 G9[7*L9 : P'V 5 G9[7*L9 : 'V 6 G9[7*L9 : 'V 7 G9[7*L9 : `o'V 8 G9[7*L9 : P'V 9 G9[7*L9 :  'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V7826'V@007826'V@00C C B B 5,'V7826'V@00,B 7826'V@00'VB 'V'V7826|wn[ 'V``7826|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 3 G9[7*L9 : L'V 8*G4 G9[7*L9 :  u'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 :  'V 3 G9[7*L9 : 0'V 4 G9[7*L9 : b'V 5 G9[7*L9 : 'V 6 G9[7*L9 : 'V 7 G9[7*L9 : 0'V 8 G9[7*L9 : v'V 9 G9[7*L9 : 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V7861'V@007861'V@00C C B B 5,'V7861'V@00,B 7861'V@00'VB 'V'V7861|wn[ 'V``7861|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t  A C 'V 0;'V 8 'V p8 pC  9 H> 9  A 9[7*L9 : @8'V 8*G9 G9[7*L9 :  @8'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : 'V 3 G9[7*L9 : 'V 4 G9[7*L9 :  'V 5 G9[7*L9 : @'V 6 G9[7*L9 : 'V 7 G9[7*L9 : 8 G9[7*L9 : p'V 9 G9[7*L9 : @8'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V7896'V@007896'V@00C C B B 5,'V7896'V@00,B 7896'V@00'VB 'V'V7896|wn[ 'V``7896|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 3 G9[7*L9 : 'V 8*G4 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : 'V 3 G9[7*L9 : 0'V 4 G9[7*L9 : 'V 5 G9[7*L9 : Py'V 6 G9[7*L9 : e'V 7 G9[7*L9 : 'V 8 G9[7*L9 : *'V 9 G9[7*L9 : ['V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V7930'V@007930'V@00C C B B 5,'V7930'V@00,B 7930'V@00'VB 'V'V7930|wn[ 'V``7930|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 0 G9[7*L9 : 8*G1 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : @X'V 3 G9[7*L9 : 0'V 4 G9[7*L9 : 'V 5 G9[7*L9 : P{'V 6 G9[7*L9 : g'V 7 G9[7*L9 : 'V 8 G9[7*L9 : E'V 9 G9[7*L9 : `v'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V7964'V@007964'V@00C C B B 5,'V7964'V@00,B 7964'V@00'VB 'V'V7964|wn[ 'V``7964|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 5 G9[7*L9 : 'V 8*G6 G9[7*L9 :  P'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : 0q'V 3 G9[7*L9 : j'V 4 G9[7*L9 : pA'V 5 G9[7*L9 : .'V 6 G9[7*L9 : 'V 7 G9[7*L9 : p'V 8 G9[7*L9 : 'V 9 G9[7*L9 : p'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA =A @ _'VA B =A 2'V7997'V@007997'V@00C C B B 5,'V7997'V@00=,B 7997'V@00=='VB ='V'V=7997|wn[ 'V``=7997|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t9  `L'Vp]'V 98 9 2 98 9 1 98 9 ,'V ,'V9 9 Y='V8 'V p8 pC  9 H> 5 G9[7*L9 : 'V 8*G6 G9[7*L9 :  `'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : К'V 3 G9[7*L9 : @V'V 4 G9[7*L9 : M'V 5 G9[7*L9 : p:'V 6 G9[7*L9 : `'V 7 G9[7*L9 : 'V 8 G9[7*L9 : 0'V 9 G9[7*L9 : 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA bA @ _'VA B bA 2'V8034'V@008034'V@00C C B B 5,'V8034'V@00b,B 8034'V@00bb'VB b'V'Vb8034|wn[ 'V``b8034|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 3 G9[7*L9 : 'V 8*G4 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 :  'V 2 G9[7*L9 : `'V 3 G9[7*L9 : ,'V 4 G9[7*L9 : P'V 5 G9[7*L9 : 'V 6 G9[7*L9 : 0'V 7 G9[7*L9 : 'V 8 G9[7*L9 : 'V 9 G9[7*L9 : 0#'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V8071'V@008071'V@00C C B B 5,'V8071'V@00,B 8071'V@00'VB 'V'V8071|wn[ 'V``8071|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 4 G9[7*L9 :  'V 8*G5 G9[7*L9 :  U'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : p'V 3 G9[7*L9 : 0'V 4 G9[7*L9 : ``'V 5 G9[7*L9 : @'V 6 G9[7*L9 : P.'V 7 G9[7*L9 : I'V 8 G9[7*L9 : 'V 9 G9[7*L9 : P'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V8107'V@008107'V@00C C B B 5,'V8107'V@00,B 8107'V@00'VB 'V'V8107|wn[ 'V``8107|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 2 G9[7*L9 : p'V 8*G3 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : |'V 3 G9[7*L9 : @'V 4 G9[7*L9 : E'V 5 G9[7*L9 : 3'V 6 G9[7*L9 : 'V 7 G9[7*L9 : 'V 8 G9[7*L9 : 'V 9 G9[7*L9 : v'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V8143'V@008143'V@00C C B B 5,'V8143'V@00,B 8143'V@00'VB 'V'V8143|wn[ 'V``8143|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 6 G9[7*L9 : @$'V 8*G7 G9[7*L9 :  0u'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : J'V 2 G9[7*L9 : `1'V 3 G9[7*L9 : &'V 4 G9[7*L9 : C'V 5 G9[7*L9 : 'V 6 G9[7*L9 :  'V 7 G9[7*L9 : P'V 8 G9[7*L9 : 'V 9 G9[7*L9 : 0'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA A @ _'VA B A 2'V8178'V@008178'V@00C C B B 5,'V8178'V@00,B 8178'V@00'VB 'V'V8178|wn[ 'V``8178|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t'V 8 'V p8 pC  9 H> 9 G9[7*L9 : @T'V 8*G9 G9[7*L9 :  @T'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : ''V 2 G9[7*L9 : 0('V 3 G9[7*L9 : _'V 4 G9[7*L9 : 'V 5 G9[7*L9 : 'V 6 G9[7*L9 : @'V 7 G9[7*L9 : t'V 8 G9[7*L9 : 0'V 9 G9[7*L9 :  'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA  A @ _'VA B  A 2'V8213'V@008213'V@00C C B B 5,'V8213'V@00 ,B 8213'V@00  'VB  'V'V 8213|wn[ 'V`` 8213|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'V'V p ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 0 G9[7*L9 : 8*G1 G9[7*L9 :  @'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 :  'V 2 G9[7*L9 : `\'V 3 G9[7*L9 : 'V 4 G9[7*L9 :  )'V 5 G9[7*L9 : 'V 6 G9[7*L9 : w'V 7 G9[7*L9 :  'V 8 G9[7*L9 : 'V 9 G9[7*L9 : 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA 9 A @ _'VA B 9 A 2'V8249'V@008249'V@00C C B B 5,'V8249'V@009 ,B 8249'V@009 9 'VB 9 'V'V9 8249|wn[ 'V``9 8249|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 0 G9[7*L9 : 8*G1 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : @'V 3 G9[7*L9 : b'V 4 G9[7*L9 : `'V 5 G9[7*L9 : w'V 6 G9[7*L9 : pn'V 7 G9[7*L9 : 5'V 8 G9[7*L9 : 'V 9 G9[7*L9 : `'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA \ A @ _'VA B \ A 2'V8284'V@008284'V@00C C B B 5,'V8284'V@00\ ,B 8284'V@00\ \ 'VB \ 'V'V\ 8284|wn[ 'V``\ 8284|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t'V 8 'V p8 pC  9 H> 9 G9[7*L9 : ж'V 8*G9 G9[7*L9 :  ж'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : `'V 2 G9[7*L9 :  'V 3 G9[7*L9 : ]'V 4 G9[7*L9 : @'V 5 G9[7*L9 : 'V 6 G9[7*L9 : 'V 7 G9[7*L9 : 0s'V 8 G9[7*L9 : 'V 9 G9[7*L9 : 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA ~ A @ _'VA B ~ A 2'V8318'V@008318'V@00C C B B 5,'V8318'V@00~ ,B 8318'V@00~ ~ 'VB ~ 'V'V~ 8318|wn[ 'V``~ 8318|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'V'V p ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 3 G9[7*L9 :  'V 8*G4 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : `H'V 3 G9[7*L9 : 4'V 4 G9[7*L9 : `'V 5 G9[7*L9 : 'V 6 G9[7*L9 : 0J'V 7 G9[7*L9 : 6'V 8 G9[7*L9 : 'V 9 G9[7*L9 : p'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA  A @ _'VA B  A 2'V8353'V@008353'V@00C C B B 5,'V8353'V@00 ,B 8353'V@00 'VB  'V'V 8353|wn[ 'V`` 8353|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 5 G9[7*L9 : 'V 8*G6 G9[7*L9 :  P'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : `'V 2 G9[7*L9 : @'V 3 G9[7*L9 : 'V 4 G9[7*L9 : p'V 5 G9[7*L9 : q'V 6 G9[7*L9 : ]'V 7 G9[7*L9 : @t'V 8 G9[7*L9 :  'V 9 G9[7*L9 : @:'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA  A @ _'VA B  A 2'V8387'V@008387'V@00C C B B 5,'V8387'V@00 ,B 8387'V@00 'VB  'V'V 8387|wn[ 'V`` 8387|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 2 G9[7*L9 : 'V 8*G3 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 :  ''V 2 G9[7*L9 : 'V 3 G9[7*L9 : P'V 4 G9[7*L9 : f'V 5 G9[7*L9 : `S'V 6 G9[7*L9 : ='V 7 G9[7*L9 : 'V 8 G9[7*L9 : P'V 9 G9[7*L9 :  'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA  A @ _'VA B  A 2'V6944'V@006944'V@00C C B B 5,'V6944'V@00 ,B 6944'V@00  'VB  'V'V 6944|wn[ 'V`` 6944|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 6 G9[7*L9 :  'V 8*G7 G9[7*L9 :  %'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : ['V 3 G9[7*L9 : 'V 4 G9[7*L9 : `'V 5 G9[7*L9 : `'V 6 G9[7*L9 : y'V 7 G9[7*L9 : @>'V 8 G9[7*L9 : 'V 9 G9[7*L9 : 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA  A @ _'VA B  A 2'V8421'V@008421'V@00C C B B 5,'V8421'V@00 ,B 8421'V@00 'VB  'V'V 8421|wn[ 'V`` 8421|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 2 G9[7*L9 : @'V 8*G3 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : 'V 3 G9[7*L9 : p'V 4 G9[7*L9 : 0'V 5 G9[7*L9 : 2'V 6 G9[7*L9 : 'V 7 G9[7*L9 : 'V 8 G9[7*L9 : 'V 9 G9[7*L9 : 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA !A @ _'VA B !A 2'V8455'V@008455'V@00C C B B 5,'V8455'V@00!,B 8455'V@00!!'VB !'V'V!8455|wn[ 'V``!8455|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 4 G9[7*L9 : {'V 8*G5 G9[7*L9 :  3'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : 'V 3 G9[7*L9 : ,'V 4 G9[7*L9 : j'V 5 G9[7*L9 : Y'V 6 G9[7*L9 : P'V 7 G9[7*L9 :  <'V 8 G9[7*L9 : 0 'V 9 G9[7*L9 : C'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA (!A @ _'VA B (!A 2'V8488'V@008488'V@00C C B B 5,'V8488'V@00(!,B 8488'V@00(!(!'VB (!'V'V(!8488|wn[ 'V``(!8488|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 1 G9[7*L9 :  'V 8*G2 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 :  'V 3 G9[7*L9 : T'V 4 G9[7*L9 : pA'V 5 G9[7*L9 : 'V 6 G9[7*L9 :  'V 7 G9[7*L9 : 'V 8 G9[7*L9 : @'V 9 G9[7*L9 : 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA I!A @ _'VA B I!A 2'V8521'V@008521'V@00C C B B 5,'V8521'V@00I!,B 8521'V@00I!I!'VB I!'V'VI!8521|wn[ 'V``I!8521|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 2 G9[7*L9 : h'V 8*G3 G9[7*L9 :  @'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : 'V 3 G9[7*L9 : 'V 4 G9[7*L9 : s'V 5 G9[7*L9 : `'V 6 G9[7*L9 : 'V 7 G9[7*L9 : 'V 8 G9[7*L9 : 0'V 9 G9[7*L9 :  'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA i!A @ _'VA B i!A 2'V8553'V@008553'V@00C C B B 5,'V8553'V@00i!,B 8553'V@00i!i!'VB i!'V'Vi!8553|wn[ 'V``i!8553|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 2 G9[7*L9 : `'V 8*G3 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : `'V 3 G9[7*L9 : 'V 4 G9[7*L9 : @p'V 5 G9[7*L9 : 'V 6 G9[7*L9 : \'V 7 G9[7*L9 : C'V 8 G9[7*L9 : 'V 9 G9[7*L9 : a'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA !A @ _'VA B !A 2'V8585'V@008585'V@00C C B B 5,'V8585'V@00!,B 8585'V@00!!'VB !'V'V!8585|wn[ 'V``!8585|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t'V 5 ,C) 5 'V `l-'V2p6 E@x)G1C)G1p6 E@x)G1C)G1p6 E@x)G1C)G('V:'V5 'V 7 _6 7  A  `('V>'V 6177x)G@x)G1C)G0 6177x)G@x)G1C)G9 617{'VpL'V{'V 7  7 _'V{'VpL'V 7 'V9 9  `{'V :'V 98 9 1 98 9 0 98 9 P 'V PL'V9 9 Y='V8 'V p8 pC  9 H> 2 G9[7*L9 : 'V 8*G3 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : 'V 3 G9[7*L9 : P{'V 4 G9[7*L9 : `'V 5 G9[7*L9 : U'V 6 G9[7*L9 : B'V 7 G9[7*L9 : P!'V 8 G9[7*L9 : 07'V 9 G9[7*L9 : `M'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA !A @ _'VA B !A 2'V8617'V@008617'V@00C C B B 5,'V8617'V@00!,B 8617'V@00!!'VB !'V'V!8617|wn[ 'V``!8617|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 2 G9[7*L9 : 'V 8*G3 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : V'V 3 G9[7*L9 : pC'V 4 G9[7*L9 : Ы'V 5 G9[7*L9 : 3'V 6 G9[7*L9 :  'V 7 G9[7*L9 : 'V 8 G9[7*L9 : 'V 9 G9[7*L9 : `'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA !A @ _'VA B !A 2'V8649'V@008649'V@00C C B B 5,'V8649'V@00!,B 8649'V@00!!'VB !'V'V!8649|wn[ 'V``!8649|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 0 G9[7*L9 : 8*G1 G9[7*L9 :  `'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : py'V 3 G9[7*L9 : 'V 4 G9[7*L9 : 'V 5 G9[7*L9 : 'V 6 G9[7*L9 : `'V 7 G9[7*L9 : 'V 8 G9[7*L9 : P'V 9 G9[7*L9 : Z'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA !A @ _'VA B !A 2'V8681'V@008681'V@00C C B B 5,'V8681'V@00!,B 8681'V@00!!'VB !'V'V!8681|wn[ 'V``!8681|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\tV`/'V 4  4 3 'VF3+'Vp\'V 5 ,C)w 5 'V `<'Vp6 E@x)G1C)G1p6 E@x)G1C)G0p6 E@x)G1C)GP'VpS'V5 'V 7 _? 7  A  `\'V@\'V 7122x)G@x)G1C)G1 7122x)G@x)G1C)G0 7122x)G@x)G1C)GW'V 'VP'V 7 'V9 S9  `'V`S'V 98 9 3 98 9 2 98 9 "'V L'V9 9 Y='V8 'V p8 pC  9 H> 7 G9[7*L9 : 'V 8*G8 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : `^'V 3 G9[7*L9 : 'V 4 G9[7*L9 : &'V 5 G9[7*L9 : p'V 6 G9[7*L9 : 'V 7 G9[7*L9 : B'V 8 G9[7*L9 : 'V 9 G9[7*L9 : 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA "A @ _'VA B "A 2'V8712'V@008712'V@00C C B B 5,'V8712'V@00",B 8712'V@00""'VB "'V'V"8712|wn[ 'V``"8712|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\tV  f'V"?"?@%?V2'V5  4  4 3 f'VF3+'V+'V 5 ,C)5 p'V `'Vp6 E@x)G1C)G7p6 E@x)G1C)G7p6 E@x)G1C)Gy'V&'V5 'V 7 _v 7  A  ` y'V*'V 7444x)G@x)G1C)G0 7444x)G@x)G1C)G9 744|'VP̏'V'V 7  7 _'Vp'VP̏'V 7 'V9 ?9  `|'V@&'V 98 9 3 98 9 2 98 9 p'V L'V9 9 Y='V8 'V p8 pC  9 H> 5 G9[7*L9 : 0'V 8*G6 G9[7*L9 :  `'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : Ђ'V 2 G9[7*L9 : 0|'V 3 G9[7*L9 : 'V 4 G9[7*L9 : 'V 5 G9[7*L9 : 'V 6 G9[7*L9 :  'V 7 G9[7*L9 : r'V 8 G9[7*L9 : 'V 9 G9[7*L9 : *'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA ("A @ _'VA B ("A 2'V8744'V@008744'V@00C C B B 5,'V8744'V@00(",B 8744'V@00("("'VB ("'V'V("8744|wn[ 'V``("8744|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 8 G9[7*L9 : b'V 8*G9 G9[7*L9 :  @E'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : `<'V 2 G9[7*L9 : 'V 3 G9[7*L9 : 'V 4 G9[7*L9 : `'V 5 G9[7*L9 : {'V 6 G9[7*L9 : `'V 7 G9[7*L9 : 'V 8 G9[7*L9 : *'V 9 G9[7*L9 : 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA G"A @ _'VA B G"A 2'V8775'V@008775'V@00C C B B 5,'V8775'V@00G",B 8775'V@00G"G"'VB G"'V'VG"8775|wn[ 'V``G"8775|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t  A C 'V 0;'V 8 'V p8 pC  9 H> 9  A 9[7*L9 : @-'V 8*G9 G9[7*L9 :  @-'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : y'V 2 G9[7*L9 : 'V 3 G9[7*L9 :  'V 4 G9[7*L9 : `'V 5 G9[7*L9 : 0'V 6 G9[7*L9 : 'V 7 G9[7*L9 : 'V 8 G9[7*L9 : 9 G9[7*L9 : @-'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA g"A @ _'VA B g"A 2'V8807'V@008807'V@00C C B B 5,'V8807'V@00g",B 8807'V@00g"g"'VB g"'V'Vg"8807|wn[ 'V``g"8807|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 0 G9[7*L9 : 8*G1 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : 'V 3 G9[7*L9 : @'V 4 G9[7*L9 : 'V 5 G9[7*L9 : p 'V 6 G9[7*L9 :  'V 7 G9[7*L9 : @'V 8 G9[7*L9 : 0U'V 9 G9[7*L9 : z'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA "A @ _'VA B "A 2'V8838'V@008838'V@00C C B B 5,'V8838'V@00",B 8838'V@00""'VB "'V'V"8838|wn[ 'V``"8838|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 7 G9[7*L9 : P'V 8*G8 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 :  C'V 2 G9[7*L9 : 'V 3 G9[7*L9 : 'V 4 G9[7*L9 : @'V 5 G9[7*L9 : 6'V 6 G9[7*L9 : P#'V 7 G9[7*L9 : P'V 8 G9[7*L9 : 'V 9 G9[7*L9 :  'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA "A @ _'VA B "A 2'V8868'V@008868'V@00C C B B 5,'V8868'V@00",B 8868'V@00""'VB "'V'V"8868|wn[ 'V``"8868|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 7 G9[7*L9 : 'V 8*G8 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : z'V 2 G9[7*L9 : 'V 3 G9[7*L9 : @'V 4 G9[7*L9 : О'V 5 G9[7*L9 : ,'V 6 G9[7*L9 : 'V 7 G9[7*L9 : 'V 8 G9[7*L9 : q'V 9 G9[7*L9 : 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA "A @ _'VA B "A 2'V8898'V@008898'V@00C C B B 5,'V8898'V@00",B 8898'V@00""'VB "'V'V"8898|wn[ 'V``"8898|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 3 G9[7*L9 : py'V 8*G4 G9[7*L9 :  f'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : ` 'V 3 G9[7*L9 : Г'V 4 G9[7*L9 : `'V 5 G9[7*L9 : l'V 6 G9[7*L9 : 'V 7 G9[7*L9 : 'V 8 G9[7*L9 : 'V 9 G9[7*L9 : `'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA "A @ _'VA B "A 2'V8928'V@008928'V@00C C B B 5,'V8928'V@00",B 8928'V@00""'VB "'V'V"8928|wn[ 'V``"8928|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 0 G9[7*L9 : 8*G1 G9[7*L9 :  {'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : p'V 2 G9[7*L9 : `'V 3 G9[7*L9 : 0'V 4 G9[7*L9 : A'V 5 G9[7*L9 : P.'V 6 G9[7*L9 : p'V 7 G9[7*L9 : 'V 8 G9[7*L9 : G'V 9 G9[7*L9 : ]'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA "A @ _'VA B "A 2'V8957'V@008957'V@00C C B B 5,'V8957'V@00",B 8957'V@00""'VB "'V'V"8957|wn[ 'V``"8957|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 6 G9[7*L9 : 'V 8*G7 G9[7*L9 :  @'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : P?'V 2 G9[7*L9 : 'V 3 G9[7*L9 :  'V 4 G9[7*L9 : z'V 5 G9[7*L9 : @'V 6 G9[7*L9 : Э'V 7 G9[7*L9 : @'V 8 G9[7*L9 : .'V 9 G9[7*L9 : Q'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA #A @ _'VA B #A 2'V8985'V@008985'V@00C C B B 5,'V8985'V@00#,B 8985'V@00##'VB #'V'V#8985|wn[ 'V``#8985|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 7 G9[7*L9 : <'V 8*G8 G9[7*L9 :  @)'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : ;'V 3 G9[7*L9 : `('V 4 G9[7*L9 : 'V 5 G9[7*L9 : 'V 6 G9[7*L9 :  }'V 7 G9[7*L9 : i'V 8 G9[7*L9 : @V'V 9 G9[7*L9 : 4'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA 6#A @ _'VA B 6#A 2'V9014'V@009014'V@00C C B B 5,'V9014'V@006#,B 9014'V@006#6#'VB 6#'V'V6#9014|wn[ 'V``6#9014|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 5 G9[7*L9 : 7'V 8*G6 G9[7*L9 :  `$'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : q'V 3 G9[7*L9 : @^'V 4 G9[7*L9 : ~'V 5 G9[7*L9 : j'V 6 G9[7*L9 : `'V 7 G9[7*L9 : 'V 8 G9[7*L9 : 'V 9 G9[7*L9 : 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA U#A @ _'VA B U#A 2'V9045'V@009045'V@00C C B B 5,'V9045'V@00U#,B 9045'V@00U#U#'VB U#'V'VU#9045|wn[ 'V``U#9045|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 2 G9[7*L9 : `d'V 8*G3 G9[7*L9 :  P'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : p'V 2 G9[7*L9 : 'V 3 G9[7*L9 : P'V 4 G9[7*L9 : ='V 5 G9[7*L9 : *'V 6 G9[7*L9 : 'V 7 G9[7*L9 : 'V 8 G9[7*L9 : 0'V 9 G9[7*L9 : 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA t#A @ _'VA B t#A 2'V9076'V@009076'V@00C C B B 5,'V9076'V@00t#,B 9076'V@00t#t#'VB t#'V'Vt#9076|wn[ 'V``t#9076|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 4 G9[7*L9 : 0N'V 8*G5 G9[7*L9 :  :'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : Б'V 3 G9[7*L9 : `~'V 4 G9[7*L9 : j'V 5 G9[7*L9 : 'V 6 G9[7*L9 :  'V 7 G9[7*L9 : 'V 8 G9[7*L9 : @'V 9 G9[7*L9 : И'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA #A @ _'VA B #A 2'V9106'V@009106'V@00C C B B 5,'V9106'V@00#,B 9106'V@00##'VB #'V'V#9106|wn[ 'V``#9106|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 7 G9[7*L9 : >'V 8*G8 G9[7*L9 :  @+'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : 7'V 3 G9[7*L9 : 'V 4 G9[7*L9 : u'V 5 G9[7*L9 : b'V 6 G9[7*L9 : @'V 7 G9[7*L9 : 'V 8 G9[7*L9 : `'V 9 G9[7*L9 : S 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA #A @ _'VA B #A 2'V9136'V@009136'V@00C C B B 5,'V9136'V@00#,B 9136'V@00##'VB #'V'V#9136|wn[ 'V``#9136|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 6 G9[7*L9 :  'V 8*G7 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : `X 'V 2 G9[7*L9 : p]'V 3 G9[7*L9 : J'V 4 G9[7*L9 : 'V 5 G9[7*L9 : P'V 6 G9[7*L9 : 'V 7 G9[7*L9 : 0'V 8 G9[7*L9 : 0'V 9 G9[7*L9 : { 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA #A @ _'VA B #A 2'V9166'V@009166'V@00C C B B 5,'V9166'V@00#,B 9166'V@00##'VB #'V'V#9166|wn[ 'V``#9166|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 2 G9[7*L9 : 'V 8*G3 G9[7*L9 :  0 'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : PH'V 2 G9[7*L9 : 'V 3 G9[7*L9 :  'V 4 G9[7*L9 : 'V 5 G9[7*L9 : |'V 6 G9[7*L9 : h'V 7 G9[7*L9 : D'V 8 G9[7*L9 : 1'V 9 G9[7*L9 : PW'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA #A @ _'VA B #A 2'V9196'V@009196'V@00C C B B 5,'V9196'V@00#,B 9196'V@00##'VB #'V'V#9196|wn[ 'V``#9196|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t'V 8 'V p8 pC  9 H> 9 G9[7*L9 :  P'V 8*G9 G9[7*L9 :  P'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : s 'V 2 G9[7*L9 : 0#'V 3 G9[7*L9 : 'V 4 G9[7*L9 : 'V 5 G9[7*L9 : 'V 6 G9[7*L9 : 0u'V 7 G9[7*L9 : 0'V 8 G9[7*L9 : 'V 9 G9[7*L9 :  'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA  $A @ _'VA B  $A 2'V9225'V@009225'V@00C C B B 5,'V9225'V@00 $,B 9225'V@00 $ $'VB  $'V'V $9225|wn[ 'V`` $9225|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'V'V p ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t9  `'V@'V 8 N'V2 8 N'V1 8 N'Vp'V  'V9 9 Y='V8  'V p8 pC  9 H> 5 G9[7*L9 : j'V 8*G6 G9[7*L9 :  0W'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 :  'V 2 G9[7*L9 : `3'V 3 G9[7*L9 : 'V 4 G9[7*L9 : 'V 5 G9[7*L9 : @'V 6 G9[7*L9 : к'V 7 G9[7*L9 : 'V 8 G9[7*L9 : 'V 9 G9[7*L9 :  'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA '$A @ _'VA B '$A 2'V9255'V@009255'V@00C C B B 5,'V9255'V@00'$,B 9255'V@00'$'$'VB '$'V'V'$9255|wn[ 'V``'$9255|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 2 G9[7*L9 : U'V 8*G3 G9[7*L9 :  0'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 :  'V 2 G9[7*L9 : N'V 3 G9[7*L9 : 0'V 4 G9[7*L9 : 'V 5 G9[7*L9 : @'V 6 G9[7*L9 : 0s'V 7 G9[7*L9 : _'V 8 G9[7*L9 : 'V 9 G9[7*L9 :  'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA E$A @ _'VA B E$A 2'V9285'V@009285'V@00C C B B 5,'V9285'V@00E$,B 9285'V@00E$E$'VB E$'V'VE$9285|wn[ 'V``E$9285|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 5 G9[7*L9 : ^'V 8*G6 G9[7*L9 :  @K'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 02'V 2 G9[7*L9 : |'V 3 G9[7*L9 : @i'V 4 G9[7*L9 : 'V 5 G9[7*L9 : p'V 6 G9[7*L9 : 'V 7 G9[7*L9 : 0'V 8 G9[7*L9 : 'V 9 G9[7*L9 : 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA b$A @ _'VA B b$A 2'V9314'V@009314'V@00C C B B 5,'V9314'V@00b$,B 9314'V@00b$b$'VB b$'V'Vb$9314|wn[ 'V``b$9314|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 0 G9[7*L9 : 8*G1 G9[7*L9 :  C 'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : p'V 2 G9[7*L9 : Pu'V 3 G9[7*L9 : a'V 4 G9[7*L9 : p<'V 5 G9[7*L9 : )'V 6 G9[7*L9 : *'V 7 G9[7*L9 : 'V 8 G9[7*L9 : 'V 9 G9[7*L9 : pL 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA $A @ _'VA B $A 2'V9344'V@009344'V@00C C B B 5,'V9344'V@00$,B 9344'V@00$$'VB $'V'V$9344|wn[ 'V``$9344|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 2 G9[7*L9 : <'V 8*G3 G9[7*L9 :  )'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : 'V 3 G9[7*L9 : 'V 4 G9[7*L9 : 0'V 5 G9[7*L9 : ;'V 6 G9[7*L9 : ('V 7 G9[7*L9 : pA'V 8 G9[7*L9 : .'V 9 G9[7*L9 : p 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA $A @ _'VA B $A 2'V9373'V@009373'V@00C C B B 5,'V9373'V@00$,B 9373'V@00$$'VB $'V'V$9373|wn[ 'V``$9373|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 1 G9[7*L9 :  'V 8*G2 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : `t 'V 2 G9[7*L9 : 'V 3 G9[7*L9 : 'V 4 G9[7*L9 : 'V 5 G9[7*L9 : R'V 6 G9[7*L9 : p?'V 7 G9[7*L9 : , 'V 8 G9[7*L9 : 0f'V 9 G9[7*L9 : R'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA $A @ _'VA B $A 2'V9402'V@009402'V@00C C B B 5,'V9402'V@00$,B 9402'V@00$$'VB $'V'V$9402|wn[ 'V``$9402|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 0 G9[7*L9 : 8*G1 G9[7*L9 :  0 'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : 'V 3 G9[7*L9 : 'V 4 G9[7*L9 : 'V 5 G9[7*L9 : 'V 6 G9[7*L9 : @)'V 7 G9[7*L9 :  'V 8 G9[7*L9 : `'V 9 G9[7*L9 :  'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA $A @ _'VA B $A 2'V9431'V@009431'V@00C C B B 5,'V9431'V@00$,B 9431'V@00$$'VB $'V'V$9431|wn[ 'V``$9431|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t  A C 'V 0;'V 8 'V p8 pC  9 H> 9  A 9[7*L9 :  'V 8*G9 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 :  'V 2 G9[7*L9 : `'V 3 G9[7*L9 : `B'V 4 G9[7*L9 : .'V 5 G9[7*L9 : 'V 6 G9[7*L9 : 'V 7 G9[7*L9 : Q'V 8 G9[7*L9 : `>'V 9 G9[7*L9 :  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA $A @ _'VA B $A 2'V9460'V@009460'V@00C C B B 5,'V9460'V@00$,B 9460'V@00$$'VB $'V'V$9460|wn[ 'V``$9460|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 6 G9[7*L9 : p'V 8*G7 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : pj'V 3 G9[7*L9 : 'V 4 G9[7*L9 : 'V 5 G9[7*L9 : 'V 6 G9[7*L9 : !'V 7 G9[7*L9 : P 'V 8 G9[7*L9 : 'V 9 G9[7*L9 :  'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA %A @ _'VA B %A 2'V9488'V@009488'V@00C C B B 5,'V9488'V@00%,B 9488'V@00%%'VB %'V'V%9488|wn[ 'V``%9488|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 0 G9[7*L9 : 8*G1 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : p 'V 2 G9[7*L9 : @'V 3 G9[7*L9 : 'V 4 G9[7*L9 : 0'V 5 G9[7*L9 : 'V 6 G9[7*L9 : ]'V 7 G9[7*L9 : 0J'V 8 G9[7*L9 : 'V 9 G9[7*L9 :  'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA -%A @ _'VA B -%A 2'V9517'V@009517'V@00C C B B 5,'V9517'V@00-%,B 9517'V@00-%-%'VB -%'V'V-%9517|wn[ 'V``-%9517|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 5 G9[7*L9 :  'V 8*G6 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : P'V 2 G9[7*L9 : 'V 3 G9[7*L9 : 'V 4 G9[7*L9 : 'V 5 G9[7*L9 : h'V 6 G9[7*L9 : `U'V 7 G9[7*L9 : 'V 8 G9[7*L9 :  'V 9 G9[7*L9 :  'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA I%A @ _'VA B I%A 2'V9545'V@009545'V@00C C B B 5,'V9545'V@00I%,B 9545'V@00I%I%'VB I%'V'VI%9545|wn[ 'V``I%9545|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 4 G9[7*L9 : w'V 8*G5 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 :  'V 2 G9[7*L9 : 'V 3 G9[7*L9 : @'V 4 G9[7*L9 : 6'V 5 G9[7*L9 : "'V 6 G9[7*L9 :  'V 7 G9[7*L9 : 'V 8 G9[7*L9 : 'V 9 G9[7*L9 :  'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA f%A @ _'VA B f%A 2'V9574'V@009574'V@00C C B B 5,'V9574'V@00f%,B 9574'V@00f%f%'VB f%'V'Vf%9574|wn[ 'V``f%9574|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 2 G9[7*L9 : `'V 8*G3 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : p_'V 3 G9[7*L9 : L'V 4 G9[7*L9 :  'V 5 G9[7*L9 : 'V 6 G9[7*L9 : p'V 7 G9[7*L9 : p'V 8 G9[7*L9 : @'V 9 G9[7*L9 : k'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA %A @ _'VA B %A 2'V9603'V@009603'V@00C C B B 5,'V9603'V@00%,B 9603'V@00%%'VB %'V'V%9603|wn[ 'V``%9603|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 3 G9[7*L9 : P'V 8*G4 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : 'V 3 G9[7*L9 : P'V 4 G9[7*L9 : 'V 5 G9[7*L9 : 'V 6 G9[7*L9 : 'V 7 G9[7*L9 : ?'V 8 G9[7*L9 : ,'V 9 G9[7*L9 : 1 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA %A @ _'VA B %A 2'V9632'V@009632'V@00C C B B 5,'V9632'V@00%,B 9632'V@00%%'VB %'V'V%9632|wn[ 'V``%9632|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 1 G9[7*L9 : ph 'V 8*G2 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : 'V 3 G9[7*L9 : 'V 4 G9[7*L9 : 'V 5 G9[7*L9 : P'V 6 G9[7*L9 : 'V 7 G9[7*L9 : z'V 8 G9[7*L9 : 'V 9 G9[7*L9 : 0z 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA %A @ _'VA B %A 2'V9661'V@009661'V@00C C B B 5,'V9661'V@00%,B 9661'V@00%%'VB %'V'V%9661|wn[ 'V``%9661|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t = b'V C H> d'V C 9 >'V 8 'V p8 pC  9 H> 9 G9[7*L9 : 7'V 8*G9 G9[7*L9 :  7'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : P'V 3 G9[7*L9 : 'V 4 G9[7*L9 : p'V 5 G9[7*L9 : 'V 6 G9[7*L9 : H'V 7 G9[7*L9 : 05'V 8 G9[7*L9 : !'V 9 G9[7*L9 : P 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA %A @ _'VA B %A 2'V9689'V@009689'V@00C C B B 5,'V9689'V@00%,B 9689'V@00%%'VB %'V'V%9689|wn[ 'V``%9689|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'V'V p ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 4 G9[7*L9 : p'V 8*G5 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : p'V 2 G9[7*L9 : 'V 3 G9[7*L9 : ?'V 4 G9[7*L9 : 0,'V 5 G9[7*L9 : 0'V 6 G9[7*L9 : 'V 7 G9[7*L9 : Ps'V 8 G9[7*L9 : _'V 9 G9[7*L9 :  'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA %A @ _'VA B %A 2'V9718'V@009718'V@00C C B B 5,'V9718'V@00%,B 9718'V@00%%'VB %'V'V%9718|wn[ 'V``%9718|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t'V 8 'V p8 pC  9 H> 9 G9[7*L9 : P['V 8*G9 G9[7*L9 :  P['V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : @ 'V 3 G9[7*L9 : 'V 4 G9[7*L9 : ` 'V 5 G9[7*L9 : D'V 6 G9[7*L9 : `1'V 7 G9[7*L9 : 0'V 8 G9[7*L9 : 'V 9 G9[7*L9 : b 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA &A @ _'VA B &A 2'V9746'V@009746'V@00C C B B 5,'V9746'V@00&,B 9746'V@00&&'VB &'V'V&9746|wn[ 'V``&9746|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'V'V p ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 3 G9[7*L9 : 'V 8*G4 G9[7*L9 :  p'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 :  'V 2 G9[7*L9 : P'V 3 G9[7*L9 : P'V 4 G9[7*L9 : 'V 5 G9[7*L9 : 'V 6 G9[7*L9 : w'V 7 G9[7*L9 : 'V 8 G9[7*L9 : 0'V 9 G9[7*L9 : 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA /&A @ _'VA B /&A 2'V9775'V@009775'V@00C C B B 5,'V9775'V@00/&,B 9775'V@00/&/&'VB /&'V'V/&9775|wn[ 'V``/&9775|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 6 G9[7*L9 : 'V 8*G7 G9[7*L9 :  @'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : ['V 2 G9[7*L9 : 0H'V 3 G9[7*L9 : `S'V 4 G9[7*L9 : $'V 5 G9[7*L9 : p'V 6 G9[7*L9 : 'V 7 G9[7*L9 : 'V 8 G9[7*L9 : 0'V 9 G9[7*L9 : 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA K&A @ _'VA B K&A 2'V9803'V@009803'V@00C C B B 5,'V9803'V@00K&,B 9803'V@00K&K&'VB K&'V'VK&9803|wn[ 'V``K&9803|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 8 G9[7*L9 : 'V 8*G9 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : 'V 3 G9[7*L9 : 'V 4 G9[7*L9 : 0'V 5 G9[7*L9 : 'V 6 G9[7*L9 : P'V 7 G9[7*L9 : @'V 8 G9[7*L9 : Щ'V 9 G9[7*L9 : 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA g&A @ _'VA B g&A 2'V9831'V@009831'V@00C C B B 5,'V9831'V@00g&,B 9831'V@00g&g&'VB g&'V'Vg&9831|wn[ 'V``g&9831|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 4 G9[7*L9 : @&'V 8*G5 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : P'V 3 G9[7*L9 : n'V 4 G9[7*L9 :  'V 5 G9[7*L9 : P'V 6 G9[7*L9 : 'V 7 G9[7*L9 : 'V 8 G9[7*L9 : 'V 9 G9[7*L9 : 0'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA &A @ _'VA B &A 2'V9859'V@009859'V@00C C B B 5,'V9859'V@00&,B 9859'V@00&&'VB &'V'V&9859|wn[ 'V``&9859|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t9  `|'V)'V 8 N'V2 8 N'V1 8 N'V'V L'V9 9 Y='V8 'V p8 pC  9 H> 5 G9[7*L9 : 'V 8*G6 G9[7*L9 :  'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : p'V 2 G9[7*L9 : 0H'V 3 G9[7*L9 : 4'V 4 G9[7*L9 : @T'V 5 G9[7*L9 : @'V 6 G9[7*L9 : 'V 7 G9[7*L9 :  'V 8 G9[7*L9 : @'V 9 G9[7*L9 :  0 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA &A @ _'VA B &A 2'V9886'V@009886'V@00C C B B 5,'V9886'V@00&,B 9886'V@00&&'VB &'V'V&9886|wn[ 'V``&9886|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\tWV  `"?"?'V#'V[heap]"?"?2?WV  'V"?"?BWV^* 4 'V,4 1 4 3 'V3+'Vp'V 5 ,C)5  'V `'V1p0Ex)G@x)G1C)G0p0Ex)G@x)G1C)G0p0Ex)G@x)G1C)G'Vj'V5 'V 7  7 3 `̍'V'V 9133x)G@x)G1C)G4 9133x)G@x)G1C)G3 9133x)G@x)G1C)G|'V 'VLf'V 7 'V9 29  `'VPj'V 8 N'V0 8 N'V9 $< 0(< 9 < _'V0L'V9 9 Y='V8 'V p8 pC  9 H> 4 G9[7*L9 : Py'V 8*G5 G9[7*L9 :  e'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 :  'V 2 G9[7*L9 : 'V 3 G9[7*L9 : p'V 4 G9[7*L9 : 'V 5 G9[7*L9 : 'V 6 G9[7*L9 :  t'V 7 G9[7*L9 : 'V 8 G9[7*L9 : 'V 9 G9[7*L9 : `Z'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA &A @ _'VA B &A 2'V9913'V@009913'V@00C C B B 5,'V9913'V@00&,B 9913'V@00&&'VB &'V'V&9913|wn[ 'V``&9913|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 3 G9[7*L9 : {'V 8*G4 G9[7*L9 :  g'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : @'V 3 G9[7*L9 : 'V 4 G9[7*L9 :  'V 5 G9[7*L9 : `'V 6 G9[7*L9 : 'V 7 G9[7*L9 : 'V 8 G9[7*L9 : 'V 9 G9[7*L9 : 'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA &A @ _'VA B &A 2'V9939'V@009939'V@00C C B B 5,'V9939'V@00&,B 9939'V@00&&'VB &'V'V&9939|wn[ 'V``&9939|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t'V 8 'V p8 pC  9 H> 9 G9[7*L9 : ` 'V 8*G9 G9[7*L9 :  ` 'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : T'V 3 G9[7*L9 : PA'V 4 G9[7*L9 : -'V 5 G9[7*L9 : p'V 6 G9[7*L9 : 'V 7 G9[7*L9 : 'V 8 G9[7*L9 :  'V 9 G9[7*L9 : -'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA &A @ _'VA B &A 2'V9966'V@009966'V@00C C B B 5,'V9966'V@00&,B 9966'V@00&&'VB &'V'V&9966|wn[ 'V``&9966|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'V'V p ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 1 G9[7*L9 : 'V 8*G2 G9[7*L9 :  M'V G9[7*L9 :  0 G9[7*L9 : 1 G9[7*L9 : 'V 2 G9[7*L9 : #'V 3 G9[7*L9 : 'V 4 G9[7*L9 : 'V 5 G9[7*L9 : 'V 6 G9[7*L9 : 0'V 7 G9[7*L9 : 'V 8 G9[7*L9 : P'V 9 G9[7*L9 : ;'V  GP? G@? 8W*GxW*G> (|W*G? HW*GxW*G7*G@ HW*G@ xW*GB ;)GS8*@? P? (|W*GS8*Gi:)GxW*GO:)G0C jy8*GC x)Gs'V0'V`W*GW*GD S8*GA  'A @ _'VA B  'A 2'V9994'V@009994'V@00C C B B 5,'V9994'V@00 ',B 9994'V@00 ' ''VB  ''V'V '9994|wn[ 'V`` '9994|wn[ 'V``'V@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'Vp ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t > 6 Hx'VF3+ 'VP)G6 `U)G'V'V?  'V'V> = 4x'V'V'V= < 4x'V'V8 'V'V< ; v'V'V8 'V'V; : v'V'V8 'V'V: 9 v'V'V8 'Vڢ'V 9 8 v'V'V8 8'V@'V 'V`9 9 o'V'VT'V'VP9 9 P9 9 'V`9 }'V; 8 'V : 9 9 'V8 P9 `9 'VP9 }'V}'Vd'V9 'VX: 'Vڢ'VP: : Mz'V <  'V: 'V9 9 'V : 'VX: 'V'Vи'Vx'V; DU'Vи'V: @; ; 'VP; }'V= : 'V < ; ; 'V: @; P; 'V@; }'V}'Vd'V; 'VH< 'Vڢ'V@< < Mz'V >  'V< 'V; ; 'V < ('VH< ('V0'V'Vx'V= DU'V'V< 0= = 'V@= }'V? < 'V > = = 'V< 0= @= 'V0= }'V}'Vd'V= 'V8> ;'Vڢ'V0> > Mz'V @  'V> 'V= = 'V > ;'V8> ;'V;'V;'Vx'V? DU'V;'V>  ? ? 'V0? }'V@ > 'V @ ? ? 'V>  ? 0? 'V ? }'V}'Vd'V? ;'V(@ D ڢ'V @ h@ Mz'V'Vjy8*G 'V@ 0'V? ? 'V @ D (@ D @'VC x'V ݢ'V]'VC h@ A 8'Vߊ'V@ 0'V A 'V'VB 'ޅ'V'V@ C 8'Vܢ'VB pA B ''V'V0< A 8'Vܢ'VB 0'V8'Vܢ'VB 'V'B ''V'V'8'Vܢ'VB n[ 'V``'C ]'V@C @â'V|wn[ 'V`` @ X^?@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'V;'V p ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t ')'V'V'V'V? Ǖ'V'V0'V)'V@ 0'V)'V@ ? Ǖ'V0'V)'V@ ? 4x'V'V)'V? > 4x'V'V)'V> = 4x'V'V)'V= < 4x'V'V)'V< ; 4x'V'V)'V; : 4x'V'V)'V: 9 4x'V'V)'V9 8 4x'V'V)'V8 7 4x'V'Vh8 A'Vڢ'V`8 8 nz'V : 'V8 'V7 7 'V 8 A'Vh8 A'V A'VA'Vx'V9 $U'VA'V8 P9 9 'V`9 }'V; 8 'V : 9 9 'V8 P9 `9 'VP9 }'V}'Vd'V9 @'VX: 'Vڢ'VP: : Mz'V <  'V: 'V9 9 'V : ('VX: ('V0'V'Vx'V; DU'V'V: @; ; 'VP; }'V= : 'V < ; ; 'V: @; P; 'V@; }'V}'VPd'V; 'VH< 'Vڢ'V@< < Mz'V >  'V< 'V; ; 'V < 'VH< 'V'V'Vx'V= DU'V'V< 0= = 'V@= }'V? < 'V > = = 'V< 0= @= 'V0= }'V}'Vd'V= 'V8> ;'Vڢ'V0> > Mz'V @  'V> 'V= = 'V > ;'V8> ;'V;'V;'Vx'V? DU'V;'V>  ? ? 'V0? }'V@ > 'V @ ? ? 'V>  ? 0? 'V ? }'V}'Vd'V? ;'V(@ D ڢ'V @ h@ Mz'V'Vjy8*G 'V@ 0'V? ? 'V @ D (@ D @'VC x'V ݢ'V]'VC h@ A 8'Vߊ'V@ 0'V A 'V'VB 'ޅ'V'V@ C 8'Vܢ'VB pA B ''V'V0< A 8'Vܢ'VB 0'V8'Vܢ'VB 'V'B ''V'V'8'Vܢ'VB n[ 'V``'C ]'V@C @â'V|wn[ 'V`` @ X^?@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'V;'V p ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 4x'V'V)'V> = 4x'V'V)'V= < 4x'V'V)'V< ; 4x'V'V)'V; : 4x'V'V)'V: 9 4x'V'V)'V9 8 4x'V'V)'V8 7 4x'V'V7 7 'Vx7 8 {'V'Voۢ'V8 7 4x'V'V7 'V7 |'V'V7 `8 'n'V|'V7 'Vh8 ڢ'VMz'V : 'V8 'V7 7 'V 8 x'Vh8 x'V'V`'Vx'V9 $U'Vx'V8 P9 9 'V`9 }'V; 8 'V : 9 9 'V8 P9 `9 'VP9 }'V}'V0d'V9 'VX: 'Vڢ'VP: : Mz'V <  'V: 'V9 9 'V : ح'VX: ح'V'V'Vx'V; DU'V'V: @; ; 'VP; }'V= : 'V < ; ; 'V: @; P; 'V@; }'V}'Vd'V; p'VH< 'Vڢ'V@< < Mz'V >  'V< 'V; ; 'V < X'VH< X'V`'V@'Vx'V= DU'V@'V< 0= = 'V@= }'V? < 'V > = = 'V< 0= @= 'V0= }'V}'VPd'V= 'V8> ;'Vڢ'V0> > Mz'V @  'V> 'V= = 'V > ;'V8> ;'V;'V;'Vx'V? DU'V;'V>  ? ? 'V0? }'V@ > 'V @ ? ? 'V>  ? 0? 'V ? }'V}'Vd'V? ;'V(@ D ڢ'V @ h@ Mz'V'Vjy8*G 'V@ 0'V? ? 'V @ D (@ D @'VC x'V ݢ'V]'VC h@ A 8'Vߊ'V@ 0'V A 'V'VB 'ޅ'V'V@ C 8'Vܢ'VB pA B ''V'V0< A 8'Vܢ'VB 0'V8'Vܢ'VB 'V'B ''V'V'8'Vܢ'VB n[ 'V``'C ]'V@C @â'V|wn[ 'V`` @ X^?@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'V;'V p ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t ')'V'V'V'V? Ǖ'V'V0'V)'V@ 0'V)'V@ ? Ǖ'V0'V)'V@ ? 4x'V'V)'V? > 4x'V'V)'V> = 4x'V'V)'V= < 4x'V'V)'V< ; 4x'V'V)'V; : 4x'V'V)'V: 9 4x'V'V)'V9 8 4x'V'V)'V8 7 4x'V'Vh8 a'Vڢ'V`8 8 nz'V : 'V8 'V7 7 'V 8 a'Vh8 a'V a'Va'Vx'V9 $U'Va'V8 P9 9 'V`9 }'V; 8 'V : 9 9 'V8 P9 `9 'VP9 }'V}'VPd'V9 `'VX: E'Vڢ'VP: : Mz'V <  'V: 'V9 9 'V : E'VX: E'VE'VE'Vx'V; DU'VE'V: @; ; 'VP; }'V= : 'V < ; ; 'V: @; P; 'V@; }'V}'V0d'V; 0E'VH< >'Vڢ'V@< < Mz'V >  'V< 'V; ; 'V < >'VH< >'V?'V>'Vx'V= DU'V>'V< 0= = 'V@= }'V? < 'V > = = 'V< 0= @= 'V0= }'V}'V`d'V= >'V8> <'Vڢ'V0> > Mz'V @  'V> 'V= = 'V > X<'V8> X<'V`<'V@<'Vx'V? DU'V@<'V>  ? ? 'V0? }'V@ > 'V @ ? ? 'V>  ? 0? 'V ? }'V}'Vd'V? ;'V(@ D ڢ'V @ h@ Mz'V'Vjy8*G 'V@ 0'V? ? 'V @ D (@ D @'VC x'V ݢ'V]'VC h@ A 8'Vߊ'V@ 0'V A 'V'VB 'ޅ'V'V@ C 8'Vܢ'VB pA B ''V'V0< A 8'Vܢ'VB 0'V8'Vܢ'VB 'V'B ''V'V'8'Vܢ'VB n[ 'V``'C ]'V@C @â'V|wn[ 'V`` @ X^?@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'V;'V p ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t ')'V'V'V'V? Ǖ'V'V0'V)'V@ 0'V)'V@ ? Ǖ'V0'V)'V@ ? 4x'V'V)'V? > 4x'V'V)'V> = 4x'V'V)'V= < 4x'V'V)'V< ; 4x'V'V)'V; : 4x'V'V)'V: 9 4x'V'V)'V9 8 4x'V'V)'V8 7 4x'V'Vh8 'Vڢ'V`8 8 nz'V : 'V8 'V7 7 'V 8 X'Vh8 X'V`'V@'Vx'V9 $U'VX'V8 P9 9 'V`9 }'V; 8 'V : 9 9 'V8 P9 `9 'VP9 }'V}'Vd'V9 'VX: 'Vڢ'VP: : Mz'V <  'V: 'V9 9 'V : x'VX: x'V'V`'Vx'V; DU'V`'V: @; ; 'VP; }'V= : 'V < ; ; 'V: @; P; 'V@; }'V}'Vd'V; 'VH< @'Vڢ'V@< < Mz'V >  'V< 'V; ; 'V < H@'VH< H@'VP@'V0@'Vx'V= DU'V0@'V< 0= = 'V@= }'V? < 'V > = = 'V< 0= @= 'V0= }'V}'Vd'V= ?'V8> <'Vڢ'V0> > Mz'V @  'V> 'V= = 'V > X<'V8> X<'V`<'V@<'Vx'V? DU'V@<'V>  ? ? 'V0? }'V@ > 'V @ ? ? 'V>  ? 0? 'V ? }'V}'Vd'V? ;'V(@ D ڢ'V @ h@ Mz'V'Vjy8*G 'V@ 0'V? ? 'V @ D (@ D @'VC x'V ݢ'V]'VC h@ A 8'Vߊ'V@ 0'V A 'V'VB 'ޅ'V'V@ C 8'Vܢ'VB pA B ''V'V0< A 8'Vܢ'VB 0'V8'Vܢ'VB 'V'B ''V'V'8'Vܢ'VB n[ 'V``'C ]'V@C @â'V|wn[ 'V`` @ X^?@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'V;'V p ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 4x'V'V)'V> = 4x'V'V)'V= < 4x'V'V)'V< ; 4x'V'V)'V; : 4x'V'V)'V: 9 4x'V'V)'V9 8 4x'V'V)'V8 7 4x'V'V)'V7 6 4x'V'V6 6 'V6 6 }'V8 7 4x'V'V)'V7 6 4x'V'V6 6 6 'V6 }'V}'V'V4a'V6 |'V7 7 'Vx7 8 {'V(7 'V 7 'V7 'V6 p'V'V7 `8 U'Vp'V7 'Vh8 ڢ'VMz'V : 'V8 'V7 7 'V 8 آ'Vh8 آ'V'V'Vx'V9 U'Vp'V8 P9 9 'V`9 }'V; 8 'V : 9 9 'V8 P9 `9 'VP9 }'V}'Vd'V9 p'VX: 'Vڢ'VP: : Mz'V <  'V: 'V9 9 'V : 'VX: 'V'Vp'Vx'V; DU'Vp'V: @; ; 'VP; }'V= : 'V < ; ; 'V: @; P; 'V@; }'V}'Vd'V;  'VH< B'Vڢ'V@< < Mz'V >  'V< 'V; ; 'V < B'VH< B'VB'VA'Vx'V= DU'VA'V< 0= = 'V@= }'V? < 'V > = = 'V< 0= @= 'V0= }'V}'VPd'V= A'V8> <'Vڢ'V0> > Mz'V @  'V> 'V= = 'V > X<'V8> X<'V`<'V@<'Vx'V? DU'V@<'V>  ? ? 'V0? }'V@ > 'V @ ? ? 'V>  ? 0? 'V ? }'V}'Vd'V? ;'V(@ D ڢ'V @ h@ Mz'V'Vjy8*G 'V@ 0'V? ? 'V @ D (@ D @'VC x'V ݢ'V]'VC h@ A 8'Vߊ'V@ 0'V A 'V'VB 'ޅ'V'V@ C 8'Vܢ'VB pA B ''V'V0< A 8'Vܢ'VB 0'V8'Vܢ'VB 'V'B ''V'V'8'Vܢ'VB n[ 'V``'C ]'V@C @â'V|wn[ 'V`` @ X^?@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'V;'V p ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 4x'V'V)'V> = 4x'V'V)'V= < 4x'V'V)'V< ; 4x'V'V)'V; : 4x'V'V)'V: 9 4x'V'V)'V9 8 4x'V'V)'V8 7 4x'V'V)'V7 6 4x'V'V6 6 'V6 6 }'V8 7 4x'V'V)'V7 6 4x'V'V6 6 6 'V6 }'V}'V 'V4a'V6  'V7 7 'Vx7 8 {'V(7 'V 7  'V7 'V6  'V 'V7 `8 U'V 'V7 'Vh8 ڢ'VMz'V : 'V8 'V7 7 'V 8 h 'Vh8 h 'Vp 'VP 'Vx'V9 U'V 'V8 P9 9 'V`9 }'V; 8 'V : 9 9 'V8 P9 `9 'VP9 }'V}'V`d'V9  'VX:  'Vڢ'VP: : Mz'V <  'V: 'V9 9 'V :  'VX:  'V 'V 'Vx'V; DU'V 'V: @; ; 'VP; }'V= : 'V < ; ; 'V: @; P; 'V@; }'V}'V`d'V;  'VH<  'Vڢ'V@< < Mz'V >  'V< 'V; ; 'V <  'VH<  'V 'Vp 'Vx'V= DU'Vp 'V< 0= = 'V@= }'V? < 'V > = = 'V< 0= @= 'V0= }'V}'V`d'V=  'V8> ?'Vڢ'V0> > Mz'V @  'V> 'V= = 'V > h?'V8> h?'Vp?'VP?'Vx'V? DU'VP?'V>  ? ? 'V0? }'V@ > 'V @ ? ? 'V>  ? 0? 'V ? }'V}'Vpd'V? ?'V(@ D ڢ'V @ h@ Mz'V'Vjy8*G 'V@ 0'V? ? 'V @ D (@ D @'VC x'V ݢ'V]'VC h@ A 8'Vߊ'V@ 0'V A 'V'VB 'ޅ'V'V@ C 8'Vܢ'VB pA B ''V'V0< A 8'Vܢ'VB 0'V8'Vܢ'VB 'V'B ''V'V'8'Vܢ'VB n[ 'V``'C ]'V@C @â'V|wn[ 'V`` @ X^?@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'V;'V p ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 4x'V'V)'V> = 4x'V'V)'V= < 4x'V'V)'V< ; 4x'V'V)'V; : 4x'V'V)'V: 9 4x'V'V)'V9 8 4x'V'V)'V8 7 4x'V'V)'V7 6 4x'V'V6 6 'V6 6 }'V8 7 4x'V'V)'V7 6 4x'V'V6 6 6 'V6 }'V}'V 'V4a'V6  'V7 7 'Vx7 8 {'V(7 'V 7  'V7 'V6  'V 'V7 `8 U'V 'V7 'Vh8 ڢ'VMz'V : 'V8 'V7 7 'V 8 h 'Vh8 h 'Vp 'VP 'Vx'V9 U'V 'V8 P9 9 'V`9 }'V; 8 'V : 9 9 'V8 P9 `9 'VP9 }'V}'V`d'V9  'VX:  'Vڢ'VP: : Mz'V <  'V: 'V9 9 'V :  'VX:  'V 'V 'Vx'V; DU'V 'V: @; ; 'VP; }'V= : 'V < ; ; 'V: @; P; 'V@; }'V}'V`d'V;  'VH<  'Vڢ'V@< < Mz'V >  'V< 'V; ; 'V <  'VH<  'V 'Vp 'Vx'V= DU'Vp 'V< 0= = 'V@= }'V? < 'V > = = 'V< 0= @= 'V0= }'V}'V`d'V=  'V8> ?'Vڢ'V0> > Mz'V @  'V> 'V= = 'V > h?'V8> h?'Vp?'VP?'Vx'V? DU'VP?'V>  ? ? 'V0? }'V@ > 'V @ ? ? 'V>  ? 0? 'V ? }'V}'Vpd'V? ?'V(@ D ڢ'V @ h@ Mz'V'Vjy8*G 'V@ 0'V? ? 'V @ D (@ D @'VC x'V ݢ'V]'VC h@ A 8'Vߊ'V@ 0'V A 'V'VB 'ޅ'V'V@ C 8'Vܢ'VB pA B ''V'V0< A 8'Vܢ'VB 0'V8'Vܢ'VB 'V'B ''V'V'8'Vܢ'VB n[ 'V``'C ]'V@C @â'V|wn[ 'V`` @ X^?@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'V;'V p ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 4x'V'V)'V> = 4x'V'V)'V= < 4x'V'V)'V< ; 4x'V'V)'V; : 4x'V'V)'V: 9 4x'V'V)'V9 8 4x'V'V)'V8 7 4x'V'V)'V7 6 4x'V'V6 6 'V6 6 }'V8 7 4x'V'V)'V7 6 4x'V'V6 6 6 'V6 }'V}'V 'V4a'V6  'V7 7 'Vx7 8 {'V(7 'V 7  'V7 'V6  'V 'V7 `8 U'V 'V7 'Vh8 ڢ'VMz'V : 'V8 'V7 7 'V 8 h 'Vh8 h 'Vp 'VP 'Vx'V9 U'V 'V8 P9 9 'V`9 }'V; 8 'V : 9 9 'V8 P9 `9 'VP9 }'V}'V`d'V9  'VX:  'Vڢ'VP: : Mz'V <  'V: 'V9 9 'V :  'VX:  'V 'V 'Vx'V; DU'V 'V: @; ; 'VP; }'V= : 'V < ; ; 'V: @; P; 'V@; }'V}'V`d'V;  'VH<  'Vڢ'V@< < Mz'V >  'V< 'V; ; 'V <  'VH<  'V 'Vp 'Vx'V= DU'Vp 'V< 0= = 'V@= }'V? < 'V > = = 'V< 0= @= 'V0= }'V}'V`d'V=  'V8> ?'Vڢ'V0> > Mz'V @  'V> 'V= = 'V > h?'V8> h?'Vp?'VP?'Vx'V? DU'VP?'V>  ? ? 'V0? }'V@ > 'V @ ? ? 'V>  ? 0? 'V ? }'V}'Vpd'V? ?'V(@ D ڢ'V @ h@ Mz'V'Vjy8*G 'V@ 0'V? ? 'V @ D (@ D @'VC x'V ݢ'V]'VC h@ A 8'Vߊ'V@ 0'V A 'V'VB 'ޅ'V'V@ C 8'Vܢ'VB pA B ''V'V0< A 8'Vܢ'VB 0'V8'Vܢ'VB 'V'B ''V'V'8'Vܢ'VB n[ 'V``'C ]'V@C @â'V|wn[ 'V`` @ X^?@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'V;'V p ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 4x'V'V)'V> = 4x'V'V)'V= < 4x'V'V)'V< ; 4x'V'V)'V; : 4x'V'V)'V: 9 4x'V'V)'V9 8 4x'V'V)'V8 7 4x'V'V)'V7 6 4x'V'V6 6 'V6 6 }'V8 7 4x'V'V)'V7 6 4x'V'V6 6 6 'V6 }'V}'V 'V4a'V6  'V7 7 'Vx7 8 {'V(7 'V 7  'V7 'V6  'V 'V7 `8 U'V 'V7 'Vh8 ڢ'VMz'V : 'V8 'V7 7 'V 8 h 'Vh8 h 'Vp 'VP 'Vx'V9 U'V 'V8 P9 9 'V`9 }'V; 8 'V : 9 9 'V8 P9 `9 'VP9 }'V}'V`d'V9  'VX:  'Vڢ'VP: : Mz'V <  'V: 'V9 9 'V :  'VX:  'V 'V 'Vx'V; DU'V 'V: @; ; 'VP; }'V= : 'V < ; ; 'V: @; P; 'V@; }'V}'V`d'V;  'VH<  'Vڢ'V@< < Mz'V >  'V< 'V; ; 'V <  'VH<  'V 'Vp 'Vx'V= DU'Vp 'V< 0= = 'V@= }'V? < 'V > = = 'V< 0= @= 'V0= }'V}'V`d'V=  'V8> ?'Vڢ'V0> > Mz'V @  'V> 'V= = 'V > h?'V8> h?'Vp?'VP?'Vx'V? DU'VP?'V>  ? ? 'V0? }'V@ > 'V @ ? ? 'V>  ? 0? 'V ? }'V}'Vpd'V? ?'V(@ D ڢ'V @ h@ Mz'V'Vjy8*G 'V@ 0'V? ? 'V @ D (@ D @'VC x'V ݢ'V]'VC h@ A 8'Vߊ'V@ 0'V A 'V'VB 'ޅ'V'V@ C 8'Vܢ'VB pA B ''V'V0< A 8'Vܢ'VB 0'V8'Vܢ'VB 'V'B ''V'V'8'Vܢ'VB n[ 'V``'C ]'V@C @â'V|wn[ 'V`` @ X^?@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'V;'V p ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 4x'V'V)'V> = 4x'V'V)'V= < 4x'V'V)'V< ; 4x'V'V)'V; : 4x'V'V)'V: 9 4x'V'V)'V9 8 4x'V'V)'V8 7 4x'V'V)'V7 6 4x'V'V6 6 'V6 6 }'V8 7 4x'V'V)'V7 6 4x'V'V6 6 6 'V6 }'V}'V 'V4a'V6  'V7 7 'Vx7 8 {'V(7 'V 7  'V7 'V6  'V 'V7 `8 U'V 'V7 'Vh8 ڢ'VMz'V : 'V8 'V7 7 'V 8 h 'Vh8 h 'Vp 'VP 'Vx'V9 U'V 'V8 P9 9 'V`9 }'V; 8 'V : 9 9 'V8 P9 `9 'VP9 }'V}'V`d'V9  'VX:  'Vڢ'VP: : Mz'V <  'V: 'V9 9 'V :  'VX:  'V 'V 'Vx'V; DU'V 'V: @; ; 'VP; }'V= : 'V < ; ; 'V: @; P; 'V@; }'V}'V`d'V;  'VH<  'Vڢ'V@< < Mz'V >  'V< 'V; ; 'V <  'VH<  'V 'Vp 'Vx'V= DU'Vp 'V< 0= = 'V@= }'V? < 'V > = = 'V< 0= @= 'V0= }'V}'V`d'V=  'V8> ?'Vڢ'V0> > Mz'V @  'V> 'V= = 'V > h?'V8> h?'Vp?'VP?'Vx'V? DU'VP?'V>  ? ? 'V0? }'V@ > 'V @ ? ? 'V>  ? 0? 'V ? }'V}'Vpd'V? ?'V(@ D ڢ'V @ h@ Mz'V'Vjy8*G 'V@ 0'V? ? 'V @ D (@ D @'VC x'V ݢ'V]'VC h@ A 8'Vߊ'V@ 0'V A 'V'VB 'ޅ'V'V@ C 8'Vܢ'VB pA B ''V'V0< A 8'Vܢ'VB 0'V8'Vܢ'VB 'V'B ''V'V'8'Vܢ'VB n[ 'V``'C ]'V@C @â'V|wn[ 'V`` @ X^?@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'V;'V p ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t  'V< 'V; ; 'V <  'VH<  'V 'Vp 'Vx'V= DU'Vp 'V< 0= = 'V@= }'V? < 'V > = = 'V< 0= @= 'V0= }'V}'V`d'V=  'V8> ?'Vڢ'V0> > Mz'V @  'V> 'V= = 'V > h?'V8> h?'Vp?'VP?'Vx'V? DU'VP?'V>  ? ? 'V0? }'V@ > 'V @ ? ? 'V>  ? 0? 'V ? }'V}'Vpd'V? ?'V(@ D ڢ'V @ h@ Mz'V'Vjy8*G 'V@ 0'V? ? 'V @ D (@ D @'VC x'V ݢ'V]'VC h@ A 8'Vߊ'V@ 0'V A 'V'VB 'ޅ'V'V@ C 8'Vܢ'VB pA B ''V'V0< A 8'Vܢ'VB 0'V8'Vܢ'VB 'V'B ''V'V'8'Vܢ'VB n[ 'V``'C ]'V@C @â'V|wn[ 'V`` @ X^?@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'V;'V p ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 4x'V'V)'V> = 4x'V'V)'V= < 4x'V'V)'V< ; 4x'V'V)'V; : 4x'V'V)'V: 9 4x'V'VP9 9 A'V'V`9 9 }'V; : 4x'V'V)'V: 9 4x'V'V9 P9 `9 'VP9 }'V}'V`d'V9 PA'VX: 1'Vڢ'VP: : Mz'V <  'V: 'V9 9 'V : H1'VX: H1'VP1'V01'Vx'V; DU'V01'V: @; ; 'VP; }'V= : 'V < ; ; 'V: @; P; 'V@; }'V}'Vd'V; 0'VH< +'Vڢ'V@< < Mz'V >  'V< 'V; ; 'V < +'VH< +'V+'Vp+'Vx'V= DU'Vp+'V< 0= = 'V@= }'V? < 'V > = = 'V< 0= @= 'V0= }'V}'V`d'V=  +'V8> <'Vڢ'V0> > Mz'V @  'V> 'V= = 'V > <'V8> <'V<'V<'Vx'V? DU'V<'V>  ? ? 'V0? }'V@ > 'V @ ? ? 'V>  ? 0? 'V ? }'V}'Vd'V? `<'V(@ D ڢ'V @ h@ Mz'V'Vjy8*G 'V@ 0'V? ? 'V @ D (@ D @'VC x'V ݢ'V]'VC h@ A 8'Vߊ'V@ 0'V A 'V'VB 'ޅ'V'V@ C 8'Vܢ'VB pA B ''V'V0< A 8'Vܢ'VB 0'V8'Vܢ'VB 'V'B ''V'V'8'Vܢ'VB n[ 'V``'C ]'V@C @â'V|wn[ 'V`` @ X^?@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'V;'V p ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 4x'V'V'V)'V@ 0'V'V@ ? Ǖ'V0'V'V@ ? 4x'V'V'V? > 4x'V'V'V> = 4x'V'V'V= < 4x'V'V'V< ; 4x'V'V'V; : 4x'V'V'V: 9 4x'V'Vh8 'V)'V9 8 v'V'Vh8 'V'V'Vx'V9 z'Vh8 MU'V'V8 P9 9 'V`9 }'V; 8 'V : 9 9 'V8 P9 `9 'VP9 }'V}'V0d'V9 'VX: 'Vڢ'VP: : Mz'V <  'V: 'V9 9 'V : H'VX: H'VP'V0'Vx'V; DU'V0'V: @; ; 'VP; }'V= : 'V < ; ; 'V: @; P; 'V@; }'V}'Vd'V; 'VH< ,'Vڢ'V@< < Mz'V >  'V< 'V; ; 'V < ,'VH< ,'V,'V,'Vx'V= DU'V,'V< 0= = 'V@= }'V? < 'V > = = 'V< 0= @= 'V0= }'V}'Vd'V= p,'V8> <'Vڢ'V0> > Mz'V @  'V> 'V= = 'V > <'V8> <'V<'V<'Vx'V? DU'V<'V>  ? ? 'V0? }'V@ > 'V @ ? ? 'V>  ? 0? 'V ? }'V}'Vd'V? `<'V(@ D ڢ'V @ h@ Mz'V'Vjy8*G 'V@ 0'V? ? 'V @ D (@ D @'VC x'V ݢ'V]'VC h@ A 8'Vߊ'V@ 0'V A 'V'VB 'ޅ'V'V@ C 8'Vܢ'VB pA B ''V'V0< A 8'Vܢ'VB 0'V8'Vܢ'VB 'V'B ''V'V'8'Vܢ'VB n[ 'V``'C ]'V@C @â'V|wn[ 'V`` @ X^?@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'V;'V p ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t  'V< 'V; ; 'V < -'VH< -'V-'V-'Vx'V= DU'V-'V< 0= = 'V@= }'V? < 'V > = = 'V< 0= @= 'V0= }'V}'V0d'V= P-'V8> <'Vڢ'V0> > Mz'V @  'V> 'V= = 'V > <'V8> <'V<'V<'Vx'V? DU'V<'V>  ? ? 'V0? }'V@ > 'V @ ? ? 'V>  ? 0? 'V ? }'V}'Vd'V? `<'V(@ D ڢ'V @ h@ Mz'V'Vjy8*G 'V@ 0'V? ? 'V @ D (@ D @'VC x'V ݢ'V]'VC h@ A 8'Vߊ'V@ 0'V A 'V'VB 'ޅ'V'V@ C 8'Vܢ'VB pA B ''V'V0< A 8'Vܢ'VB 0'V8'Vܢ'VB 'V'B ''V'V'8'Vܢ'VB n[ 'V``'C ]'V@C @â'V|wn[ 'V`` @ X^?@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'V;'V p ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 4x'V'V)'V> = 4x'V'V)'V= < 4x'V'V)'V< ; 4x'V'V)'V; : 4x'V'V)'V: 9 4x'V'V)'V9 8 4x'V'V)'V8 7 4x'V'V)'V7 6 4x'V'V6 7 'Vx7 8 ۝'V'V`'V7 4x'V'V7 7 'Vx7 8 {'V(7 'V 7 'V7 'V6 'V'V7 `8 U'V'V7 'Vh8 ڢ'VMz'V : 'V8 'V7 7 'V 8 'Vh8 'V'Vв'Vx'V9 U'V'V8 P9 9 'V`9 }'V; 8 'V : 9 9 'V8 P9 `9 'VP9 }'V}'Vd'V9 'VX: 'Vڢ'VP: : Mz'V <  'V: 'V9 9 'V : 'VX: 'V'V'Vx'V; DU'V'V: @; ; 'VP; }'V= : 'V < ; ; 'V: @; P; 'V@; }'V}'Vpd'V; 0'VH< .'Vڢ'V@< < Mz'V >  'V< 'V; ; 'V < .'VH< .'V.'V.'Vx'V= DU'V.'V< 0= = 'V@= }'V? < 'V > = = 'V< 0= @= 'V0= }'V}'VPd'V= 0.'V8> <'Vڢ'V0> > Mz'V @  'V> 'V= = 'V > <'V8> <'V<'V<'Vx'V? DU'V<'V>  ? ? 'V0? }'V@ > 'V @ ? ? 'V>  ? 0? 'V ? }'V}'Vd'V? `<'V(@ D ڢ'V @ h@ Mz'V'Vjy8*G 'V@ 0'V? ? 'V @ D (@ D @'VC x'V ݢ'V]'VC h@ A 8'Vߊ'V@ 0'V A 'V'VB 'ޅ'V'V@ C 8'Vܢ'VB pA B ''V'V0< A 8'Vܢ'VB 0'V8'Vܢ'VB 'V'B ''V'V'8'Vܢ'VB n[ 'V``'C ]'V@C @â'V|wn[ 'V`` @ X^?@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'V;'V p ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 4x'V'V)'V> = 4x'V'V)'V= < 4x'V'V)'V< ; 4x'V'V)'V; : 4x'V'V)'V: 9 4x'V'V)'V9 8 4x'V'V)'V8 7 4x'V'V7 7 'Vx7 8 {'V'Voۢ'V8 7 4x'V'V7 3'V7 ,3'V3'V7 `8 'n'V,3'V7 'Vh8 ڢ'VMz'V : 'V8 'V7 7 'V 8 (3'Vh8 (3'V03'V3'Vx'V9 $U'V(3'V8 P9 9 'V`9 }'V; 8 'V : 9 9 'V8 P9 `9 'VP9 }'V}'Vd'V9 2'VX: 'Vڢ'VP: : Mz'V <  'V: 'V9 9 'V : H'VX: H'VP'V0'Vx'V; DU'V0'V: @; ; 'VP; }'V= : 'V < ; ; 'V: @; P; 'V@; }'V}'Vd'V; 'VH< 'Vڢ'V@< < Mz'V >  'V< 'V; ; 'V < 'VH< 'V 'V'Vx'V= DU'V'V< 0= = 'V@= }'V? < 'V > = = 'V< 0= @= 'V0= }'V}'V`d'V= 'V8> ='Vڢ'V0> > Mz'V @  'V> 'V= = 'V > 8='V8> 8='V@='V ='Vx'V? DU'V ='V>  ? ? 'V0? }'V@ > 'V @ ? ? 'V>  ? 0? 'V ? }'V}'Vd'V? <'V(@ D ڢ'V @ h@ Mz'V'Vjy8*G 'V@ 0'V? ? 'V @ D (@ D @'VC x'V ݢ'V]'VC h@ A 8'Vߊ'V@ 0'V A 'V'VB 'ޅ'V'V@ C 8'Vܢ'VB pA B ''V'V0< A 8'Vܢ'VB 0'V8'Vܢ'VB 'V'B ''V'V'8'Vܢ'VB n[ 'V``'C ]'V@C @â'V|wn[ 'V`` @ X^?@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'V;'V p ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 4x'V'V)'V> = 4x'V'V)'V= < 4x'V'V)'V< ; 4x'V'V)'V; : 4x'V'V)'V: 9 4x'V'V)'V9 8 4x'V'V)'V8 7 4x'V'V)'V7 6 4x'V'V7 7 'Vx7 8 |'V(7 'V 7 'V7 'V6 L'V'V7 `8 'n'VL'V7 'Vh8 ڢ'VMz'V : 'V8 'V7 7 'V 8 H'Vh8 H'VP'V0'Vx'V9 $U'VH'V8 P9 9 'V`9 }'V; 8 'V : 9 9 'V8 P9 `9 'VP9 }'V}'V0d'V9 'VX: 'Vڢ'VP: : Mz'V <  'V: 'V9 9 'V : 'VX: 'V'V'Vx'V; DU'V'V: @; ; 'VP; }'V= : 'V < ; ; 'V: @; P; 'V@; }'V}'Vd'V; @'VH< 'Vڢ'V@< < Mz'V >  'V< 'V; ; 'V < 'VH< 'V'V'Vx'V= DU'V'V< 0= = 'V@= }'V? < 'V > = = 'V< 0= @= 'V0= }'V}'Vd'V= 'V8> ='Vڢ'V0> > Mz'V @  'V> 'V= = 'V > 8='V8> 8='V@='V ='Vx'V? DU'V ='V>  ? ? 'V0? }'V@ > 'V @ ? ? 'V>  ? 0? 'V ? }'V}'Vd'V? <'V(@ D ڢ'V @ h@ Mz'V'Vjy8*G 'V@ 0'V? ? 'V @ D (@ D @'VC x'V ݢ'V]'VC h@ A 8'Vߊ'V@ 0'V A 'V'VB 'ޅ'V'V@ C 8'Vܢ'VB pA B ''V'V0< A 8'Vܢ'VB 0'V8'Vܢ'VB 'V'B ''V'V'8'Vܢ'VB n[ 'V``'C ]'V@C @â'V|wn[ 'V`` @ X^?@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'V;'V p ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 'V'V'V)'V'V'V'V@ 'VǕ'V0'V@ 0'V)'V@ ? Ǖ'V0'V)'V@ ? 4x'V'V)'V? > 4x'V'V)'V> = 4x'V'V)'V= < 4x'V'V)'V< ; 4x'V'V)'V; : 4x'V'V)'V: 9 4x'V'VX: 'Vڢ'VP: : nz'V <  'V: 'V9 9 'V : 'VX: 'V'V'Vx'V; DU'V'V: @; ; 'VP; }'V= : 'V < ; ; 'V: @; P; 'V@; }'V}'Vd'V; 'VH< 'Vڢ'V@< < Mz'V >  'V< 'V; ; 'V < H'VH< H'VP'V0'Vx'V= DU'V0'V< 0= = 'V@= }'V? < 'V > = = 'V< 0= @= 'V0= }'V}'V0d'V= 'V8> ='Vڢ'V0> > Mz'V @  'V> 'V= = 'V > 8='V8> 8='V@='V ='Vx'V? DU'V ='V>  ? ? 'V0? }'V@ > 'V @ ? ? 'V>  ? 0? 'V ? }'V}'Vd'V? <'V(@ D ڢ'V @ h@ Mz'V'Vjy8*G 'V@ 0'V? ? 'V @ D (@ D @'VC x'V ݢ'V]'VC h@ A 8'Vߊ'V@ 0'V A 'V'VB 'ޅ'V'V@ C 8'Vܢ'VB pA B ''V'V0< A 8'Vܢ'VB 0'V8'Vܢ'VB 'V'B ''V'V'8'Vܢ'VB n[ 'V``'C ]'V@C @â'V|wn[ 'V`` @ X^?@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'V;'V p ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t  'V< 'V; ; 'V < ('VH< ('V0'V'Vx'V= DU'V'V< 0= = 'V@= }'V? < 'V > = = 'V< 0= @= 'V0= }'V}'VPd'V= 'V8> ='Vڢ'V0> > Mz'V @  'V> 'V= = 'V > 8='V8> 8='V@='V ='Vx'V? DU'V ='V>  ? ? 'V0? }'V@ > 'V @ ? ? 'V>  ? 0? 'V ? }'V}'Vd'V? <'V(@ D ڢ'V @ h@ Mz'V'Vjy8*G 'V@ 0'V? ? 'V @ D (@ D @'VC x'V ݢ'V]'VC h@ A 8'Vߊ'V@ 0'V A 'V'VB 'ޅ'V'V@ C 8'Vܢ'VB pA B ''V'V0< A 8'Vܢ'VB 0'V8'Vܢ'VB 'V'B ''V'V'8'Vܢ'VB n[ 'V``'C ]'V@C @â'V|wn[ 'V`` @ X^?@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'V;'V p ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 4x'V'V)'V> = 4x'V'V)'V= < 4x'V'V)'V< ; 4x'V'V)'V; : 4x'V'V)'V: 9 4x'V'V)'V9 8 4x'V'V)'V8 7 4x'V'V)'V7 6 4x'V'V7 7 'Vx7 8 |'V(7 'V 7 'V7 'V6 p'V'V7 `8 U'Vp'V7 'Vh8 ڢ'VMz'V : 'V8 'V7 7 'V 8 'Vh8 'V'V'Vx'V9 U'Vp'V8 P9 9 'V`9 }'V; 8 'V : 9 9 'V8 P9 `9 'VP9 }'V}'V`d'V9 p'VX:  'Vڢ'VP: : Mz'V <  'V: 'V9 9 'V : h 'VX: h 'Vp 'VP 'Vx'V; DU'VP 'V: @; ; 'VP; }'V= : 'V < ; ; 'V: @; P; 'V@; }'V}'Vd'V;  'VH< 'Vڢ'V@< < Mz'V >  'V< 'V; ; 'V < 'VH< 'V'V'Vx'V= DU'V'V< 0= = 'V@= }'V? < 'V > = = 'V< 0= @= 'V0= }'V}'V`d'V= @'V8> ='Vڢ'V0> > Mz'V @  'V> 'V= = 'V > ='V8> ='V='V='Vx'V? DU'V='V>  ? ? 'V0? }'V@ > 'V @ ? ? 'V>  ? 0? 'V ? }'V}'V0d'V? @='V(@ D ڢ'V @ h@ Mz'V'Vjy8*G 'V@ 0'V? ? 'V @ D (@ D @'VC x'V ݢ'V]'VC h@ A 8'Vߊ'V@ 0'V A 'V'VB 'ޅ'V'V@ C 8'Vܢ'VB pA B ''V'V0< A 8'Vܢ'VB 0'V8'Vܢ'VB 'V'B ''V'V'8'Vܢ'VB n[ 'V``'C ]'V@C @â'V|wn[ 'V`` @ X^?@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'V;'V p ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t ')'V'V'V'V? Ǖ'V'V0'V)'V@ 0'V)'V@ ? Ǖ'V0'V)'V@ ? 4x'V'V)'V? > 4x'V'V)'V> = 4x'V'V)'V= < 4x'V'V)'V< ; 4x'V'V)'V; : 4x'V'V)'V: 9 4x'V'V)'V9 8 4x'V'V)'V8 7 4x'V'Vh8 'Vڢ'V`8 8 nz'V : 'V8 'V7 7 'V 8 'Vh8 'V'V'Vx'V9 U'V@'V8 P9 9 'V`9 }'V; 8 'V : 9 9 'V8 P9 `9 'VP9 }'V}'Vd'V9 @'VX: 'Vڢ'VP: : Mz'V <  'V: 'V9 9 'V : 'VX: 'V'V'Vx'V; DU'V'V: @; ; 'VP; }'V= : 'V < ; ; 'V: @; P; 'V@; }'V}'V0d'V; P'VH< 'Vڢ'V@< < Mz'V >  'V< 'V; ; 'V < 'VH< 'V'V'Vx'V= DU'V'V< 0= = 'V@= }'V? < 'V > = = 'V< 0= @= 'V0= }'V}'Vd'V= 'V8> ='Vڢ'V0> > Mz'V @  'V> 'V= = 'V > ='V8> ='V='V='Vx'V? DU'V='V>  ? ? 'V0? }'V@ > 'V @ ? ? 'V>  ? 0? 'V ? }'V}'V0d'V? @='V(@ D ڢ'V @ h@ Mz'V'Vjy8*G 'V@ 0'V? ? 'V @ D (@ D @'VC x'V ݢ'V]'VC h@ A 8'Vߊ'V@ 0'V A 'V'VB 'ޅ'V'V@ C 8'Vܢ'VB pA B ''V'V0< A 8'Vܢ'VB 0'V8'Vܢ'VB 'V'B ''V'V'8'Vܢ'VB n[ 'V``'C ]'V@C @â'V|wn[ 'V`` @ X^?@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'V;'V p ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 4x'V'V)'V> = 4x'V'V)'V= < 4x'V'V)'V< ; 4x'V'V)'V; : 4x'V'V)'V: 9 4x'V'V)'V9 8 4x'V'Vh8 5'Vڢ'V`8 8 y'V : 'V4x'V 'Vڢ'V 9 8 4x'V'V8 5'Vh8 5'V5'V5'Vx'V9 U'V5'V8 P9 9 'V`9 }'V; 8 'V : 9 9 'V8 P9 `9 'VP9 }'V}'Vd'V9 5'VX: -'Vڢ'VP: : Mz'V <  'V: 'V9 9 'V : -'VX: -'V.'V-'Vx'V; DU'V-'V: @; ; 'VP; }'V= : 'V < ; ; 'V: @; P; 'V@; }'V}'V`d'V; -'VH< 'Vڢ'V@< < Mz'V >  'V< 'V; ; 'V < H'VH< H'VP'V0'Vx'V= DU'V0'V< 0= = 'V@= }'V? < 'V > = = 'V< 0= @= 'V0= }'V}'Vd'V= 'V8> ='Vڢ'V0> > Mz'V @  'V> 'V= = 'V > ='V8> ='V='V='Vx'V? DU'V='V>  ? ? 'V0? }'V@ > 'V @ ? ? 'V>  ? 0? 'V ? }'V}'V0d'V? @='V(@ D ڢ'V @ h@ Mz'V'Vjy8*G 'V@ 0'V? ? 'V @ D (@ D @'VC x'V ݢ'V]'VC h@ A 8'Vߊ'V@ 0'V A 'V'VB 'ޅ'V'V@ C 8'Vܢ'VB pA B ''V'V0< A 8'Vܢ'VB 0'V8'Vܢ'VB 'V'B ''V'V'8'Vܢ'VB n[ 'V``'C ]'V@C @â'V|wn[ 'V`` @ X^?@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'V;'V p ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t ')'V'V'V'V? Ǖ'V'V0'V)'V@ 0'V)'V@ ? Ǖ'V0'V)'V@ ? 4x'V'V)'V? > 4x'V'V)'V> = 4x'V'V)'V= < 4x'V'V)'V< ; 4x'V'V)'V; : 4x'V'V)'V: 9 4x'V'V)'V9 8 4x'V'V)'V8 7 4x'V'Vh8 'Vڢ'V`8 8 nz'V : 'V8 'V7 7 'V 8 'Vh8 'V'V'Vx'V9 $U'V'V8 P9 9 'V`9 }'V; 8 'V : 9 9 'V8 P9 `9 'VP9 }'V}'VPd'V9 P'VX: 'Vڢ'VP: : Mz'V <  'V: 'V9 9 'V : 8'VX: 8'V@'V 'Vx'V; DU'V 'V: @; ; 'VP; }'V= : 'V < ; ; 'V: @; P; 'V@; }'V}'Vd'V; Б'VH< 'Vڢ'V@< < Mz'V >  'V< 'V; ; 'V < ('VH< ('V0'V'Vx'V= DU'V'V< 0= = 'V@= }'V? < 'V > = = 'V< 0= @= 'V0= }'V}'Vd'V= 'V8> ='Vڢ'V0> > Mz'V @  'V> 'V= = 'V > ='V8> ='V='V='Vx'V? DU'V='V>  ? ? 'V0? }'V@ > 'V @ ? ? 'V>  ? 0? 'V ? }'V}'V0d'V? @='V(@ D ڢ'V @ h@ Mz'V'Vjy8*G 'V@ 0'V? ? 'V @ D (@ D @'VC x'V ݢ'V]'VC h@ A 8'Vߊ'V@ 0'V A 'V'VB 'ޅ'V'V@ C 8'Vܢ'VB pA B ''V'V0< A 8'Vܢ'VB 0'V8'Vܢ'VB 'V'B ''V'V'8'Vܢ'VB n[ 'V``'C ]'V@C @â'V|wn[ 'V`` @ X^?@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'V;'V p ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 4x'V'V'V> = 4x'V'Vp9 'V'V= < v'V'Vp9 'V'V< ; v'V'Vp9 'V'V; : v'V'Vp9 'V)'V: 9 v'V'Vp9 ''Vp9 P: : |'Vp9 &'V: U'V&'V9 'VX: ڢ'VMz'V < 'V: 'V9 9 'V : X''VX: X''V`''V@''Vx'V; U'V&'V: @; ; 'VP; }'V= : 'V < ; ; 'V: @; P; 'V@; }'V}'Vd'V; &'VH< 'Vڢ'V@< < Mz'V >  'V< 'V; ; 'V < 'VH< 'V'V'Vx'V= DU'V'V< 0= = 'V@= }'V? < 'V > = = 'V< 0= @= 'V0= }'V}'Vd'V= @'V8> >'Vڢ'V0> > Mz'V @  'V> 'V= = 'V > >'V8> >'V >'V>'Vx'V? DU'V>'V>  ? ? 'V0? }'V@ > 'V @ ? ? 'V>  ? 0? 'V ? }'V}'Vd'V? ='V(@ D ڢ'V @ h@ Mz'V'Vjy8*G 'V@ 0'V? ? 'V @ D (@ D @'VC x'V ݢ'V]'VC h@ A 8'Vߊ'V@ 0'V A 'V'VB 'ޅ'V'V@ C 8'Vܢ'VB pA B ''V'V0< A 8'Vܢ'VB 0'V8'Vܢ'VB 'V'B ''V'V'8'Vܢ'VB n[ 'V``'C ]'V@C @â'V|wn[ 'V`` @ X^?@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'V;'V p ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t ')'V'V'V'V? Ǖ'V'V0'V)'V@ 0'V)'V@ ? Ǖ'V0'V)'V@ ? 4x'V'V)'V? > 4x'V'V)'V> = 4x'V'V)'V= < 4x'V'V)'V< ; 4x'V'V)'V; : 4x'V'V)'V: 9 4x'V'V)'V9 8 4x'V'V)'V8 7 4x'V'Vh8 'Vڢ'V`8 8 nz'V : 'V8 'V7 7 'V 8 'Vh8 'V'V'Vx'V9 $U'V'V8 P9 9 'V`9 }'V; 8 'V : 9 9 'V8 P9 `9 'VP9 }'V}'VPd'V9 P'VX: 'Vڢ'VP: : Mz'V <  'V: 'V9 9 'V : 8'VX: 8'V@'V 'Vx'V; DU'V 'V: @; ; 'VP; }'V= : 'V < ; ; 'V: @; P; 'V@; }'V}'Vd'V; й'VH< 'Vڢ'V@< < Mz'V >  'V< 'V; ; 'V < 'VH< 'V'V'Vx'V= DU'V'V< 0= = 'V@= }'V? < 'V > = = 'V< 0= @= 'V0= }'V}'Vd'V= 'V8> >'Vڢ'V0> > Mz'V @  'V> 'V= = 'V > >'V8> >'V >'V>'Vx'V? DU'V>'V>  ? ? 'V0? }'V@ > 'V @ ? ? 'V>  ? 0? 'V ? }'V}'Vd'V? ='V(@ D ڢ'V @ h@ Mz'V'Vjy8*G 'V@ 0'V? ? 'V @ D (@ D @'VC x'V ݢ'V]'VC h@ A 8'Vߊ'V@ 0'V A 'V'VB 'ޅ'V'V@ C 8'Vܢ'VB pA B ''V'V0< A 8'Vܢ'VB 0'V8'Vܢ'VB 'V'B ''V'V'8'Vܢ'VB n[ 'V``'C ]'V@C @â'V|wn[ 'V`` @ X^?@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'V;'V p ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 4x'V'V)'V> = 4x'V'V)'V= < 4x'V'V)'V< ; 4x'V'V)'V; : 4x'V'V)'V: 9 4x'V'V)'V9 8 4x'V'V)'V8 7 4x'V'Vh8 'Vڢ'V`8 8 nz'V :  'V8 'V7 7 'V 8 'Vh8 'V'V'Vx'V9 DU'V'V8 P9 9 'V`9 }'V; 8 'V : 9 9 'V8 P9 `9 'VP9 }'V}'VPd'V9 'VX: 'Vڢ'VP: : Mz'V <  'V: 'V9 9 'V : 'VX: 'V'Vp'Vx'V; DU'Vp'V: @; ; 'VP; }'V= : 'V < ; ; 'V: @; P; 'V@; }'V}'Vd'V;  'VH< 'Vڢ'V@< < Mz'V >  'V< 'V; ; 'V < 'VH< 'V'V'Vx'V= DU'V'V< 0= = 'V@= }'V? < 'V > = = 'V< 0= @= 'V0= }'V}'Vd'V= 'V8> >'Vڢ'V0> > Mz'V @  'V> 'V= = 'V > >'V8> >'V >'V>'Vx'V? DU'V>'V>  ? ? 'V0? }'V@ > 'V @ ? ? 'V>  ? 0? 'V ? }'V}'Vd'V? ='V(@ D ڢ'V @ h@ Mz'V'Vjy8*G 'V@ 0'V? ? 'V @ D (@ D @'VC x'V ݢ'V]'VC h@ A 8'Vߊ'V@ 0'V A 'V'VB 'ޅ'V'V@ C 8'Vܢ'VB pA B ''V'V0< A 8'Vܢ'VB 0'V8'Vܢ'VB 'V'B ''V'V'8'Vܢ'VB n[ 'V``'C ]'V@C @â'V|wn[ 'V`` @ X^?@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'V;'V p ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 4x'V'V)'V> = 4x'V'V)'V= < 4x'V'V)'V< ; 4x'V'V)'V; : 4x'V'V)'V: 9 4x'V'V)'V9 8 4x'V'V)'V8 7 4x'V'Vh8 'Vڢ'V`8 8 nz'V :  'V8 'V7 7 'V 8 'Vh8 'V'V'Vx'V9 DU'V'V8 P9 9 'V`9 }'V; 8 'V : 9 9 'V8 P9 `9 'VP9 }'V}'VPd'V9 'VX: 'Vڢ'VP: : Mz'V <  'V: 'V9 9 'V : 'VX: 'V'Vp'Vx'V; DU'Vp'V: @; ; 'VP; }'V= : 'V < ; ; 'V: @; P; 'V@; }'V}'Vd'V;  'VH< 'Vڢ'V@< < Mz'V >  'V< 'V; ; 'V < 'VH< 'V'V'Vx'V= DU'V'V< 0= = 'V@= }'V? < 'V > = = 'V< 0= @= 'V0= }'V}'Vd'V= 'V8> >'Vڢ'V0> > Mz'V @  'V> 'V= = 'V > >'V8> >'V >'V>'Vx'V? DU'V>'V>  ? ? 'V0? }'V@ > 'V @ ? ? 'V>  ? 0? 'V ? }'V}'Vd'V? ='V(@ D ڢ'V @ h@ Mz'V'Vjy8*G 'V@ 0'V? ? 'V @ D (@ D @'VC x'V ݢ'V]'VC h@ A 8'Vߊ'V@ 0'V A 'V'VB 'ޅ'V'V@ C 8'Vܢ'VB pA B ''V'V0< A 8'Vܢ'VB 0'V8'Vܢ'VB 'V'B ''V'V'8'Vܢ'VB n[ 'V``'C ]'V@C @â'V|wn[ 'V`` @ X^?@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'V;'V p ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 4x'V'V)'V> = 4x'V'V)'V= < 4x'V'V)'V< ; 4x'V'V)'V; : 4x'V'V)'V: 9 4x'V'V)'V9 8 4x'V'V)'V8 7 4x'V'Vh8 'Vڢ'V`8 8 nz'V :  'V8 'V7 7 'V 8 'Vh8 'V'V'Vx'V9 DU'V'V8 P9 9 'V`9 }'V; 8 'V : 9 9 'V8 P9 `9 'VP9 }'V}'VPd'V9 'VX: 'Vڢ'VP: : Mz'V <  'V: 'V9 9 'V : 'VX: 'V'Vp'Vx'V; DU'Vp'V: @; ; 'VP; }'V= : 'V < ; ; 'V: @; P; 'V@; }'V}'Vd'V;  'VH< 'Vڢ'V@< < Mz'V >  'V< 'V; ; 'V < 'VH< 'V'V'Vx'V= DU'V'V< 0= = 'V@= }'V? < 'V > = = 'V< 0= @= 'V0= }'V}'Vd'V= 'V8> >'Vڢ'V0> > Mz'V @  'V> 'V= = 'V > >'V8> >'V >'V>'Vx'V? DU'V>'V>  ? ? 'V0? }'V@ > 'V @ ? ? 'V>  ? 0? 'V ? }'V}'Vd'V? ='V(@ D ڢ'V @ h@ Mz'V'Vjy8*G 'V@ 0'V? ? 'V @ D (@ D @'VC x'V ݢ'V]'VC h@ A 8'Vߊ'V@ 0'V A 'V'VB 'ޅ'V'V@ C 8'Vܢ'VB pA B ''V'V0< A 8'Vܢ'VB 0'V8'Vܢ'VB 'V'B ''V'V'8'Vܢ'VB n[ 'V``'C ]'V@C @â'V|wn[ 'V`` @ X^?@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'V;'V p ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 4x'V'V)'V> = 4x'V'V)'V= < 4x'V'V)'V< ; 4x'V'V)'V; : 4x'V'V)'V: 9 4x'V'V)'V9 8 4x'V'V)'V8 7 4x'V'Vh8 'Vڢ'V`8 8 nz'V :  'V8 'V7 7 'V 8 'Vh8 'V'V'Vx'V9 DU'V'V8 P9 9 'V`9 }'V; 8 'V : 9 9 'V8 P9 `9 'VP9 }'V}'VPd'V9 'VX: 'Vڢ'VP: : Mz'V <  'V: 'V9 9 'V : 'VX: 'V'Vp'Vx'V; DU'Vp'V: @; ; 'VP; }'V= : 'V < ; ; 'V: @; P; 'V@; }'V}'Vd'V;  'VH< 'Vڢ'V@< < Mz'V >  'V< 'V; ; 'V < 'VH< 'V'V'Vx'V= DU'V'V< 0= = 'V@= }'V? < 'V > = = 'V< 0= @= 'V0= }'V}'Vd'V= 'V8> >'Vڢ'V0> > Mz'V @  'V> 'V= = 'V > >'V8> >'V >'V>'Vx'V? DU'V>'V>  ? ? 'V0? }'V@ > 'V @ ? ? 'V>  ? 0? 'V ? }'V}'Vd'V? ='V(@ D ڢ'V @ h@ Mz'V'Vjy8*G 'V@ 0'V? ? 'V @ D (@ D @'VC x'V ݢ'V]'VC h@ A 8'Vߊ'V@ 0'V A 'V'VB 'ޅ'V'V@ C 8'Vܢ'VB pA B ''V'V0< A 8'Vܢ'VB 0'V8'Vܢ'VB 'V'B ''V'V'8'Vܢ'VB n[ 'V``'C ]'V@C @â'V|wn[ 'V`` @ X^?@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'V;'V p ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 4x'V'V'V)'V@ 0'V'V@ ? Ǖ'V'Vh8 0'V'V@ ? v'V'Vh8 'V'V? > v'V'Vh8 'V'V> = v'V'Vh8 'V'V= < v'V'Vh8 'V'V< ; v'V'Vh8 'V'V; : v'V'Vh8 'V'V: 9 v'V'Vh8 'V)'V9 8 v'V'Vh8 'V'V'Vx'V9 z'Vh8 MU'V'V8 P9 9 'V`9 }'V; 8 'V : 9 9 'V8 P9 `9 'VP9 }'V}'VPd'V9 'VX: 'Vڢ'VP: : Mz'V <  'V: 'V9 9 'V : 'VX: 'V'Vp'Vx'V; DU'Vp'V: @; ; 'VP; }'V= : 'V < ; ; 'V: @; P; 'V@; }'V}'Vd'V;  'VH< 'Vڢ'V@< < Mz'V >  'V< 'V; ; 'V < 'VH< 'V'V'Vx'V= DU'V'V< 0= = 'V@= }'V? < 'V > = = 'V< 0= @= 'V0= }'V}'Vd'V= 'V8> >'Vڢ'V0> > Mz'V @  'V> 'V= = 'V > >'V8> >'V >'V>'Vx'V? DU'V>'V>  ? ? 'V0? }'V@ > 'V @ ? ? 'V>  ? 0? 'V ? }'V}'Vd'V? ='V(@ D ڢ'V @ h@ Mz'V'Vjy8*G 'V@ 0'V? ? 'V @ D (@ D @'VC x'V ݢ'V]'VC h@ A 8'Vߊ'V@ 0'V A 'V'VB 'ޅ'V'V@ C 8'Vܢ'VB pA B ''V'V0< A 8'Vܢ'VB 0'V8'Vܢ'VB 'V'B ''V'V'8'Vܢ'VB n[ 'V``'C ]'V@C @â'V|wn[ 'V`` @ X^?@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'V;'V p ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t 4x'V'V)'V> = 4x'V'V)'V= < 4x'V'VH< 'Vڢ'V@< < y'V > 'V4x'V 'Vڢ'V = < 4x'V'V< 'VH< 'V'V'Vx'V= U'Vp'V< 0= = 'V@= }'V? < 'V > = = 'V< 0= @= 'V0= }'V}'Vd'V= p'V8> >'Vڢ'V0> > Mz'V @  'V> 'V= = 'V > >'V8> >'V >'V>'Vx'V? DU'V>'V>  ? ? 'V0? }'V@ > 'V @ ? ? 'V>  ? 0? 'V ? }'V}'Vd'V? ='V(@ D ڢ'V @ h@ Mz'V'Vjy8*G 'V@ 0'V? ? 'V @ D (@ D @'VC x'V ݢ'V]'VC h@ A 8'Vߊ'V@ 0'V A 'V'VB 'ޅ'V'V@ C 8'Vܢ'VB pA B ''V'V0< A 8'Vܢ'VB 0'V8'Vܢ'VB 'V'B ''V'V'8'Vܢ'VB n[ 'V``'C ]'V@C @â'V|wn[ 'V`` @ X^?@x)GD 6H8*GW*G'V`Y*GtV5W*Gآ'V` Ur'VW*GW*Gp'V;'V p ` 'VE آ'Vsn'Vp n'Vp Ԡ'Vp ` p P  'V sW*GeW*GjW*GpY*G`W*Gq)G @آ'V('V`F ұ'Vp'V;)G hF 'V\t { BTreeMap(btree_map::Iter<'a, K, V>), ArchivedBTreeMap(rkyv::collections::btree_map::Iter<'a, K, V>), } impl<'a, K, V> Iterator for AbstractBTreeMapIter<'a, K, V> { type Item = (&'a K, &'a V); fn next(&mut self) -> Option { match self { AbstractBTreeMapIter::BTreeMap(x) => x.next(), AbstractBTreeMapIter::ArchivedBTreeMap(x) => x.next(), } } } impl AbstractBTreeMap for BTreeMap { fn iter(&self) -> AbstractBTreeMapIter { AbstractBTreeMapIter::BTreeMap(self.iter()) } fn get(&self, key: &Q) -> Option<&V> where K: Ord + Borrow, Q: Ord + ?Sized, { self.get(key) } } impl AbstractBTreeMap for ArchivedBTreeMap { fn iter(&self) -> AbstractBTreeMapIter { AbstractBTreeMapIter::ArchivedBTreeMap(self.iter()) } fn get(&self, key: &Q) -> Option<&V> where K: Ord + Borrow, Q: Ord + ?Sized, { self.get(key) } } pub trait AbstractBTreeMap { fn iter(&self) -> AbstractBTreeMapIter; fn get(&self, key: &Q) -> Option<&V> where K: Ord + Borrow, Q: Ord + ?Sized; fn outer_join(&self, that: &impl AbstractBTreeMap, f: F) -> BTreeMap where K: Ord + Clone, F: Fn(OuterJoinArg<&K, &V, &W>) -> Option, { let mut res = BTreeMap::new(); for (k, v) in self.iter() { let arg = match that.get(k) { Some(w) => OuterJoinArg::Both(k, v, w), None => OuterJoinArg::Left(k, v), }; if let Some(r) = f(arg) { res.insert(k.clone(), r); } } for (k, w) in that.iter() { if self.get(k).is_none() { let arg = OuterJoinArg::Right(k, w); if let Some(r) = f(arg) { res.insert(k.clone(), r); } } } res } fn left_join(&self, that: &impl AbstractBTreeMap, f: F) -> BTreeMap where K: Ord + Clone, F: Fn(&K, &V, Option<&W>) -> Option, { let mut res = BTreeMap::new(); for (k, v) in self.iter() { let w = that.get(k); if let Some(r) = f(k, v, w) { res.insert(k.clone(), r); } } res } fn right_join(&self, that: &impl AbstractBTreeMap, f: F) -> BTreeMap where K: Ord + Clone, F: Fn(&K, Option<&V>, &W) -> Option, { let mut res = BTreeMap::new(); for (k, w) in that.iter() { let v = self.get(k); if let Some(r) = f(k, v, w) { res.insert(k.clone(), r); } } res } fn inner_join(&self, that: &impl AbstractBTreeMap, f: F) -> BTreeMap where K: Ord + Clone, F: Fn(&K, &V, &W) -> Option, { let mut res = BTreeMap::new(); let self_iter = self.iter(); let that_iter = that.iter(); if self_iter.size_hint().0 < that_iter.size_hint().0 { for (k, v) in self.iter() { if let Some(w) = that.get(k) { if let Some(r) = f(k, v, w) { res.insert(k.clone(), r); } } } } else { for (k, w) in that.iter() { if let Some(v) = self.get(k) { if let Some(r) = f(k, v, w) { res.insert(k.clone(), r); } } } } res } } pub trait InPlaceRelationalOps { fn inner_join_with(&mut self, that: &impl AbstractBTreeMap, f: F) where K: Ord, F: Fn(&K, &mut V, &W) -> bool; fn left_join_with(&mut self, that: &impl AbstractBTreeMap, f: F) where K: Ord, F: Fn(&K, &mut V, Option<&W>) -> bool; fn right_join_with(&mut self, that: &impl AbstractBTreeMap, f: F) where K: Ord + Clone, F: Fn(&K, Option<&mut V>, &W) -> bool; fn outer_join_with(&mut self, that: &impl AbstractBTreeMap, l: L, r: R) where K: Ord + Clone, L: Fn(&K, &mut V, Option<&W>) -> bool, R: Fn(&K, &W) -> Option; } impl InPlaceRelationalOps for BTreeMap { fn inner_join_with(&mut self, that: &impl AbstractBTreeMap, f: F) where K: Ord, F: Fn(&K, &mut V, &W) -> bool, { self.retain(|k, v| that.get(k).map(|w| f(k, v, w)).unwrap_or_default()) } fn left_join_with(&mut self, that: &impl AbstractBTreeMap, f: F) where K: Ord, F: Fn(&K, &mut V, Option<&W>) -> bool, { self.retain(|k, v| f(k, v, that.get(k))) } fn right_join_with(&mut self, that: &impl AbstractBTreeMap, f: F) where K: Ord + Clone, F: Fn(&K, Option<&mut V>, &W) -> bool, { for (k, w) in that.iter() { if !f(k, self.get_mut(k), w) { self.remove(k); } } } fn outer_join_with(&mut self, that: &impl AbstractBTreeMap, l: L, r: R) where K: Ord + Clone, L: Fn(&K, &mut V, Option<&W>) -> bool, R: Fn(&K, &W) -> Option, { // k in that for (k, w) in that.iter() { match self.get_mut(k) { Some(v) => { if !l(k, v, Some(w)) { self.remove(k); } } None => { if let Some(v) = r(k, w) { self.insert(k.clone(), v); } } } } // k not in that self.retain(|k, v| that.get(k).is_some() || l(k, v, None)); } } vec-collections-0.4.3/src/dedup.rs000064400000000000000000000206430072674642500152140ustar 00000000000000use core::{ cmp::{min, Ordering}, marker::PhantomData, ops::DerefMut, }; /// deduplicate a slice, moving the duplicates to the end. /// returns the number of unique elements. /// /// there is an unstable library feature called slice.partition_dedup which is /// roughly similar: /// /// the library feature would be preferable since it is unsafe and thus has no bounds checks. fn dedup_by bool>(d: &mut [T], same_bucket: F, keep: Keep) -> usize { if d.is_empty() { return 0; } let mut j = 0; for i in 1..d.len() { if !same_bucket(&d[i], &d[j]) { j += 1; if i != j { d.swap(i, j); } } else if keep == Keep::Last { d.swap(i, j); } } j + 1 } /// Enum to determine what elements to keep in case of collisions #[derive(Debug, PartialEq, Eq, Clone, Copy)] pub enum Keep { /// when encountering duplicate elements, keep first First, /// when encountering duplicate elements, keep last Last, } /// Trait to abstract over the target collection, Vec or SmallVec pub trait Seq: DerefMut { /// create a new, empty collection with the given capacity fn with_capacity(capacity: usize) -> Self; /// push an element to the end fn push(&mut self, value: T); /// truncate the length fn truncate(&mut self, size: usize); } impl Seq for Vec { fn with_capacity(capacity: usize) -> Self { Self::with_capacity(capacity) } fn push(&mut self, value: T) { self.push(value) } fn truncate(&mut self, len: usize) { self.truncate(len) } } impl Seq for smallvec::SmallVec { fn with_capacity(capacity: usize) -> Self { Self::with_capacity(capacity) } fn push(&mut self, value: A::Item) { self.push(value) } fn truncate(&mut self, len: usize) { self.truncate(len) } } /// an aggregator to incrementally sort and deduplicate unsorted elements /// /// this is a compromise between sorting and deduping at the end, which can have a lot of /// temporary memory usage if you feed it with lots of duplicate elements, and sorting /// on each insertion, which is expensive for a flat data structure due to all the memory /// movements. struct SortAndDedup { /// partially sorted and deduplicated data elements data: I, /// number of sorted elements sorted: usize, /// comparison cmp: F, /// which element to keep in case of duplicates keep: Keep, _t: PhantomData, } /// Sort and dedup an interator `I` into a collection `R`. /// /// `keep` determines whether to keep the first or the last occurrence in case of duplicates pub fn sort_dedup>(iter: I, keep: Keep) -> R where I::Item: Ord, { sort_dedup_by(iter, keep, |a: &I::Item, b: &I::Item| a.cmp(b)) } /// Sort and dedup an interator `I` into a collection `R`, using a comparison fn. /// /// `keep` determines whether to keep the first or the last occurrence in case of duplicates /// `key` is a function that produces a key to sort and dedup by pub fn sort_dedup_by, F>(iter: I, keep: Keep, cmp: F) -> R where F: Fn(&I::Item, &I::Item) -> std::cmp::Ordering, { let mut agg: SortAndDedup = SortAndDedup { data: R::with_capacity(min(iter.size_hint().0, 16)), sorted: 0, cmp, keep, _t: PhantomData, }; for x in iter { agg.push(x); } agg.into_inner() } /// Sort and dedup an interator `I` into a collection `R`, using a key fn. /// /// `keep` determines whether to keep the first or the last occurrence in case of duplicates /// `key` is a function that produces a key to sort and dedup by pub fn sort_dedup_by_key, K: Ord, F: Fn(&I::Item) -> &K>( iter: I, keep: Keep, key: F, ) -> R { sort_dedup_by(iter, keep, |a: &I::Item, b: &I::Item| key(a).cmp(key(b))) } impl SortAndDedup where F: Fn(&T, &T) -> Ordering, I: Seq, { fn sort_and_dedup(&mut self) { if self.sorted < self.data.len() { let cmp = &self.cmp; let slice = self.data.deref_mut(); // this must be a stable sort for the keep feature to work // since typically the first 50% are already sorted, we benefit from a sort algo that optimizes for that, like timsort slice.sort_by(cmp); let unique = dedup_by(slice, |a, b| cmp(a, b) == Ordering::Equal, self.keep); self.data.truncate(unique); self.sorted = self.data.len(); } } fn into_inner(self) -> I { let mut res = self; res.sort_and_dedup(); res.data } fn push(&mut self, elem: T) { if self.sorted == self.data.len() { if let Some(last) = self.data.last_mut() { match (self.cmp)(last, &elem) { Ordering::Less => { // remain sorted self.sorted += 1; self.data.push(elem); } Ordering::Equal => { // remain sorted, just replace the end if needed if self.keep == Keep::Last { *last = elem; } } Ordering::Greater => { // unsorted self.data.push(elem); } } } else { // single element is always sorted self.sorted += 1; self.data.push(elem); } } else { // not sorted self.data.push(elem); } // Don't bother with the compaction for small collections if self.data.len() >= 16 { let sorted = self.sorted; let unsorted = self.data.len() - sorted; if unsorted > sorted { // after this, it will be fully sorted. So even in the worst case // it will be another self.data.len() elements until we call this again self.sort_and_dedup(); } } } } #[cfg(test)] mod tests { use super::*; use core::fmt::Debug; use quickcheck_macros::quickcheck; use std::collections::*; /// just a helper to get good output when a check fails fn unary_op(x: E, expected: R, actual: R) -> bool { let res = expected == actual; if !res { println!("x:{:?} expected:{:?} actual:{:?}", x, expected, actual); } res } #[quickcheck] fn sort_and_dedup_check(x: Vec) -> bool { let expected: Vec = x .iter() .cloned() .collect::>() .into_iter() .collect(); let actual: Vec = sort_dedup(x.into_iter(), Keep::First); expected == actual } #[quickcheck] fn sort_and_dedup_by_check(x: Vec<(i32, i32)>) -> bool { // TODO: make the keep_last work! let expected: Vec<(i32, i32)> = x .iter() .cloned() .collect::>() .into_iter() .collect(); let actual = sort_dedup_by_key(x.iter().cloned(), Keep::Last, |x| &x.0); unary_op(x, expected, actual) } #[test] fn dedup_by() { let mut v: Vec<(i32, i32)> = vec![(0, 1), (0, 2), (0, 3)]; let r = super::dedup_by(&mut v, |(a, _), (b, _)| a == b, Keep::Last); assert_eq!(r, 1); v.truncate(r); assert_eq!(v, vec![(0, 3)]); } #[test] fn sort_and_dedup_by_test() { let v: Vec<(i32, i32)> = vec![(0, 1), (0, 2), (0, 3), (1, 1), (1, 2)]; let keep_first: Vec<_> = sort_dedup_by_key(v.clone().into_iter(), Keep::First, |x| &x.0); let keep_last: Vec<_> = sort_dedup_by_key(v.clone().into_iter(), Keep::Last, |x| &x.0); assert_eq!(keep_first, vec![(0, 1), (1, 1)]); assert_eq!(keep_last, vec![(0, 3), (1, 2)]); let expected: Vec<(i32, i32)> = v .iter() .cloned() .collect::>() .into_iter() .collect(); println!("{:?} {:?} {:?}", keep_first, keep_last, expected) } } vec-collections-0.4.3/src/iterators.rs000064400000000000000000000032530072674642500161250ustar 00000000000000/// An interator that is guaranteed to be sorted by item pub struct VecSetIter { i: I, } impl sorted_iter::sorted_iterator::SortedByItem for VecSetIter {} impl VecSetIter { pub(crate) fn new(i: I) -> Self { Self { i } } } impl Iterator for VecSetIter { type Item = I::Item; fn next(&mut self) -> Option { self.i.next() } fn size_hint(&self) -> (usize, Option) { self.i.size_hint() } } /// An interator that is guaranteed to be sorted by key pub struct VecMapIter { i: I, } impl sorted_iter::sorted_pair_iterator::SortedByKey for VecMapIter {} impl VecMapIter { pub(crate) fn new(i: I) -> Self { Self { i } } } impl Iterator for VecMapIter { type Item = I::Item; fn next(&mut self) -> Option { self.i.next() } fn size_hint(&self) -> (usize, Option) { self.i.size_hint() } } pub(crate) struct SliceIterator<'a, T>(pub &'a [T]); impl<'a, T> Iterator for SliceIterator<'a, T> { type Item = &'a T; fn next(&mut self) -> Option { if self.0.is_empty() { None } else { let res: Self::Item = &self.0[0]; self.0 = &self.0[1..]; Some(res) } } } impl<'a, T> SliceIterator<'a, T> { pub fn as_slice(&self) -> &[T] { self.0 } pub(crate) fn drop_front(&mut self, n: usize) { self.0 = &self.0[n..]; } pub(crate) fn take_front(&mut self, n: usize) -> &'a [T] { let res = &self.0[..n]; self.0 = &self.0[n..]; res } } vec-collections-0.4.3/src/lib.rs000064400000000000000000000066020072674642500146600ustar 00000000000000//! This crate provides collections (sets and maps) that wrap [SmallVec]. //! //! # Use cases //! //! ## Small collections //! //! It happens very frequently that you have collections that have on average just a very small number of elements. If you know //! the maximum size or even the maximum _typical_ size in advance, you can use this crate to store such collections without allocations. //! For a larger number of elements, the underlying [SmallVec] will allocate the elements on the heap as a single allocation. //! //! ## Read-heavy collections //! //! Another very frequent pattern is that you have a possibly large collection that is being created once and then used readonly for //! a long time. E.g. lookup tables. In these cases, ease of adding individual new elements is less important than compact in-memory //! representation and lookup performance. This crate provides succinct collections that have only a very small constant overhead over //! the contents of the collections. //! //! # Performance //! //! Performance for bulk creation as well as lookup is better than [BTreeMap]/[BTreeSet] and comparable with [HashMap]/[HashSet] for //! types with a cheap [Ord] instance, like primitive types, and small to medium sizes. Performance for insertion or removal of //! individual elements to/from large collections is bad, however. This is not the intended use case. //! //! # Collections overview //! //! ## [VecSet] //! //! Provides a set backed by a [SmallVec] of elements. //! //! ## [VecMap] //! //! Provides a map backed by a [SmallVec] of key value pairs. //! //! ## [RadixTree] //! //! A [RadixTree] that comes in different flavours. //! //! ## [TotalVecSet] //! //! A [VecSet] with an additional flag so it can support negation. This way it is possible to represent e.g. the set of all u64 except 1. //! //! ## [TotalVecMap] //! //! A [VecMap] with an additional default value, so lookup is a total function. //! //! # Unsafe //! //! The in place operations use unsafe code. If that is a problem for you, let me know and I can hide them behind a feature. //! //! [SmallVec]: https://docs.rs/smallvec/1.4.1/smallvec/struct.SmallVec.html //! [VecSet]: struct.VecSet.html //! [VecMap]: struct.VecMap.html //! [TotalVecSet]: struct.TotalVecSet //! [TotalVecMap]: struct.TotalVecMap //! [RadixTree]: radix_tree/struct.RadixTree.html //! [Ord]: https://doc.rust-lang.org/std/cmp/trait.Ord.html //! [BTreeSet]: https://doc.rust-lang.org/std/collections/struct.BTreeSet.html //! [BTreeMap]: https://doc.rust-lang.org/std/collections/struct.BTreeMap.html //! [HashSet]: https://doc.rust-lang.org/std/collections/struct.HashSet.html //! [HashMap]: https://doc.rust-lang.org/std/collections/struct.HashMap.html #[cfg_attr(docsrs, doc(cfg(feature = "rkyv_validated", feature = "radixtree")))] #[cfg(test)] extern crate quickcheck; #[cfg(test)] #[macro_use(quickcheck)] extern crate quickcheck_macros; #[cfg(test)] extern crate maplit; extern crate sorted_iter; pub use sorted_iter::{SortedIterator, SortedPairIterator}; mod merge_state; mod vec_map; mod vec_set; #[cfg(feature = "radixtree")] pub mod radix_tree; #[cfg(feature = "total")] pub mod total_vec_map; #[cfg(feature = "total")] pub mod total_vec_set; #[cfg(feature = "std_support")] pub mod btree_map; mod dedup; mod iterators; mod macros; pub use dedup::{sort_dedup, sort_dedup_by_key}; pub use macros::*; pub use smallvec::Array; pub use vec_map::*; pub use vec_set::*; vec-collections-0.4.3/src/macros.rs000064400000000000000000000027350072674642500154010ustar 00000000000000/// Macro to create a vecset #[macro_export] macro_rules! vecset { () => ({ $crate::VecSet::default() }); ($($x:expr),*$(,)*) => ({ let mut set = $crate::VecSet::default(); $(set.insert($x);)* set }); } /// Macro to create a vecmap #[macro_export] macro_rules! vecmap { ($($key:expr => $value:expr,)+) => { vecmap!($($key => $value),+) }; ($($key:expr => $value:expr),*) => { { let mut _map = $crate::VecMap::default(); $( let _ = _map.insert($key, $value); )* _map } }; } #[cfg(test)] mod tests { use crate::{VecMap, VecSet}; #[test] fn vecset_macro() { let from_macro_empty: VecSet<[u32; 4]> = vecset! {}; let from_macro: VecSet<[u32; 4]> = vecset! {1,2,3}; let mut manual: VecSet<[u32; 4]> = VecSet::default(); assert_eq!(from_macro_empty, manual); manual.insert(1); manual.insert(2); manual.insert(3); assert_eq!(from_macro, manual); } #[test] fn vecmap_macro() { let from_macro_empty: VecMap<[(u32, u32); 4]> = vecmap! {}; let from_macro: VecMap<[(u32, u32); 4]> = vecmap! {1 => 2, 2 => 4,3 => 6}; let mut manual: VecMap<[(u32, u32); 4]> = VecMap::default(); assert_eq!(from_macro_empty, manual); manual.insert(1, 2); manual.insert(2, 4); manual.insert(3, 6); assert_eq!(from_macro, manual); } } vec-collections-0.4.3/src/merge_state.rs000064400000000000000000000305030072674642500164060ustar 00000000000000#![allow(dead_code)] use crate::iterators::SliceIterator; use binary_merge::{MergeOperation, MergeState}; use core::{fmt, fmt::Debug}; use inplace_vec_builder::{InPlaceSmallVecBuilder, InPlaceVecBuilder}; use smallvec::{Array, SmallVec}; use std::marker::PhantomData; /// A typical write part for the merge state pub(crate) trait MergeStateMut: MergeState { /// Consume n elements of a fn advance_a(&mut self, n: usize, take: bool) -> bool; /// Consume n elements of b fn advance_b(&mut self, n: usize, take: bool) -> bool; } pub(crate) trait MutateInput: MergeStateMut { fn source_slices_mut(&mut self) -> (&mut [Self::A], &[Self::B]); } pub(crate) struct InPlaceMergeState< 'a, A: Array, B: Array, C: Converter = NoConverter, > { pub a: InPlaceSmallVecBuilder<'a, A>, pub b: smallvec::IntoIter, _c: PhantomData, } impl<'a, A: Array, B: Array, C: Converter> InPlaceMergeState<'a, A, B, C> { fn new(a: &'a mut SmallVec, b: SmallVec) -> Self { Self { a: a.into(), b: b.into_iter(), _c: PhantomData, } } } impl<'a, A: Array, B: Array, C: Converter> MergeState for InPlaceMergeState<'a, A, B, C> { type A = A::Item; type B = B::Item; fn a_slice(&self) -> &[A::Item] { self.a.source_slice() } fn b_slice(&self) -> &[B::Item] { self.b.as_slice() } } impl<'a, A: Array, B: Array, C: Converter> MergeStateMut for InPlaceMergeState<'a, A, B, C> { fn advance_a(&mut self, n: usize, take: bool) -> bool { self.a.consume(n, take); true } fn advance_b(&mut self, n: usize, take: bool) -> bool { if take { self.a.extend_from_iter((&mut self.b).map(C::convert), n); } else { for _ in 0..n { let _ = self.b.next(); } } true } } impl<'a, A: Array, B: Array, C: Converter> InPlaceMergeState<'a, A, B, C> { pub fn merge>(a: &'a mut SmallVec, b: SmallVec, o: O, _c: C) { let mut state = Self::new(a, b); o.merge(&mut state); } } /// An in place merge state where the rhs is a reference pub(crate) struct InPlaceSmallVecMergeStateRef< 'a, A: Array, B, C: Converter<&'a B, A::Item> = NoConverter, > { pub(crate) a: InPlaceSmallVecBuilder<'a, A>, pub(crate) b: SliceIterator<'a, B>, _c: PhantomData, } impl<'a, A: Array, B, C: Converter<&'a B, A::Item>> InPlaceSmallVecMergeStateRef<'a, A, B, C> { fn new(a: &'a mut SmallVec, b: &'a impl AsRef<[B]>) -> Self { Self { a: a.into(), b: SliceIterator(b.as_ref()), _c: PhantomData, } } } impl<'a, A: Array, B, C: Converter<&'a B, A::Item>> MergeState for InPlaceSmallVecMergeStateRef<'a, A, B, C> { type A = A::Item; type B = B; fn a_slice(&self) -> &[A::Item] { self.a.source_slice() } fn b_slice(&self) -> &[B] { self.b.as_slice() } } impl<'a, A: Array, B, C: Converter<&'a B, A::Item>> MergeStateMut for InPlaceSmallVecMergeStateRef<'a, A, B, C> where A::Item: Clone, { fn advance_a(&mut self, n: usize, take: bool) -> bool { self.a.consume(n, take); true } fn advance_b(&mut self, n: usize, take: bool) -> bool { if take { self.a.extend_from_iter((&mut self.b).map(C::convert), n); } else { for _ in 0..n { let _ = self.b.next(); } } true } } impl<'a, A, B, C: Converter<&'a B, A::Item>> MutateInput for InPlaceSmallVecMergeStateRef<'a, A, B, C> where A: Array, A::Item: Clone, { fn source_slices_mut(&mut self) -> (&mut [Self::A], &[Self::B]) { (self.a.source_slice_mut(), self.b.as_slice()) } } impl<'a, A: Array, B: 'a, C: Converter<&'a B, A::Item>> InPlaceSmallVecMergeStateRef<'a, A, B, C> { pub fn merge>( a: &'a mut SmallVec, b: &'a impl AsRef<[B]>, o: O, _: C, ) { let mut state = Self::new(a, b); o.merge(&mut state); } } /// An in place merge state where the rhs is a reference pub(crate) struct InPlaceVecMergeStateRef<'a, A, B, C: Converter<&'a B, A> = NoConverter> { pub(crate) a: InPlaceVecBuilder<'a, A>, pub(crate) b: SliceIterator<'a, B>, _c: PhantomData, } impl<'a, A, B, C: Converter<&'a B, A>> InPlaceVecMergeStateRef<'a, A, B, C> { fn new(a: &'a mut Vec, b: &'a impl AsRef<[B]>) -> Self { Self { a: a.into(), b: SliceIterator(b.as_ref()), _c: PhantomData, } } } impl<'a, A, B, C: Converter<&'a B, A>> MergeState for InPlaceVecMergeStateRef<'a, A, B, C> { type A = A; type B = B; fn a_slice(&self) -> &[A] { self.a.source_slice() } fn b_slice(&self) -> &[B] { self.b.as_slice() } } impl<'a, A, B, C: Converter<&'a B, A>> MergeStateMut for InPlaceVecMergeStateRef<'a, A, B, C> where A: Clone, { fn advance_a(&mut self, n: usize, take: bool) -> bool { self.a.consume(n, take); true } fn advance_b(&mut self, n: usize, take: bool) -> bool { if take { self.a.extend_from_iter((&mut self.b).map(C::convert), n); } else { for _ in 0..n { let _ = self.b.next(); } } true } } impl<'a, A, B, C: Converter<&'a B, A>> MutateInput for InPlaceVecMergeStateRef<'a, A, B, C> where A: Clone, { fn source_slices_mut(&mut self) -> (&mut [Self::A], &[Self::B]) { (self.a.source_slice_mut(), self.b.as_slice()) } } impl<'a, A, B: 'a, C: Converter<&'a B, A>> InPlaceVecMergeStateRef<'a, A, B, C> { pub fn merge>(a: &'a mut Vec, b: &'a impl AsRef<[B]>, o: O, _: C) { let mut state = Self::new(a, b); o.merge(&mut state); } } /// A merge state where we only track if elements have been produced, and abort as soon as the first element is produced pub(crate) struct BoolOpMergeState<'a, A, B> { a: SliceIterator<'a, A>, b: SliceIterator<'a, B>, r: bool, } impl<'a, A: Debug, B: Debug> Debug for BoolOpMergeState<'a, A, B> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!( f, "a: {:?}, b: {:?} r: {}", self.a_slice(), self.b_slice(), self.r ) } } impl<'a, A, B> BoolOpMergeState<'a, A, B> { fn new(a: &'a [A], b: &'a [B]) -> Self { Self { a: SliceIterator(a), b: SliceIterator(b), r: false, } } } impl<'a, A, B> BoolOpMergeState<'a, A, B> { pub fn merge>(a: &'a [A], b: &'a [B], o: O) -> bool { let mut state = Self::new(a, b); o.merge(&mut state); state.r } } impl<'a, A, B> MergeState for BoolOpMergeState<'a, A, B> { type A = A; type B = B; fn a_slice(&self) -> &[A] { self.a.as_slice() } fn b_slice(&self) -> &[B] { self.b.as_slice() } } impl<'a, A, B> MergeStateMut for BoolOpMergeState<'a, A, B> { fn advance_a(&mut self, n: usize, take: bool) -> bool { if take { self.r = true; false } else { self.a.drop_front(n); true } } fn advance_b(&mut self, n: usize, take: bool) -> bool { if take { self.r = true; false } else { self.b.drop_front(n); true } } } pub trait Converter { fn convert(value: A) -> B; } /// A converter that does not work. Use this only if you are sure it will never be used. pub struct NoConverter; impl Converter for NoConverter { fn convert(_: A) -> B { panic!("conversion not possible") } } /// The clone converter that clones the value pub struct CloneConverter; impl Converter<&A, A> for CloneConverter { fn convert(value: &A) -> A { value.clone() } } /// The identity converter that just passes through the value pub struct IdConverter; impl Converter for IdConverter { fn convert(value: A) -> A { value } } /// A merge state where we build into a new smallvec pub(crate) struct SmallVecMergeState<'a, A, B, Arr: Array, C: Converter<&'a B, A> = NoConverter> { pub a: SliceIterator<'a, A>, pub b: SliceIterator<'a, B>, pub r: SmallVec, _c: PhantomData, } impl<'a, A: Debug, B: Debug, Arr: Array> Debug for SmallVecMergeState<'a, A, B, Arr> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "a: {:?}, b: {:?}", self.a_slice(), self.b_slice(),) } } impl<'a, A, B, Arr: Array, C: Converter<&'a B, A>> SmallVecMergeState<'a, A, B, Arr, C> { fn new(a: &'a [A], b: &'a [B], r: SmallVec) -> Self { Self { a: SliceIterator(a), b: SliceIterator(b), r, _c: PhantomData, } } pub fn into_vec(self) -> SmallVec { self.r } pub fn merge>(a: &'a [A], b: &'a [B], o: O, _c: C) -> SmallVec { let t: SmallVec = SmallVec::new(); let mut state = Self::new(a, b, t); o.merge(&mut state); state.into_vec() } } impl<'a, A, B, Arr: Array, C: Converter<&'a B, A>> MergeState for SmallVecMergeState<'a, A, B, Arr, C> { type A = A; type B = B; fn a_slice(&self) -> &[A] { self.a.as_slice() } fn b_slice(&self) -> &[B] { self.b.as_slice() } } impl<'a, A: Clone, B, Arr: Array, C: Converter<&'a B, A>> MergeStateMut for SmallVecMergeState<'a, A, B, Arr, C> { fn advance_a(&mut self, n: usize, take: bool) -> bool { if take { self.r.reserve(n); for e in self.a.take_front(n).iter() { self.r.push(e.clone()) } } else { self.a.drop_front(n); } true } fn advance_b(&mut self, n: usize, take: bool) -> bool { if take { self.r.reserve(n); for e in self.b.take_front(n).iter() { self.r.push(C::convert(e)) } } else { self.b.drop_front(n); } true } } /// A merge state where we build into a new vec pub(crate) struct VecMergeState<'a, A, B, R, AC, BC> { pub a: SliceIterator<'a, A>, pub b: SliceIterator<'a, B>, pub r: Vec, _c: PhantomData<(AC, BC)>, } impl<'a, A: Debug, B: Debug, R, AC, BC> Debug for VecMergeState<'a, A, B, R, AC, BC> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "a: {:?}, b: {:?}", self.a_slice(), self.b_slice(),) } } impl<'a, A, B, R, AC: Converter<&'a A, R>, BC: Converter<&'a B, R>> VecMergeState<'a, A, B, R, AC, BC> { fn new(a: &'a [A], b: &'a [B], r: Vec) -> Self { Self { a: SliceIterator(a), b: SliceIterator(b), r, _c: PhantomData, } } fn into_vec(self) -> Vec { self.r } pub fn merge>( a: &'a [A], b: &'a [B], o: O, _ac: AC, _bc: BC, ) -> Vec { let t: Vec = Vec::new(); let mut state = Self::new(a, b, t); o.merge(&mut state); state.into_vec() } } impl<'a, A, B, R, AC, BC> MergeState for VecMergeState<'a, A, B, R, AC, BC> { type A = A; type B = B; fn a_slice(&self) -> &[A] { self.a.as_slice() } fn b_slice(&self) -> &[B] { self.b.as_slice() } } impl<'a, A, B, R, AC: Converter<&'a A, R>, BC: Converter<&'a B, R>> MergeStateMut for VecMergeState<'a, A, B, R, AC, BC> { fn advance_a(&mut self, n: usize, take: bool) -> bool { if take { self.r.reserve(n); for e in self.a.take_front(n).iter() { self.r.push(AC::convert(e)) } } else { self.a.drop_front(n); } true } fn advance_b(&mut self, n: usize, take: bool) -> bool { if take { self.r.reserve(n); for e in self.b.take_front(n).iter() { self.r.push(BC::convert(e)) } } else { self.b.drop_front(n); } true } } vec-collections-0.4.3/src/radix_tree/arc_radix_tree.rs000064400000000000000000000225620072674642500212160ustar 00000000000000use super::internals; use internals::{AbstractRadixTreeMut as _, Fragment}; use lazy_static::lazy_static; use std::{collections::BTreeMap, sync::Arc}; use super::{location, offset_from, AbstractRadixTree, RadixTree, TKey, TValue}; use rkyv::{ de::SharedDeserializeRegistry, ser::{ScratchSpace, Serializer, SharedSerializeRegistry}, vec::ArchivedVec, Archive, Archived, Deserialize, Resolver, Serialize, }; lazy_static! { static ref EMPTY_ARC_VEC: Arc> = Arc::new(Vec::new()); } fn empty_arc() -> Arc> { // TODO: this seems to work, but is strictly speaking ub. Get rid of the unsafe unsafe { std::mem::transmute(EMPTY_ARC_VEC.clone()) } } fn wrap_in_arc(data: Vec) -> Arc> { if data.is_empty() { empty_arc() } else { Arc::new(data) } } /// A generic radix tree with structural sharing and copy on write /// /// Compared to the simplest radix tree, this adds cheap (O(1)) snapshots and enables incremental #[derive(Clone)] pub struct ArcRadixTree where K: TKey, V: TValue, { prefix: Fragment, value: Option, children: Arc>, } impl Default for ArcRadixTree { fn default() -> Self { Self { prefix: Default::default(), value: Default::default(), children: empty_arc(), } } } impl AbstractRadixTree for ArcRadixTree { type Materialized = ArcRadixTree; fn prefix(&self) -> &[K] { &self.prefix } fn value(&self) -> Option<&V> { self.value.as_ref() } fn children(&self) -> &[Self] { self.children_arc().as_ref() } } impl internals::AbstractRadixTreeMut for ArcRadixTree { fn new(prefix: Fragment, value: Option, children: Vec) -> Self { let children = wrap_in_arc(children); Self { prefix, value, children, } } fn value_mut(&mut self) -> &mut Option { &mut self.value } fn prefix_mut(&mut self) -> &mut Fragment { &mut self.prefix } fn children_mut(&mut self) -> &mut Vec { // this is what makes the data structure copy on write. // If we are the sole owner, this will not allocate and be very cheap. // if there is another owner (e.g. an old snapshot), this will clone the array. // // cloning will shrink to fit Arc::make_mut(self.children_arc_mut()) } } impl From> for ArcRadixTree { fn from(value: RadixTree) -> Self { let RadixTree { prefix, value, children, } = value; let children = children.into_iter().map(Self::from).collect::>(); Self::new(prefix, value, children) } } impl ArcRadixTree { fn children_arc(&self) -> &Arc> { &self.children } fn children_arc_mut(&mut self) -> &mut Arc> { &mut self.children } /// copy all arcs that are used internally in this tree, and store them in a BTreeMap /// /// as long as the BTreeMap exists, this will have the effect of disabling reuse for /// all tree nodes and force copies on modification. pub fn all_arcs(&self, into: &mut BTreeMap>>) { let children = self.children_arc(); into.insert(location(children.as_ref()), children.clone()); for child in children.iter() { child.all_arcs(into); } } } impl> From<&ArchivedArcRadixTree> for ArcRadixTree { fn from(value: &ArchivedArcRadixTree) -> Self { let children = value.children().iter().map(Self::from).collect::>(); let children = Arc::new(children); ArcRadixTree { prefix: value.prefix().into(), value: value.value().cloned(), children, } } } impl> AbstractRadixTree for ArchivedArcRadixTree { type Materialized = ArcRadixTree; fn prefix(&self) -> &[K] { &self.prefix } fn value(&self) -> Option<&V> { self.value.as_ref() } fn children(&self) -> &[Self] { &self.children } } pub struct ArcRadixTreeResolver { prefix: Resolver>, value: Resolver>, children: Resolver>>>, } #[repr(C)] pub struct ArchivedArcRadixTree where K: TKey, V: TValue, { prefix: Archived>, value: Archived>, children: Archived>>>, } impl<'a, K: TKey, V: TValue> Archive for ArcRadixTree { type Archived = ArchivedArcRadixTree; type Resolver = ArcRadixTreeResolver; unsafe fn resolve(&self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived) { let ArcRadixTreeResolver { prefix, value, children, } = resolver; let ptr = &mut (*out).prefix; ArchivedVec::resolve_from_slice(self.prefix(), pos + offset_from(out, ptr), prefix, ptr); let ptr = &mut (*out).value; self.value() .cloned() .resolve(pos + offset_from(out, ptr), value, ptr); let ptr = &mut (*out).children; self.children_arc() .resolve(pos + offset_from(out, ptr), children, ptr); } } impl Serialize for ArcRadixTree where K: TKey + Serialize, V: TValue + Serialize, S: ScratchSpace + Serializer + SharedSerializeRegistry, { fn serialize(&self, serializer: &mut S) -> Result { let prefix = rkyv::vec::ArchivedVec::serialize_from_slice(self.prefix(), serializer)?; let value = self.value().cloned().serialize(serializer)?; let arc = self.children_arc(); let arc: &Arc>> = unsafe { std::mem::transmute(arc) }; let children = arc.serialize(serializer)?; Ok(ArcRadixTreeResolver { prefix, value, children, }) } } impl Deserialize, D> for ArchivedArcRadixTree where D: SharedDeserializeRegistry, K: TKey, V: TValue, Archived: Deserialize, Archived: Deserialize, { fn deserialize(&self, deserializer: &mut D) -> Result, D::Error> { let prefix: Vec = self.prefix.deserialize(deserializer)?; let value: Option = self.value.deserialize(deserializer)?; let children: Arc>> = self.children.deserialize(deserializer)?; Ok(ArcRadixTree { prefix: Fragment::from(prefix.as_ref()), value, children, }) } } #[cfg(feature = "rkyv_validated")] mod validation_support { use super::{TKey, TValue}; use bytecheck::CheckBytes; use core::fmt; use rkyv::{ validation::{ArchiveContext, SharedContext}, Archived, }; use super::ArchivedArcRadixTree; /// Validation error for a radix tree #[derive(Debug)] pub enum ArchivedRadixTreeError { /// error with the prefix Prefix, /// error with the value Value, /// error with the children Children(String), /// error with the order of the children Order, } impl std::error::Error for ArchivedRadixTreeError {} impl std::fmt::Display for ArchivedRadixTreeError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{:?}", self) } } impl bytecheck::CheckBytes for ArchivedArcRadixTree where C: ?Sized + ArchiveContext + SharedContext, C::Error: std::error::Error, K: TKey, V: TValue, Archived>: bytecheck::CheckBytes, Archived>: bytecheck::CheckBytes, { type Error = ArchivedRadixTreeError; unsafe fn check_bytes<'a>( this: *const Self, context: &mut C, ) -> Result<&'a Self, Self::Error> { let Self { prefix, value, children, } = &(*this); // check the prefix CheckBytes::check_bytes(prefix, context).map_err(|_| ArchivedRadixTreeError::Prefix)?; // check the value, if present CheckBytes::check_bytes(value, context).map_err(|_| ArchivedRadixTreeError::Value)?; // check that the prefix of all children is of non zero length if !children.iter().all(|child| !child.prefix.is_empty()) { return Err(ArchivedRadixTreeError::Children( "empty child prefix".into(), )); }; // check the order of the children if !children .iter() .zip(children.iter().skip(1)) .all(|(a, b)| a.prefix[0] < b.prefix[0]) { return Err(ArchivedRadixTreeError::Order); }; // recursively check the children CheckBytes::check_bytes(children, context) .map_err(|e| ArchivedRadixTreeError::Children(e.to_string()))?; Ok(&*this) } } } vec-collections-0.4.3/src/radix_tree/flat_radix_tree.rs000064400000000000000000000224440072674642500213760ustar 00000000000000use super::{internals, AbstractRadixTree, AbstractRadixTreeMut, Fragment, TKey, TValue}; use std::fmt::Debug; use std::iter::FromIterator; /// A generic radix tree #[derive(Debug, Clone, PartialEq, Eq)] pub struct RadixTree { pub(crate) prefix: Fragment, pub(crate) value: Option, pub(crate) children: Vec, } impl AbstractRadixTree for RadixTree { type Materialized = RadixTree; fn prefix(&self) -> &[K] { &self.prefix } fn value(&self) -> Option<&V> { self.value.as_ref() } fn children(&self) -> &[Self] { &self.children } } impl, V: TValue> FromIterator<(K, V)> for RadixTree { fn from_iter>(iter: T) -> Self { let mut res = RadixTree::default(); for (k, v) in iter.into_iter() { res.insert(k.as_ref(), v) } res } } impl internals::AbstractRadixTreeMut for RadixTree { fn new(prefix: Fragment, value: Option, children: Vec) -> Self { Self { prefix, value, children, } } fn value_mut(&mut self) -> &mut Option { &mut self.value } fn children_mut(&mut self) -> &mut Vec { &mut self.children } fn prefix_mut(&mut self) -> &mut Fragment { &mut self.prefix } } impl Default for RadixTree { fn default() -> Self { Self { prefix: Fragment::default(), value: None, children: Vec::new(), } } } #[cfg(feature = "rkyv")] mod rkyv_support { use super::super::{internals, offset_from}; use super::{AbstractRadixTree, Fragment, RadixTree, TKey, TValue}; use internals::AbstractRadixTreeMut as _; use rkyv::{ ser::{ScratchSpace, Serializer}, vec::ArchivedVec, Archive, Archived, Deserialize, Fallible, Resolver, Serialize, }; #[repr(C)] pub struct ArchivedRadixTree { prefix: Archived>, value: Archived>, children: Archived>>, } impl std::fmt::Debug for ArchivedRadixTree { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("ArchivedRadixTree").finish_non_exhaustive() } } pub struct RadixTreeResolver { prefix: Resolver>, value: Resolver>, children: Resolver>>, } impl> AbstractRadixTree for ArchivedRadixTree { fn prefix(&self) -> &[K] { &self.prefix } fn value(&self) -> Option<&V> { self.value.as_ref() } fn children(&self) -> &[Self] { &self.children } type Materialized = RadixTree; } impl Archive for RadixTree where K: TKey + Archive, V: TValue + Archive, { type Archived = ArchivedRadixTree; type Resolver = RadixTreeResolver; unsafe fn resolve(&self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived) { let RadixTreeResolver { prefix, value, children, } = resolver; let ptr = &mut (*out).prefix; ArchivedVec::resolve_from_slice( self.prefix(), pos + offset_from(out, ptr), prefix, ptr, ); let ptr = &mut (*out).value; self.value() .cloned() .resolve(pos + offset_from(out, ptr), value, ptr); let ptr = &mut (*out).children; ArchivedVec::resolve_from_slice( self.children(), pos + offset_from(out, ptr), children, ptr, ); } } impl Serialize for RadixTree where K: TKey + Serialize, V: TValue + Serialize, S: ScratchSpace + Serializer, { fn serialize(&self, serializer: &mut S) -> Result { let prefix = ArchivedVec::serialize_from_slice(self.prefix(), serializer)?; let value = self.value().cloned().serialize(serializer)?; let children = ArchivedVec::serialize_from_slice(self.children(), serializer)?; Ok(RadixTreeResolver { prefix, value, children, }) } } impl Deserialize, D> for ArchivedRadixTree where D: Fallible + ?Sized, K: TKey, V: TValue, Archived: Deserialize, Archived: Deserialize, { fn deserialize(&self, deserializer: &mut D) -> Result, D::Error> { let prefix: Vec = self.prefix.deserialize(deserializer)?; let value: Option = self.value.deserialize(deserializer)?; let children: Vec> = self.children.deserialize(deserializer)?; Ok(RadixTree::new( Fragment::from(prefix.as_ref()), value, children, )) } } #[cfg(feature = "rkyv_validated")] mod validation_support { use super::{TKey, TValue}; use bytecheck::CheckBytes; use core::fmt; use rkyv::{validation::ArchiveContext, Archived}; use super::ArchivedRadixTree; /// Validation error for a radix tree #[derive(Debug)] pub enum ArchivedRadixTreeError { /// error with the prefix Prefix, /// error with the value Value, /// error with the children Children, /// error with the order of the children Order, } impl std::error::Error for ArchivedRadixTreeError {} impl std::fmt::Display for ArchivedRadixTreeError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{:?}", self) } } impl bytecheck::CheckBytes for ArchivedRadixTree where C: ?Sized + ArchiveContext, C::Error: std::error::Error, K: TKey, V: TValue, Archived>: bytecheck::CheckBytes, Archived>: bytecheck::CheckBytes, { type Error = ArchivedRadixTreeError; unsafe fn check_bytes<'a>( this: *const Self, context: &mut C, ) -> Result<&'a Self, Self::Error> { let Self { prefix, value, children, } = &(*this); // check the prefix CheckBytes::check_bytes(prefix, context) .map_err(|_| ArchivedRadixTreeError::Prefix)?; // check the value, if present CheckBytes::check_bytes(value, context) .map_err(|_| ArchivedRadixTreeError::Value)?; // check that the prefix of all children is of non zero length if !children.iter().all(|child| !child.prefix.is_empty()) { return Err(ArchivedRadixTreeError::Children); }; // check the order of the children if !children .iter() .zip(children.iter().skip(1)) .all(|(a, b)| a.prefix[0] < b.prefix[0]) { return Err(ArchivedRadixTreeError::Order); }; // recursively check the children CheckBytes::check_bytes(children, context) .map_err(|_| ArchivedRadixTreeError::Children)?; Ok(&*this) } } } } #[cfg(feature = "rkyv")] #[cfg(test)] mod tests { use super::{AbstractRadixTree, AbstractRadixTreeMut, RadixTree}; fn mk_string(n: usize) -> String { let text = n.to_string(); text.chars() .flat_map(|c| std::iter::repeat(c).take(100)) .collect::() } #[test] fn archive_smoke() { let mut a = RadixTree::empty(); for i in 0..1000 { a.insert(mk_string(i).as_bytes(), ()); } use rkyv::*; use ser::Serializer; let mut serializer = ser::serializers::AllocSerializer::<256>::default(); serializer.serialize_value(&a).unwrap(); let bytes = serializer.into_serializer().into_inner(); let archived = unsafe { rkyv::archived_root::>(&bytes) }; println!("size: {}", bytes.len()); println!( "key size:{}", archived .iter() .map(|(k, _)| k.as_ref().len()) .sum::() ); // hexdump::hexdump(&bytes); // println!("{:#?}", a); // println!("{}", hex::encode(&bytes)); let _result: RadixTree = archived.deserialize(&mut Infallible).unwrap(); // println!("{:#?}", result); } } vec-collections-0.4.3/src/radix_tree/lazy_radix_tree.rs000064400000000000000000000221720072674642500214250ustar 00000000000000use super::{internals, location, offset_from, AbstractRadixTree, Fragment, RadixTree, TKey}; use rkyv::{ ser::{ScratchSpace, Serializer, SharedSerializeRegistry}, vec::ArchivedVec, Archive, Archived, Resolver, Serialize, }; use std::{collections::BTreeMap, sync::Arc}; pub trait TValue: Debug + Clone + Archive + Send + Sync + 'static {} impl + Send + Sync + 'static> TValue for T {} /// A radix tree with structural sharing and copy on write, that is lazily loaded from an rkyv archive /// /// Since this is lazily loaded from a byte slice, it can only live as long as the byte slice. Therefore /// it needs to have a lifetime parameter. /// /// This is even more experimental than the other radix tree stuff! #[allow(clippy::type_complexity)] #[derive(Clone)] pub struct LazyRadixTree<'a, K, V> where K: TKey, V: TValue, { prefix: Fragment, value: Option, /// the children are lazy loaded at the time of first access. children: Lazy<&'a [Archived>], Arc>>, } impl<'a, K: TKey, V: TValue> Default for LazyRadixTree<'a, K, V> { fn default() -> Self { Self { prefix: Default::default(), value: Default::default(), children: Default::default(), } } } impl<'a, K: TKey, V: TValue> AbstractRadixTree for LazyRadixTree<'a, K, V> { type Materialized = LazyRadixTree<'a, K, V>; fn prefix(&self) -> &[K] { &self.prefix } fn value(&self) -> Option<&V> { self.value.as_ref() } fn children(&self) -> &[Self] { self.children_arc().as_ref() } } impl<'a, K: TKey, V: TValue> internals::AbstractRadixTreeMut for LazyRadixTree<'a, K, V> { fn new(prefix: Fragment, value: Option, children: Vec) -> Self { let children = Lazy::initialized(Arc::new(children)); Self { prefix, value, children, } } fn value_mut(&mut self) -> &mut Option { &mut self.value } fn prefix_mut(&mut self) -> &mut Fragment { &mut self.prefix } fn children_mut(&mut self) -> &mut Vec { Arc::make_mut(self.children_arc_mut()) } } impl From> for LazyRadixTree<'static, K, V> { fn from(value: RadixTree) -> Self { let RadixTree { prefix, value, children, } = value; let children = children.into_iter().map(Self::from).collect::>(); let children = Lazy::initialized(Arc::new(children)); Self { prefix, value, children, } } } impl<'a, K: TKey, V: TValue> LazyRadixTree<'a, K, V> { fn children_arc(&self) -> &Arc> { self.children.get_or_create(materialize_shallow) } fn children_arc_mut(&mut self) -> &mut Arc> { self.children.get_or_create_mut(materialize_shallow) } fn maybe_arc(&self) -> Option<&Arc>> { self.children.get() } /// copy all arcs that are used internally in this tree, and store them in a BTreeMap pub fn all_arcs(&self, into: &mut BTreeMap>>) { if let Some(children) = self.maybe_arc() { into.insert(location(children.as_ref()), children.clone()); for child in children.iter() { child.all_arcs(into); } } } } impl<'a, K: TKey + Archive, V: TValue + Archive> From<&'a ArchivedLazyRadixTree> for LazyRadixTree<'a, K, V> { fn from(value: &'a ArchivedLazyRadixTree) -> Self { let children = value.children().iter().map(Self::from).collect::>(); let children = Lazy::initialized(Arc::new(children)); LazyRadixTree { prefix: value.prefix().into(), value: value.value().cloned(), children, } } } impl AbstractRadixTree for ArchivedLazyRadixTree { type Materialized = LazyRadixTree<'static, K, V>; fn prefix(&self) -> &[K] { &self.prefix } fn value(&self) -> Option<&V> { self.value.as_ref() } fn children(&self) -> &[Self] { &self.children } } fn materialize_shallow( children: &[ArchivedLazyRadixTree], ) -> Arc>> { Arc::new( children .iter() .map(|child| LazyRadixTree { prefix: child.prefix.as_ref().into(), value: child.value.as_ref().cloned(), children: Lazy::uninitialized(child.children.as_ref()), }) .collect(), ) } pub struct LazyRadixTreeResolver { prefix: Resolver>, value: Resolver>, children: Resolver>>>, } #[repr(C)] pub struct ArchivedLazyRadixTree where K: TKey, V: TValue, { prefix: Archived>, value: Archived>, children: Archived>>>, } impl<'a, K: TKey, V: TValue> Archive for LazyRadixTree<'a, K, V> { type Archived = ArchivedLazyRadixTree; type Resolver = LazyRadixTreeResolver; unsafe fn resolve(&self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived) { let LazyRadixTreeResolver { prefix, value, children, } = resolver; let ptr = &mut (*out).prefix; ArchivedVec::resolve_from_slice(self.prefix(), pos + offset_from(out, ptr), prefix, ptr); let ptr = &mut (*out).value; self.value() .cloned() .resolve(pos + offset_from(out, ptr), value, ptr); let ptr = &mut (*out).children; self.children_arc() .resolve(pos + offset_from(out, ptr), children, ptr); } } impl<'a, S, K, V> Serialize for LazyRadixTree<'a, K, V> where K: TKey + Serialize, V: TValue + Serialize, S: ScratchSpace + Serializer + SharedSerializeRegistry, { fn serialize(&self, serializer: &mut S) -> Result { let prefix = rkyv::vec::ArchivedVec::serialize_from_slice(self.prefix(), serializer)?; let value = self.value().cloned().serialize(serializer)?; let arc = self.children_arc(); let arc: &Arc>> = unsafe { std::mem::transmute(arc) }; let children = arc.serialize(serializer)?; Ok(LazyRadixTreeResolver { prefix, value, children, }) } } use core::cell::UnsafeCell; use parking_lot::Mutex; use std::fmt::Debug; /// Utility for a lazily initialized value #[derive(Default)] struct Lazy { mutex: Mutex<()>, data: UnsafeCell>, } unsafe impl Send for Lazy {} impl Debug for Lazy { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("Lazy").finish_non_exhaustive() } } impl Clone for Lazy { fn clone(&self) -> Self { let guard = self.mutex.lock(); let data = unsafe { (&*self.data.get()).clone() }; drop(guard); Self { mutex: Mutex::new(()), data: UnsafeCell::new(data), } } } #[derive(Debug, Clone)] enum Either { A(A), B(B), } impl Default for Either { fn default() -> Self { Self::A(A::default()) } } impl Either { fn a_to_b(&mut self, f: impl Fn(A) -> B) { if let Either::A(a) = self { *self = Either::B(f(*a)) } } } impl Lazy { pub fn uninitialized(data: A) -> Self { Self::new(Either::A(data)) } pub fn initialized(data: B) -> Self { Self::new(Either::B(data)) } pub fn get(&self) -> Option<&B> { let guard = self.mutex.lock(); let res = unsafe { if let Either::B(b) = &*self.data.get() { Some(b) } else { None } }; drop(guard); res } pub fn get_or_create(&self, f: impl Fn(A) -> B) -> &B { unsafe { let guard = self.mutex.lock(); let data: &mut Either = &mut *self.data.get(); data.a_to_b(f); drop(guard); if let Either::B(data) = &*self.data.get() { data } else { panic!() } } } pub fn get_or_create_mut(&mut self, f: impl Fn(A) -> B) -> &mut B { unsafe { let guard = self.mutex.lock(); let data: &mut Either = &mut *self.data.get(); data.a_to_b(f); drop(guard); if let Either::B(data) = &mut *self.data.get() { data } else { panic!() } } } fn new(data: Either) -> Self { Self { mutex: Mutex::new(()), data: UnsafeCell::new(data), } } } vec-collections-0.4.3/src/radix_tree/mod.rs000064400000000000000000001737540072674642500170340ustar 00000000000000#![allow(dead_code)] //! A radix tree //! //! The advantage of a radix tree over a collection like a [BTreeMap](std::collections::BTreeMap) or a [HashMap](std::collections::HashMap) //! is that keys are not stored in full. So when keys are very long and commonly have a common prefix, //! a radix tree is a good choice. //! //! Radix trees allow very quick (O(log n)) filtering by prefix, as well as very fast (O(1)) prepending a prefix. //! //! Radix trees in this crate come in three flavours: //! - [RadixTree](RadixTree) is the most straightforward flavour. It does not contain any indirection. //! use this for short lived objects. //! - [ArcRadixTree](ArcRadixTree) allows cheap snapshots and has copy on write semantics. //! use this for a longer lived in memory tree that evolves over time //! - [LazyRadixTree](LazyRadixTree) allows cheap snapshots, copy on write semantics, and lazy loading. //! use this for e.g. memory mapping a giant radix tree from a large file, that does not fit in memory. //! //! No attempt is made to hide the internal structure. E.g. if you want to use a RadixTree as a set, //! this is possible by using unit as value type, but probably not very convenient. use std::{borrow::Borrow, cmp::Ordering, fmt::Debug, marker::PhantomData, ops::Deref, sync::Arc}; /// Trait for everything that is needed for a component to be a radix tree key component pub trait TKey: Debug + Ord + Copy + Archive + Send + Sync + 'static {} impl + Send + Sync + 'static> TKey for T {} /// Trait for everything that is needed for a component to be a radix tree value pub trait TValue: Debug + Clone + Archive + Send + Sync + 'static {} impl TValue for T {} use rkyv::Archive; #[cfg(feature = "lazy_radixtree")] mod lazy_radix_tree; #[cfg(feature = "lazy_radixtree")] pub use lazy_radix_tree::LazyRadixTree; #[cfg(feature = "rkyv")] mod arc_radix_tree; #[cfg(feature = "rkyv")] pub use arc_radix_tree::ArcRadixTree; use smallvec::SmallVec; use sorted_iter::sorted_pair_iterator::SortedByKey; mod flat_radix_tree; use crate::merge_state::{ BoolOpMergeState, Converter, InPlaceVecMergeStateRef, MergeStateMut, MutateInput, NoConverter, VecMergeState, }; use binary_merge::MergeOperation; pub use flat_radix_tree::RadixTree; // common prefix of two slices. fn common_prefix<'a, T: Eq>(a: &'a [T], b: &'a [T]) -> usize { a.iter().zip(b).take_while(|(a, b)| a == b).count() } pub(crate) mod internals { use super::*; /// A path fragment #[derive(Debug, Clone, PartialEq, Eq)] pub struct Fragment(SmallVec<[T; 16]>); impl AsRef<[T]> for Fragment { fn as_ref(&self) -> &[T] { self.0.as_ref() } } impl Borrow<[T]> for Fragment { fn borrow(&self) -> &[T] { self.0.as_ref() } } impl Deref for Fragment { type Target = [T]; fn deref(&self) -> &[T] { self.as_ref() } } impl<'a, T: Clone> From<&'a [T]> for Fragment { fn from(value: &'a [T]) -> Self { Self(value.into()) } } impl From> for Fragment { fn from(value: SmallVec<[T; 16]>) -> Self { Self(value) } } impl Ord for Fragment { fn cmp(&self, other: &Self) -> std::cmp::Ordering { self.0[0].cmp(&other.0[0]) } } impl PartialOrd for Fragment { fn partial_cmp(&self, other: &Self) -> Option { Some(self.cmp(other)) } } impl Default for Fragment { fn default() -> Self { Self(SmallVec::new()) } } /// implement this trait for a new flavour of radix tree. The public AbstractRadixTreeMut will be implemented for you. /// /// this is in a private module since it allows you to break the invariants of the tree. pub trait AbstractRadixTreeMut: AbstractRadixTree + Clone + Default { /// Creates a new, possibly non-canonical node /// /// because this allows the creation of a non-canonical node, which is sometimes necessary /// for intermediate states, it must not be publicly exposed. fn new(prefix: Fragment, value: Option, children: Vec) -> Self; fn value_mut(&mut self) -> &mut Option; fn children_mut(&mut self) -> &mut Vec; fn prefix_mut(&mut self) -> &mut Fragment; /// create an artificial split at offset n /// splitting at n >= prefix.len() is an error fn split(&mut self, n: usize) { assert!(n < self.prefix().len()); let first = self.prefix()[..n].into(); let rest = self.prefix()[n..].into(); let mut split = Self::new(first, None, Vec::new()); std::mem::swap(self, &mut split); let mut child = split; *child.prefix_mut() = rest; self.children_mut().push(child); } /// removes degenerate node again fn unsplit(&mut self) { // remove all empty children // this might sometimes not be necessary, but it is tricky to find out when. self.children_mut().retain(|x| !x.is_empty()); // a single child and no own value is degenerate if self.children().len() == 1 && self.value().is_none() { let mut child = self.children_mut().pop().unwrap(); child.prepend0(self.prefix()); *self = child; } // canonicalize prefix for empty node // this might sometimes not be necessary, but it is tricky to find out when. if self.is_empty() { *self.prefix_mut() = Fragment::default(); } } fn prepend0(&mut self, prefix: &[K]) { if !prefix.is_empty() && !self.is_empty() { let mut prefix1 = SmallVec::new(); prefix1.extend_from_slice(prefix); prefix1.extend_from_slice(self.prefix()); *self.prefix_mut() = prefix1.into(); } } fn outer_combine_children_with(&mut self, rhs: &[R], f: F) where R: AbstractRadixTree, F: Fn(&mut V, &V) -> bool + Copy, { InPlaceVecMergeStateRef::merge( self.children_mut(), &rhs, OuterCombineOp(f, PhantomData), RadixTreeConverter(PhantomData), ); } fn inner_combine_children_with(&mut self, rhs: &[R], f: F) where W: TValue, R: AbstractRadixTree, F: Fn(&mut V, &W) -> bool + Copy, { InPlaceVecMergeStateRef::merge( self.children_mut(), &rhs, InnerCombineOp(f, PhantomData), NoConverter, ); } fn left_combine_children_with(&mut self, rhs: &[R], f: F) where W: TValue, R: AbstractRadixTree, F: Fn(&mut V, &W) -> bool + Copy, { InPlaceVecMergeStateRef::merge( self.children_mut(), &rhs, LeftCombineOp(f, PhantomData), NoConverter, ); } fn retain_prefix_children_with(&mut self, rhs: &[R], f: impl Fn(&W) -> bool + Copy) where W: TValue, R: AbstractRadixTree, { InPlaceVecMergeStateRef::merge( self.children_mut(), &rhs, RetainPrefixOp(f, PhantomData), NoConverter, ); } fn remove_prefix_children_with(&mut self, rhs: &[R], f: F) where W: TValue, R: AbstractRadixTree, F: Fn(&W) -> bool + Copy, { InPlaceVecMergeStateRef::merge( self.children_mut(), &rhs, RemovePrefixOp(f, PhantomData), NoConverter, ); } } } use internals::{AbstractRadixTreeMut as _, Fragment}; /// Interface to a mutable abstract radix tree that allows mutation. /// /// Most operations are meant to be generically useful. E.g. pub trait AbstractRadixTreeMut: internals::AbstractRadixTreeMut { /// Create an empty tree fn empty() -> Self { Self::default() } /// Create a leaf tree - with just a value, but no prefix and no children fn leaf(value: V) -> Self { Self::new(Fragment::default(), Some(value), Default::default()) } /// Create a tree containing a single key/value pair fn single(key: &[K], value: V) -> Self { Self::new(key.into(), Some(value), Vec::new()) } /// Insert a mapping. Will replace existing mapping. fn insert(&mut self, key: &[K], value: V) { self.outer_combine_with(&Self::single(key, value), |a, b| { *a = b.clone(); true }) } /// Return the subtree with the given prefix. Will return an empty tree in case there is no match. fn filter_prefix(&self, prefix: &[K]) -> Self { match find(self, prefix) { FindResult::Found(tree) => { let mut res = tree.clone(); *res.prefix_mut() = prefix.into(); res } FindResult::Prefix { tree, rt } => { let mut res = tree.clone(); let p = res.prefix(); *res.prefix_mut() = Fragment::from(&p[p.len() - rt..]); res.prepend(prefix); res } FindResult::NotFound { .. } => Self::default(), } } /// Prepend a prefix to the tree fn prepend(&mut self, prefix: &[K]) { if !prefix.is_empty() && !self.is_empty() { let mut prefix1 = SmallVec::new(); prefix1.extend_from_slice(prefix); prefix1.extend_from_slice(self.prefix()); *self.prefix_mut() = prefix1.into(); } } /// Left biased union with another tree of the same key and value type /// /// If you want a right biased union, you can implement it with [outer_combine](AbstractRadixTree::outer_combine). fn union( &self, that: &impl AbstractRadixTree, ) -> Self::Materialized { self.outer_combine(that, |a, _| Some(a.clone())) } /// In place left biased union with another tree of the same key and value type /// /// If you want a right biased union, you can implement it with [outer_combine_with](AbstractRadixTreeMut::outer_combine_with). fn union_with( &mut self, that: &impl AbstractRadixTree, ) { self.outer_combine_with(that, |_, _| true) } /// Intersection with another tree of the same key type fn intersection(&self, that: &impl AbstractRadixTree) -> Self::Materialized { self.inner_combine(that, |a, _| Some(a.clone())) } /// In place intersection with another tree of the same key type fn intersection_with(&mut self, that: &impl AbstractRadixTree) { self.inner_combine_with(that, |_, _| true) } /// Difference with another tree of the same key type fn difference(&self, that: &impl AbstractRadixTree) -> Self::Materialized { self.left_combine( that, |a, b| if b.is_none() { Some(a.clone()) } else { None }, ) } /// In place difference with another tree of the same key type fn difference_with(&mut self, that: &impl AbstractRadixTree) { self.left_combine_with(that, |_, _| false) } /// outer combine of `self` tree with `that` tree /// /// outer means that elements that are in `self` but not in `that` or vice versa are copied. /// for elements that are in both trees, it is possible to customize how they are combined. /// `f` can mutate the value of `self` in place, or return false to remove the value. fn outer_combine_with( &mut self, that: &impl AbstractRadixTree, f: impl Fn(&mut V, &V) -> bool + Copy, ) { let n = common_prefix(self.prefix(), that.prefix()); if n == self.prefix().len() && n == that.prefix().len() { // prefixes are identical if let Some(w) = that.value() { if let Some(v) = &mut self.value_mut() { if !f(v, w) { *self.value_mut() = None; } } else { *self.value_mut() = Some(w.clone()) } } self.outer_combine_children_with(that.children(), f); } else if n == self.prefix().len() { // self is a prefix of that let that = that.materialize_shortened(n); self.outer_combine_children_with(&[that], f); } else if n == that.prefix().len() { // that is a prefix of self // split at the offset, then merge in that // we must not swap sides! self.split(n); // self now has the same prefix as that, so just repeat the code // from where prefixes are identical if let Some(w) = that.value() { if let Some(v) = &mut self.value_mut() { if !f(v, w) { *self.value_mut() = None; } } else { *self.value_mut() = Some(w.clone()) } } self.outer_combine_children_with(that.children(), f); } else { // disjoint self.split(n); self.children_mut().push(that.materialize_shortened(n)); self.children_mut().sort_by_key(|x| x.prefix()[0]); } self.unsplit(); } /// inner combine of `self` tree with `that` tree /// /// inner means that elements that are in `self` but not in `that` or vice versa are removed. /// for elements that are in both trees, it is possible to customize how they are combined. /// `f` can mutate the value of `self` in place, or return false to remove the value. fn inner_combine_with( &mut self, that: &impl AbstractRadixTree, f: impl Fn(&mut V, &W) -> bool + Copy, ) { let n = common_prefix(self.prefix(), that.prefix()); if n == self.prefix().len() && n == that.prefix().len() { // prefixes are identical if let (Some(v), Some(w)) = (self.value_mut(), that.value()) { if !f(v, w) { *self.value_mut() = None; } } else { *self.value_mut() = None; } self.inner_combine_children_with(that.children(), f); } else if n == self.prefix().len() { // self is a prefix of that *self.value_mut() = None; let that = that.materialize_shortened(n); self.inner_combine_children_with(&[that], f); } else if n == that.prefix().len() { // that is a prefix of self // split at the offset, then merge in that // we must not swap sides! self.split(n); self.inner_combine_children_with(that.children(), f); } else { // disjoint *self.value_mut() = None; self.children_mut().clear(); } self.unsplit(); } /// Left combine of `self` tree with `that` tree /// /// Left means that elements that are in `self` but not in `that` are kept, but elements that /// are in `that` but not in `self` are dropped. /// /// For elements that are in both trees, it is possible to customize how they are combined. /// `f` can mutate the value of `self` in place, or return false to remove the value. fn left_combine_with( &mut self, that: &impl AbstractRadixTree, f: impl Fn(&mut V, &W) -> bool + Copy, ) { let n = common_prefix(self.prefix(), that.prefix()); if n == self.prefix().len() && n == that.prefix().len() { // prefixes are identical if let Some(w) = that.value() { if let Some(v) = self.value_mut() { if !f(v, w) { *self.value_mut() = None; } } } self.left_combine_children_with(that.children(), f); } else if n == self.prefix().len() { // self is a prefix of that let that = that.materialize_shortened(n); self.left_combine_children_with(&[that], f); } else if n == that.prefix().len() { // that is a prefix of self self.split(n); self.left_combine_children_with(that.children(), f); } else { // disjoint, nothing to do } self.unsplit(); } /// Remove all parts of the tree for which that contains a prefix. /// /// The predicate `f` is used to filter the tree `that` before applying it. /// If the predicate returns always false, this will be a noop. fn remove_prefix_with( &mut self, that: &impl AbstractRadixTree, f: impl Fn(&W) -> bool + Copy, ) { let n = common_prefix(self.prefix(), that.prefix()); if n == self.prefix().len() && n == that.prefix().len() { // prefixes are identical match that.value() { Some(value) if f(value) => { *self.value_mut() = None; self.children_mut().clear(); } _ => { self.remove_prefix_children_with(that.children(), f); } } } else if n == that.prefix().len() { // that is a prefix of self match that.value() { Some(value) if f(value) => { *self.value_mut() = None; self.children_mut().clear(); } _ => { self.split(n); self.remove_prefix_children_with(that.children(), f); } } } else if n == self.prefix().len() { // self is a prefix of that let that = that.materialize_shortened(n); self.remove_prefix_children_with(&[that], f); } else { // disjoint, nothing to do } self.unsplit(); } /// Retain all parts of the tree for which that contains a prefix. /// /// The predicate `f` is used to filter the tree `that` before applying it. /// If the predicate returns always false, this will result in the empty tree. fn retain_prefix_with( &mut self, that: &impl AbstractRadixTree, f: impl Fn(&W) -> bool + Copy, ) { let n = common_prefix(self.prefix(), that.prefix()); if n == self.prefix().len() && n == that.prefix().len() { // prefixes are identical if that.value().is_none() || !f(that.value().unwrap()) { *self.value_mut() = None; self.retain_prefix_children_with(that.children(), f); } } else if n == that.prefix().len() { // that is a prefix of self if that.value().is_none() || !f(that.value().unwrap()) { self.split(n); self.retain_prefix_children_with(that.children(), f); } // otherwise, keep it all } else if n == self.prefix().len() { // self is a prefix of that *self.value_mut() = None; let that = that.materialize_shortened(n); self.retain_prefix_children_with(&[that], f); } else { // disjoint, nuke it *self.value_mut() = None; self.children_mut().clear(); } self.unsplit(); } } /// Implement the public AbstractRadixTreeMut for everything that has internals::AbstractRadixTreeMut implemented, /// which can only be in this crate. impl> AbstractRadixTreeMut for T { } /// Trait to abstract over radix trees. /// /// This is mostly for DRYing the various flavours of radix trees in this crate as well as their rkyved versions. pub trait AbstractRadixTree: Sized { /// The prefix of this node. May only be empty for the top level node of a tree fn prefix(&self) -> &[K]; /// The optional value fn value(&self) -> Option<&V>; /// The children fn children(&self) -> &[Self]; /// Type of a materialized, mutable version of this tree type Materialized: AbstractRadixTreeMut; /// True if the tree is empty fn is_empty(&self) -> bool { self.value().is_none() && self.children().is_empty() } /// true if two maps have values at the same keys fn intersects(&self, that: &impl AbstractRadixTree) -> bool { intersects(self, that) } /// true if two maps have no values at the same keys fn is_disjoint(&self, that: &impl AbstractRadixTree) -> bool { !intersects(self, that) } /// iterate over all elements fn iter<'a>(&'a self) -> Iter<'a, K, V, Self> where K: 'a, { Iter::new(self, IterKey::new(self.prefix())) } /// iterate over all elements fn into_iter(self) -> ObjAndIter> { ObjAndIter::new(Box::new(self), |x| x.iter()) } /// iterate over all values - this is cheaper than iterating over elements, since it does not have to build the keys from fragments fn values<'a>(&'a self) -> Values<'a, K, V, Self> where K: 'a, { Values::new(self) } /// True if key is contained in this set fn contains_key(&self, key: &[K]) -> bool { // if we find a tree at exactly the location, and it has a value, we have a hit if let FindResult::Found(tree) = find(self, key) { tree.value().is_some() } else { false } } /// Get an optional reference to the value for the given key fn get(&self, key: &[K]) -> Option<&V> { // if we find a tree at exactly the location, and it has a value, we have a hit if let FindResult::Found(tree) = find(self, key) { tree.value() } else { None } } /// true if the keys of self are a subset of the keys of that. /// /// a set is considered to be a subset of itself. fn is_subset(&self, that: &impl AbstractRadixTree) -> bool { is_subset(self, that) } /// true if the keys of self are a superset of the keys of that. /// /// a set is considered to be a subset of itself. fn is_superset(&self, that: &impl AbstractRadixTree) -> bool { is_subset(that, self) } fn materialize_shortened(&self, n: usize) -> Self::Materialized { assert!(n < self.prefix().len()); Self::Materialized::new( self.prefix()[n..].into(), self.value().cloned(), self.children() .iter() .map(|x| x.materialize_shortened(0)) .collect(), ) } /// Outer combine this tree with another tree, using the given combine function fn outer_combine( &self, that: &impl AbstractRadixTree, f: impl Fn(&V, &V) -> Option + Copy, ) -> Self::Materialized { outer_combine(self, that, f) } /// Inner combine this tree with another tree, using the given combine function fn inner_combine( &self, that: &impl AbstractRadixTree, f: impl Fn(&V, &W) -> Option + Copy, ) -> Self::Materialized { inner_combine(self, that, f) } /// Left combine this tree with another tree, using the given combine function fn left_combine( &self, that: &impl AbstractRadixTree, f: impl Fn(&V, Option<&W>) -> Option + Copy, ) -> Self::Materialized { left_combine(self, that, f) } /// An iterator for all pairs with a certain prefix fn scan_prefix<'a>(&'a self, prefix: &'a [K]) -> Iter<'a, K, V, Self> { match find(self, prefix) { FindResult::Found(tree) => { let prefix = IterKey::new(prefix); Iter::new(tree, prefix) } FindResult::Prefix { tree, rt } => { let mut prefix = IterKey::new(prefix); let remaining = &tree.prefix()[tree.prefix().len() - rt..]; prefix.append(remaining); Iter::new(tree, prefix) } FindResult::NotFound { .. } => Iter::empty(), } } } enum FindResult { // Found an exact match Found(T), // found a tree for which the path is a prefix, with n remaining chars in the prefix of T Prefix { // a tree of which the searched path is a prefix tree: T, // number of remaining elements in the prefix of the tree rt: usize, }, // did not find anything, T is the closest match, with n remaining (unmatched) in the prefix of T NotFound { // the closest match closest: T, // number of remaining elements in the prefix of the tree rt: usize, // number of remaining elements in the search prefix rp: usize, }, } /// find a prefix in a tree. Will either return /// - Found(tree) if we found the tree exactly, /// - Prefix if we found a tree of which prefix is a prefix /// - NotFound if there is no tree fn find<'a, K: TKey, V: TValue, T: AbstractRadixTree>( tree: &'a T, prefix: &[K], ) -> FindResult<&'a T> { let n = common_prefix(tree.prefix(), prefix); // remaining in prefix let rp = prefix.len() - n; // remaining in tree prefix let rt = tree.prefix().len() - n; if rp == 0 && rt == 0 { // direct hit FindResult::Found(tree) } else if rp == 0 { // tree is a subtree of prefix FindResult::Prefix { tree, rt } } else if rt == 0 { // prefix is a subtree of tree let c = &prefix[n]; if let Ok(index) = tree.children().binary_search_by(|e| e.prefix()[0].cmp(c)) { let child = &tree.children()[index]; find(child, &prefix[n..]) } else { FindResult::NotFound { closest: tree, rp, rt, } } } else { // disjoint, but we still need to store how far we matched FindResult::NotFound { closest: tree, rp, rt, } } } fn materialize(tree: &T) -> T::Materialized where K: Clone, V: Clone, T: AbstractRadixTree, { materialize_shortened(tree, 0) } fn materialize_shortened(tree: &T, n: usize) -> T::Materialized where K: Clone, V: Clone, T: AbstractRadixTree, { assert!(n < tree.prefix().len()); T::Materialized::new( tree.prefix()[n..].into(), tree.value().cloned(), tree.children().iter().map(materialize).collect(), ) } /// Key for iteration /// /// This refers to a temporary key that is being constructed during iteration. Cloning it will make a copy. #[derive(Debug, Clone)] pub struct IterKey(Arc>); impl IterKey { fn new(root: &[K]) -> Self { Self(Arc::new(root.to_vec())) } fn append(&mut self, data: &[K]) { // for typical iterator use, a reference is not kept for a long time, so this will be very cheap // // in the case a reference is kept, this will make a copy. let elems = Arc::make_mut(&mut self.0); elems.extend_from_slice(data); } fn pop(&mut self, n: usize) { let elems = Arc::make_mut(&mut self.0); elems.truncate(elems.len().saturating_sub(n)); } } impl AsRef<[T]> for IterKey { fn as_ref(&self) -> &[T] { self.0.as_ref() } } impl Borrow<[T]> for IterKey { fn borrow(&self) -> &[T] { self.0.as_ref() } } impl core::ops::Deref for IterKey { type Target = [T]; fn deref(&self) -> &Self::Target { self.0.as_ref() } } /// An iterator over the values of a radix tree. /// /// This is more efficient than taking the value part of an entry iteration, because the keys /// do not have to be constructed. pub struct Values<'a, K, V, T> { stack: Vec<(&'a T, usize)>, _p: PhantomData<(K, V)>, } impl<'a, K, V, T> Values<'a, K, V, T> { fn new(tree: &'a T) -> Self { Self { stack: vec![(tree, 0)], _p: PhantomData, } } fn tree(&self) -> &'a T { self.stack.last().unwrap().0 } fn inc(&mut self) -> Option { let pos = &mut self.stack.last_mut().unwrap().1; let res = if *pos == 0 { None } else { Some(*pos - 1) }; *pos += 1; res } } impl<'a, K: TKey, V: TValue, T> Iterator for Values<'a, K, V, T> where T: AbstractRadixTree, { type Item = &'a V; fn next(&mut self) -> Option { while !self.stack.is_empty() { if let Some(pos) = self.inc() { if pos < self.tree().children().len() { self.stack.push((&self.tree().children()[pos], 0)); } else { self.stack.pop(); } } else if let Some(value) = self.tree().value() { return Some(value); } } None } } /// An iterator over the elements (key and value) of a radix tree /// /// A complication of this compared to an iterator for a normal collection is that the keys do /// not acutally exist, but are constructed on demand during iteration. pub struct Iter<'a, K, V, T> { path: IterKey, stack: Vec<(&'a T, usize)>, _v: PhantomData, } impl<'a, K: TKey, V: TValue, T: AbstractRadixTree> Iter<'a, K, V, T> { fn empty() -> Self { Self { stack: Vec::new(), path: IterKey::new(&[]), _v: PhantomData, } } fn new(tree: &'a T, prefix: IterKey) -> Self { Self { stack: vec![(tree, 0)], path: prefix, _v: PhantomData, } } fn tree(&self) -> &'a T { self.stack.last().unwrap().0 } fn inc(&mut self) -> Option { let pos = &mut self.stack.last_mut().unwrap().1; let res = if *pos == 0 { None } else { Some(*pos - 1) }; *pos += 1; res } } impl<'a, K: TKey, V: TValue, T: AbstractRadixTree> SortedByKey for Iter<'a, K, V, T> {} impl<'a, K: TKey, V: 'a + TValue, T: AbstractRadixTree> Iterator for Iter<'a, K, V, T> { type Item = (IterKey, &'a V); fn next(&mut self) -> Option { while !self.stack.is_empty() { if let Some(pos) = self.inc() { if pos < self.tree().children().len() { let child = &self.tree().children()[pos]; self.path.append(child.prefix()); self.stack.push((child, 0)); } else { self.path.pop(self.tree().prefix().len()); self.stack.pop(); } } else if let Some(value) = self.tree().value().as_ref() { return Some((self.path.clone(), value)); } } None } } struct RadixTreeConverter(PhantomData<(K, V)>); impl, K: TKey, V: TValue> Converter<&T, T::Materialized> for RadixTreeConverter { fn convert(value: &T) -> T::Materialized { materialize(value) } } fn is_subset( l: &impl AbstractRadixTree, r: &impl AbstractRadixTree, ) -> bool { is_subset0(l, l.prefix(), r, r.prefix()) } fn is_subset0( l: &impl AbstractRadixTree, l_prefix: &[K], r: &impl AbstractRadixTree, r_prefix: &[K], ) -> bool { let n = common_prefix(l_prefix, r_prefix); if n == l_prefix.len() && n == r_prefix.len() { // prefixes are identical (l.value().is_none() || r.value().is_some()) && !BoolOpMergeState::merge(l.children(), r.children(), NonSubsetOp(PhantomData)) } else if n == l_prefix.len() { // l is a prefix of r - shorten r_prefix let r_prefix = &r_prefix[n..]; // if l has a value but not r, we found one // if one or more of lc are not a subset of r, we are done l.value().is_none() && l.children() .iter() .all(|lc| is_subset0(lc, lc.prefix(), r, r_prefix)) } else if n == r_prefix.len() { // r is a prefix of l - shorten L_prefix let l_prefix = &l_prefix[n..]; // if l is a subset of none of rc, we are done r.children() .iter() .any(|rc| is_subset0(l, l_prefix, rc, rc.prefix())) } else { // disjoint false } } fn intersects( l: &impl AbstractRadixTree, r: &impl AbstractRadixTree, ) -> bool { intersects0(l, l.prefix(), r, r.prefix()) } fn intersects0( l: &impl AbstractRadixTree, l_prefix: &[K], r: &impl AbstractRadixTree, r_prefix: &[K], ) -> bool { let n = common_prefix(l_prefix, r_prefix); if n == l_prefix.len() && n == r_prefix.len() { // prefixes are identical (l.value().is_some() && r.value().is_some()) || BoolOpMergeState::merge(l.children(), r.children(), IntersectOp(PhantomData)) } else if n == l_prefix.len() { // l is a prefix of r let r_prefix = &r_prefix[n..]; l.children() .iter() .any(|lc| intersects0(lc, lc.prefix(), r, r_prefix)) } else if n == r_prefix.len() { // r is a prefix of l let l_prefix = &l_prefix[n..]; r.children() .iter() .any(|rc| intersects0(l, l_prefix, rc, rc.prefix())) } else { // disjoint false } } /// Outer combine two trees with a function f fn outer_combine< K: TKey, V: TValue, R: AbstractRadixTreeMut, A: AbstractRadixTree, B: AbstractRadixTree, >( a: &A, b: &B, f: impl Fn(&V, &V) -> Option + Copy, ) -> R { let n = common_prefix(a.prefix(), b.prefix()); let prefix = a.prefix()[..n].into(); let mut children = Vec::new(); let mut value = None; if n == a.prefix().len() && n == b.prefix().len() { // prefixes are identical value = match (a.value(), b.value()) { (Some(a), Some(b)) => f(a, b), (Some(a), None) => Some(a.clone()), (None, Some(b)) => Some(b.clone()), (None, None) => None, }; children = VecMergeState::merge( a.children(), b.children(), OuterCombineOp(f, PhantomData), RadixTreeConverter(PhantomData), RadixTreeConverter(PhantomData), ); } else if n == a.prefix().len() { // a is a prefix of b let b = b.materialize_shortened(n); value = a.value().cloned(); children = VecMergeState::merge( a.children(), &[b], OuterCombineOp(f, PhantomData), RadixTreeConverter(PhantomData), RadixTreeConverter(PhantomData), ); } else if n == b.prefix().len() { // b is a prefix of a let a = a.materialize_shortened(n); value = b.value().cloned(); children = VecMergeState::merge( &[a], b.children(), OuterCombineOp(f, PhantomData), RadixTreeConverter(PhantomData), RadixTreeConverter(PhantomData), ); } else { // disjoint children.push(a.materialize_shortened(n)); children.push(b.materialize_shortened(n)); children.sort_by_key(|x| x.prefix()[0]); } let mut res = R::new(prefix, value, children); res.unsplit(); res } /// Inner combine two trees with a function f fn inner_combine>( a: &impl AbstractRadixTree, b: &impl AbstractRadixTree, f: impl Fn(&V, &W) -> Option + Copy, ) -> R { let n = common_prefix(a.prefix(), b.prefix()); let prefix = a.prefix()[..n].into(); let mut children = Vec::::new(); let mut value = None; if n == a.prefix().len() && n == b.prefix().len() { // prefixes are identical value = match (a.value(), b.value()) { (Some(a), Some(b)) => f(a, b), _ => None, }; children = VecMergeState::merge( a.children(), b.children(), InnerCombineOp(f, PhantomData), RadixTreeConverter(PhantomData), NoConverter, ); } else if n == a.prefix().len() { // a is a prefix of b let b = b.materialize_shortened(n); children = VecMergeState::merge( a.children(), &[b], InnerCombineOp(f, PhantomData), RadixTreeConverter(PhantomData), NoConverter, ); } else if n == b.prefix().len() { // b is a prefix of a let a = a.materialize_shortened(n); children = VecMergeState::merge( &[a], b.children(), InnerCombineOp(f, PhantomData), RadixTreeConverter(PhantomData), NoConverter, ); } else { // disjoint } let mut res = R::new(prefix, value, children); res.unsplit(); res } /// Left combine two trees with a function f fn left_combine>( a: &impl AbstractRadixTree, b: &impl AbstractRadixTree, f: impl Fn(&V, Option<&W>) -> Option + Copy, ) -> R { let n = common_prefix(a.prefix(), b.prefix()); let mut prefix = a.prefix()[..n].into(); let children; let mut value = None; if n == a.prefix().len() && n == b.prefix().len() { // prefixes are identical value = match (a.value(), b.value()) { (Some(a), b) => f(a, b), _ => None, }; children = VecMergeState::merge( a.children(), b.children(), LeftCombineOp(f, PhantomData), RadixTreeConverter(PhantomData), NoConverter, ); } else if n == a.prefix().len() { // a is a prefix of b let b = b.materialize_shortened(n); value = a.value().cloned(); children = VecMergeState::merge( a.children(), &[b], LeftCombineOp(f, PhantomData), RadixTreeConverter(PhantomData), NoConverter, ); } else if n == b.prefix().len() { // b is a prefix of a let a = a.materialize_shortened(n); children = VecMergeState::merge( &[a], b.children(), LeftCombineOp(f, PhantomData), RadixTreeConverter(PhantomData), NoConverter, ); } else { // disjoint prefix = a.prefix().into(); value = a.value().cloned(); children = a .children() .iter() .map(|x| x.materialize_shortened(0)) .collect(); } let mut res = R::new(prefix, value, children); res.unsplit(); res } struct IntersectOp(PhantomData); impl<'a, K, V, W, I> MergeOperation for IntersectOp<(K, V, W)> where K: TKey, V: TValue, W: TValue, I: MergeStateMut, I::A: AbstractRadixTree, I::B: AbstractRadixTree, { fn cmp(&self, a: &I::A, b: &I::B) -> Ordering { a.prefix()[0].cmp(&b.prefix()[0]) } fn from_a(&self, m: &mut I, n: usize) -> bool { m.advance_a(n, false) } fn from_b(&self, m: &mut I, n: usize) -> bool { m.advance_b(n, false) } fn collision(&self, m: &mut I) -> bool { let a = &m.a_slice()[0]; let b = &m.b_slice()[0]; // if this is true, we have found an intersection and can abort. let take = intersects(a, b); m.advance_a(1, take) && m.advance_b(1, false) } } struct NonSubsetOp(PhantomData); impl<'a, K, V, W, I> MergeOperation for NonSubsetOp<(K, V, W)> where K: TKey, V: TValue, W: TValue, I: MergeStateMut, I::A: AbstractRadixTree, I::B: AbstractRadixTree, { fn cmp(&self, a: &I::A, b: &I::B) -> Ordering { a.prefix()[0].cmp(&b.prefix()[0]) } fn from_a(&self, m: &mut I, n: usize) -> bool { m.advance_a(n, true) } fn from_b(&self, m: &mut I, n: usize) -> bool { m.advance_b(n, false) } fn collision(&self, m: &mut I) -> bool { let a = &m.a_slice()[0]; let b = &m.b_slice()[0]; // if this is true, we have found a value of a that is not in b, and we can abort let take = !a.is_subset(b); m.advance_a(1, take) && m.advance_b(1, false) } } /// In place merge operation struct OuterCombineOp(F, PhantomData

); impl<'a, F, K, V, A, B, C> MergeOperation> for OuterCombineOp where K: TKey, V: TValue, F: Fn(&mut V, &V) -> bool + Copy, B: AbstractRadixTree, C: Converter<&'a B, A>, A: AbstractRadixTreeMut, { fn cmp(&self, a: &A, b: &B) -> Ordering { a.prefix()[0].cmp(&b.prefix()[0]) } fn from_a(&self, m: &mut InPlaceVecMergeStateRef<'a, A, B, C>, n: usize) -> bool { m.advance_a(n, true) } fn from_b(&self, m: &mut InPlaceVecMergeStateRef<'a, A, B, C>, n: usize) -> bool { m.advance_b(n, true) } fn collision(&self, m: &mut InPlaceVecMergeStateRef<'a, A, B, C>) -> bool { let (a, b) = m.source_slices_mut(); let av = &mut a[0]; let bv = &b[0]; av.outer_combine_with(bv, self.0); // we have modified av in place. We are only going to take it over if it // is non-empty, otherwise we skip it. let take = !av.is_empty(); m.advance_a(1, take) && m.advance_b(1, false) } } impl<'a, F, K, V, A, B, R> MergeOperation, RadixTreeConverter>> for OuterCombineOp where K: TKey, V: TValue, A: AbstractRadixTree, B: AbstractRadixTree, F: Fn(&V, &V) -> Option + Copy, R: AbstractRadixTreeMut, { fn cmp(&self, a: &A, b: &B) -> Ordering { a.prefix()[0].cmp(&b.prefix()[0]) } fn from_a( &self, m: &mut VecMergeState<'a, A, B, R, RadixTreeConverter, RadixTreeConverter>, n: usize, ) -> bool { m.advance_a(n, true) } fn from_b( &self, m: &mut VecMergeState<'a, A, B, R, RadixTreeConverter, RadixTreeConverter>, n: usize, ) -> bool { m.advance_b(n, true) } fn collision( &self, m: &mut VecMergeState<'a, A, B, R, RadixTreeConverter, RadixTreeConverter>, ) -> bool { let a = m.a.next().unwrap(); let b = m.b.next().unwrap(); let res: R = outer_combine(a, b, self.0); if !res.is_empty() { m.r.push(res); } true } } /// In place intersection operation struct InnerCombineOp(F, PhantomData

); impl<'a, K, V, W, F, I, R> MergeOperation for LeftCombineOp where K: TKey, V: TValue, W: TValue, F: Fn(&mut V, &W) -> bool + Copy, I: MutateInput, I::B: AbstractRadixTree, R: AbstractRadixTreeMut, { fn cmp(&self, a: &I::A, b: &I::B) -> Ordering { a.prefix()[0].cmp(&b.prefix()[0]) } fn from_a(&self, m: &mut I, n: usize) -> bool { m.advance_a(n, true) } fn from_b(&self, m: &mut I, n: usize) -> bool { m.advance_b(n, false) } fn collision(&self, m: &mut I) -> bool { let (a, b) = m.source_slices_mut(); let av = &mut a[0]; let bv = &b[0]; av.left_combine_with(bv, self.0); // we have modified av in place. We are only going to take it over if it // is non-empty, otherwise we skip it. let take = !av.is_empty(); m.advance_a(1, take) && m.advance_b(1, false) } } impl<'a, F, K, V, W, A, B, R> MergeOperation, NoConverter>> for LeftCombineOp where K: TKey, V: TValue, W: TValue, A: AbstractRadixTree, B: AbstractRadixTree, R: AbstractRadixTreeMut, F: Fn(&V, Option<&W>) -> Option + Copy, { fn cmp(&self, a: &A, b: &B) -> Ordering { a.prefix()[0].cmp(&b.prefix()[0]) } fn from_a( &self, m: &mut VecMergeState<'a, A, B, R, RadixTreeConverter, NoConverter>, n: usize, ) -> bool { m.advance_a(n, true) } fn from_b( &self, m: &mut VecMergeState<'a, A, B, R, RadixTreeConverter, NoConverter>, n: usize, ) -> bool { m.advance_b(n, false) } fn collision( &self, m: &mut VecMergeState<'a, A, B, R, RadixTreeConverter, NoConverter>, ) -> bool { let a = m.a.next().unwrap(); let b = m.b.next().unwrap(); let res = left_combine(a, b, self.0); if !res.is_empty() { m.r.push(res); } true } } /// Remove prefixes of b in a struct RemovePrefixOp(F, PhantomData

); impl<'a, K, V, W, F, I, R> MergeOperation for RemovePrefixOp where K: TKey, V: TValue, W: TValue, F: Fn(&W) -> bool + Copy, I: MutateInput, I::B: AbstractRadixTree, R: AbstractRadixTreeMut, { fn cmp(&self, a: &I::A, b: &I::B) -> Ordering { a.prefix()[0].cmp(&b.prefix()[0]) } fn from_a(&self, m: &mut I, n: usize) -> bool { m.advance_a(n, true) } fn from_b(&self, m: &mut I, n: usize) -> bool { m.advance_b(n, false) } fn collision(&self, m: &mut I) -> bool { let (a, b) = m.source_slices_mut(); let av = &mut a[0]; let bv = &b[0]; av.remove_prefix_with(bv, self.0); // we have modified av in place. We are only going to take it over if it // is non-empty, otherwise we skip it. let take = !av.is_empty(); m.advance_a(1, take) && m.advance_b(1, false) } } /// Retain prefixes of b in a struct RetainPrefixOp(F, PhantomData

); impl<'a, K, V, W, F, I, R> MergeOperation for RetainPrefixOp where K: TKey, V: TValue, W: TValue, F: Fn(&W) -> bool + Copy, I: MutateInput, I::B: AbstractRadixTree, R: AbstractRadixTreeMut, { fn cmp(&self, a: &I::A, b: &I::B) -> Ordering { a.prefix()[0].cmp(&b.prefix()[0]) } fn from_a(&self, m: &mut I, n: usize) -> bool { m.advance_a(n, false) } fn from_b(&self, m: &mut I, n: usize) -> bool { m.advance_b(n, false) } fn collision(&self, m: &mut I) -> bool { let (a, b) = m.source_slices_mut(); let av = &mut a[0]; let bv = &b[0]; av.retain_prefix_with(bv, self.0); // we have modified av in place. We are only going to take it over if it // is non-empty, otherwise we skip it. let take = !av.is_empty(); m.advance_a(1, take) && m.advance_b(1, false) } } #[cfg(test)] mod test { use std::collections::BTreeSet; use super::*; use maplit::btreeset; use obey::*; use quickcheck::*; impl Arbitrary for RadixTree { fn arbitrary(g: &mut G) -> Self { let t: Vec = Arbitrary::arbitrary(g); t.iter() .take(2) .map(|x| (x.as_bytes().to_vec(), ())) .collect() } } impl TestSamples, bool> for RadixTree { fn samples(&self, res: &mut BTreeSet>) { res.insert(vec![]); for (k, _) in self.iter() { let a = k.as_ref().to_vec(); let mut b = a.clone(); let mut c = a.clone(); b.push(0); c.pop(); res.insert(a); res.insert(b); res.insert(c); } } fn at(&self, elem: Vec) -> bool { self.contains_key(&elem) } } type Test = RadixTree; type Reference = BTreeSet>; fn r2t(r: &Reference) -> Test { r.iter().map(|t| (t.to_vec(), ())).collect() } quickcheck! { fn is_disjoint_sample(a: Test, b: Test) -> bool { binary_property_test(&a, &b, a.is_disjoint(&b), |a, b| !(a & b)) } fn is_subset_sample(a: Reference, b: Reference) -> bool { let a = r2t(&a); let b = r2t(&b); binary_property_test(&a, &b, a.is_subset(&b), |a, b| !a | b) } fn union_sample(a: Test, b: Test) -> bool { let r = a.union(&b); binary_element_test(&a, &b, r, |a, b| a | b) } fn union_with_sample(a: Test, b: Test) -> bool { let mut r = a.clone(); r.union_with(&b); binary_element_test(&a, &b, r, |a, b| a | b) } fn intersection_sample(a: Test, b: Test) -> bool { let r = a.intersection(&b); binary_element_test(&a, &b, r, |a, b| a & b) } fn intersection_with_sample(a: Test, b: Test) -> bool { let mut r = a.clone(); r.intersection_with(&b); binary_element_test(&a, &b, r, |a, b| a & b) } fn difference_with_sample(a: Test, b: Test) -> bool { let mut r = a.clone(); r.difference_with(&b); binary_element_test(&a, &b, r, |a, b| a & !b) } fn difference_sample(a: Test, b: Test) -> bool { let r = a.difference(&b); binary_element_test(&a, &b, r, |a, b| a & !b) } fn union(a: Reference, b: Reference) -> bool { let a1: Test = r2t(&a); let b1: Test = r2t(&b); let r1 = a1.union(&b1); let expected = r2t(&a.union(&b).cloned().collect()); expected == r1 } fn union_with(a: Reference, b: Reference) -> bool { let a1: Test = r2t(&a); let b1: Test = r2t(&b); let mut r1 = a1; r1.union_with(&b1); let expected = r2t(&a.union(&b).cloned().collect()); expected == r1 } fn intersection(a: Reference, b: Reference) -> bool { let a1: Test = r2t(&a); let b1: Test = r2t(&b); let r1 = a1.intersection(&b1); let expected = r2t(&a.intersection(&b).cloned().collect()); expected == r1 } fn intersection_with(a: Reference, b: Reference) -> bool { let a1: Test = r2t(&a); let b1: Test = r2t(&b); let mut r1 = a1; r1.intersection_with(&b1); let expected = r2t(&a.intersection(&b).cloned().collect()); expected == r1 } fn difference(a: Reference, b: Reference) -> bool { let a = a.into_iter().collect(); let b = b.into_iter().collect(); let a1: Test = r2t(&a); let b1: Test = r2t(&b); let r1 = a1.difference(&b1); let expected = r2t(&a.difference(&b).cloned().collect()); if expected != r1 { println!("a:{:#?}\nb:{:#?}", a1, b1); println!("expected:{:#?}\nvalue:{:#?}", expected, r1); } expected == r1 } fn difference_with(a: Reference, b: Reference) -> bool { let a = a.into_iter().collect(); let b = b.into_iter().collect(); let a1: Test = r2t(&a); let b1: Test = r2t(&b); let mut r1 = a1; r1.difference_with(&b1); let expected = r2t(&a.difference(&b).cloned().collect()); if expected != r1 { println!("expected:{:#?}\nvalue:{:#?}", expected, r1); } expected == r1 } fn remove_prefix(a: Reference, b: Reference) -> bool { let a = a.into_iter().collect(); let b = b.into_iter().collect(); let a1: Test = r2t(&a); let b1: Test = r2t(&b); let mut r1 = a1.clone(); r1.remove_prefix_with(&b1, |_| true); let mut r = a; // keep all elements of a for which no element in b is a prefix r.retain(|re| !b.iter().any(|x| re.starts_with(x))); let expected = r2t(&r); if expected != r1 { println!("a:{:#?}\nb:{:#?}", a1, b1); println!("expected:{:#?}\nvalue:{:#?}", expected, r1); } expected == r1 } fn retain_prefix(a: Reference, b: Reference) -> bool { let a = a.into_iter().collect(); let b = b.into_iter().collect(); let a1: Test = r2t(&a); let b1: Test = r2t(&b); let mut r1 = a1.clone(); r1.retain_prefix_with(&b1, |_| true); let mut r = a; // keep all elements of a for which no element in b is a prefix r.retain(|re| b.iter().any(|x| re.starts_with(x))); let expected = r2t(&r); if expected != r1 { println!("a:{:#?}\nb:{:#?}", a1, b1); println!("expected:{:#?}\nvalue:{:#?}", expected, r1); } expected == r1 } fn is_disjoint(a: Reference, b: Reference) -> bool { let a1: Test = r2t(&a); let b1: Test = r2t(&b); let actual = a1.is_disjoint(&b1); let expected = a.is_disjoint(&b); expected == actual } fn is_subset(a: Reference, b: Reference) -> bool { let a1: Test = r2t(&a); let b1: Test = r2t(&b); let actual = a1.is_subset(&b1); let expected = a.is_subset(&b); expected == actual } fn contains(a: Reference, b: Vec) -> bool { let a1: Test = r2t(&a); let expected = a.contains(&b); let actual = a1.contains_key(&b); expected == actual } } // bitop_assign_consistent!(Test); // set_predicate_consistent!(Test); // bitop_symmetry!(Test); // bitop_empty!(Test); // #[test] // fn values_iter() { // let elems = &["abc", "ab", "a", "ba"]; // let tree = elems // .iter() // .map(|x| (x.as_bytes(), (*x).to_owned())) // .collect::>(); // for x in tree.values() { // println!("{}", x); // } // for (k, v) in tree.iter() { // println!("{:?} {}", k, v); // } // } fn test_tree(strings: &[&str]) -> RadixTree { let mut res = RadixTree::default(); for key in strings { res.insert(key.as_bytes(), ()); } res } #[test] fn smoke_test() { let mut res = RadixTree::default(); let keys = ["aabbcc", "aabb", "aabbee"]; let nope = ["xaabbcc", "aabbx", "aabbx", "aabbeex"]; for key in keys { let x = RadixTree::single(key.as_bytes(), ()); res.union_with(&x); // any set is subset of itself assert!(res.is_subset(&res)); } for (key, _) in res.scan_prefix("aa".as_bytes()) { println!("{:?}", std::str::from_utf8(key.as_ref()).unwrap()); } for key in nope { assert!(!res.contains_key(key.as_bytes())); // keys not contained in the set must not be a subset let mut t = RadixTree::single(key.as_bytes(), ()); assert!(!t.is_subset(&res)); t.intersection_with(&res); assert!(t.is_empty()); let mut dif = res.clone(); dif.difference_with(&RadixTree::single(key.as_bytes(), ())); assert_eq!(dif, res); } for key in keys { assert!(res.contains_key(key.as_bytes())); // keys contained in the set must be a subset assert!(RadixTree::single(key.as_bytes(), ()).is_subset(&res)); let mut t = RadixTree::single(key.as_bytes(), ()); assert!(t.is_subset(&res)); t.intersection_with(&res); assert!(t == RadixTree::single(key.as_bytes(), ())); let mut dif = res.clone(); dif.difference_with(&RadixTree::single(key.as_bytes(), ())); assert!(!dif.contains_key(key.as_bytes())); } } #[test] fn is_subset_sample1() { let a = r2t(&btreeset! { vec![1]}); let b = r2t(&btreeset! {}); println!("a.is_subset(b): {}", a.is_subset(&b)); assert!(binary_property_test(&a, &b, a.is_subset(&b), |a, b| !a | b)); } #[test] fn difference_sample1() { let a = r2t(&btreeset! { vec![]}); let b = r2t(&btreeset! { vec![0] }); println!("a.difference(b): {:#?}", a.difference(&b)); assert!(binary_element_test(&a, &b, a.difference(&b), |a, b| a & !b)); } #[test] fn difference_sample2() { let a = r2t(&btreeset! { vec![0]}); let b = r2t(&btreeset! { vec![1] }); println!("a.difference(b): {:#?}", a.difference(&b)); assert!(binary_element_test(&a, &b, a.difference(&b), |a, b| a & !b)); } #[test] fn remove_prefix_sample1() { let mut test = test_tree(&["a", "aa", "aaa", "ab", "b", "bc", "bc", "eeeee", "eeeef"]); let exclude = test_tree(&["aa", "bc", "ee"]); test.remove_prefix_with(&exclude, |_| true); let expected = test_tree(&["a", "ab", "b"]); assert_eq!(test, expected); } #[test] fn retain_prefix_sample1() { let a = r2t(&btreeset! { vec![0]}); let b = r2t(&btreeset! { vec![0], vec![1] }); let mut r = a.clone(); r.retain_prefix_with(&b, |_| true); assert_eq!(r, a); } #[test] fn retain_prefix_sample() { let mut test = test_tree(&["a", "aa", "aaa", "ab", "b", "bc", "bcd", "eeeee", "eeeef"]); let exclude = test_tree(&["aa", "bc", "ee"]); test.retain_prefix_with(&exclude, |_| true); let expected = test_tree(&["aa", "aaa", "bc", "bcd", "eeeee", "eeeef"]); assert_eq!(test, expected); } } fn offset_from(base: *const T, p: *const U) -> usize { let base = base as usize; let p = p as usize; assert!(p >= base); p - base } fn location(x: &T) -> usize { (x as *const T) as usize } /// Helper to contain an object and an interator that takes the object by reference /// /// This is a quick way to implement into_iter in terms of iter. pub struct ObjAndIter { k: Box, v: V, } impl ObjAndIter { fn new(k: Box, f: impl Fn(&'static K) -> V) -> Self { let kr = unsafe { std::mem::transmute(k.as_ref()) }; let v = f(kr); Self { k, v } } } impl Iterator for ObjAndIter { type Item = V::Item; fn next(&mut self) -> Option { self.v.next() } } vec-collections-0.4.3/src/total_vec_map.rs000064400000000000000000000237660072674642500167410ustar 00000000000000use crate::vec_map::{AbstractVecMap, VecMap}; use core::{ borrow::Borrow, cmp, cmp::Ordering, fmt, fmt::Debug, hash, hash::Hash, ops::{Add, Div, Index, Mul, Neg, Sub}, }; use num_traits::{Bounded, One, Zero}; #[cfg(feature = "serde")] use serde::{ de::{Deserialize, Deserializer}, ser::{Serialize, Serializer}, }; use smallvec::Array; /// A [VecMap] with default value. /// /// Having a default value means that the mapping is a total function from K to V, hence the name. /// /// [VecMap]: struct.VecMap.html pub struct TotalVecMap(VecMap, V); #[cfg(feature = "serde")] impl> Serialize for TotalVecMap where K: Serialize, V: Serialize, { fn serialize(&self, serializer: S) -> Result { (&self.0, &self.1).serialize(serializer) } } #[cfg(feature = "serde")] impl<'de, K, V, A: Array> Deserialize<'de> for TotalVecMap where K: Deserialize<'de> + Ord + PartialEq + Clone, V: Deserialize<'de> + Eq, { fn deserialize>(deserializer: D) -> Result { let (map, default) = <(VecMap, V)>::deserialize(deserializer)?; Ok(Self::new(map, default)) } } /// Type alias for a [TotalVecMap](struct.TotalVecMap) with up to 1 mappings with inline storage. pub type TotalVecMap1 = TotalVecMap; impl> Clone for TotalVecMap { fn clone(&self) -> Self { Self(self.0.clone(), self.1.clone()) } } impl> Hash for TotalVecMap { fn hash(&self, state: &mut H) { self.0.hash(state) } } impl> PartialEq for TotalVecMap { fn eq(&self, other: &Self) -> bool { self.0 == other.0 } } impl> Eq for TotalVecMap {} impl> PartialOrd for TotalVecMap { fn partial_cmp(&self, other: &Self) -> Option { (&self.0, &self.1).partial_cmp(&(&other.0, &other.1)) } } impl> Ord for TotalVecMap { fn cmp(&self, other: &Self) -> Ordering { (&self.0, &self.1).cmp(&(&other.0, &other.1)) } } impl> Default for TotalVecMap { fn default() -> Self { Self(Default::default(), Default::default()) } } impl> TotalVecMap { /// Creates a total vec map, given a vec map and a default value. /// /// Mappings in the map that map to the default value will be removed in order to have /// a unique representation. pub fn new(map: VecMap, default: V) -> Self { let mut entries = map; // ensure canonical representation! entries.retain(|(_, v)| *v != default); Self(entries, default) } } impl> TotalVecMap { /// Creates a constant mapping from any K to the given V. pub fn constant(value: V) -> Self { Self(VecMap::default(), value) } /// Returns all non-default mappings as a `VecMap`. pub fn non_default_mappings(&self) -> &VecMap { &self.0 } } impl> Debug for TotalVecMap { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("TotalVecMap") .field("values", &self.0) .field("default", &self.1) .finish() } } /// Creates a constant mapping from any K to the given V. impl> From for TotalVecMap { fn from(value: V) -> Self { Self::constant(value) } } impl> Bounded for TotalVecMap { fn min_value() -> Self { V::min_value().into() } fn max_value() -> Self { V::max_value().into() } } impl + Eq + Clone, A: Array> Add for TotalVecMap { type Output = TotalVecMap; fn add(self, that: Self) -> Self::Output { self.combine_ref(&that, |a, b| a.clone() + b.clone()) } } impl + Eq + Clone, A: Array> Sub for TotalVecMap { type Output = Self; fn sub(self, that: Self) -> Self::Output { self.combine_ref(&that, |a, b| a.clone() - b.clone()) } } impl + Eq + Clone, A: Array> Neg for TotalVecMap { type Output = Self; fn neg(self) -> Self::Output { self.map_values(|a| -a.clone()) } } impl + Eq + Clone, A: Array> Mul for TotalVecMap { type Output = TotalVecMap; fn mul(self, that: Self) -> Self::Output { self.combine_ref(&that, |a, b| a.clone() * b.clone()) } } impl + Eq + Clone, A: Array> Div for TotalVecMap { type Output = TotalVecMap; fn div(self, that: Self) -> Self::Output { self.combine_ref(&that, |a, b| a.clone() / b.clone()) } } impl> Zero for TotalVecMap { fn zero() -> Self { V::zero().into() } fn is_zero(&self) -> bool { self.0.is_empty() && self.1.is_zero() } } impl> One for TotalVecMap { fn one() -> Self { V::one().into() } fn is_one(&self) -> bool { self.0.is_empty() && self.1.is_one() } } impl> TotalVecMap { /// combine a total map with another total map, using a function that takes value references pub fn combine_ref V>(&self, that: &Self, f: F) -> Self { use crate::vec_map::OuterJoinArg; let r_default = f(&self.1, &that.1); let r = self.0.outer_join(&that.0, |arg| { let r = match arg { OuterJoinArg::Left(_, v) => f(v, &that.1), OuterJoinArg::Right(_, w) => f(&self.1, w), OuterJoinArg::Both(_, v, w) => f(v, w), }; if r != r_default { Some(r) } else { None } }); Self(r, r_default) } } impl> TotalVecMap { pub fn supremum(&self, that: &Self) -> Self { self.combine_ref(that, |a, b| cmp::max(a, b).clone()) } pub fn infimum(&self, that: &Self) -> Self { self.combine_ref(that, |a, b| cmp::min(a, b).clone()) } } impl> TotalVecMap { pub fn map_values W, B: Array>( &self, f: F, ) -> TotalVecMap { let default = f(&self.1); let elements: smallvec::SmallVec = self .0 .slice_iter() .filter_map(|entry| { let w = f(&entry.1); if w != default { Some((entry.0.clone(), w)) } else { None } }) .collect(); TotalVecMap(VecMap::new(elements), default) } } impl> Index<&Q> for TotalVecMap where K: Borrow, Q: Ord, { type Output = V; /// Lookup. Time complexity is O(log N), where N is the number of non-default elements fn index(&self, key: &Q) -> &V { self.0.get(key).unwrap_or(&self.1) } } // we don't implement IndexMut since that would allow changing a value to the default and all sorts of other nasty things! #[cfg(test)] mod tests { use super::*; use quickcheck::*; use std::collections::{BTreeMap, BTreeSet}; type Ref = (BTreeMap, i32); type Test = TotalVecMap1; fn from_ref(r: Ref) -> Test { let (elements, default) = r; Test::new(elements.into(), default) } impl Arbitrary for TotalVecMap1 { fn arbitrary(g: &mut G) -> Self { TotalVecMap::new(Arbitrary::arbitrary(g), Arbitrary::arbitrary(g)) } } fn combine_reference i32>(a: &Ref, b: &Ref, f: F) -> Ref { let (a, ad) = a.clone(); let (b, bd) = b.clone(); let rd = f(ad, bd); let mut r: BTreeMap = BTreeMap::default(); let mut keys: BTreeSet = BTreeSet::new(); keys.extend(a.keys()); keys.extend(b.keys()); for key in keys { let value = f(*a.get(&key).unwrap_or(&ad), *b.get(&key).unwrap_or(&bd)); r.insert(key, value); } (r, rd) } quickcheck! { #[cfg(feature = "serde")] fn serde_roundtrip(reference: Test) -> bool { let bytes = serde_json::to_vec(&reference).unwrap(); let deser = serde_json::from_slice(&bytes).unwrap(); reference == deser } fn index(a: Ref, key: i32) -> bool { let x = from_ref(a.clone()); let (elements, default) = a; let expected = elements.get(&key).cloned().unwrap_or(default); let actual = x[&key]; expected == actual } fn supremum(a: Ref, b: Ref) -> bool { let expected = from_ref(combine_reference(&a, &b, cmp::max)); let a1 = from_ref(a); let b1 = from_ref(b); let actual = a1.supremum(&b1); expected == actual } fn infimum(a: Ref, b: Ref) -> bool { let expected = from_ref(combine_reference(&a, &b, cmp::min)); let a1 = from_ref(a); let b1 = from_ref(b); let actual = a1.infimum(&b1); expected == actual } } } vec-collections-0.4.3/src/total_vec_set.rs000064400000000000000000000333000072674642500167400ustar 00000000000000use crate::{AbstractVecSet, VecSet}; use core::{ fmt, fmt::{Debug, Write}, hash::Hash, mem, ops::{BitAnd, BitAndAssign, BitOr, BitOrAssign, BitXor, BitXorAssign, Not, Sub, SubAssign}, }; #[cfg(feature = "serde")] use serde::{ de::{Deserialize, Deserializer}, ser::{Serialize, Serializer}, }; use smallvec::Array; /// A [VecSet] with an additional flag so it can support negation. /// /// This way it is possible to represent e.g. the set of all u64 except 1. /// /// [VecSet]: struct.VecSet.html pub struct TotalVecSet { elements: VecSet, negated: bool, } /// Type alias for a [TotalVecSet](struct.TotalVecSet) with up to 2 elements with inline storage. pub type TotalVecSet2 = TotalVecSet<[T; 2]>; #[cfg(feature = "serde")] impl Serialize for TotalVecSet where A::Item: Serialize, { fn serialize(&self, serializer: S) -> Result { (&self.elements, &self.negated).serialize(serializer) } } #[cfg(feature = "serde")] impl<'de, A: Array> Deserialize<'de> for TotalVecSet where A::Item: Deserialize<'de> + Ord + PartialEq + Clone, { fn deserialize>(deserializer: D) -> Result { let (elements, negated) = <(VecSet, bool)>::deserialize(deserializer)?; Ok(Self::new(elements, negated)) } } impl> Clone for TotalVecSet { fn clone(&self) -> Self { Self { elements: self.elements.clone(), negated: self.negated, } } } impl> Hash for TotalVecSet { fn hash(&self, state: &mut H) { self.elements.hash(state); self.negated.hash(state); } } impl> PartialEq for TotalVecSet { fn eq(&self, other: &Self) -> bool { self.elements == other.elements && self.negated == other.negated } } impl> Eq for TotalVecSet {} impl> Debug for TotalVecSet { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { if self.negated { f.write_char('!')?; } f.debug_set().entries(self.elements.iter()).finish() } } impl> TotalVecSet { fn new(elements: VecSet, negated: bool) -> Self { Self { elements, negated } } pub fn is_empty(&self) -> bool { !self.negated && self.elements.is_empty() } pub fn is_all(&self) -> bool { self.negated && self.elements.is_empty() } pub fn constant(value: bool) -> Self { Self::new(VecSet::empty(), value) } pub fn empty() -> Self { false.into() } pub fn all() -> Self { true.into() } pub fn shrink_to_fit(&mut self) { self.elements.shrink_to_fit() } } impl> From for TotalVecSet { fn from(value: bool) -> Self { Self::constant(value) } } impl> From> for TotalVecSet { fn from(value: VecSet) -> Self { Self::new(value, false) } } impl> TotalVecSet { pub fn contains(&self, value: &T) -> bool { self.negated ^ self.elements.contains(value) } pub fn insert(&mut self, that: T) { if !self.negated { self.elements.insert(that); } else { self.elements.remove(&that); } } pub fn is_superset(&self, that: &Self) -> bool { !self.is_subset(that) } pub fn is_subset(&self, that: &Self) -> bool { match (self.negated, that.negated) { (false, false) => self.elements.is_subset(&that.elements), (false, true) => self.elements.is_disjoint(&that.elements), (true, false) => false, (true, true) => self.elements.is_superset(&that.elements), } } pub fn is_disjoint(&self, that: &Self) -> bool { match (self.negated, that.negated) { (false, false) => self.elements.is_disjoint(&that.elements), (false, true) => self.elements.is_subset(&that.elements), (true, false) => self.elements.is_superset(&that.elements), (true, true) => false, } } } impl> TotalVecSet { pub fn remove(&mut self, that: &T) { if self.negated { self.elements.insert(that.clone()); } else { self.elements.remove(that); } } } impl> BitAnd for &TotalVecSet { type Output = TotalVecSet; fn bitand(self, that: Self) -> Self::Output { match (self.negated, that.negated) { // intersection of elements (false, false) => Self::Output::new(&self.elements & &that.elements, false), // remove elements from self (false, true) => Self::Output::new(&self.elements - &that.elements, false), // remove elements from that (true, false) => Self::Output::new(&that.elements - &self.elements, false), // union of elements (true, true) => Self::Output::new(&that.elements | &self.elements, true), } } } impl> BitAndAssign for TotalVecSet { fn bitand_assign(&mut self, that: Self) { match (self.negated, that.negated) { // intersection of elements (false, false) => { self.elements &= that.elements; self.negated = false; } // remove elements from self (false, true) => { self.elements -= that.elements; self.negated = false; } // remove elements from that (true, false) => { let mut that = that; mem::swap(&mut that.elements, &mut self.elements); self.elements -= that.elements; self.negated = false; } // union of elements (true, true) => { self.elements |= that.elements; self.negated = true; } }; } } impl> BitOr for &TotalVecSet { type Output = TotalVecSet; fn bitor(self, that: Self) -> Self::Output { match (self.negated, that.negated) { // union of elements (false, false) => Self::Output::new(&self.elements | &that.elements, false), // remove holes from that (false, true) => Self::Output::new(&that.elements - &self.elements, true), // remove holes from self (true, false) => Self::Output::new(&self.elements - &that.elements, true), // intersection of holes (true, true) => Self::Output::new(&that.elements & &self.elements, true), } } } impl> BitOrAssign for TotalVecSet { fn bitor_assign(&mut self, that: Self) { match (self.negated, that.negated) { // union of elements (false, false) => { self.elements |= that.elements; self.negated = false; } // remove holes from that (false, true) => { let mut that = that; mem::swap(&mut that.elements, &mut self.elements); self.elements -= that.elements; self.negated = true; } // remove holes from self (true, false) => { self.elements -= that.elements; self.negated = true; } // intersection of holes (true, true) => { self.elements &= that.elements; self.negated = true; } }; } } impl> BitXor for &TotalVecSet { type Output = TotalVecSet; fn bitxor(self, that: Self) -> Self::Output { Self::Output::new(&self.elements ^ &that.elements, self.negated ^ that.negated) } } impl> BitXorAssign for TotalVecSet { fn bitxor_assign(&mut self, that: Self) { self.elements ^= that.elements; self.negated ^= that.negated; } } #[allow(clippy::suspicious_arithmetic_impl)] impl> Sub for &TotalVecSet { type Output = TotalVecSet; fn sub(self, that: Self) -> Self::Output { match (self.negated, that.negated) { // intersection of elements (false, false) => Self::Output::new(&self.elements - &that.elements, false), // keep only holes of that (false, true) => Self::Output::new(&self.elements & &that.elements, false), // add holes from that (true, false) => Self::Output::new(&self.elements | &that.elements, true), // union of elements (true, true) => Self::Output::new(&that.elements - &self.elements, false), } } } impl> SubAssign for TotalVecSet { fn sub_assign(&mut self, that: Self) { match (self.negated, that.negated) { // intersection of elements (false, false) => { self.elements -= that.elements; self.negated = false; } // keep only holes of that (false, true) => { self.elements &= that.elements; self.negated = false; } // add holes from that (true, false) => { self.elements |= that.elements; self.negated = true; } // union of elements (true, true) => { let mut that = that; mem::swap(&mut that.elements, &mut self.elements); self.elements -= that.elements; self.negated = false; } } } } impl> Not for &TotalVecSet { type Output = TotalVecSet; fn not(self) -> Self::Output { Self::Output::new(self.elements.clone(), !self.negated) } } impl> Not for TotalVecSet { type Output = TotalVecSet; fn not(self) -> Self::Output { Self::Output::new(self.elements, !self.negated) } } #[cfg(test)] mod tests { #![allow(dead_code)] use super::*; use obey::*; use quickcheck::*; use std::collections::BTreeSet; type Test = TotalVecSet<[i64; 2]>; impl Arbitrary for TotalVecSet<[T; 2]> { fn arbitrary(g: &mut G) -> Self { let mut elements: Vec = Arbitrary::arbitrary(g); elements.truncate(2); let negated: bool = Arbitrary::arbitrary(g); TotalVecSet::new(elements.into(), negated) } } /// just a helper to get good output when a check fails fn print_on_failure_unary(x: E, expected: R, actual: R) -> bool { let res = expected == actual; if !res { println!("x:{:?} expected:{:?} actual:{:?}", x, expected, actual); } res } fn binary_op(a: &Test, b: &Test, r: &Test, op: impl Fn(bool, bool) -> bool) -> bool { let mut samples: BTreeSet = BTreeSet::new(); samples.extend(a.elements.as_ref().iter().cloned()); samples.extend(b.elements.as_ref().iter().cloned()); samples.insert(core::i64::MIN); samples.iter().all(|e| { let expected = op(a.contains(e), b.contains(e)); let actual = r.contains(e); if expected != actual { println!( "{:?}!={:?} at {:?} {:?} {:?} {:?}", expected, actual, e, a, b, r ); } expected == actual }) } fn binary_property(a: &Test, b: &Test, r: bool, op: impl Fn(bool, bool) -> bool) -> bool { let mut samples: BTreeSet = BTreeSet::new(); samples.extend(a.elements.as_ref().iter().cloned()); samples.extend(b.elements.as_ref().iter().cloned()); samples.insert(core::i64::MIN); if r { samples.iter().all(|e| { let expected = op(a.contains(e), b.contains(e)); if !expected { println!( "{:?} is false at {:?}\na {:?}\nb {:?}\nr {:?}", expected, e, a, b, r ); } expected }) } else { samples.iter().any(|e| !op(a.contains(e), b.contains(e))) } } quickcheck! { #[cfg(feature = "serde")] fn serde_roundtrip(reference: Test) -> bool { let bytes = serde_json::to_vec(&reference).unwrap(); let deser = serde_json::from_slice(&bytes).unwrap(); reference == deser } fn is_disjoint_sample(a: Test, b: Test) -> bool { binary_property(&a, &b, a.is_disjoint(&b), |a, b| !(a & b)) } fn is_subset_sample(a: Test, b: Test) -> bool { binary_property(&a, &b, a.is_subset(&b), |a, b| !a | b) } fn union_sample(a: Test, b: Test) -> bool { binary_op(&a, &b, &(&a | &b), |a, b| a | b) } fn intersection_sample(a: Test, b: Test) -> bool { binary_op(&a, &b, &(&a & &b), |a, b| a & b) } fn xor_sample(a: Test, b: Test) -> bool { binary_op(&a, &b, &(&a ^ &b), |a, b| a ^ b) } fn diff_sample(a: Test, b: Test) -> bool { binary_op(&a, &b, &(&a - &b), |a, b| a & !b) } } bitop_assign_consistent!(Test); bitop_symmetry!(Test); bitop_empty!(Test); bitop_sub_not_all!(Test); } vec-collections-0.4.3/src/vec_map.rs000064400000000000000000000741360072674642500155330ustar 00000000000000#![allow(clippy::clone_on_copy)] #[cfg(feature = "total")] use crate::iterators::SliceIterator; use crate::{ dedup::{sort_dedup_by_key, Keep}, merge_state::{InPlaceSmallVecMergeStateRef, MergeStateMut, NoConverter, SmallVecMergeState}, VecSet, }; use crate::{iterators::VecMapIter, merge_state::InPlaceMergeState}; use binary_merge::MergeOperation; #[cfg(feature = "rkyv_validated")] use bytecheck::CheckBytes; use core::{borrow::Borrow, cmp::Ordering, fmt, fmt::Debug, hash, hash::Hash, iter::FromIterator}; #[cfg(feature = "rkyv")] use rkyv::{validation::ArchiveContext, Archive}; use smallvec::{Array, SmallVec}; use std::collections::BTreeMap; #[cfg(feature = "serde")] use { core::marker::PhantomData, serde::{ de::{Deserialize, Deserializer, MapAccess, Visitor}, ser::{Serialize, SerializeMap, Serializer}, }, }; /// An abstract vec map /// /// this is implemented by VecMap and ArchivedVecMap, so they are interoperable. pub trait AbstractVecMap { fn as_slice(&self) -> &[(K, V)]; fn is_empty(&self) -> bool { self.as_slice().is_empty() } fn iter(&self) -> VecMapIter> { VecMapIter::new(self.as_slice().iter()) } /// lookup of a mapping. Time complexity is O(log N). Binary search. fn get(&self, key: &Q) -> Option<&V> where K: Borrow + 'static, Q: Ord + ?Sized, { let elements = self.as_slice(); elements .binary_search_by(|p| p.0.borrow().cmp(key)) .map(|index| &elements[index].1) .ok() } /// Perform an outer join with another VecMap, producing a new result /// /// fn outer_join(&self, that: &impl AbstractVecMap, f: F) -> VecMap where K: Ord + Clone, A: Array, F: Fn(OuterJoinArg<&K, &V, &W>) -> Option, { VecMap::::new(SmallVecMergeState::merge( self.as_slice(), that.as_slice(), OuterJoinOp(f), NoConverter, )) } fn left_join(&self, that: &impl AbstractVecMap, f: F) -> VecMap where K: Ord + Clone, F: Fn(&K, &V, Option<&W>) -> Option, A: Array, { VecMap::new(SmallVecMergeState::merge( self.as_slice(), that.as_slice(), LeftJoinOp(f), NoConverter, )) } fn right_join(&self, that: &impl AbstractVecMap, f: F) -> VecMap where K: Ord + Clone, F: Fn(&K, Option<&V>, &W) -> Option, A: Array, { VecMap::new(SmallVecMergeState::merge( self.as_slice(), that.as_slice(), RightJoinOp(f), NoConverter, )) } fn inner_join(&self, that: &impl AbstractVecMap, f: F) -> VecMap where K: Ord + Clone, F: Fn(&K, &V, &W) -> Option, A: Array, { VecMap::new(SmallVecMergeState::merge( self.as_slice(), that.as_slice(), InnerJoinOp(f), NoConverter, )) } } impl> AbstractVecMap for VecMap { fn as_slice(&self) -> &[A::Item] { self.0.as_slice() } } #[cfg(feature = "rkyv")] impl AbstractVecMap for ArchivedVecMap { fn as_slice(&self) -> &[(K, V)] { self.0.as_slice() } } /// A map backed by a [SmallVec] of key value pairs. /// /// [SmallVec]: https://docs.rs/smallvec/1.4.1/smallvec/struct.SmallVec.html pub struct VecMap(SmallVec); /// Type alias for a [VecMap](struct.VecMap) with up to 1 mapping with inline storage. /// /// This is a good default, since for usize sized keys and values, 1 mapping is the max you can fit in without making the struct larger. pub type VecMap1 = VecMap<[(K, V); 1]>; impl> Debug for VecMap { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_set().entries(self.as_slice().iter()).finish() } } impl> Clone for VecMap { fn clone(&self) -> Self { Self(self.0.clone()) } } impl> Hash for VecMap { fn hash(&self, state: &mut H) { self.0.hash(state) } } impl> PartialEq for VecMap { fn eq(&self, other: &Self) -> bool { self.0 == other.0 } } impl> Eq for VecMap {} impl> PartialOrd for VecMap { fn partial_cmp(&self, other: &Self) -> Option { self.0.partial_cmp(&other.0) } } impl> Ord for VecMap { fn cmp(&self, other: &Self) -> Ordering { self.0.cmp(&other.0) } } impl<'a, K: 'a, V: 'a, A: Array> IntoIterator for &'a VecMap { type Item = &'a A::Item; type IntoIter = VecMapIter>; fn into_iter(self) -> Self::IntoIter { self.iter() } } impl IntoIterator for VecMap { type Item = A::Item; type IntoIter = VecMapIter>; fn into_iter(self) -> Self::IntoIter { VecMapIter::new(self.0.into_iter()) } } impl Default for VecMap { fn default() -> Self { VecMap(SmallVec::default()) } } impl From> for VecSet { fn from(value: VecMap) -> Self { // entries are sorted by unique first elemnt, so they are also a valid set VecSet::new_unsafe(value.0) } } struct CombineOp(F, std::marker::PhantomData); impl<'a, K: Ord, V, A: Array, B: Array, F: Fn(V, V) -> V> MergeOperation> for CombineOp { fn cmp(&self, a: &(K, V), b: &(K, V)) -> Ordering { a.0.cmp(&b.0) } fn from_a(&self, m: &mut InPlaceMergeState, n: usize) -> bool { m.advance_a(n, true) } fn from_b(&self, m: &mut InPlaceMergeState, n: usize) -> bool { m.advance_b(n, true) } fn collision(&self, m: &mut InPlaceMergeState) -> bool { if let (Some((ak, av)), Some((_, bv))) = (m.a.pop_front(), m.b.next()) { let r = (self.0)(av, bv); m.a.push((ak, r)); } true } } pub enum OuterJoinArg { Left(K, A), Right(K, B), Both(K, A, B), } struct OuterJoinOp(F); struct LeftJoinOp(F); struct RightJoinOp(F); struct InnerJoinOp(F); impl> FromIterator<(K, V)> for VecMap { fn from_iter>(iter: I) -> Self { VecMap(sort_dedup_by_key(iter.into_iter(), Keep::Last, |(k, _)| k)) } } impl> From> for VecMap { fn from(value: BTreeMap) -> Self { Self::new(value.into_iter().collect()) } } impl> Extend for VecMap { fn extend>(&mut self, iter: I) { self.merge_with::(iter.into_iter().collect()); } } impl AsRef<[A::Item]> for VecMap { fn as_ref(&self) -> &[A::Item] { self.as_slice() } } impl From> for SmallVec { fn from(value: VecMap) -> Self { value.0 } } impl<'a, K, V, W, R, A, F> MergeOperation> for OuterJoinOp where K: Ord + Clone, A: Array, F: Fn(OuterJoinArg<&K, &V, &W>) -> Option, { fn cmp(&self, a: &(K, V), b: &(K, W)) -> Ordering { a.0.cmp(&b.0) } fn from_a(&self, m: &mut SmallVecMergeState<'a, (K, V), (K, W), A>, n: usize) -> bool { for _ in 0..n { if let Some((k, a)) = m.a.next() { let arg = OuterJoinArg::Left(k, a); if let Some(res) = (self.0)(arg) { m.r.push((k.clone(), res)); } } } true } fn from_b(&self, m: &mut SmallVecMergeState<'a, (K, V), (K, W), A>, n: usize) -> bool { for _ in 0..n { if let Some((k, b)) = m.b.next() { let arg = OuterJoinArg::Right(k, b); if let Some(res) = (self.0)(arg) { m.r.push((k.clone(), res)); } } } true } fn collision(&self, m: &mut SmallVecMergeState<'a, (K, V), (K, W), A>) -> bool { if let Some((k, a)) = m.a.next() { if let Some((_, b)) = m.b.next() { let arg = OuterJoinArg::Both(k, a, b); if let Some(res) = (self.0)(arg) { m.r.push((k.clone(), res)); } } } true } } impl<'a, K, V, W, F, A> MergeOperation> for OuterJoinOp where A: Array, K: Ord + Clone, F: Fn(OuterJoinArg<&K, V, &W>) -> Option, { fn cmp(&self, a: &(K, V), b: &(K, W)) -> Ordering { a.0.cmp(&b.0) } fn from_a(&self, m: &mut InPlaceSmallVecMergeStateRef<'a, A, (K, W)>, n: usize) -> bool { for _ in 0..n { if let Some((k, v)) = m.a.pop_front() { if let Some(v) = (self.0)(OuterJoinArg::Left(&k, v)) { m.a.push((k, v)); } } } true } fn from_b(&self, m: &mut InPlaceSmallVecMergeStateRef<'a, A, (K, W)>, n: usize) -> bool { for _ in 0..n { if let Some((k, b)) = m.b.next() { if let Some(v) = (self.0)(OuterJoinArg::Right(k, b)) { m.a.push((k.clone(), v)); } } } true } fn collision(&self, m: &mut InPlaceSmallVecMergeStateRef<'a, A, (K, W)>) -> bool { if let Some((k, v)) = m.a.pop_front() { if let Some((_, w)) = m.b.next() { if let Some(v) = (self.0)(OuterJoinArg::Both(&k, v, w)) { m.a.push((k, v)); } } } true } } impl<'a, K, V, W, F, A, B> MergeOperation> for OuterJoinOp where A: Array, B: Array, K: Ord, F: Fn(OuterJoinArg<&K, V, W>) -> Option, { fn cmp(&self, a: &(K, V), b: &(K, W)) -> Ordering { a.0.cmp(&b.0) } fn from_a(&self, m: &mut InPlaceMergeState<'a, A, B>, n: usize) -> bool { for _ in 0..n { if let Some((k, v)) = m.a.pop_front() { if let Some(v) = (self.0)(OuterJoinArg::Left(&k, v)) { m.a.push((k, v)); } } } true } fn from_b(&self, m: &mut InPlaceMergeState<'a, A, B>, n: usize) -> bool { for _ in 0..n { if let Some((k, b)) = m.b.next() { if let Some(v) = (self.0)(OuterJoinArg::Right(&k, b)) { m.a.push((k, v)); } } } true } fn collision(&self, m: &mut InPlaceMergeState<'a, A, B>) -> bool { if let Some((k, v)) = m.a.pop_front() { if let Some((_, w)) = m.b.next() { if let Some(v) = (self.0)(OuterJoinArg::Both(&k, v, w)) { m.a.push((k, v)); } } } true } } impl<'a, K, V, W, R, F, A> MergeOperation> for LeftJoinOp where K: Ord + Clone, A: Array, F: Fn(&K, &V, Option<&W>) -> Option, { fn cmp(&self, a: &(K, V), b: &(K, W)) -> Ordering { a.0.cmp(&b.0) } fn from_a(&self, m: &mut SmallVecMergeState<'a, (K, V), (K, W), A>, n: usize) -> bool { for _ in 0..n { if let Some((k, a)) = m.a.next() { if let Some(res) = (self.0)(k, a, None) { m.r.push((k.clone(), res)); } } } true } fn from_b(&self, m: &mut SmallVecMergeState<'a, (K, V), (K, W), A>, n: usize) -> bool { m.b.drop_front(n); true } fn collision(&self, m: &mut SmallVecMergeState<'a, (K, V), (K, W), A>) -> bool { if let Some((k, a)) = m.a.next() { if let Some((_, b)) = m.b.next() { if let Some(res) = (self.0)(k, a, Some(b)) { m.r.push((k.clone(), res)); } } } true } } impl<'a, K, V, W, F, A> MergeOperation> for LeftJoinOp where A: Array, K: Ord + Clone, F: Fn(&K, V, Option<&W>) -> Option, { fn cmp(&self, a: &(K, V), b: &(K, W)) -> Ordering { a.0.cmp(&b.0) } fn from_a(&self, m: &mut InPlaceSmallVecMergeStateRef<'a, A, (K, W)>, n: usize) -> bool { for _ in 0..n { if let Some((k, v)) = m.a.pop_front() { if let Some(v) = (self.0)(&k, v, None) { m.a.push((k, v)) } } } true } fn from_b(&self, m: &mut InPlaceSmallVecMergeStateRef<'a, A, (K, W)>, n: usize) -> bool { m.b.drop_front(n); true } fn collision(&self, m: &mut InPlaceSmallVecMergeStateRef<'a, A, (K, W)>) -> bool { if let Some((k, v)) = m.a.pop_front() { if let Some((_, w)) = m.b.next() { if let Some(v) = (self.0)(&k, v, Some(w)) { m.a.push((k, v)) } } } true } } impl<'a, K, V, W, R, F, A> MergeOperation> for RightJoinOp where K: Ord + Clone, A: Array, F: Fn(&K, Option<&V>, &W) -> Option, { fn cmp(&self, a: &(K, V), b: &(K, W)) -> Ordering { a.0.cmp(&b.0) } fn from_a(&self, m: &mut SmallVecMergeState<'a, (K, V), (K, W), A>, n: usize) -> bool { m.a.drop_front(n); true } fn from_b(&self, m: &mut SmallVecMergeState<'a, (K, V), (K, W), A>, n: usize) -> bool { for _ in 0..n { if let Some((k, b)) = m.b.next() { if let Some(res) = (self.0)(k, None, b) { m.r.push((k.clone(), res)); } } } true } fn collision(&self, m: &mut SmallVecMergeState<'a, (K, V), (K, W), A>) -> bool { if let Some((k, a)) = m.a.next() { if let Some((_, b)) = m.b.next() { if let Some(res) = (self.0)(k, Some(a), b) { m.r.push((k.clone(), res)); } } } true } } impl<'a, K, V, W, F, A> MergeOperation> for RightJoinOp where A: Array, K: Ord + Clone, F: Fn(&K, Option, &W) -> Option, { fn cmp(&self, a: &(K, V), b: &(K, W)) -> Ordering { a.0.cmp(&b.0) } fn from_a(&self, m: &mut InPlaceSmallVecMergeStateRef<'a, A, (K, W)>, n: usize) -> bool { m.a.consume(n, false); true } fn from_b(&self, m: &mut InPlaceSmallVecMergeStateRef<'a, A, (K, W)>, n: usize) -> bool { for _ in 0..n { if let Some((k, w)) = m.b.next() { if let Some(v) = (self.0)(k, None, w) { m.a.push((k.clone(), v)) } } } true } fn collision(&self, m: &mut InPlaceSmallVecMergeStateRef<'a, A, (K, W)>) -> bool { if let Some((k, v)) = m.a.pop_front() { if let Some((_, w)) = m.b.next() { if let Some(res) = (self.0)(&k, Some(v), w) { m.a.push((k, res)); } } } true } } impl<'a, K, V, W, R, F, A> MergeOperation> for InnerJoinOp where K: Ord + Clone, A: Array, F: Fn(&K, &V, &W) -> Option, { fn cmp(&self, a: &(K, V), b: &(K, W)) -> Ordering { a.0.cmp(&b.0) } fn from_a(&self, m: &mut SmallVecMergeState<'a, (K, V), (K, W), A>, n: usize) -> bool { m.a.drop_front(n); true } fn from_b(&self, m: &mut SmallVecMergeState<'a, (K, V), (K, W), A>, n: usize) -> bool { m.b.drop_front(n); true } fn collision(&self, m: &mut SmallVecMergeState<'a, (K, V), (K, W), A>) -> bool { if let Some((k, a)) = m.a.next() { if let Some((_, b)) = m.b.next() { if let Some(res) = (self.0)(k, a, b) { m.r.push((k.clone(), res)); } } } true } } impl<'a, K, V, W, F, A> MergeOperation> for InnerJoinOp where A: Array, K: Ord + Clone, F: Fn(&K, V, &W) -> Option, { fn cmp(&self, a: &(K, V), b: &(K, W)) -> Ordering { a.0.cmp(&b.0) } fn from_a(&self, m: &mut InPlaceSmallVecMergeStateRef<'a, A, (K, W)>, n: usize) -> bool { m.a.consume(n, false); true } fn from_b(&self, m: &mut InPlaceSmallVecMergeStateRef<'a, A, (K, W)>, n: usize) -> bool { m.b.drop_front(n); true } fn collision(&self, m: &mut InPlaceSmallVecMergeStateRef<'a, A, (K, W)>) -> bool { if let Some((k, v)) = m.a.pop_front() { if let Some((_, w)) = m.b.next() { if let Some(v) = (self.0)(&k, v, w) { m.a.push((k, v)) } } } true } } impl> VecMap { /// map values while keeping keys pub fn map_values, F: FnMut(V) -> R>(self, mut f: F) -> VecMap { VecMap::new( self.0 .into_iter() .map(|entry| (entry.0, f(entry.1))) .collect(), ) } } impl VecMap { /// private because it does not check invariants pub(crate) fn new(value: SmallVec) -> Self { Self(value) } pub fn is_empty(&self) -> bool { self.0.is_empty() } pub fn empty() -> Self { Self(SmallVec::new()) } /// number of mappings pub fn len(&self) -> usize { self.0.len() } /// the underlying memory as a slice of key value pairs fn as_slice(&self) -> &[A::Item] { self.0.as_ref() } /// retain all pairs matching a predicate pub fn retain bool>(&mut self, mut f: F) { self.0.retain(|entry| f(entry)) } #[cfg(feature = "total")] pub(crate) fn slice_iter(&self) -> SliceIterator { SliceIterator(self.0.as_slice()) } pub fn into_inner(self) -> SmallVec { self.0 } /// Creates a vecmap with a single item pub fn single(item: A::Item) -> Self { Self(smallvec::smallvec![item]) } } impl> VecMap { pub fn insert(&mut self, key: K, value: V) -> Option { match self.0.binary_search_by(|(k, _)| k.cmp(&key)) { Ok(index) => { let mut elem = (key, value); std::mem::swap(&mut elem, &mut self.0[index]); Some(elem.1) } Err(ip) => { self.0.insert(ip, (key, value)); None } } } pub fn inner_join_with(&mut self, that: &impl AbstractVecMap, f: F) where K: Ord + Clone, F: Fn(&K, V, &W) -> Option, { InPlaceSmallVecMergeStateRef::merge( &mut self.0, &that.as_slice(), InnerJoinOp(f), NoConverter, ) } pub fn left_join_with(&mut self, that: &impl AbstractVecMap, f: F) where K: Ord + Clone, F: Fn(&K, V, Option<&W>) -> Option, { InPlaceSmallVecMergeStateRef::merge( &mut self.0, &that.as_slice(), LeftJoinOp(f), NoConverter, ) } pub fn right_join_with(&mut self, that: &impl AbstractVecMap, f: F) where K: Ord + Clone, F: Fn(&K, Option, &W) -> Option, { InPlaceSmallVecMergeStateRef::merge( &mut self.0, &that.as_slice(), RightJoinOp(f), NoConverter, ) } pub fn outer_join_with(&mut self, that: &impl AbstractVecMap, f: F) where K: Ord + Clone, F: Fn(OuterJoinArg<&K, V, &W>) -> Option, { InPlaceSmallVecMergeStateRef::merge( &mut self.0, &that.as_slice(), OuterJoinOp(f), NoConverter, ) } /// in-place merge with another map of the same type. The merge is right-biased, so on collisions the values /// from the rhs will win. pub fn merge_with>(&mut self, that: VecMap) { self.combine_with(that, |_, r| r) } /// in-place combine with another map of the same type. The given function allows to select the value in case /// of collisions. pub fn combine_with, F: Fn(V, V) -> V>( &mut self, that: VecMap, f: F, ) { InPlaceMergeState::merge( &mut self.0, that.0, OuterJoinOp(move |arg: OuterJoinArg<&K, V, V>| { Some(match arg { OuterJoinArg::Left(_, v) => v, OuterJoinArg::Right(_, v) => v, OuterJoinArg::Both(_, v, w) => f(v, w), }) }), NoConverter, ); } } impl> VecMap { pub fn get_mut(&mut self, key: &Q) -> Option<&mut V> where K: Borrow, Q: Ord + ?Sized, { let elements = self.0.as_mut_slice(); match elements.binary_search_by(|p| p.0.borrow().cmp(key)) { Ok(index) => Some(&mut elements[index].1), Err(_) => None, } } } #[cfg(feature = "serde")] impl> Serialize for VecMap where K: Serialize, V: Serialize, { fn serialize(&self, serializer: S) -> Result { let mut state = serializer.serialize_map(Some(self.len()))?; for (k, v) in self.0.iter() { state.serialize_entry(&k, &v)?; } state.end() } } #[cfg(feature = "serde")] impl<'de, K, V, A: Array> Deserialize<'de> for VecMap where K: Deserialize<'de> + Ord + PartialEq + Clone, V: Deserialize<'de>, { fn deserialize>(deserializer: D) -> Result { deserializer.deserialize_map(VecMapVisitor { phantom: PhantomData, }) } } #[cfg(feature = "serde")] struct VecMapVisitor { phantom: PhantomData<(K, V, A)>, } #[cfg(feature = "serde")] impl<'de, K, V, A> Visitor<'de> for VecMapVisitor where A: Array, K: Deserialize<'de> + Ord + PartialEq + Clone, V: Deserialize<'de>, { type Value = VecMap; fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { formatter.write_str("a map") } fn visit_map>(self, mut map: M) -> Result { let len = map.size_hint().unwrap_or(0); let mut values: SmallVec = SmallVec::with_capacity(len); while let Some(value) = map.next_entry::()? { values.push(value); } values.sort_by_key(|x: &(K, V)| x.0.clone()); values.dedup_by_key(|x: &mut (K, V)| x.0.clone()); Ok(VecMap(values)) } } #[cfg(feature = "rkyv")] #[repr(transparent)] pub struct ArchivedVecMap(rkyv::vec::ArchivedVec<(K, V)>); #[cfg(feature = "rkyv")] impl rkyv::Archive for VecMap where A: Array, K: rkyv::Archive, V: rkyv::Archive, { type Archived = ArchivedVecMap; type Resolver = rkyv::vec::VecResolver; unsafe fn resolve(&self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived) { rkyv::vec::ArchivedVec::resolve_from_slice(self.0.as_slice(), pos, resolver, &mut (*out).0); } } #[cfg(feature = "rkyv")] impl rkyv::Serialize for VecMap where A: Array, K: rkyv::Archive + rkyv::Serialize, V: rkyv::Archive + rkyv::Serialize, S: rkyv::ser::ScratchSpace + rkyv::ser::Serializer, { fn serialize(&self, serializer: &mut S) -> Result { rkyv::vec::ArchivedVec::serialize_from_slice(self.0.as_ref(), serializer) } } #[cfg(feature = "rkyv")] impl rkyv::Deserialize, D> for ArchivedVecMap where A: Array, K: rkyv::Archive, V: rkyv::Archive, D: rkyv::Fallible + ?Sized, [<::Item as rkyv::Archive>::Archived]: rkyv::DeserializeUnsized<[::Item], D>, { fn deserialize(&self, deserializer: &mut D) -> Result, D::Error> { // todo: replace this with SmallVec once smallvec support for rkyv lands on crates.io let items: Vec<(K, V)> = self.0.deserialize(deserializer)?; Ok(VecMap(items.into())) } } /// Validation error for a vec map #[cfg(feature = "rkyv_validated")] #[derive(Debug)] pub enum ArchivedVecMapError { /// error with the individual elements of the VecSet ValueCheckError, /// elements were not properly ordered OrderCheckError, } #[cfg(feature = "rkyv_validated")] impl std::error::Error for ArchivedVecMapError {} #[cfg(feature = "rkyv_validated")] impl std::fmt::Display for ArchivedVecMapError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{:?}", self) } } #[cfg(feature = "rkyv_validated")] impl bytecheck::CheckBytes for ArchivedVecMap where C: ArchiveContext, C::Error: std::error::Error, K: Ord + Archive + CheckBytes, V: Archive + CheckBytes, bool: bytecheck::CheckBytes, { type Error = ArchivedVecMapError; unsafe fn check_bytes<'a>( value: *const Self, context: &mut C, ) -> Result<&'a Self, Self::Error> { let values = &(*value).0; CheckBytes::check_bytes(values, context) .map_err(|_| ArchivedVecMapError::ValueCheckError)?; if !values .iter() .zip(values.iter().skip(1)) .all(|((ak, _), (bk, _))| ak < bk) { return Err(ArchivedVecMapError::OrderCheckError); }; Ok(&*value) } } #[cfg(test)] mod tests { use super::*; use maplit::btreemap; use quickcheck::*; use std::collections::BTreeMap; use OuterJoinArg::*; type Test = VecMap1; type Ref = BTreeMap; impl Arbitrary for VecMap1 { fn arbitrary(g: &mut G) -> Self { let t: BTreeMap = Arbitrary::arbitrary(g); t.into() } } fn outer_join_reference(a: &Ref, b: &Ref) -> Ref { let mut r = a.clone(); for (k, v) in b.clone().into_iter() { r.insert(k, v); } r } fn inner_join_reference(a: &Ref, b: &Ref) -> Ref { let mut r: Ref = BTreeMap::new(); for (k, v) in a.clone().into_iter() { if b.contains_key(&k) { r.insert(k, v); } } r } quickcheck! { #[cfg(feature = "serde")] fn serde_roundtrip(reference: Test) -> bool { let bytes = serde_json::to_vec(&reference).unwrap(); let deser = serde_json::from_slice(&bytes).unwrap(); reference == deser } #[cfg(feature = "rkyv")] fn rkyv_roundtrip_unvalidated(a: Test) -> bool { use rkyv::*; use ser::Serializer; let mut serializer = ser::serializers::AllocSerializer::<256>::default(); serializer.serialize_value(&a).unwrap(); let bytes = serializer.into_serializer().into_inner(); let archived = unsafe { rkyv::archived_root::(&bytes) }; let deserialized: Test = archived.deserialize(&mut Infallible).unwrap(); a == deserialized } #[cfg(feature = "rkyv_validated")] #[quickcheck] fn rkyv_roundtrip_validated(a: Test) -> bool { use rkyv::*; use ser::Serializer; let mut serializer = ser::serializers::AllocSerializer::<256>::default(); serializer.serialize_value(&a).unwrap(); let bytes = serializer.into_serializer().into_inner(); let archived = rkyv::check_archived_root::(&bytes).unwrap(); let deserialized: Test = archived.deserialize(&mut Infallible).unwrap(); a == deserialized } fn outer_join(a: Ref, b: Ref) -> bool { let expected: Test = outer_join_reference(&a, &b).into(); let a: Test = a.into(); let b: Test = b.into(); let actual = a.outer_join(&b, |arg| Some(match arg { Left(_, a) => *a, Right(_, b) => *b, Both(_, _, b) => *b, })); expected == actual } fn inner_join(a: Ref, b: Ref) -> bool { let expected: Test = inner_join_reference(&a, &b).into(); let a: Test = a.into(); let b: Test = b.into(); let actual = a.inner_join(&b, |_, a,_| Some(*a)); expected == actual } } #[test] fn smoke_test() { let a = btreemap! { 1 => 1, 2 => 3, }; let b = btreemap! { 1 => 2, 3 => 4, }; let r = outer_join_reference(&a, &b); let a: Test = a.into(); let b: Test = b.into(); let expected: Test = r.into(); let actual = a.outer_join(&b, |arg| { Some(match arg { Left(_, a) => a.clone(), Right(_, b) => b.clone(), Both(_, _, b) => b.clone(), }) }); assert_eq!(actual, expected); println!("{:?}", actual); } } vec-collections-0.4.3/src/vec_set.rs000064400000000000000000000727170072674642500155540ustar 00000000000000use crate::dedup::Keep; pub use crate::iterators::VecSetIter; use crate::merge_state::{ CloneConverter, IdConverter, InPlaceMergeState, InPlaceSmallVecMergeStateRef, NoConverter, }; use crate::{ dedup::sort_dedup, merge_state::{BoolOpMergeState, MergeStateMut, SmallVecMergeState}, }; use binary_merge::MergeOperation; #[cfg(feature = "rkyv_validated")] use bytecheck::CheckBytes; use core::{ cmp::Ordering, fmt, hash, hash::Hash, iter::FromIterator, ops::{BitAnd, BitAndAssign, BitOr, BitOrAssign, BitXor, BitXorAssign, Sub, SubAssign}, }; #[cfg(feature = "rkyv")] use rkyv::{validation::ArchiveContext, Archive}; use smallvec::{Array, SmallVec}; use std::collections::BTreeSet; #[cfg(feature = "serde")] use { core::marker::PhantomData, serde::{ de::{Deserialize, Deserializer, SeqAccess, Visitor}, ser::{Serialize, SerializeSeq, Serializer}, }, }; struct SetUnionOp; struct SetIntersectionOp; struct SetXorOp; struct SetDiffOpt; /// A set backed by a [SmallVec] of elements. /// /// `A` the underlying storage. This must be an array. The size of this array is the maximum size this collection /// can hold without allocating. VecSet is just a wrapper around a [SmallVec], so it does not have additional memory /// overhead. /// /// Sets support comparison operations ( /// [is_disjoint](#method.is_disjoint), /// [is_subset](#method.is_subset), /// [is_superset](#method.is_superset) /// ) and set combine operations /// ( /// [bitand](https://doc.rust-lang.org/std/ops/trait.BitAnd.html), /// [bitor](https://doc.rust-lang.org/std/ops/trait.BitOr.html), /// [bitxor](https://doc.rust-lang.org/std/ops/trait.BitXor.html), /// [sub](https://doc.rust-lang.org/std/ops/trait.Sub.html) /// ). /// They also support in place operations /// ( /// [bitand_assign](https://doc.rust-lang.org/std/ops/trait.BitAndAssign.html), /// [bitor_assign](https://doc.rust-lang.org/std/ops/trait.BitOrAssign.html), /// [bitxor_assign](https://doc.rust-lang.org/std/ops/trait.BitXorAssign.html), /// [sub_assign](https://doc.rust-lang.org/std/ops/trait.SubAssign.html) /// ) that will try to avoid allocations. /// /// # Creation /// /// The best way to create a VecSet is to use FromIterator, via collect. /// ``` /// use vec_collections::VecSet; /// let a: VecSet<[u32; 4]> = (0..4).collect(); // does not allocate /// ``` /// /// # General usage /// ``` /// use vec_collections::{VecSet, AbstractVecSet}; /// let a: VecSet<[u32; 4]> = (0..4).collect(); // does not allocate /// let b: VecSet<[u32; 2]> = (4..6).collect(); // does not allocate /// println!("{}", a.is_disjoint(&b)); // true /// let c = &a | &b; // underlying smallvec will spill over to the heap /// println!("{}", c.contains(&5)); // true /// ``` /// /// # In place operations /// ``` /// use vec_collections::{VecSet, AbstractVecSet}; /// let mut a: VecSet<[u32; 4]> = (0..4).collect(); // does not allocate /// let b: VecSet<[u32; 4]> = (2..6).collect(); // does not allocate /// a &= b; // in place intersection, will yield 2..4, will not allocate /// println!("{}", a.contains(&3)); // true /// ``` /// /// # Accessing the elements as a slice /// /// Since a VecSet is a succinct collection, you can get a reference to the contents as a slice. /// /// ## Example: choosing a random element /// ``` /// use vec_collections::VecSet; /// use rand::seq::SliceRandom; /// let mut a: VecSet<[u32; 4]> = (0..4).collect(); // does not allocate /// let mut rng = rand::thread_rng(); /// let e = a.as_ref().choose(&mut rng).unwrap(); /// println!("{}", e); /// ``` /// /// [SmallVec]: https://docs.rs/smallvec/1.4.1/smallvec/struct.SmallVec.html #[derive(Default)] pub struct VecSet(SmallVec); /// Type alias for a [VecSet](struct.VecSet) with up to 2 elements with inline storage. /// /// This is a good default, since for usize sized types, 2 is the max you can fit in without making the struct larger. pub type VecSet2 = VecSet<[T; 2]>; /// An abstract vec set /// /// this is implemented by VecSet and ArchivedVecSet, so they are interoperable. pub trait AbstractVecSet { // the elements as a slice, must be strictly ordered fn as_slice(&self) -> &[T]; fn is_empty(&self) -> bool { self.as_slice().is_empty() } fn contains(&self, value: &T) -> bool { self.as_slice().binary_search(value).is_ok() } /// true if this set has no common elements with another set. fn is_disjoint(&self, that: &impl AbstractVecSet) -> bool { !BoolOpMergeState::merge(self.as_slice(), that.as_slice(), SetIntersectionOp) } /// true if this set is a subset of another set. /// /// A set is considered to be a subset of itself. fn is_subset(&self, that: &impl AbstractVecSet) -> bool { !BoolOpMergeState::merge(self.as_slice(), that.as_slice(), SetDiffOpt) } /// true if this set is a superset of another set. /// /// A set is considered to be a superset of itself. fn is_superset(&self, that: &impl AbstractVecSet) -> bool { !BoolOpMergeState::merge(that.as_slice(), self.as_slice(), SetDiffOpt) } fn union>(&self, that: &impl AbstractVecSet) -> VecSet where T: Clone, { VecSet(SmallVecMergeState::merge( self.as_slice(), that.as_slice(), SetUnionOp, CloneConverter, )) } fn intersection>(&self, that: &impl AbstractVecSet) -> VecSet where T: Clone, { VecSet(SmallVecMergeState::merge( self.as_slice(), that.as_slice(), SetIntersectionOp, CloneConverter, )) } fn symmetric_difference>(&self, that: &impl AbstractVecSet) -> VecSet where T: Clone, { VecSet(SmallVecMergeState::merge( self.as_slice(), that.as_slice(), SetXorOp, CloneConverter, )) } fn difference>(&self, that: &impl AbstractVecSet) -> VecSet where T: Clone, { VecSet(SmallVecMergeState::merge( self.as_slice(), that.as_slice(), SetDiffOpt, CloneConverter, )) } /// An iterator that returns references to the items of this set in sorted order fn iter(&self) -> VecSetIter> { VecSetIter::new(self.as_slice().iter()) } } impl AbstractVecSet for VecSet where A::Item: Ord, { fn as_slice(&self) -> &[A::Item] { self.0.as_ref() } } #[cfg(feature = "rkyv")] impl AbstractVecSet for ArchivedVecSet where T: Ord, { fn as_slice(&self) -> &[T] { self.0.as_ref() } } impl> fmt::Debug for VecSet { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_set().entries(self.iter()).finish() } } impl> Clone for VecSet { fn clone(&self) -> Self { Self(self.0.clone()) } } impl> Hash for VecSet { fn hash(&self, state: &mut H) { self.0.hash(state) } } impl> PartialEq for VecSet { fn eq(&self, other: &Self) -> bool { self.0 == other.0 } } impl> Eq for VecSet {} impl> PartialOrd for VecSet { fn partial_cmp(&self, other: &Self) -> Option { self.0.partial_cmp(&other.0) } } impl> Ord for VecSet { fn cmp(&self, other: &Self) -> Ordering { self.0.cmp(&other.0) } } impl VecSet { /// Private because it does not check the invariants. pub(crate) fn new_unsafe(a: SmallVec) -> Self { Self(a) } /// A set with a single element. pub fn single(value: A::Item) -> Self { let mut res = SmallVec::new(); res.push(value); Self(res) } /// The empty set. pub fn empty() -> Self { Self::new_unsafe(SmallVec::new()) } /// An iterator that returns references to the items of this set in sorted order pub fn iter(&self) -> VecSetIter> { VecSetIter::new(self.0.iter()) } /// The underlying memory as a slice. fn as_slice(&self) -> &[A::Item] { &self.0 } /// The number of elements in the set. pub fn len(&self) -> usize { self.0.len() } /// Shrink the underlying SmallVec to fit. pub fn shrink_to_fit(&mut self) { self.0.shrink_to_fit() } /// true if the set is empty. pub fn is_empty(&self) -> bool { self.0.is_empty() } /// Returns the wrapped SmallVec. pub fn into_inner(self) -> SmallVec { self.0 } } impl VecSet where A::Item: Ord, { /// insert an element. /// /// The time complexity of this is O(N), so building a large set using single element inserts will be slow! /// Prefer using [from_iter](std::iter::FromIterator::from_iter) when building a large VecSet from elements. pub fn insert(&mut self, that: A::Item) -> bool { match self.0.binary_search(&that) { Ok(index) => { self.0[index] = that; false } Err(index) => { self.0.insert(index, that); true } } } /// Remove an element. /// /// The time complexity of this is O(N), so removing many elements using single element removes inserts will be slow! /// Prefer using [retain](VecSet::retain) when removing a large number of elements. pub fn remove(&mut self, that: &A::Item) -> bool { if let Ok(index) = self.0.binary_search(that) { self.0.remove(index); true } else { false } } /// Retain all elements matching a predicate. pub fn retain bool>(&mut self, mut f: F) { self.0.retain(|entry| f(entry)) } /// creates a set from a vec. /// /// Will sort and deduplicate the vector using a stable merge sort, so worst case time complexity /// is O(N log N). However, this will be faster for an already partially sorted vector. /// /// Note that the backing memory of the vector might be reused, so if this is a large vector containing /// lots of duplicates, it is advisable to call shrink_to_fit on the resulting set. fn from_vec(vec: Vec) -> Self { let mut vec = vec; vec.sort(); vec.dedup(); Self::new_unsafe(SmallVec::from_vec(vec)) } } impl<'a, A: Array> IntoIterator for &'a VecSet { type Item = &'a A::Item; type IntoIter = VecSetIter>; fn into_iter(self) -> Self::IntoIter { self.iter() } } impl IntoIterator for VecSet { type Item = A::Item; type IntoIter = VecSetIter>; fn into_iter(self) -> Self::IntoIter { VecSetIter::new(self.0.into_iter()) } } impl From> for Vec { fn from(value: VecSet) -> Self { value.0.into_vec() } } impl From> for SmallVec { fn from(value: VecSet) -> Self { value.into_inner() } } impl, B: Array> BitAnd<&VecSet> for &VecSet { type Output = VecSet; fn bitand(self, that: &VecSet) -> Self::Output { self.intersection(that) } } impl, B: Array> BitOr<&VecSet> for &VecSet { type Output = VecSet; fn bitor(self, that: &VecSet) -> Self::Output { self.union(that) } } impl, B: Array> BitXor<&VecSet> for &VecSet { type Output = VecSet; fn bitxor(self, that: &VecSet) -> Self::Output { self.symmetric_difference(that) } } impl, B: Array> Sub<&VecSet> for &VecSet { type Output = VecSet; fn sub(self, that: &VecSet) -> Self::Output { self.difference(that) } } impl, B: Array> BitAndAssign> for VecSet { fn bitand_assign(&mut self, that: VecSet) { InPlaceMergeState::merge(&mut self.0, that.0, SetIntersectionOp, IdConverter); } } impl, B: Array> BitAndAssign<&VecSet> for VecSet { fn bitand_assign(&mut self, that: &VecSet) { InPlaceSmallVecMergeStateRef::merge( &mut self.0, &that.0, SetIntersectionOp, CloneConverter, ); } } impl, B: Array> BitOrAssign> for VecSet { fn bitor_assign(&mut self, that: VecSet) { InPlaceMergeState::merge(&mut self.0, that.0, SetUnionOp, IdConverter); } } impl, B: Array> BitOrAssign<&VecSet> for VecSet { fn bitor_assign(&mut self, that: &VecSet) { InPlaceSmallVecMergeStateRef::merge(&mut self.0, &that.0, SetUnionOp, CloneConverter); } } impl, B: Array> BitXorAssign> for VecSet { fn bitxor_assign(&mut self, that: VecSet) { InPlaceMergeState::merge(&mut self.0, that.0, SetXorOp, IdConverter); } } impl, B: Array> BitXorAssign<&VecSet> for VecSet { fn bitxor_assign(&mut self, that: &VecSet) { InPlaceSmallVecMergeStateRef::merge(&mut self.0, &that.0, SetXorOp, CloneConverter); } } impl, B: Array> SubAssign> for VecSet { fn sub_assign(&mut self, that: VecSet) { InPlaceMergeState::merge(&mut self.0, that.0, SetDiffOpt, IdConverter); } } impl, B: Array> SubAssign<&VecSet> for VecSet { fn sub_assign(&mut self, that: &VecSet) { InPlaceSmallVecMergeStateRef::merge(&mut self.0, &that.0, SetDiffOpt, CloneConverter); } } impl AsRef<[A::Item]> for VecSet { fn as_ref(&self) -> &[A::Item] { self.as_slice() } } impl> From> for VecSet { fn from(vec: Vec) -> Self { Self::from_vec(vec) } } /// Provides a way to create a VecSet from a BTreeSet without having to sort again impl> From> for VecSet { fn from(value: BTreeSet) -> Self { Self::new_unsafe(value.into_iter().collect()) } } /// Builds the set from an iterator. /// /// Uses a heuristic to deduplicate while building the set, so the intermediate storage will never be more /// than twice the size of the resulting set. This is the most efficient way to build a large VecSet, significantly /// more efficient than single element insertion. /// /// Worst case performance is O(log(n)^2 * n), but performance for already partially sorted collections will be /// significantly better. For a fully sorted collection, performance will be O(n). impl> FromIterator for VecSet { fn from_iter>(iter: I) -> Self { let mut vec: SmallVec = sort_dedup(iter.into_iter(), Keep::First); vec.shrink_to_fit(); Self::new_unsafe(vec) } } impl> Extend for VecSet { fn extend>(&mut self, iter: I) { *self |= Self::from_iter(iter); } } impl> MergeOperation for SetUnionOp { fn cmp(&self, a: &T, b: &T) -> Ordering { a.cmp(b) } fn from_a(&self, m: &mut I, n: usize) -> bool { m.advance_a(n, true) } fn from_b(&self, m: &mut I, n: usize) -> bool { m.advance_b(n, true) } fn collision(&self, m: &mut I) -> bool { m.advance_a(1, true) && m.advance_b(1, false) } } impl> MergeOperation for SetIntersectionOp { fn cmp(&self, a: &T, b: &T) -> Ordering { a.cmp(b) } fn from_a(&self, m: &mut I, n: usize) -> bool { m.advance_a(n, false) } fn from_b(&self, m: &mut I, n: usize) -> bool { m.advance_b(n, false) } fn collision(&self, m: &mut I) -> bool { m.advance_a(1, true) && m.advance_b(1, false) } } impl> MergeOperation for SetDiffOpt { fn cmp(&self, a: &T, b: &T) -> Ordering { a.cmp(b) } fn from_a(&self, m: &mut I, n: usize) -> bool { m.advance_a(n, true) } fn from_b(&self, m: &mut I, n: usize) -> bool { m.advance_b(n, false) } fn collision(&self, m: &mut I) -> bool { m.advance_a(1, false) && m.advance_b(1, false) } } impl> MergeOperation for SetXorOp { fn cmp(&self, a: &T, b: &T) -> Ordering { a.cmp(b) } fn from_a(&self, m: &mut I, n: usize) -> bool { m.advance_a(n, true) } fn from_b(&self, m: &mut I, n: usize) -> bool { m.advance_b(n, true) } fn collision(&self, m: &mut I) -> bool { m.advance_a(1, false) && m.advance_b(1, false) } } #[cfg(feature = "serde")] impl Serialize for VecSet where A::Item: Serialize, { fn serialize(&self, serializer: S) -> Result { let mut state = serializer.serialize_seq(Some(self.len()))?; for item in self.iter() { state.serialize_element(&item)?; } state.end() } } #[cfg(feature = "serde")] impl<'de, A: Array> Deserialize<'de> for VecSet where A::Item: Deserialize<'de> + Ord, { fn deserialize>(deserializer: D) -> Result { deserializer.deserialize_seq(VecSetVisitor { phantom: PhantomData, }) } } #[cfg(feature = "serde")] struct VecSetVisitor { phantom: PhantomData, } #[cfg(feature = "serde")] impl<'de, A: Array> Visitor<'de> for VecSetVisitor where A::Item: Deserialize<'de> + Ord, { type Value = VecSet; fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { formatter.write_str("a sequence") } fn visit_seq(self, mut seq: B) -> Result where B: SeqAccess<'de>, { let len = seq.size_hint().unwrap_or(0); let mut values = SmallVec::with_capacity(len); while let Some(value) = seq.next_element()? { values.push(value); } values.sort(); values.dedup(); Ok(VecSet(values)) } } #[cfg(feature = "rkyv")] #[repr(transparent)] pub struct ArchivedVecSet(rkyv::vec::ArchivedVec); #[cfg(feature = "rkyv")] impl rkyv::Archive for VecSet where A: Array, A::Item: rkyv::Archive, { type Archived = ArchivedVecSet<::Archived>; type Resolver = rkyv::vec::VecResolver; unsafe fn resolve(&self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived) { rkyv::vec::ArchivedVec::resolve_from_slice(self.0.as_slice(), pos, resolver, &mut (*out).0); } } #[cfg(feature = "rkyv")] impl rkyv::Serialize for VecSet where A: Array, T: rkyv::Archive + rkyv::Serialize, S: rkyv::ser::ScratchSpace + rkyv::ser::Serializer, { fn serialize(&self, serializer: &mut S) -> Result { rkyv::vec::ArchivedVec::serialize_from_slice(self.0.as_ref(), serializer) } } #[cfg(feature = "rkyv")] impl rkyv::Deserialize, D> for ArchivedVecSet where A: Array, T: rkyv::Archive, D: rkyv::Fallible + ?Sized, [<::Item as rkyv::Archive>::Archived]: rkyv::DeserializeUnsized<[::Item], D>, { fn deserialize(&self, deserializer: &mut D) -> Result, D::Error> { // todo: replace this with SmallVec once smallvec support for rkyv lands on crates.io let items: Vec = self.0.deserialize(deserializer)?; Ok(VecSet(items.into())) } } /// Validation error for a vec set #[cfg(feature = "rkyv_validated")] #[derive(Debug)] pub enum ArchivedVecSetError { /// error with the individual elements of the VecSet ValueCheckError, /// elements were not properly ordered OrderCheckError, } #[cfg(feature = "rkyv_validated")] impl std::error::Error for ArchivedVecSetError {} #[cfg(feature = "rkyv_validated")] impl std::fmt::Display for ArchivedVecSetError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{:?}", self) } } #[cfg(feature = "rkyv_validated")] impl bytecheck::CheckBytes for ArchivedVecSet where C: ArchiveContext, C::Error: std::error::Error, T: Ord + Archive + CheckBytes, bool: bytecheck::CheckBytes, { type Error = ArchivedVecSetError; unsafe fn check_bytes<'a>( value: *const Self, context: &mut C, ) -> Result<&'a Self, Self::Error> { let values = &(*value).0; CheckBytes::check_bytes(values, context) .map_err(|_| ArchivedVecSetError::ValueCheckError)?; if !values.iter().zip(values.iter().skip(1)).all(|(a, b)| a < b) { return Err(ArchivedVecSetError::OrderCheckError); }; Ok(&*value) } } impl VecSet where A::Item: Ord + Clone, { pub fn union(&self, that: &impl AbstractVecSet) -> Self { Self(SmallVecMergeState::merge( self.as_slice(), that.as_slice(), SetUnionOp, CloneConverter, )) } pub fn intersection(&self, that: &impl AbstractVecSet) -> Self { Self(SmallVecMergeState::merge( self.as_slice(), that.as_slice(), SetIntersectionOp, CloneConverter, )) } pub fn symmetric_difference(&self, that: &impl AbstractVecSet) -> Self { Self(SmallVecMergeState::merge( self.as_slice(), that.as_slice(), SetXorOp, CloneConverter, )) } pub fn difference(&self, that: &impl AbstractVecSet) -> Self { Self(SmallVecMergeState::merge( self.as_slice(), that.as_slice(), SetDiffOpt, CloneConverter, )) } pub fn union_with(&mut self, that: &impl AbstractVecSet) { InPlaceSmallVecMergeStateRef::merge(&mut self.0, &that.as_slice(), SetUnionOp, NoConverter); } pub fn intersection_with(&mut self, that: &impl AbstractVecSet) { InPlaceSmallVecMergeStateRef::merge( &mut self.0, &that.as_slice(), SetIntersectionOp, NoConverter, ); } pub fn xor_with(&mut self, that: &impl AbstractVecSet) { InPlaceSmallVecMergeStateRef::merge( &mut self.0, &that.as_slice(), SetIntersectionOp, NoConverter, ); } pub fn difference_with(&mut self, that: &impl AbstractVecSet) { InPlaceSmallVecMergeStateRef::merge(&mut self.0, &that.as_slice(), SetDiffOpt, NoConverter); } } #[cfg(test)] mod test { use super::*; use crate::vec_set::AbstractVecSet; use num_traits::PrimInt; use obey::*; use quickcheck::*; #[test] fn drop_pointer_being_freed_was_not_allocated() { // this test might look completely pointless, but at some point this // caused an evil "pointer being freed was not allocated". let mut tags: VecSet<[Box; 4]> = VecSet::default(); tags.bitor_assign(VecSet::<[Box; 4]>::single("a".into())); let sv = tags.into_inner(); std::mem::drop(sv); } impl Arbitrary for VecSet<[T; 2]> { fn arbitrary(g: &mut G) -> Self { Self::from_vec(Arbitrary::arbitrary(g)) } } impl TestSamples for VecSet<[E; 2]> { fn samples(&self, res: &mut BTreeSet) { res.insert(E::min_value()); for x in self.0.iter().cloned() { res.insert(x - E::one()); res.insert(x); res.insert(x + E::one()); } res.insert(E::max_value()); } fn at(&self, elem: E) -> bool { self.contains(&elem) } } type Test = VecSet<[i64; 2]>; type Reference = BTreeSet; quickcheck! { #[cfg(feature = "serde")] fn serde_roundtrip(reference: Test) -> bool { let bytes = serde_json::to_vec(&reference).unwrap(); let deser = serde_json::from_slice(&bytes).unwrap(); reference == deser } #[cfg(feature = "rkyv")] fn rkyv_roundtrip_unvalidated(a: Test) -> bool { use rkyv::*; use ser::Serializer; let mut serializer = ser::serializers::AllocSerializer::<256>::default(); serializer.serialize_value(&a).unwrap(); let bytes = serializer.into_serializer().into_inner(); let archived = unsafe { rkyv::archived_root::(&bytes) }; let deserialized: Test = archived.deserialize(&mut Infallible).unwrap(); a == deserialized } #[cfg(feature = "rkyv_validated")] #[quickcheck] fn rkyv_roundtrip_validated(a: Test) -> bool { use rkyv::*; use ser::Serializer; let mut serializer = ser::serializers::AllocSerializer::<256>::default(); serializer.serialize_value(&a).unwrap(); let bytes = serializer.into_serializer().into_inner(); let archived = rkyv::check_archived_root::(&bytes).unwrap(); let deserialized: Test = archived.deserialize(&mut Infallible).unwrap(); a == deserialized } fn is_disjoint_sample(a: Test, b: Test) -> bool { binary_property_test(&a, &b, a.is_disjoint(&b), |a, b| !(a & b)) } fn is_subset_sample(a: Test, b: Test) -> bool { binary_property_test(&a, &b, a.is_subset(&b), |a, b| !a | b) } fn union_sample(a: Test, b: Test) -> bool { binary_element_test(&a, &b, &a | &b, |a, b| a | b) } fn intersection_sample(a: Test, b: Test) -> bool { binary_element_test(&a, &b, &a & &b, |a, b| a & b) } fn xor_sample(a: Test, b: Test) -> bool { binary_element_test(&a, &b, &a ^ &b, |a, b| a ^ b) } fn diff_sample(a: Test, b: Test) -> bool { binary_element_test(&a, &b, &a - &b, |a, b| a & !b) } fn union(a: Reference, b: Reference) -> bool { let mut a1: Test = a.iter().cloned().collect(); let b1: Test = b.iter().cloned().collect(); let r2 = &a1 | &b1; a1 |= b1; println!("{:?} {:?}", a, b); let expected: Vec = a.union(&b).cloned().collect(); let actual: Vec = a1.into(); let actual2: Vec = r2.into(); expected == actual && expected == actual2 } fn intersection(a: Reference, b: Reference) -> bool { let mut a1: Test = a.iter().cloned().collect(); let b1: Test = b.iter().cloned().collect(); let r2 = &a1 & &b1; a1 &= b1; let expected: Vec = a.intersection(&b).cloned().collect(); let actual: Vec = a1.into(); let actual2: Vec = r2.into(); expected == actual && expected == actual2 } fn xor(a: Reference, b: Reference) -> bool { let mut a1: Test = a.iter().cloned().collect(); let b1: Test = b.iter().cloned().collect(); let r2 = &a1 ^ &b1; a1 ^= b1; let expected: Vec = a.symmetric_difference(&b).cloned().collect(); let actual: Vec = a1.into(); let actual2: Vec = r2.into(); expected == actual && expected == actual2 } fn difference(a: Reference, b: Reference) -> bool { let mut a1: Test = a.iter().cloned().collect(); let b1: Test = b.iter().cloned().collect(); let r2 = &a1 - &b1; a1 -= b1; let expected: Vec = a.difference(&b).cloned().collect(); let actual: Vec = a1.into(); let actual2: Vec = r2.into(); expected == actual && expected == actual2 } fn is_disjoint(a: Reference, b: Reference) -> bool { let a1: Test = a.iter().cloned().collect(); let b1: Test = b.iter().cloned().collect(); let actual = a1.is_disjoint(&b1); let expected = a.is_disjoint(&b); expected == actual } fn is_subset(a: Reference, b: Reference) -> bool { let a1: Test = a.iter().cloned().collect(); let b1: Test = b.iter().cloned().collect(); let actual = a1.is_subset(&b1); let expected = a.is_subset(&b); expected == actual } fn contains(a: Reference, b: i64) -> bool { let a1: Test = a.iter().cloned().collect(); let expected = a.contains(&b); let actual = a1.contains(&b); expected == actual } } bitop_assign_consistent!(Test); set_predicate_consistent!(Test); bitop_symmetry!(Test); bitop_empty!(Test); } vec-collections-0.4.3/test000064400000000000000000010410000072674642500136470ustar 000000000000000-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 1-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 0-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 1-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 2-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 3-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 4-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 5-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 6-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 7-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 8-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 9-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` hl,0x|<@LP 2-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 0-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 1-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 2-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 3-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 4-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 5-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 6-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 7-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 8-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 9-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` hl,0x|<@LP 3-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 0-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 1-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 2-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 3-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 4-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 5-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 6-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 7-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 8-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 9-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` hl,0x|<@LP 4-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 0-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 1-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 2-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 3-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 4-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 5-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 6-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 7-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 8-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 9-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` hl,0x|<@LP 5-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 0-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 1-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 2-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 3-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 4-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 5-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 6-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 7-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 8-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 9-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` hl,0x|<@LP 6-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 0-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 1-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 2-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 3-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 4-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 5-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 6-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 7-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 8-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 9-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` hl,0x|<@LP 7-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 0-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 1-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 2-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 3-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 4-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 5-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 6-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 7-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 8-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 9-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` hl,0x|<@LP 8-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 0-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 1-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 2-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 3-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 4-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 5-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 6-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 7-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 8-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 9-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` hl,0x|<@LP 9-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 0-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 1-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 2-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 3-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 4-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 5-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 6-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 7-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 8-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` 9-010123456789|x|txptlphldh`d\` 20123456789|x|txptlphldh`d\` 30123456789|x|txptlphldh`d\` 40123456789|x|txptlphldh`d\` 50123456789|x|txptlphldh`d\` 60123456789|x|txptlphldh`d\` 70123456789|x|txptlphldh`d\` 80123456789|x|txptlphldh`d\` 90123456789|x|txptlphldh`d\`   ,0<@LP\` hl,0x|<@LP x|

); impl<'a, K, V, W, F, I, R> MergeOperation for InnerCombineOp where K: TKey, V: TValue, W: TValue, F: Fn(&mut V, &W) -> bool + Copy, I: MutateInput, I::B: AbstractRadixTree, R: AbstractRadixTreeMut, { fn cmp(&self, a: &I::A, b: &I::B) -> Ordering { a.prefix()[0].cmp(&b.prefix()[0]) } fn from_a(&self, m: &mut I, n: usize) -> bool { m.advance_a(n, false) } fn from_b(&self, m: &mut I, n: usize) -> bool { m.advance_b(n, false) } fn collision(&self, m: &mut I) -> bool { let (a, b) = m.source_slices_mut(); let av = &mut a[0]; let bv = &b[0]; av.inner_combine_with(bv, self.0); // we have modified av in place. We are only going to take it over if it // is non-empty, otherwise we skip it. let take = !av.is_empty(); m.advance_a(1, take) && m.advance_b(1, false) } } impl<'a, F, K, V, W, A, B, R> MergeOperation, NoConverter>> for InnerCombineOp where K: TKey, V: TValue, W: TValue, A: AbstractRadixTree, B: AbstractRadixTree, R: AbstractRadixTreeMut, F: Fn(&V, &W) -> Option + Copy, { fn cmp(&self, a: &A, b: &B) -> Ordering { a.prefix()[0].cmp(&b.prefix()[0]) } fn from_a( &self, m: &mut VecMergeState<'a, A, B, R, RadixTreeConverter, NoConverter>, n: usize, ) -> bool { m.advance_a(n, false) } fn from_b( &self, m: &mut VecMergeState<'a, A, B, R, RadixTreeConverter, NoConverter>, n: usize, ) -> bool { m.advance_b(n, false) } fn collision( &self, m: &mut VecMergeState<'a, A, B, R, RadixTreeConverter, NoConverter>, ) -> bool { let a = m.a.next().unwrap(); let b = m.b.next().unwrap(); let res = inner_combine(a, b, self.0); if !res.is_empty() { m.r.push(res); } true } } /// In place intersection operation struct LeftCombineOp(F, PhantomData